That fuck shit the fascists are using
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}