That fuck shit the fascists are using
1package org.tm.archive.components;
2
3import android.app.Dialog;
4import android.content.Context;
5import android.content.res.TypedArray;
6import android.os.Bundle;
7import android.text.Editable;
8import android.text.TextUtils;
9import android.text.TextWatcher;
10import android.util.AttributeSet;
11import android.view.View;
12import android.widget.AdapterView;
13import android.widget.Button;
14import android.widget.EditText;
15import android.widget.Spinner;
16import android.widget.TextView;
17
18import androidx.annotation.NonNull;
19import androidx.appcompat.app.AlertDialog;
20import androidx.preference.DialogPreference;
21import androidx.preference.PreferenceDialogFragmentCompat;
22
23import org.signal.core.util.logging.Log;
24import org.tm.archive.R;
25import org.tm.archive.components.CustomDefaultPreference.CustomDefaultPreferenceDialogFragmentCompat.CustomPreferenceValidator;
26import org.tm.archive.util.TextSecurePreferences;
27
28import java.net.URI;
29import java.net.URISyntaxException;
30
31
32public class CustomDefaultPreference extends DialogPreference {
33
34 private static final String TAG = Log.tag(CustomDefaultPreference.class);
35
36 private final int inputType;
37 private final String customPreference;
38 private final String customToggle;
39
40 private CustomPreferenceValidator validator;
41 private String defaultValue;
42
43 public CustomDefaultPreference(Context context, AttributeSet attrs) {
44 super(context, attrs);
45
46 int[] attributeNames = new int[]{android.R.attr.inputType, R.attr.custom_pref_toggle};
47 TypedArray attributes = context.obtainStyledAttributes(attrs, attributeNames);
48
49 this.inputType = attributes.getInt(0, 0);
50 this.customPreference = getKey();
51 this.customToggle = attributes.getString(1);
52 this.validator = new CustomDefaultPreferenceDialogFragmentCompat.NullValidator();
53
54 attributes.recycle();
55
56 setPersistent(false);
57 setDialogLayoutResource(R.layout.custom_default_preference_dialog);
58 }
59
60 public CustomDefaultPreference setValidator(CustomPreferenceValidator validator) {
61 this.validator = validator;
62 return this;
63 }
64
65 public CustomDefaultPreference setDefaultValue(String defaultValue) {
66 this.defaultValue = defaultValue;
67 this.setSummary(getSummary());
68 return this;
69 }
70
71 @Override
72 public String getSummary() {
73 if (isCustom()) {
74 return getContext().getString(R.string.CustomDefaultPreference_using_custom,
75 getPrettyPrintValue(getCustomValue()));
76 } else {
77 return getContext().getString(R.string.CustomDefaultPreference_using_default,
78 getPrettyPrintValue(getDefaultValue()));
79 }
80 }
81
82 private String getPrettyPrintValue(String value) {
83 if (TextUtils.isEmpty(value)) return getContext().getString(R.string.CustomDefaultPreference_none);
84 else return value;
85 }
86
87 private boolean isCustom() {
88 return TextSecurePreferences.getBooleanPreference(getContext(), customToggle, false);
89 }
90
91 private void setCustom(boolean custom) {
92 TextSecurePreferences.setBooleanPreference(getContext(), customToggle, custom);
93 }
94
95 private String getCustomValue() {
96 return TextSecurePreferences.getStringPreference(getContext(), customPreference, "");
97 }
98
99 private void setCustomValue(String value) {
100 TextSecurePreferences.setStringPreference(getContext(), customPreference, value);
101 }
102
103 private String getDefaultValue() {
104 return defaultValue;
105 }
106
107
108 public static class CustomDefaultPreferenceDialogFragmentCompat extends PreferenceDialogFragmentCompat {
109
110 private static final String INPUT_TYPE = "input_type";
111
112 private Spinner spinner;
113 private EditText customText;
114 private TextView defaultLabel;
115
116 public static CustomDefaultPreferenceDialogFragmentCompat newInstance(String key) {
117 CustomDefaultPreferenceDialogFragmentCompat fragment = new CustomDefaultPreferenceDialogFragmentCompat();
118 Bundle b = new Bundle(1);
119 b.putString(PreferenceDialogFragmentCompat.ARG_KEY, key);
120 fragment.setArguments(b);
121 return fragment;
122 }
123
124 @Override
125 protected void onBindDialogView(@NonNull View view) {
126 Log.i(TAG, "onBindDialogView");
127 super.onBindDialogView(view);
128
129 CustomDefaultPreference preference = (CustomDefaultPreference)getPreference();
130
131 this.spinner = (Spinner) view.findViewById(R.id.default_or_custom);
132 this.defaultLabel = (TextView) view.findViewById(R.id.default_label);
133 this.customText = (EditText) view.findViewById(R.id.custom_edit);
134
135 this.customText.setInputType(preference.inputType);
136 this.customText.addTextChangedListener(new TextValidator());
137 this.customText.setText(preference.getCustomValue());
138 this.spinner.setOnItemSelectedListener(new SelectionLister());
139 this.defaultLabel.setText(preference.getPrettyPrintValue(preference.defaultValue));
140 }
141
142
143 @Override
144 public @NonNull Dialog onCreateDialog(Bundle instanceState) {
145 Dialog dialog = super.onCreateDialog(instanceState);
146
147 CustomDefaultPreference preference = (CustomDefaultPreference)getPreference();
148
149 if (preference.isCustom()) spinner.setSelection(1, true);
150 else spinner.setSelection(0, true);
151
152 return dialog;
153 }
154
155 @Override
156 public void onDialogClosed(boolean positiveResult) {
157 CustomDefaultPreference preference = (CustomDefaultPreference)getPreference();
158
159 if (positiveResult) {
160 if (spinner != null) preference.setCustom(spinner.getSelectedItemPosition() == 1);
161 if (customText != null) preference.setCustomValue(customText.getText().toString());
162
163 preference.setSummary(preference.getSummary());
164 }
165 }
166
167 interface CustomPreferenceValidator {
168 public boolean isValid(String value);
169 }
170
171 private static class NullValidator implements CustomPreferenceValidator {
172 @Override
173 public boolean isValid(String value) {
174 return true;
175 }
176 }
177
178 private class TextValidator implements TextWatcher {
179
180 @Override
181 public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
182
183 @Override
184 public void onTextChanged(CharSequence s, int start, int before, int count) {}
185
186 @Override
187 public void afterTextChanged(Editable s) {
188 CustomDefaultPreference preference = (CustomDefaultPreference)getPreference();
189
190 if (spinner.getSelectedItemPosition() == 1) {
191 Button positiveButton = ((AlertDialog)getDialog()).getButton(AlertDialog.BUTTON_POSITIVE);
192 positiveButton.setEnabled(preference.validator.isValid(s.toString()));
193 }
194 }
195 }
196
197 public static class UriValidator implements CustomPreferenceValidator {
198 @Override
199 public boolean isValid(String value) {
200 if (TextUtils.isEmpty(value)) return true;
201
202 try {
203 new URI(value);
204 return true;
205 } catch (URISyntaxException mue) {
206 return false;
207 }
208 }
209 }
210
211 public static class HostnameValidator implements CustomPreferenceValidator {
212 @Override
213 public boolean isValid(String value) {
214 if (TextUtils.isEmpty(value)) return true;
215
216 try {
217 URI uri = new URI(null, value, null, null);
218 return true;
219 } catch (URISyntaxException mue) {
220 return false;
221 }
222 }
223 }
224
225 public static class PortValidator implements CustomPreferenceValidator {
226 @Override
227 public boolean isValid(String value) {
228 try {
229 Integer.parseInt(value);
230 return true;
231 } catch (NumberFormatException e) {
232 return false;
233 }
234 }
235 }
236
237 private class SelectionLister implements AdapterView.OnItemSelectedListener {
238
239 @Override
240 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
241 CustomDefaultPreference preference = (CustomDefaultPreference)getPreference();
242 Button positiveButton = ((AlertDialog)getDialog()).getButton(AlertDialog.BUTTON_POSITIVE);
243
244 defaultLabel.setVisibility(position == 0 ? View.VISIBLE : View.GONE);
245 customText.setVisibility(position == 0 ? View.GONE : View.VISIBLE);
246 positiveButton.setEnabled(position == 0 || preference.validator.isValid(customText.getText().toString()));
247 }
248
249 @Override
250 public void onNothingSelected(AdapterView<?> parent) {
251 defaultLabel.setVisibility(View.VISIBLE);
252 customText.setVisibility(View.GONE);
253 }
254 }
255
256 }
257
258
259
260}