From 9fee2110c792ace57bfc82a70f1b41dc50905b4b Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Wed, 26 Sep 2018 16:59:51 +0200 Subject: Implemented number picker preference --- .../preferences/NumberPickerPreference.java | 106 +++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 app/src/main/java/de/danoeh/antennapod/preferences/NumberPickerPreference.java (limited to 'app/src/main/java/de/danoeh/antennapod/preferences/NumberPickerPreference.java') 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); + } +} -- cgit v1.2.3