That fuck shit the fascists are using
at master 170 lines 5.9 kB view raw
1package org.tm.archive.devicetransfer; 2 3import android.os.Bundle; 4import android.view.View; 5import android.widget.Button; 6import android.widget.TextView; 7 8import androidx.activity.OnBackPressedCallback; 9import androidx.annotation.NonNull; 10import androidx.annotation.Nullable; 11import androidx.annotation.StringRes; 12 13import com.google.android.material.dialog.MaterialAlertDialogBuilder; 14 15import org.greenrobot.eventbus.EventBus; 16import org.greenrobot.eventbus.Subscribe; 17import org.greenrobot.eventbus.ThreadMode; 18import org.signal.devicetransfer.DeviceToDeviceTransferService; 19import org.signal.devicetransfer.TransferStatus; 20import org.tm.archive.LoggingFragment; 21import org.tm.archive.R; 22 23/** 24 * Drives the UI for the actual device transfer progress. Shown after setup is complete 25 * and the two devices are transferring. 26 * <p> 27 * Handles show progress and error state. 28 */ 29public abstract class DeviceTransferFragment extends LoggingFragment { 30 31 private static final String TRANSFER_FINISHED_KEY = "transfer_finished"; 32 33 private final OnBackPressed onBackPressed = new OnBackPressed(); 34 private final TransferModeListener transferModeListener = new TransferModeListener(); 35 36 protected TextView title; 37 protected View tryAgain; 38 protected Button cancel; 39 protected View progress; 40 protected View alert; 41 protected TextView status; 42 protected boolean transferFinished; 43 44 public DeviceTransferFragment() { 45 super(R.layout.device_transfer_fragment); 46 } 47 48 @Override 49 public void onCreate(@Nullable Bundle savedInstanceState) { 50 super.onCreate(savedInstanceState); 51 if (savedInstanceState != null) { 52 transferFinished = savedInstanceState.getBoolean(TRANSFER_FINISHED_KEY); 53 } 54 } 55 56 @Override 57 public void onStart() { 58 super.onStart(); 59 if (transferFinished) { 60 navigateToTransferComplete(); 61 } 62 } 63 64 @Override 65 public void onSaveInstanceState(@NonNull Bundle outState) { 66 super.onSaveInstanceState(outState); 67 outState.putBoolean(TRANSFER_FINISHED_KEY, transferFinished); 68 } 69 70 @Override 71 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { 72 title = view.findViewById(R.id.device_transfer_fragment_title); 73 tryAgain = view.findViewById(R.id.device_transfer_fragment_try_again); 74 cancel = view.findViewById(R.id.device_transfer_fragment_cancel); 75 progress = view.findViewById(R.id.device_transfer_fragment_progress); 76 alert = view.findViewById(R.id.device_transfer_fragment_alert); 77 status = view.findViewById(R.id.device_transfer_fragment_status); 78 79 cancel.setOnClickListener(v -> cancelActiveTransfer()); 80 tryAgain.setOnClickListener(v -> { 81 EventBus.getDefault().unregister(transferModeListener); 82 EventBus.getDefault().removeStickyEvent(TransferStatus.class); 83 navigateToRestartTransfer(); 84 }); 85 86 EventBus.getDefault().register(transferModeListener); 87 } 88 89 @Override 90 public void onActivityCreated(@Nullable Bundle savedInstanceState) { 91 super.onActivityCreated(savedInstanceState); 92 requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), onBackPressed); 93 } 94 95 @Override 96 public void onDestroyView() { 97 EventBus.getDefault().unregister(transferModeListener); 98 super.onDestroyView(); 99 } 100 101 private void cancelActiveTransfer() { 102 new MaterialAlertDialogBuilder(requireContext()).setTitle(R.string.DeviceTransfer__stop_transfer) 103 .setMessage(R.string.DeviceTransfer__all_transfer_progress_will_be_lost) 104 .setPositiveButton(R.string.DeviceTransfer__stop_transfer, (d, w) -> { 105 EventBus.getDefault().unregister(transferModeListener); 106 DeviceToDeviceTransferService.stop(requireContext()); 107 EventBus.getDefault().removeStickyEvent(TransferStatus.class); 108 navigateAwayFromTransfer(); 109 }) 110 .setNegativeButton(android.R.string.cancel, null) 111 .show(); 112 } 113 114 protected void ignoreTransferStatusEvents() { 115 EventBus.getDefault().unregister(transferModeListener); 116 } 117 118 protected abstract void navigateToRestartTransfer(); 119 120 protected abstract void navigateAwayFromTransfer(); 121 122 protected abstract void navigateToTransferComplete(); 123 124 private class TransferModeListener { 125 @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) 126 public void onEventMainThread(@NonNull TransferStatus event) { 127 if (event.getTransferMode() != TransferStatus.TransferMode.SERVICE_CONNECTED) { 128 abort(); 129 } 130 } 131 } 132 133 protected void abort() { 134 abort(R.string.DeviceTransfer__transfer_failed); 135 } 136 137 protected void abort(@StringRes int errorMessage) { 138 EventBus.getDefault().unregister(transferModeListener); 139 DeviceToDeviceTransferService.stop(requireContext()); 140 141 progress.setVisibility(View.GONE); 142 alert.setVisibility(View.VISIBLE); 143 tryAgain.setVisibility(View.VISIBLE); 144 145 title.setText(R.string.DeviceTransfer__unable_to_transfer); 146 status.setText(errorMessage); 147 cancel.setText(R.string.DeviceTransfer__cancel); 148 cancel.setOnClickListener(v -> navigateAwayFromTransfer()); 149 150 onBackPressed.isActiveTransfer = false; 151 } 152 153 protected class OnBackPressed extends OnBackPressedCallback { 154 155 private boolean isActiveTransfer = true; 156 157 public OnBackPressed() { 158 super(true); 159 } 160 161 @Override 162 public void handleOnBackPressed() { 163 if (isActiveTransfer) { 164 cancelActiveTransfer(); 165 } else { 166 navigateAwayFromTransfer(); 167 } 168 } 169 } 170}