That fuck shit the fascists are using
1package org.tm.archive.proxy;
2
3import android.os.Bundle;
4import android.view.LayoutInflater;
5import android.view.View;
6import android.view.ViewGroup;
7import android.widget.TextView;
8import android.widget.Toast;
9
10import androidx.annotation.NonNull;
11import androidx.annotation.Nullable;
12import androidx.fragment.app.DialogFragment;
13import androidx.fragment.app.FragmentManager;
14import androidx.lifecycle.ViewModelProvider;
15
16import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
17import com.google.android.material.dialog.MaterialAlertDialogBuilder;
18
19import org.signal.core.util.logging.Log;
20import org.tm.archive.R;
21import org.tm.archive.preferences.EditProxyViewModel;
22import org.tm.archive.util.BottomSheetUtil;
23import org.signal.core.util.concurrent.LifecycleDisposable;
24import org.tm.archive.util.ThemeUtil;
25import org.tm.archive.util.WindowUtil;
26import org.tm.archive.util.views.CircularProgressMaterialButton;
27
28/**
29 * A bottom sheet shown in response to a deep link. Allows a user to set a proxy.
30 */
31public final class ProxyBottomSheetFragment extends BottomSheetDialogFragment {
32
33 private static final String TAG = Log.tag(ProxyBottomSheetFragment.class);
34
35 private static final String ARG_PROXY_LINK = "proxy_link";
36
37 private TextView proxyText;
38 private View cancelButton;
39 private CircularProgressMaterialButton useProxyButton;
40 private EditProxyViewModel viewModel;
41 private LifecycleDisposable lifecycleDisposable;
42
43 public static void showForProxy(@NonNull FragmentManager manager, @NonNull String proxyLink) {
44 ProxyBottomSheetFragment fragment = new ProxyBottomSheetFragment();
45
46 Bundle args = new Bundle();
47 args.putString(ARG_PROXY_LINK, proxyLink);
48 fragment.setArguments(args);
49
50 fragment.show(manager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG);
51 }
52
53 @Override
54 public void onCreate(@Nullable Bundle savedInstanceState) {
55 setStyle(DialogFragment.STYLE_NORMAL,
56 ThemeUtil.isDarkTheme(requireContext()) ? R.style.Theme_Signal_RoundedBottomSheet
57 : R.style.Theme_Signal_RoundedBottomSheet_Light);
58
59 super.onCreate(savedInstanceState);
60 }
61
62 @Override
63 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
64 return inflater.inflate(R.layout.proxy_bottom_sheet, container, false);
65 }
66
67 @Override
68 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
69 this.proxyText = view.findViewById(R.id.proxy_sheet_host);
70 this.useProxyButton = view.findViewById(R.id.proxy_sheet_use_proxy);
71 this.cancelButton = view.findViewById(R.id.proxy_sheet_cancel);
72
73 lifecycleDisposable = new LifecycleDisposable();
74 lifecycleDisposable.bindTo(getViewLifecycleOwner());
75
76 String host = getArguments().getString(ARG_PROXY_LINK);
77 proxyText.setText(host);
78
79 initViewModel();
80
81 useProxyButton.setOnClickListener(v -> viewModel.onSaveClicked(host));
82 cancelButton.setOnClickListener(v -> dismiss());
83 }
84
85 @Override
86 public void onResume() {
87 super.onResume();
88 WindowUtil.initializeScreenshotSecurity(requireContext(), requireDialog().getWindow());
89 }
90
91 private void initViewModel() {
92 this.viewModel = new ViewModelProvider(this).get(EditProxyViewModel.class);
93
94 lifecycleDisposable.addAll(
95 viewModel.getSaveState().subscribe(this::presentSaveState),
96 viewModel.getEvents().subscribe(this::presentEvents)
97 );
98 }
99
100 private void presentSaveState(@NonNull EditProxyViewModel.SaveState state) {
101 switch (state) {
102 case IDLE:
103 useProxyButton.cancelSpinning();
104 break;
105 case IN_PROGRESS:
106 useProxyButton.setSpinning();
107 break;
108 }
109 }
110
111 private void presentEvents(@NonNull EditProxyViewModel.Event event) {
112 if (isStateSaved()) {
113 Log.w(TAG, "Got an event after state had been saved. Dropping. " + event.name());
114 return;
115 }
116
117 switch (event) {
118 case PROXY_SUCCESS:
119 Toast.makeText(requireContext(), R.string.ProxyBottomSheetFragment_successfully_connected_to_proxy, Toast.LENGTH_LONG).show();
120 dismiss();
121 break;
122 case PROXY_FAILURE:
123 new MaterialAlertDialogBuilder(requireContext())
124 .setTitle(R.string.preferences_failed_to_connect)
125 .setMessage(R.string.preferences_couldnt_connect_to_the_proxy)
126 .setPositiveButton(android.R.string.ok, (d, i) -> d.dismiss())
127 .show();
128 dismiss();
129 break;
130 }
131 }
132}