• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 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 package com.android.tv.settings.accessibility;
17 
18 import static com.android.tv.settings.util.InstrumentationUtils.logEntrySelected;
19 
20 import android.app.tvsettings.TvSettingsEnums;
21 import android.content.ContentResolver;
22 import android.content.Context;
23 import android.os.Bundle;
24 import android.provider.Settings;
25 import androidx.annotation.Keep;
26 import androidx.preference.Preference;
27 import androidx.preference.PreferenceScreen;
28 import androidx.lifecycle.ViewModelProvider;
29 import com.android.tv.settings.R;
30 import com.android.tv.settings.RadioPreference;
31 import com.android.tv.settings.SettingsPreferenceFragment;
32 import com.android.tv.settings.accessibility.viewmodel.KeyRepeatViewModel;
33 import com.android.tv.settings.overlay.FlavorUtils;
34 
35 @Keep
36 public class AccessibilityRepeatRateFragment extends SettingsPreferenceFragment
37         implements Preference.OnPreferenceChangeListener {
38     private int mCurrentRepeatRate;
39     private boolean isTwoPanel;
40     private KeyRepeatViewModel viewModel;
41 
42     @Override
onCreatePreferences(Bundle savedInstanceState, String rootKey)43     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
44         setPreferencesFromResource(R.xml.accessibility_repeat_rate, null);
45         viewModel = new ViewModelProvider(requireActivity()).get(KeyRepeatViewModel.class);
46         PreferenceScreen repeatRateScreen = getPreferenceManager().getPreferenceScreen();
47         final Context themedContext = getPreferenceManager().getContext();
48         isTwoPanel = FlavorUtils.isTwoPanel(getContext());
49         final String[] entries =
50                 getContext().getResources().getStringArray(R.array.a11y_repeat_rate_entries);
51         final int[] entryValues =
52                 getContext().getResources().getIntArray(R.array.a11y_repeat_rate_values);
53 
54         // Setting initial repeat rate
55         initRepeatRateValue();
56         for (int i = 0; i < entries.length; i++) {
57             final RadioPreference radioPreference = new RadioPreference(themedContext);
58             radioPreference.setTitle(entries[i]);
59             radioPreference.setKey(String.valueOf(entryValues[i]));
60             radioPreference.setOnPreferenceChangeListener(this);
61             radioPreference.setPersistent(false);
62             if (mCurrentRepeatRate == entryValues[i]) {
63                 radioPreference.setChecked(true);
64             }
65             if (isTwoPanel) {
66                 if (i == 0) {
67                     // Setting information fragment only for default value
68                     radioPreference.setFragment(
69                             AccessibilityKeyRepeatRateInfoFragment.class.getName());
70                 } else {
71                     radioPreference.setFragment(null);
72                 }
73             }
74             repeatRateScreen.addPreference(radioPreference);
75         }
76     }
77 
78     @Override
onPreferenceChange(Preference preference, Object newValue)79     public boolean onPreferenceChange(Preference preference, Object newValue) {
80         RadioPreference radioPreference = (RadioPreference) preference;
81 
82         // Return if current radio button and previous radio button is same
83         if (radioPreference.isChecked()) {
84             return false;
85         }
86 
87         // Clear all previously checked radio buttons
88         PreferenceScreen keyRepeatRateScreen = getPreferenceManager().getPreferenceScreen();
89         radioPreference.clearOtherRadioPreferences(keyRepeatRateScreen);
90 
91         // Setting new repeat rate
92         setRepeatRate(radioPreference);
93 
94         // Setting information fragment
95         final int[] entryValues =
96                 getContext().getResources().getIntArray(R.array.a11y_repeat_rate_values);
97         if (isTwoPanel) {
98             if (mCurrentRepeatRate == entryValues[0]) {
99                 // Setting information fragment only for default value
100                 radioPreference.setFragment(AccessibilityKeyRepeatRateInfoFragment.class.getName());
101             } else {
102                 radioPreference.setFragment(null);
103             }
104         }
105         // Log repeat rate selection
106         logNewRepeatRateTimeoutSelection(mCurrentRepeatRate);
107         return true;
108     }
109 
110     @Override
getPageId()111     protected int getPageId() {
112         return TvSettingsEnums.SYSTEM_A11Y_KEY_REPEAT_RATE;
113     }
114 
logNewRepeatRateTimeoutSelection(int entryValue)115     private void logNewRepeatRateTimeoutSelection(int entryValue) {
116         final int[] a11yRepeatRateOptions = {
117                 TvSettingsEnums.SYSTEM_A11Y_KEY_REPEAT_RATE_DEFAULT,
118                 TvSettingsEnums.SYSTEM_A11Y_KEY_REPEAT_RATE_SLOW,
119                 TvSettingsEnums.SYSTEM_A11Y_KEY_REPEAT_RATE_FAST,
120         };
121         final int[] entryValues =
122                 getContext().getResources().getIntArray(R.array.a11y_repeat_rate_values);
123         for (int i = 0; i < entryValues.length; i++) {
124             if (entryValue == entryValues[i]) {
125                 logEntrySelected(a11yRepeatRateOptions[i]);
126                 return;
127             }
128         }
129     }
130 
131     /** Setting Initial repeat rate. */
initRepeatRateValue()132     private void initRepeatRateValue() {
133         final ContentResolver resolver = getContext().getContentResolver();
134         mCurrentRepeatRate =
135                 Settings.Secure.getInt(
136                         resolver,
137                         Settings.Secure.KEY_REPEAT_DELAY_MS,
138                         getContext().getResources().getInteger(R.integer.key_repeat_rate));
139     }
140 
141     /** Setting repeat rate time */
setRepeatRate(RadioPreference radioPreference)142     private void setRepeatRate(RadioPreference radioPreference) {
143         // Getting new repeat rate value
144         mCurrentRepeatRate = Integer.parseInt(radioPreference.getKey());
145 
146         // Committing new value to content provider
147         final ContentResolver resolver = getContext().getContentResolver();
148         Settings.Secure.putInt(resolver, Settings.Secure.KEY_REPEAT_DELAY_MS, mCurrentRepeatRate);
149 
150         // Setting radio preference with updated value
151         radioPreference.setChecked(true);
152 
153         // Update the summary of delay before repeat row
154         viewModel.setKeyRepeatRateSummary(radioPreference.getTitle().toString());
155     }
156 }
157