That fuck shit the fascists are using
at master 132 lines 4.7 kB view raw
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}