1 package com.android.deskclock.settings;
2 
3 import android.app.AlertDialog;
4 import android.content.Context;
5 import android.content.res.TypedArray;
6 import android.os.Parcelable;
7 import android.preference.DialogPreference;
8 import android.support.annotation.NonNull;
9 import android.util.AttributeSet;
10 import android.view.View;
11 import android.widget.NumberPicker;
12 import android.widget.TextView;
13 
14 import com.android.deskclock.NumberPickerCompat;
15 import com.android.deskclock.R;
16 
17 /**
18  * A dialog preference that shows a number picker for selecting crescendo length
19  */
20 public final class CrescendoLengthDialog extends DialogPreference {
21 
22     private static final String DEFAULT_CRESCENDO_TIME = "0";
23     private static final int CRESCENDO_TIME_STEP = 5;
24 
25     private NumberPickerCompat mNumberPickerView;
26     private TextView mNumberPickerSecondsView;
27     private int mCrescendoSeconds;
28 
CrescendoLengthDialog(Context context, AttributeSet attrs)29     public CrescendoLengthDialog(Context context, AttributeSet attrs) {
30         super(context, attrs);
31         setDialogLayoutResource(R.layout.crescendo_length_picker);
32         setTitle(R.string.crescendo_duration_title);
33     }
34 
35     @Override
onPrepareDialogBuilder(AlertDialog.Builder builder)36     protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
37         super.onPrepareDialogBuilder(builder);
38         builder.setTitle(getContext().getString(R.string.crescendo_duration_title))
39                 .setCancelable(true);
40     }
41 
42     @Override
onBindDialogView(@onNull View view)43     protected void onBindDialogView(@NonNull View view) {
44         super.onBindDialogView(view);
45 
46         final String[] displayedValues = new String[13];
47         displayedValues[0] = getContext().getString(R.string.no_crescendo_duration);
48         for (int i = 1; i < displayedValues.length; i++) {
49             displayedValues[i] = String.valueOf(i * CRESCENDO_TIME_STEP);
50         }
51 
52         mNumberPickerSecondsView = (TextView) view.findViewById(R.id.title);
53         mNumberPickerSecondsView.setText(getContext().getString(R.string.crescendo_picker_label));
54         mNumberPickerView = (NumberPickerCompat) view.findViewById(R.id.seconds_picker);
55         mNumberPickerView.setDisplayedValues(displayedValues);
56         mNumberPickerView.setMinValue(0);
57         mNumberPickerView.setMaxValue(displayedValues.length - 1);
58         mNumberPickerView.setValue(mCrescendoSeconds / CRESCENDO_TIME_STEP);
59         updateUnits();
60 
61         mNumberPickerView.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
62             @Override
63             public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
64                 updateUnits();
65             }
66         });
67         mNumberPickerView.setOnAnnounceValueChangedListener(
68                 new NumberPickerCompat.OnAnnounceValueChangedListener() {
69             @Override
70             public void onAnnounceValueChanged(NumberPicker picker, int value,
71                     String displayedValue) {
72                 final String announceString;
73                 if (value == 0) {
74                     announceString = getContext().getString(R.string.no_crescendo_duration);
75                 } else {
76                     announceString = getContext().getString(
77                             R.string.crescendo_duration, displayedValue);
78                 }
79                 picker.announceForAccessibility(announceString);
80             }
81         });
82     }
83 
84     @Override
onSetInitialValue(boolean restorePersistedValue, Object defaultValue)85     protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
86         String val;
87         if (restorePersistedValue) {
88             val = getPersistedString(DEFAULT_CRESCENDO_TIME);
89             if (val != null) {
90                 mCrescendoSeconds = Integer.parseInt(val);
91             }
92         } else {
93             val = (String) defaultValue;
94             if (val != null) {
95                 mCrescendoSeconds = Integer.parseInt(val);
96             }
97             persistString(val);
98         }
99     }
100 
101     @Override
onGetDefaultValue(TypedArray a, int index)102     protected Object onGetDefaultValue(TypedArray a, int index) {
103         return a.getString(index);
104     }
105 
106     @Override
onRestoreInstanceState(Parcelable state)107     protected void onRestoreInstanceState(Parcelable state) {
108         // Restore the value to the NumberPicker.
109         super.onRestoreInstanceState(state);
110 
111         // Update the unit display in response to the new value.
112         updateUnits();
113     }
114 
updateUnits()115     private void updateUnits() {
116         if (mNumberPickerView != null) {
117             final int value = mNumberPickerView.getValue();
118             final int visibility = value == 0 ? View.INVISIBLE : View.VISIBLE;
119             mNumberPickerSecondsView.setVisibility(visibility);
120         }
121     }
122 
123     @Override
onDialogClosed(boolean positiveResult)124     protected void onDialogClosed(boolean positiveResult) {
125         if (positiveResult) {
126             mNumberPickerView.clearFocus();
127             mCrescendoSeconds = mNumberPickerView.getValue() * CRESCENDO_TIME_STEP;
128             persistString(Integer.toString(mCrescendoSeconds));
129             setSummary();
130         }
131     }
132 
setSummary()133     public void setSummary() {
134         if (mCrescendoSeconds == 0) {
135             setSummary(getContext().getString(R.string.no_crescendo_duration));
136         } else {
137             setSummary(getContext().getString(R.string.crescendo_duration, mCrescendoSeconds));
138         }
139     }
140 }