summaryrefslogtreecommitdiff
path: root/app/src/main/java/de/danoeh/antennapod/preferences/NumberPickerPreference.java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/preferences/NumberPickerPreference.java')
-rw-r--r--app/src/main/java/de/danoeh/antennapod/preferences/NumberPickerPreference.java106
1 files changed, 106 insertions, 0 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/preferences/NumberPickerPreference.java b/app/src/main/java/de/danoeh/antennapod/preferences/NumberPickerPreference.java
new file mode 100644
index 000000000..20b07e486
--- /dev/null
+++ b/app/src/main/java/de/danoeh/antennapod/preferences/NumberPickerPreference.java
@@ -0,0 +1,106 @@
+package de.danoeh.antennapod.preferences;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.support.v7.preference.Preference;
+import android.text.InputFilter;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.EditText;
+import de.danoeh.antennapod.R;
+
+public class NumberPickerPreference extends Preference {
+ private Context context;
+ private int defaultValue = 0;
+ private int minValue = 0;
+ private int maxValue = Integer.MAX_VALUE;
+
+ public NumberPickerPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ init(context, attrs);
+ }
+
+ public NumberPickerPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init(context, attrs);
+ }
+
+ public NumberPickerPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(context, attrs);
+ }
+
+ public NumberPickerPreference(Context context) {
+ super(context);
+ this.context = context;
+ }
+
+ private void init(Context context, AttributeSet attrs) {
+ this.context = context;
+
+ for (int i = 0; i < attrs.getAttributeCount(); i++) {
+ String name = attrs.getAttributeName(i);
+ String value = attrs.getAttributeValue(i);
+ switch (name) {
+ case "defaultValue":
+ defaultValue = Integer.parseInt(value);
+ break;
+ case "minValue":
+ minValue = Integer.parseInt(value);
+ break;
+ case "maxValue":
+ maxValue = Integer.parseInt(value);
+ break;
+ }
+ }
+ }
+
+ @Override
+ protected void onClick() {
+ super.onClick();
+
+ View view = View.inflate(context, R.layout.numberpicker, null);
+ EditText number = view.findViewById(R.id.number);
+ number.setText(getSharedPreferences().getString(getKey(), ""+defaultValue));
+ number.setFilters(new InputFilter[]{(source, start, end, dest, dstart, dend) -> {
+ try {
+ String newVal = dest.toString().substring(0, dstart) + dest.toString().substring(dend);
+ newVal = newVal.substring(0, dstart) + source.toString() + newVal.substring(dstart);
+ int input = Integer.parseInt(newVal);
+ if (input >= minValue && input <= maxValue) {
+ return null;
+ }
+ } catch (NumberFormatException nfe) {
+ nfe.printStackTrace();
+ }
+ return "";
+ }});
+
+ AlertDialog dialog = new AlertDialog.Builder(context)
+ .setTitle(getTitle())
+ .setView(view)
+ .setNegativeButton(android.R.string.cancel, null)
+ .setPositiveButton(android.R.string.ok, (dialogInterface, i) -> {
+ try {
+ String numberString = number.getText().toString();
+ int value = Integer.parseInt(numberString);
+
+ if (value < minValue || value > maxValue) {
+ return;
+ }
+
+ getSharedPreferences().edit().putString(getKey(), "" + value).apply();
+
+ if (getOnPreferenceChangeListener() != null) {
+ getOnPreferenceChangeListener().onPreferenceChange(this, value);
+ }
+ } catch (NumberFormatException e) {
+ // Do not set value
+ }
+ })
+ .create();
+ dialog.show();
+ dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
+ }
+}