Implement a11y UI for Accessibility timeout feature.

This UI control the Accessibility Timeout API in Settings App.
Add a user control to set timeout length to suit their need.

Bug: 119283926
Test: atest AccessibilityTimeoutControllerTest
Test: make RunSettingsRoboTests -j ROBOTEST_FILTER=CodeInspectionTest
Test: atest UniquePreferenceTest
Change-Id: Ic8f7337e6bd7739c1189382cc87d45465b64c6ed
This commit is contained in:
Leon Liao
2018-11-13 20:31:54 +08:00
parent 4864624c3d
commit fc29b1c331
9 changed files with 733 additions and 0 deletions

View File

@@ -697,6 +697,33 @@
<item>Accessibility volume</item> <item>Accessibility volume</item>
</string-array> </string-array>
<!-- Keys for the list of accessibility timeouts xml. -->
<string-array name="accessibility_timeout_content_selector_keys" translatable="false">
<item>accessibility_content_timeout_default</item>
<item>accessibility_content_timeout_10secs</item>
<item>accessibility_content_timeout_30secs</item>
<item>accessibility_content_timeout_1min</item>
<item>accessibility_content_timeout_2mins</item>
</string-array>
<!-- Keys for the list of accessibility timeouts xml. -->
<string-array name="accessibility_timeout_control_selector_keys" translatable="false">
<item>accessibility_control_timeout_default</item>
<item>accessibility_control_timeout_10secs</item>
<item>accessibility_control_timeout_30secs</item>
<item>accessibility_control_timeout_1min</item>
<item>accessibility_control_timeout_2mins</item>
</string-array>
<!-- Values for the list of accessibility timeouts, pairs to Keys . -->
<integer-array name="accessibility_timeout_selector_values" translatable="false">
<item>0</item>
<item>10000</item>
<item>30000</item>
<item>60000</item>
<item>120000</item>
</integer-array>
<!-- Titles for the list of long press timeout options. --> <!-- Titles for the list of long press timeout options. -->
<string-array name="long_press_timeout_selector_titles"> <string-array name="long_press_timeout_selector_titles">
<!-- A title for the option for short long-press timeout [CHAR LIMIT=25] --> <!-- A title for the option for short long-press timeout [CHAR LIMIT=25] -->

View File

@@ -4575,6 +4575,24 @@
<string name="accessibility_toggle_master_mono_title">Mono audio</string> <string name="accessibility_toggle_master_mono_title">Mono audio</string>
<!-- Summary for the accessibility preference for master mono. [CHAR LIMIT=50] --> <!-- Summary for the accessibility preference for master mono. [CHAR LIMIT=50] -->
<string name="accessibility_toggle_master_mono_summary">Combine channels when playing audio</string> <string name="accessibility_toggle_master_mono_summary">Combine channels when playing audio</string>
<!-- Title for accessibility preference to accessibility timeout. [CHAR LIMIT=35] -->
<string name="accessibility_timeout_default">Default</string>
<!-- Title for accessibility preference to accessibility timeout. [CHAR LIMIT=35] -->
<string name="accessibility_timeout_10secs">10 seconds</string>
<!-- Title for accessibility preference to accessibility timeout. [CHAR LIMIT=35] -->
<string name="accessibility_timeout_30secs">30 seconds</string>
<!-- Title for accessibility preference to accessibility timeout. [CHAR LIMIT=35] -->
<string name="accessibility_timeout_1min">1 minute</string>
<!-- Title for accessibility preference to accessibility timeout. [CHAR LIMIT=35] -->
<string name="accessibility_timeout_2mins">2 minutes</string>
<!-- Title for accessibility preference to accessibility message_timeout. [CHAR LIMIT=35] -->
<string name="accessibility_accessibility_content_timeout_preference_title">Content Timeout</string>
<!-- Title for accessibility preference to accessibility message_timeout. [CHAR LIMIT=35] -->
<string name="accessibility_accessibility_control_timeout_preference_title">Control Timeout</string>
<!-- Title for accessibility preference to accessibility message_timeout. [CHAR LIMIT=NONE] -->
<string name="accessibility_accessibility_timeout_preference_summary">Choose how long it takes before automatically disappearing messages go away.\nSome apps may not support this setting yet.</string>
<!-- Title for accessibility preference to choose long-press delay i.e. timeout before it is detected. [CHAR LIMIT=35] --> <!-- Title for accessibility preference to choose long-press delay i.e. timeout before it is detected. [CHAR LIMIT=35] -->
<string name="accessibility_long_press_timeout_preference_title">Touch &amp; hold delay</string> <string name="accessibility_long_press_timeout_preference_title">Touch &amp; hold delay</string>
<!-- Title for the accessibility preference to configure display color inversion. [CHAR LIMIT=NONE] --> <!-- Title for the accessibility preference to configure display color inversion. [CHAR LIMIT=NONE] -->

View File

@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:key="accessibility_content_timeout_preference"
android:title="@string/accessibility_accessibility_content_timeout_preference_title"
android:persistent="false" >
<com.android.settings.widget.VideoPreference
android:key="accessibility_content_timeout_video"
app:animation="@raw/gesture_swipe_up"
app:preview="@drawable/gesture_swipe_up"
android:persistent="false" />
<Preference
android:key="accessibility_content_timeout_summary"
android:selectable="false"
android:enabled="true"
android:summary="@string/accessibility_accessibility_timeout_preference_summary"
android:persistent="false" />
<com.android.settings.widget.RadioButtonPreference
android:key="accessibility_content_timeout_default"
android:title="@string/accessibility_timeout_default"
android:persistent="false" />
<com.android.settings.widget.RadioButtonPreference
android:key="accessibility_content_timeout_10secs"
android:title="@string/accessibility_timeout_10secs"
android:persistent="false" />
<com.android.settings.widget.RadioButtonPreference
android:key="accessibility_content_timeout_30secs"
android:title="@string/accessibility_timeout_30secs"
android:persistent="false" />
<com.android.settings.widget.RadioButtonPreference
android:key="accessibility_content_timeout_1min"
android:title="@string/accessibility_timeout_1min"
android:persistent="false" />
<com.android.settings.widget.RadioButtonPreference
android:key="accessibility_content_timeout_2mins"
android:title="@string/accessibility_timeout_2mins"
android:persistent="false" />
</PreferenceScreen>

View File

@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:key="accessibility_control_timeout_preference"
android:title="@string/accessibility_accessibility_control_timeout_preference_title"
android:persistent="false" >
<com.android.settings.widget.VideoPreference
android:key="accessibility_control_timeout_video"
app:animation="@raw/gesture_swipe_up"
app:preview="@drawable/gesture_swipe_up"
android:persistent="false" />
<Preference
android:key="accessibility_control_timeout_summary"
android:selectable="false"
android:enabled="true"
android:summary="@string/accessibility_accessibility_timeout_preference_summary"
android:persistent="false" />
<com.android.settings.widget.RadioButtonPreference
android:key="accessibility_control_timeout_default"
android:title="@string/accessibility_timeout_default"
android:persistent="false" />
<com.android.settings.widget.RadioButtonPreference
android:key="accessibility_control_timeout_10secs"
android:title="@string/accessibility_timeout_10secs"
android:persistent="false" />
<com.android.settings.widget.RadioButtonPreference
android:key="accessibility_control_timeout_30secs"
android:title="@string/accessibility_timeout_30secs"
android:persistent="false" />
<com.android.settings.widget.RadioButtonPreference
android:key="accessibility_control_timeout_1min"
android:title="@string/accessibility_timeout_1min"
android:persistent="false" />
<com.android.settings.widget.RadioButtonPreference
android:key="accessibility_control_timeout_2mins"
android:title="@string/accessibility_timeout_2mins"
android:persistent="false" />
</PreferenceScreen>

View File

@@ -71,6 +71,14 @@
<SwitchPreference <SwitchPreference
android:key="toggle_disable_animations" android:key="toggle_disable_animations"
android:title="@string/accessibility_disable_animations" /> android:title="@string/accessibility_disable_animations" />
<Preference
android:fragment="com.android.settings.accessibility.AccessibilityContentTimeoutPreferenceFragment"
android:key="accessibility_content_timeout_preference_fragment"
android:title="@string/accessibility_accessibility_content_timeout_preference_title"
android:icon="@drawable/ic_accessibility_generic"
android:persistent="false" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory
@@ -100,6 +108,13 @@
android:entryValues="@array/long_press_timeout_selector_values" android:entryValues="@array/long_press_timeout_selector_values"
android:persistent="false"/> android:persistent="false"/>
<Preference
android:fragment="com.android.settings.accessibility.AccessibilityControlTimeoutPreferenceFragment"
android:key="accessibility_control_timeout_preference_fragment"
android:title="@string/accessibility_accessibility_control_timeout_preference_title"
android:icon="@drawable/ic_accessibility_generic"
android:persistent="false" />
<Preference <Preference
android:fragment="com.android.settings.accessibility.VibrationSettings" android:fragment="com.android.settings.accessibility.VibrationSettings"
android:key="vibration_preference_screen" android:key="vibration_preference_screen"

View File

@@ -0,0 +1,130 @@
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.accessibility;
import android.provider.SearchIndexableResource;
import android.content.Context;
import android.content.res.Resources;
import androidx.preference.Preference;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@SearchIndexable
public final class AccessibilityContentTimeoutPreferenceFragment extends DashboardFragment
implements AccessibilityTimeoutController.OnChangeListener {
static final String TAG = "AccessibilityContentTimeoutPreferenceFragment";
private static final List<AbstractPreferenceController> sControllers = new ArrayList<>();
@Override
public void onCheckedChanged(Preference preference) {
for (AbstractPreferenceController controller : sControllers) {
controller.updateState(preference);
}
}
@Override
public void onResume() {
super.onResume();
for (AbstractPreferenceController controller :
buildPreferenceControllers(getPrefContext(), getSettingsLifecycle())) {
((AccessibilityTimeoutController)controller).setOnChangeListener(this);
}
}
@Override
public void onPause() {
super.onPause();
for (AbstractPreferenceController controller :
buildPreferenceControllers(getPrefContext(), getSettingsLifecycle())) {
((AccessibilityTimeoutController)controller).setOnChangeListener(null);
}
}
@Override
public int getMetricsCategory() {
return MetricsEvent.ACCESSIBILITY;
}
@Override
protected String getLogTag() {
return TAG;
}
@Override
protected int getPreferenceScreenResId() {
return R.xml.accessibility_content_timeout_settings;
}
@Override
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getSettingsLifecycle());
}
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
Lifecycle lifecycle) {
if (sControllers.size() == 0) {
Resources resources = context.getResources();
String[] timeoutKeys = resources.getStringArray(
R.array.accessibility_timeout_content_selector_keys);
for (int i=0; i < timeoutKeys.length; i++) {
sControllers.add(new AccessibilityTimeoutController(
context, lifecycle, timeoutKeys[i], TAG));
}
}
return sControllers;
}
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() {
@Override
public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
boolean enabled) {
final SearchIndexableResource sir = new SearchIndexableResource(context);
sir.xmlResId = R.xml.accessibility_content_timeout_settings;
return Arrays.asList(sir);
}
@Override
public List<String> getNonIndexableKeys(Context context) {
final List<String> keys = super.getNonIndexableKeys(context);
return keys;
}
@Override
public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context, null);
}
};
}

View File

@@ -0,0 +1,130 @@
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.accessibility;
import android.provider.SearchIndexableResource;
import android.content.Context;
import android.content.res.Resources;
import androidx.preference.Preference;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@SearchIndexable
public final class AccessibilityControlTimeoutPreferenceFragment extends DashboardFragment
implements AccessibilityTimeoutController.OnChangeListener {
static final String TAG = "AccessibilityControlTimeoutPreferenceFragment";
private static final List<AbstractPreferenceController> sControllers = new ArrayList<>();
@Override
public void onCheckedChanged(Preference preference) {
for (AbstractPreferenceController controller : sControllers) {
controller.updateState(preference);
}
}
@Override
public void onResume() {
super.onResume();
for (AbstractPreferenceController controller :
buildPreferenceControllers(getPrefContext(), getSettingsLifecycle())) {
((AccessibilityTimeoutController)controller).setOnChangeListener(this);
}
}
@Override
public void onPause() {
super.onPause();
for (AbstractPreferenceController controller :
buildPreferenceControllers(getPrefContext(), getSettingsLifecycle())) {
((AccessibilityTimeoutController)controller).setOnChangeListener(null);
}
}
@Override
public int getMetricsCategory() {
return MetricsEvent.ACCESSIBILITY;
}
@Override
protected String getLogTag() {
return TAG;
}
@Override
protected int getPreferenceScreenResId() {
return R.xml.accessibility_control_timeout_settings;
}
@Override
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getSettingsLifecycle());
}
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
Lifecycle lifecycle) {
if (sControllers.size() == 0) {
Resources resources = context.getResources();
String[] timeoutKeys = resources.getStringArray(
R.array.accessibility_timeout_control_selector_keys);
for (int i=0; i < timeoutKeys.length; i++) {
sControllers.add(new AccessibilityTimeoutController(
context, lifecycle, timeoutKeys[i], TAG));
}
}
return sControllers;
}
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() {
@Override
public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
boolean enabled) {
final SearchIndexableResource sir = new SearchIndexableResource(context);
sir.xmlResId = R.xml.accessibility_control_timeout_settings;
return Arrays.asList(sir);
}
@Override
public List<String> getNonIndexableKeys(Context context) {
final List<String> keys = super.getNonIndexableKeys(context);
return keys;
}
@Override
public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context, null);
}
};
}

View File

@@ -0,0 +1,167 @@
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.accessibility;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Resources;
import android.provider.Settings;
import androidx.lifecycle.LifecycleObserver;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.widget.RadioButtonPreference;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import java.lang.Integer;
import java.util.HashMap;
import java.util.Map;
public class AccessibilityTimeoutController extends AbstractPreferenceController implements
LifecycleObserver, RadioButtonPreference.OnClickListener, PreferenceControllerMixin {
// pair the preference key and timeout value
private final Map<String, Integer> mAccessibilityTimeoutKeyToValueMap = new HashMap<>();
private final String mPreferenceKey;
private final String mfragmentTag;
private final ContentResolver mContentResolver;
private final Resources mResources;
private OnChangeListener mOnChangeListener;
private RadioButtonPreference mPreference;
private int mAccessibilityUiTimeoutValue;
public AccessibilityTimeoutController(Context context, Lifecycle lifecycle,
String preferenceKey, String fragmentTag) {
super(context);
mContentResolver = context.getContentResolver();
mResources = context.getResources();
if (lifecycle != null) {
lifecycle.addObserver(this);
}
mPreferenceKey = preferenceKey;
mfragmentTag = fragmentTag;
}
public void setOnChangeListener(OnChangeListener listener) {
mOnChangeListener = listener;
}
private Map<String, Integer> getTimeoutValueToKeyMap() {
if (mAccessibilityTimeoutKeyToValueMap.size() == 0) {
String[] timeoutKeys = null;
if (mfragmentTag.equals(AccessibilityContentTimeoutPreferenceFragment.TAG)) {
timeoutKeys = mResources.getStringArray(
R.array.accessibility_timeout_content_selector_keys);
} else if (mfragmentTag.equals(AccessibilityControlTimeoutPreferenceFragment.TAG)) {
timeoutKeys = mResources.getStringArray(
R.array.accessibility_timeout_control_selector_keys);
}
int[] timeoutValues = mResources.getIntArray(
R.array.accessibility_timeout_selector_values);
final int timeoutValueCount = timeoutValues.length;
for (int i = 0; i < timeoutValueCount; i++) {
mAccessibilityTimeoutKeyToValueMap.put(timeoutKeys[i], timeoutValues[i]);
}
}
return mAccessibilityTimeoutKeyToValueMap;
}
private void putSecureString(String name, String value) {
Settings.Secure.putString(mContentResolver, name, value);
}
private void handlePreferenceChange(String value) {
if (mfragmentTag.equals(AccessibilityContentTimeoutPreferenceFragment.TAG)) {
putSecureString(Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS, value);
} else if (mfragmentTag.equals(AccessibilityControlTimeoutPreferenceFragment.TAG)) {
putSecureString(Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS, value);
}
}
@Override
public boolean isAvailable() {
return true;
}
@Override
public String getPreferenceKey() {
return mPreferenceKey;
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreference = (RadioButtonPreference)
screen.findPreference(getPreferenceKey());
mPreference.setOnClickListener(this);
}
@Override
public void onRadioButtonClicked(RadioButtonPreference preference) {
int value = getTimeoutValueToKeyMap().get(mPreferenceKey);
handlePreferenceChange(String.valueOf(value));
if (mOnChangeListener != null) {
mOnChangeListener.onCheckedChanged(mPreference);
}
}
protected void getAccessibilityUiValue() {
String timeoutValue = null;
if (mfragmentTag.equals(AccessibilityContentTimeoutPreferenceFragment.TAG)) {
timeoutValue = Settings.Secure.getString(mContentResolver,
Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS);
} else if (mfragmentTag.equals(AccessibilityControlTimeoutPreferenceFragment.TAG)) {
timeoutValue = Settings.Secure.getString(mContentResolver,
Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS);
}
mAccessibilityUiTimeoutValue = timeoutValue == null? 0: Integer.parseInt(timeoutValue);
}
protected void updatePreferenceCheckedState(int value) {
if (mAccessibilityUiTimeoutValue == value) {
mPreference.setChecked(true);
}
}
@Override
public void updateState(Preference preference) {
super.updateState(preference);
getAccessibilityUiValue();
// reset RadioButton
mPreference.setChecked(false);
int preferenceValue = getTimeoutValueToKeyMap().get(mPreference.getKey());
updatePreferenceCheckedState(preferenceValue);
}
public static interface OnChangeListener {
void onCheckedChanged(Preference preference);
}
}

View File

@@ -0,0 +1,120 @@
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.accessibility;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.ContentResolver;
import android.content.Context;
import android.provider.Settings;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.widget.RadioButtonPreference;
import com.android.settingslib.core.lifecycle.Lifecycle;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
@RunWith(SettingsRobolectricTestRunner.class)
public class AccessibilityTimeoutControllerTest
implements AccessibilityTimeoutController.OnChangeListener {
private static final String PREF_KEY = "accessibility_content_timeout_30secs";
private static String PREF_TITLE;
private AccessibilityTimeoutController mController;
@Mock
private RadioButtonPreference mMockPref;
private Context mContext;
private ContentResolver mContentResolver;
@Mock
private PreferenceScreen mScreen;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mController = new AccessibilityTimeoutController(mContext, mock(Lifecycle.class),
PREF_KEY, AccessibilityContentTimeoutPreferenceFragment.TAG);
mController.setOnChangeListener(this);
mContentResolver = mContext.getContentResolver();
PREF_TITLE = mContext.getResources().getString(R.string.accessibility_timeout_30secs);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mMockPref);
when(mMockPref.getKey()).thenReturn(PREF_KEY);
when(mMockPref.getTitle()).thenReturn(PREF_TITLE);
mController.displayPreference(mScreen);
}
@Override
public void onCheckedChanged(Preference preference) {
mController.updateState(preference);
}
@Test
public void isAvailable() {
assertTrue(mController.isAvailable());
}
@Test
public void updateState_notChecked() {
Settings.Secure.putString(mContentResolver,
Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS, "0");
mController.updateState(mMockPref);
// the first checked state is seted to false by control
verify(mMockPref).setChecked(false);
verify(mMockPref).setChecked(false);
}
@Test
public void updateState_checked() {
Settings.Secure.putString(mContentResolver,
Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS, "30000");
mController.updateState(mMockPref);
// the first checked state is seted to false by control
verify(mMockPref).setChecked(false);
verify(mMockPref).setChecked(true);
}
@Test
public void onRadioButtonClick() {
mController.onRadioButtonClicked(mMockPref);
String accessibilityUiTimeoutValue = Settings.Secure.getString(mContentResolver,
Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS);
assertThat(accessibilityUiTimeoutValue).isEqualTo("30000");
}
}