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