blob: 7bb76faa99c478a96022d96c40c4d1477ca593fe [file] [log] [blame]
Alexandre Lisiona3650992013-11-13 14:19:35 -05001package org.sflphone.views;
2
3/*
4 * Copyright (C) 2011 The CyanogenMod Project
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19import java.lang.reflect.Field;
20
21import org.sflphone.R;
22
23import android.content.Context;
24import android.content.res.TypedArray;
25import android.preference.DialogPreference;
26import android.util.AttributeSet;
27import android.util.Log;
28import android.view.LayoutInflater;
29import android.view.View;
30import android.widget.EditText;
31import android.widget.NumberPicker;
32import android.widget.TextView;
33
34/*
35 * @author Danesh
36 * @author nebkat
37 */
38
39public class DoubleNumberPickerPreference extends DialogPreference {
40 private int mMin1, mMax1, mDefault1;
41 private int mMin2, mMax2, mDefault2;
42
43 private String mMaxExternalKey1, mMinExternalKey1;
44 private String mMaxExternalKey2, mMinExternalKey2;
45
46 private String mPickerTitle1;
47 private String mPickerTitle2;
48
49 private NumberPicker mNumberPicker1;
50 private NumberPicker mNumberPicker2;
51
52 public DoubleNumberPickerPreference(Context context, AttributeSet attrs) {
53 super(context, attrs);
54 // TypedArray dialogType = context.obtainStyledAttributes(attrs,
55 // com.android.internal.R.styleable.DialogPreference, 0, 0);
56 TypedArray doubleNumberPickerType = context.obtainStyledAttributes(attrs, R.styleable.DoubleNumberPickerPreference, 0, 0);
57
58 mMaxExternalKey1 = doubleNumberPickerType.getString(R.styleable.DoubleNumberPickerPreference_maxExternal1);
59 mMinExternalKey1 = doubleNumberPickerType.getString(R.styleable.DoubleNumberPickerPreference_minExternal1);
60 mMaxExternalKey2 = doubleNumberPickerType.getString(R.styleable.DoubleNumberPickerPreference_maxExternal2);
61 mMinExternalKey2 = doubleNumberPickerType.getString(R.styleable.DoubleNumberPickerPreference_minExternal2);
62
63 mPickerTitle1 = doubleNumberPickerType.getString(R.styleable.DoubleNumberPickerPreference_pickerTitle1);
64 mPickerTitle2 = doubleNumberPickerType.getString(R.styleable.DoubleNumberPickerPreference_pickerTitle2);
65
66 mMax1 = doubleNumberPickerType.getInt(R.styleable.DoubleNumberPickerPreference_max1, 5);
67 mMin1 = doubleNumberPickerType.getInt(R.styleable.DoubleNumberPickerPreference_min1, 0);
68 mMax2 = doubleNumberPickerType.getInt(R.styleable.DoubleNumberPickerPreference_max2, 5);
69 mMin2 = doubleNumberPickerType.getInt(R.styleable.DoubleNumberPickerPreference_min2, 0);
70
71 mDefault1 = doubleNumberPickerType.getInt(R.styleable.DoubleNumberPickerPreference_defaultValue1, mMin1);
72 mDefault2 = doubleNumberPickerType.getInt(R.styleable.DoubleNumberPickerPreference_defaultValue2, mMin2);
73
74 // dialogType.recycle();
75 doubleNumberPickerType.recycle();
76 }
77
78 @Override
79 protected View onCreateDialogView() {
80 int max1 = mMax1;
81 int min1 = mMin1;
82 int max2 = mMax2;
83 int min2 = mMin2;
84
85 // External values
86 if (mMaxExternalKey1 != null) {
87 max1 = getSharedPreferences().getInt(mMaxExternalKey1, mMax1);
88 }
89 if (mMinExternalKey1 != null) {
90 min1 = getSharedPreferences().getInt(mMinExternalKey1, mMin1);
91 }
92 if (mMaxExternalKey2 != null) {
93 max2 = getSharedPreferences().getInt(mMaxExternalKey2, mMax2);
94 }
95 if (mMinExternalKey2 != null) {
96 min2 = getSharedPreferences().getInt(mMinExternalKey2, mMin2);
97 }
98
99 LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
100 View view = inflater.inflate(R.layout.double_number_picker_dialog, null);
101
102 mNumberPicker1 = (NumberPicker) view.findViewById(R.id.number_picker_1);
103 mNumberPicker2 = (NumberPicker) view.findViewById(R.id.number_picker_2);
104
105 if (mNumberPicker1 == null || mNumberPicker2 == null) {
106 throw new RuntimeException("mNumberPicker1 or mNumberPicker2 is null!");
107 }
108
109 // Initialize state
110 mNumberPicker1.setWrapSelectorWheel(false);
111 mNumberPicker1.setMaxValue(max1);
112 mNumberPicker1.setMinValue(min1);
113 mNumberPicker1.setValue(getPersistedValue(1));
114 mNumberPicker2.setWrapSelectorWheel(false);
115 mNumberPicker2.setMaxValue(max2);
116 mNumberPicker2.setMinValue(min2);
117 mNumberPicker2.setValue(getPersistedValue(2));
118
119 // Titles
120 TextView pickerTitle1 = (TextView) view.findViewById(R.id.picker_title_1);
121 TextView pickerTitle2 = (TextView) view.findViewById(R.id.picker_title_2);
122
123 if (pickerTitle1 != null && pickerTitle2 != null) {
124 pickerTitle1.setText(mPickerTitle1);
125 pickerTitle2.setText(mPickerTitle2);
126 }
127
128 // No keyboard popup
129 disableTextInput(mNumberPicker1);
130 disableTextInput(mNumberPicker2);
131 // EditText textInput1 = (EditText) mNumberPicker1.findViewById(com.android.internal.R.id.numberpicker_input);
132 // EditText textInput2 = (EditText) mNumberPicker2.findViewById(com.android.internal.R.id.numberpicker_input);
133 // if (textInput1 != null && textInput2 != null) {
134 // textInput1.setCursorVisible(false);
135 // textInput1.setFocusable(false);
136 // textInput1.setFocusableInTouchMode(false);
137 // textInput2.setCursorVisible(false);
138 // textInput2.setFocusable(false);
139 // textInput2.setFocusableInTouchMode(false);
140 // }
141
142 return view;
143 }
144
145 private int getPersistedValue(int value) {
146 String[] values = getPersistedString(mDefault1 + "|" + mDefault2).split("\\|");
147 if (value == 1) {
148 try {
149 return Integer.parseInt(values[0]);
150 } catch (NumberFormatException e) {
151 return mDefault1;
152 }
153 } else {
154 try {
155 return Integer.parseInt(values[1]);
156 } catch (NumberFormatException e) {
157 return mDefault2;
158 }
159 }
160 }
161
162 @Override
163 protected void onDialogClosed(boolean positiveResult) {
164 if (positiveResult) {
165 persistString(mNumberPicker1.getValue() + "|" + mNumberPicker2.getValue());
166 getOnPreferenceChangeListener().onPreferenceChange(this, mNumberPicker1.getValue()+""+mNumberPicker2.getValue());
167 }
168 }
169
170 public void setMin1(int min) {
171 mMin1 = min;
172 }
173
174 public void setMax1(int max) {
175 mMax1 = max;
176 }
177
178 public void setMin2(int min) {
179 mMin2 = min;
180 }
181
182 public void setMax2(int max) {
183 mMax2 = max;
184 }
185
186 public void setDefault1(int def) {
187 mDefault1 = def;
188 }
189
190 public void setDefault2(int def) {
191 mDefault2 = def;
192 }
193
194 /*
195 * reflection of NumberPicker.java verified in 4.1, 4.2
196 */
197 private void disableTextInput(NumberPicker np) {
198 if (np == null)
199 return;
200 Class<?> classType = np.getClass();
201 Field inputTextField;
202 try {
203 inputTextField = classType.getDeclaredField("mInputText");
204 inputTextField.setAccessible(true);
205 EditText textInput = (EditText) inputTextField.get(np);
206 if (textInput != null) {
207 textInput.setCursorVisible(false);
208 textInput.setFocusable(false);
209 textInput.setFocusableInTouchMode(false);
210 }
211 } catch (Exception e) {
212 Log.d("trebuchet", "DoubleNumberPickerPreference disableTextInput error", e);
213 }
214 }
215
216}