abouttreesummaryrefslogcommitdiff
path: root/srcs/juloo.keyboard2/prefs/SlideBarPreference.java
diff options
context:
space:
mode:
Diffstat (limited to 'srcs/juloo.keyboard2/prefs/SlideBarPreference.java')
-rw-r--r--srcs/juloo.keyboard2/prefs/SlideBarPreference.java131
1 files changed, 131 insertions, 0 deletions
diff --git a/srcs/juloo.keyboard2/prefs/SlideBarPreference.java b/srcs/juloo.keyboard2/prefs/SlideBarPreference.java
new file mode 100644
index 0000000..cacf37e
--- /dev/null
+++ b/srcs/juloo.keyboard2/prefs/SlideBarPreference.java
@@ -0,0 +1,131 @@
+package juloo.keyboard2.prefs;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.preference.DialogPreference;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.SeekBar;
+
+/*
+ ** SideBarPreference
+ ** -
+ ** Open a dialog showing a seekbar
+ ** -
+ ** xml attrs:
+ ** android:defaultValue Default value (float)
+ ** min min value (float)
+ ** max max value (float)
+ ** -
+ ** Summary field allow to show the current value using %f or %s flag
+ */
+public class SlideBarPreference extends DialogPreference
+ implements SeekBar.OnSeekBarChangeListener
+{
+ private static final int STEPS = 100;
+
+ private LinearLayout _layout;
+ private TextView _textView;
+ private SeekBar _seekBar;
+
+ private float _min;
+ private float _max;
+ private float _value;
+
+ private String _initialSummary;
+
+ public SlideBarPreference(Context context, AttributeSet attrs)
+ {
+ super(context, attrs);
+ _initialSummary = getSummary().toString();
+ _textView = new TextView(context);
+ _textView.setPadding(48, 40, 48, 40);
+ _seekBar = new SeekBar(context);
+ _seekBar.setOnSeekBarChangeListener(this);
+ _seekBar.setMax(STEPS);
+ _min = float_of_string(attrs.getAttributeValue(null, "min"));
+ _value = _min;
+ _max = Math.max(1f, float_of_string(attrs.getAttributeValue(null, "max")));
+ _layout = new LinearLayout(getContext());
+ _layout.setOrientation(LinearLayout.VERTICAL);
+ _layout.addView(_textView);
+ _layout.addView(_seekBar);
+ }
+
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
+ {
+ _value = Math.round(progress * (_max - _min)) / (float)STEPS + _min;
+ updateText();
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar)
+ {
+ }
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar)
+ {
+ }
+
+ @Override
+ protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue)
+ {
+ if (restorePersistedValue)
+ {
+ _value = getPersistedFloat(_min);
+ }
+ else
+ {
+ _value = (Float)defaultValue;
+ persistFloat(_value);
+ }
+ _seekBar.setProgress((int)((_value - _min) * STEPS / (_max - _min)));
+ updateText();
+ }
+
+ @Override
+ protected Object onGetDefaultValue(TypedArray a, int index)
+ {
+ return (a.getFloat(index, _min));
+ }
+
+ @Override
+ protected void onDialogClosed(boolean positiveResult)
+ {
+ if (positiveResult)
+ persistFloat(_value);
+ else
+ _seekBar.setProgress((int)((getPersistedFloat(_min) - _min) * STEPS / (_max - _min)));
+
+ updateText();
+ }
+
+ protected View onCreateDialogView()
+ {
+ ViewGroup parent = (ViewGroup)_layout.getParent();
+
+ if (parent != null)
+ parent.removeView(_layout);
+ return (_layout);
+ }
+
+ private void updateText()
+ {
+ String f = String.format(_initialSummary, _value);
+
+ _textView.setText(f);
+ setSummary(f);
+ }
+
+ private static float float_of_string(String str)
+ {
+ if (str == null)
+ return (0f);
+ return (Float.parseFloat(str));
+ }
+}