abouttreesummaryrefslogcommitdiff
path: root/srcs/juloo.common/SlideBarPreference.java
blob: b41448b24b31a4e2c34e3c8d1f17795517098d57 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package juloo.common;

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));
  }
}