1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package org.chromium.latency.walt; 18 19 import android.content.Context; 20 import android.content.res.TypedArray; 21 import android.os.Bundle; 22 import android.util.AttributeSet; 23 import android.view.View; 24 25 import androidx.annotation.NonNull; 26 import androidx.preference.DialogPreference; 27 import androidx.preference.PreferenceDialogFragmentCompat; 28 29 public class NumberPickerPreference extends DialogPreference { 30 private boolean isInitSet = false; 31 private int currentValue; 32 private int maxValue; 33 private int minValue; 34 35 private static final int DEFAULT_value = 0; 36 private static final int DEFAULT_maxValue = 0; 37 private static final int DEFAULT_minValue = 0; 38 39 private final String defaultSummary; 40 NumberPickerPreference(Context context, AttributeSet attrs)41 public NumberPickerPreference(Context context, AttributeSet attrs) { 42 super(context, attrs); 43 44 defaultSummary = getSummary().toString(); 45 TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.NumberPickerPreference); 46 47 try { 48 maxValue = a.getInt(R.styleable.NumberPickerPreference_maxValue, DEFAULT_maxValue); 49 minValue = a.getInt(R.styleable.NumberPickerPreference_minValue, DEFAULT_minValue); 50 } finally { 51 a.recycle(); 52 } 53 54 setDialogLayoutResource(R.layout.numberpicker_dialog); 55 setPositiveButtonText(android.R.string.ok); 56 setNegativeButtonText(android.R.string.cancel); 57 58 setDialogIcon(null); 59 60 } 61 getValue()62 public int getValue() { 63 return currentValue; 64 } 65 setValue(int value)66 public void setValue(int value) { 67 boolean changed = (currentValue != value); 68 if (changed || !isInitSet) { 69 isInitSet = true; 70 currentValue = value; 71 persistInt(currentValue); 72 setSummary(String.format(defaultSummary, getValue())); 73 } 74 } 75 76 @Override onGetDefaultValue(TypedArray a, int index)77 protected Object onGetDefaultValue(TypedArray a, int index) { 78 return a.getInt(index, DEFAULT_value); 79 } 80 81 @Override onSetInitialValue(Object defaultValue)82 protected void onSetInitialValue(Object defaultValue) { 83 setValue((Integer) defaultValue); 84 } 85 86 public static class NumberPickerPreferenceDialogFragmentCompat 87 extends PreferenceDialogFragmentCompat { 88 private static final String SAVE_STATE_VALUE = "NumberPickerPreferenceDialogFragment.value"; 89 private CustomNumberPicker picker; 90 private int currentValue = 1; 91 NumberPickerPreferenceDialogFragmentCompat()92 public NumberPickerPreferenceDialogFragmentCompat() { 93 } 94 newInstance(String key)95 public static NumberPickerPreferenceDialogFragmentCompat newInstance(String key) { 96 NumberPickerPreferenceDialogFragmentCompat fragment = 97 new NumberPickerPreferenceDialogFragmentCompat(); 98 Bundle b = new Bundle(1); 99 b.putString(ARG_KEY, key); 100 fragment.setArguments(b); 101 return fragment; 102 } 103 onCreate(Bundle savedInstanceState)104 public void onCreate(Bundle savedInstanceState) { 105 super.onCreate(savedInstanceState); 106 if (savedInstanceState == null) { 107 currentValue = getNumberPickerPreference().getValue(); 108 } else { 109 currentValue = savedInstanceState.getInt(SAVE_STATE_VALUE); 110 } 111 } 112 onSaveInstanceState(@onNull Bundle outState)113 public void onSaveInstanceState(@NonNull Bundle outState) { 114 outState.putInt(SAVE_STATE_VALUE, currentValue); 115 } 116 getNumberPickerPreference()117 private NumberPickerPreference getNumberPickerPreference() { 118 return (NumberPickerPreference) this.getPreference(); 119 } 120 121 @Override onBindDialogView(View view)122 protected void onBindDialogView(View view) { 123 super.onBindDialogView(view); 124 picker = (CustomNumberPicker) view.findViewById(R.id.numpicker_pref); 125 picker.setMaxValue(getNumberPickerPreference().maxValue); 126 picker.setMinValue(getNumberPickerPreference().minValue); 127 picker.setValue(currentValue); 128 } 129 130 @Override onDialogClosed(boolean b)131 public void onDialogClosed(boolean b) { 132 if (b) { 133 int value = picker.getValue(); 134 if(getPreference().callChangeListener(value)) { 135 getNumberPickerPreference().setValue(value); 136 } 137 } 138 } 139 } 140 } 141