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