Merge "Refactor AccessibilityControlTimeoutPreferenceFragment to improve maintainability"
diff --git a/res/xml/accessibility_control_timeout_settings.xml b/res/xml/accessibility_control_timeout_settings.xml
index 3cd0dd6..5a1bd17 100644
--- a/res/xml/accessibility_control_timeout_settings.xml
+++ b/res/xml/accessibility_control_timeout_settings.xml
@@ -18,13 +18,11 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
- android:title="@string/accessibility_control_timeout_preference_title"
- android:persistent="false" >
+ android:title="@string/accessibility_control_timeout_preference_title">
<com.android.settingslib.widget.TopIntroPreference
android:key="accessibility_control_timeout_intro"
- android:persistent="false"
- android:title="@string/accessibility_control_timeout_preference_intro_text" />
+ android:title="@string/accessibility_control_timeout_preference_intro_text"/>
<com.android.settingslib.widget.IllustrationPreference
android:key="accessibility_control_timeout_banner"
@@ -33,32 +31,31 @@
<com.android.settingslib.widget.SelectorWithWidgetPreference
android:key="accessibility_control_timeout_default"
android:title="@string/accessibility_timeout_default"
- android:persistent="false" />
+ settings:controller="com.android.settings.accessibility.AccessibilityTimeoutController"/>
<com.android.settingslib.widget.SelectorWithWidgetPreference
android:key="accessibility_control_timeout_10secs"
android:title="@string/accessibility_timeout_10secs"
- android:persistent="false" />
+ settings:controller="com.android.settings.accessibility.AccessibilityTimeoutController"/>
<com.android.settingslib.widget.SelectorWithWidgetPreference
android:key="accessibility_control_timeout_30secs"
android:title="@string/accessibility_timeout_30secs"
- android:persistent="false" />
+ settings:controller="com.android.settings.accessibility.AccessibilityTimeoutController"/>
<com.android.settingslib.widget.SelectorWithWidgetPreference
android:key="accessibility_control_timeout_1min"
android:title="@string/accessibility_timeout_1min"
- android:persistent="false" />
+ settings:controller="com.android.settings.accessibility.AccessibilityTimeoutController"/>
<com.android.settingslib.widget.SelectorWithWidgetPreference
android:key="accessibility_control_timeout_2mins"
android:title="@string/accessibility_timeout_2mins"
- android:persistent="false" />
+ settings:controller="com.android.settings.accessibility.AccessibilityTimeoutController"/>
<com.android.settings.accessibility.AccessibilityFooterPreference
android:key="accessibility_control_timeout_footer"
android:title="@string/accessibility_control_timeout_preference_summary"
- android:persistent="false"
android:selectable="false"
settings:searchable="false"
settings:controller="com.android.settings.accessibility.AccessibilityControlTimeoutFooterPreferenceController"/>
diff --git a/src/com/android/settings/accessibility/AccessibilityControlTimeoutPreferenceFragment.java b/src/com/android/settings/accessibility/AccessibilityControlTimeoutPreferenceFragment.java
index c7a9b10..d7e33ae 100644
--- a/src/com/android/settings/accessibility/AccessibilityControlTimeoutPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/AccessibilityControlTimeoutPreferenceFragment.java
@@ -17,55 +17,17 @@
package com.android.settings.accessibility;
import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.content.res.Resources;
-
-import androidx.preference.Preference;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
-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.List;
-
/** Settings fragment containing accessibility control timeout preference. */
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
-public final class AccessibilityControlTimeoutPreferenceFragment extends DashboardFragment
- implements AccessibilityTimeoutController.OnChangeListener {
+public final class AccessibilityControlTimeoutPreferenceFragment extends DashboardFragment {
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() {
@@ -83,38 +45,10 @@
}
@Override
- protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
- return buildPreferenceControllers(context, getSettingsLifecycle());
- }
-
- @Override
public int getHelpResource() {
return R.string.help_url_timeout;
}
- 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]));
- }
- }
- return sControllers;
- }
-
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
- new BaseSearchIndexProvider(R.xml.accessibility_control_timeout_settings) {
-
- @Override
- public List<AbstractPreferenceController> createPreferenceControllers(
- Context context) {
- return buildPreferenceControllers(context, null);
- }
- };
+ new BaseSearchIndexProvider(R.xml.accessibility_control_timeout_settings);
}
diff --git a/src/com/android/settings/accessibility/AccessibilityTimeoutController.java b/src/com/android/settings/accessibility/AccessibilityTimeoutController.java
index 2d624c3..b306cd8 100644
--- a/src/com/android/settings/accessibility/AccessibilityTimeoutController.java
+++ b/src/com/android/settings/accessibility/AccessibilityTimeoutController.java
@@ -19,79 +19,114 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Looper;
import android.provider.Settings;
-import androidx.lifecycle.LifecycleObserver;
+import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
import com.android.settingslib.widget.SelectorWithWidgetPreference;
-import com.google.common.primitives.Ints;
-
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
-/**
- * Controller class that control accessibility time out settings.
- */
-public class AccessibilityTimeoutController extends AbstractPreferenceController implements
- LifecycleObserver, SelectorWithWidgetPreference.OnClickListener, PreferenceControllerMixin {
- static final String CONTENT_TIMEOUT_SETTINGS_SECURE =
- Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS;
- static final String CONTROL_TIMEOUT_SETTINGS_SECURE =
- Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS;
+/** Controller class that control accessibility timeout settings. */
+public class AccessibilityTimeoutController extends BasePreferenceController implements
+ LifecycleObserver, OnStart, OnStop , SelectorWithWidgetPreference.OnClickListener {
+
+ private static final List<String> ACCESSIBILITY_TIMEOUT_FEATURE_KEYS = Arrays.asList(
+ Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS,
+ Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS
+ );
// pair the preference key and timeout value.
private final Map<String, Integer> mAccessibilityTimeoutKeyToValueMap = new HashMap<>();
-
// RadioButtonPreference key, each preference represent a timeout value.
- private final String mPreferenceKey;
private final ContentResolver mContentResolver;
private final Resources mResources;
- private OnChangeListener mOnChangeListener;
private SelectorWithWidgetPreference mPreference;
private int mAccessibilityUiTimeoutValue;
+ private AccessibilitySettingsContentObserver mSettingsContentObserver;
- public AccessibilityTimeoutController(Context context, Lifecycle lifecycle,
- String preferenceKey) {
- super(context);
-
+ public AccessibilityTimeoutController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
mContentResolver = context.getContentResolver();
mResources = context.getResources();
-
- if (lifecycle != null) {
- lifecycle.addObserver(this);
- }
- mPreferenceKey = preferenceKey;
+ mSettingsContentObserver = new AccessibilitySettingsContentObserver(
+ new Handler(Looper.getMainLooper()));
+ mSettingsContentObserver.registerKeysToObserverCallback(ACCESSIBILITY_TIMEOUT_FEATURE_KEYS,
+ key -> updateState(mPreference));
}
- protected static int getSecureAccessibilityTimeoutValue(ContentResolver resolver, String name) {
- String timeOutSec = Settings.Secure.getString(resolver, name);
- if (timeOutSec == null) {
- return 0;
- }
- Integer timeOutValue = Ints.tryParse(timeOutSec);
- return timeOutValue == null ? 0 : timeOutValue;
+ @VisibleForTesting
+ AccessibilityTimeoutController(Context context, String preferenceKey,
+ AccessibilitySettingsContentObserver contentObserver) {
+ this(context, preferenceKey);
+ mSettingsContentObserver = contentObserver;
}
- public void setOnChangeListener(OnChangeListener listener) {
- mOnChangeListener = listener;
+ @Override
+ public void onStart() {
+ mSettingsContentObserver.register(mContentResolver);
+ }
+
+ @Override
+ public void onStop() {
+ mSettingsContentObserver.unregister(mContentResolver);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mPreference = screen.findPreference(getPreferenceKey());
+ mPreference.setOnClickListener(this);
+ }
+
+ @Override
+ public void onRadioButtonClicked(SelectorWithWidgetPreference preference) {
+ final String value = String.valueOf(getTimeoutValueToKeyMap().get(mPreferenceKey));
+
+ // save value to both content and control timeout setting.
+ Settings.Secure.putString(mContentResolver,
+ Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS, value);
+ Settings.Secure.putString(mContentResolver,
+ Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS, value);
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ super.updateState(preference);
+ mAccessibilityUiTimeoutValue = AccessibilityTimeoutUtils.getSecureAccessibilityTimeoutValue(
+ mContentResolver);
+
+ // reset RadioButton
+ mPreference.setChecked(false);
+ final int preferenceValue = getTimeoutValueToKeyMap().get(mPreference.getKey());
+ if (mAccessibilityUiTimeoutValue == preferenceValue) {
+ mPreference.setChecked(true);
+ }
}
private Map<String, Integer> getTimeoutValueToKeyMap() {
if (mAccessibilityTimeoutKeyToValueMap.size() == 0) {
-
String[] timeoutKeys = mResources.getStringArray(
R.array.accessibility_timeout_control_selector_keys);
-
- int[] timeoutValues = mResources.getIntArray(
+ final 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]);
@@ -99,77 +134,4 @@
}
return mAccessibilityTimeoutKeyToValueMap;
}
-
- private void putSecureString(String name, String value) {
- Settings.Secure.putString(mContentResolver, name, value);
- }
-
- private void handlePreferenceChange(String value) {
- // save value to both content and control timeout setting.
- putSecureString(Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS, value);
- 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 = (SelectorWithWidgetPreference)
- screen.findPreference(getPreferenceKey());
- mPreference.setOnClickListener(this);
- }
-
- @Override
- public void onRadioButtonClicked(SelectorWithWidgetPreference preference) {
- int value = getTimeoutValueToKeyMap().get(mPreferenceKey);
- handlePreferenceChange(String.valueOf(value));
- if (mOnChangeListener != null) {
- mOnChangeListener.onCheckedChanged(mPreference);
- }
- }
-
- private int getAccessibilityTimeoutValue() {
- // get accessibility control timeout value
- int timeoutValue = getSecureAccessibilityTimeoutValue(mContentResolver,
- CONTROL_TIMEOUT_SETTINGS_SECURE);
- return timeoutValue;
- }
-
- protected void updatePreferenceCheckedState(int value) {
- if (mAccessibilityUiTimeoutValue == value) {
- mPreference.setChecked(true);
- }
- }
-
- @Override
- public void updateState(Preference preference) {
- super.updateState(preference);
-
- mAccessibilityUiTimeoutValue = getAccessibilityTimeoutValue();
-
- // reset RadioButton
- mPreference.setChecked(false);
- int preferenceValue = getTimeoutValueToKeyMap().get(mPreference.getKey());
- updatePreferenceCheckedState(preferenceValue);
- }
-
- /**
- * Listener interface handles checked event.
- */
- public interface OnChangeListener {
- /**
- * A hook that is called when preference checked.
- */
- void onCheckedChanged(Preference preference);
- }
}
diff --git a/src/com/android/settings/accessibility/AccessibilityTimeoutPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityTimeoutPreferenceController.java
index e7b0e3c..d703a92 100644
--- a/src/com/android/settings/accessibility/AccessibilityTimeoutPreferenceController.java
+++ b/src/com/android/settings/accessibility/AccessibilityTimeoutPreferenceController.java
@@ -16,17 +16,25 @@
package com.android.settings.accessibility;
+import android.content.ContentResolver;
import android.content.Context;
+import android.content.res.Resources;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.google.common.primitives.Ints;
+/** Preference controller for accessibility timeout. */
public class AccessibilityTimeoutPreferenceController extends BasePreferenceController {
+ private final ContentResolver mContentResolver;
+ private final Resources mResources;
+
public AccessibilityTimeoutPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
+ mContentResolver = mContext.getContentResolver();
+ mResources = mContext.getResources();
}
@Override
@@ -36,14 +44,13 @@
@Override
public CharSequence getSummary() {
- final String[] timeoutSummarys = mContext.getResources().getStringArray(
+ final String[] timeoutSummaries = mResources.getStringArray(
R.array.accessibility_timeout_summaries);
- final int[] timeoutValues = mContext.getResources().getIntArray(
+ final int[] timeoutValues = mResources.getIntArray(
R.array.accessibility_timeout_selector_values);
- final int timeoutValue = AccessibilityTimeoutController.getSecureAccessibilityTimeoutValue(
- mContext.getContentResolver(),
- AccessibilityTimeoutController.CONTROL_TIMEOUT_SETTINGS_SECURE);
+ final int timeoutValue = AccessibilityTimeoutUtils.getSecureAccessibilityTimeoutValue(
+ mContentResolver);
final int idx = Ints.indexOf(timeoutValues, timeoutValue);
- return timeoutSummarys[idx == -1 ? 0 : idx];
+ return timeoutSummaries[idx == -1 ? 0 : idx];
}
}
diff --git a/src/com/android/settings/accessibility/AccessibilityTimeoutUtils.java b/src/com/android/settings/accessibility/AccessibilityTimeoutUtils.java
new file mode 100644
index 0000000..b738688
--- /dev/null
+++ b/src/com/android/settings/accessibility/AccessibilityTimeoutUtils.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2022 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.provider.Settings;
+
+import com.google.common.primitives.Ints;
+
+/** Provides utility methods to accessibility timeout. */
+public final class AccessibilityTimeoutUtils {
+
+ /**
+ * Gets accessibility control timeout value.
+ *
+ * @param resolver the resolver to use
+ * @return accessibility control timeout value
+ */
+ public static int getSecureAccessibilityTimeoutValue(ContentResolver resolver) {
+ final String timeOutSec = Settings.Secure.getString(resolver,
+ Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS);
+ if (timeOutSec == null) {
+ return 0;
+ }
+ Integer timeOutValue = Ints.tryParse(timeOutSec);
+ return timeOutValue == null ? 0 : timeOutValue;
+ }
+
+ private AccessibilityTimeoutUtils(){}
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityControlTimeoutPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityControlTimeoutPreferenceFragmentTest.java
new file mode 100644
index 0000000..97407bb
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityControlTimeoutPreferenceFragmentTest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2022 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 android.app.settings.SettingsEnums;
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+import com.android.settings.testutils.XmlTestUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+import java.util.List;
+
+/** Tests for {@link AccessibilityControlTimeoutPreferenceFragment}. */
+@RunWith(RobolectricTestRunner.class)
+public class AccessibilityControlTimeoutPreferenceFragmentTest {
+
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ private AccessibilityControlTimeoutPreferenceFragment mFragment;
+
+ @Before
+ public void setUp() {
+ mFragment = new AccessibilityControlTimeoutPreferenceFragment();
+ }
+
+ @Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.ACCESSIBILITY_TIMEOUT);
+ }
+
+ @Test
+ public void getPreferenceScreenResId_returnsCorrectXml() {
+ assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(
+ R.xml.accessibility_control_timeout_settings);
+ }
+
+ @Test
+ public void getHelpResource_returnsCorrectHelpResource() {
+ assertThat(mFragment.getHelpResource()).isEqualTo(R.string.help_url_timeout);
+ }
+
+ @Test
+ public void getLogTag_returnsCorrectTag() {
+ assertThat(mFragment.getLogTag()).isEqualTo(
+ "AccessibilityControlTimeoutPreferenceFragment");
+ }
+
+ @Test
+ public void getNonIndexableKeys_existInXmlLayout() {
+ final List<String> niks =
+ AccessibilityControlTimeoutPreferenceFragment.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(mContext);
+ final List<String> keys =
+ XmlTestUtils.getKeysFromPreferenceXml(mContext,
+ R.xml.accessibility_control_timeout_settings);
+
+ assertThat(keys).containsAtLeastElementsIn(niks);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityTimeoutControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityTimeoutControllerTest.java
index fc9fefb..9f0b046 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityTimeoutControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityTimeoutControllerTest.java
@@ -18,8 +18,6 @@
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;
@@ -27,59 +25,57 @@
import android.content.Context;
import android.provider.Settings;
-import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R;
-import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.widget.SelectorWithWidgetPreference;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
+/** Tests for {@link AccessibilityTimeoutController}. */
@RunWith(RobolectricTestRunner.class)
-public class AccessibilityTimeoutControllerTest
- implements AccessibilityTimeoutController.OnChangeListener {
+public class AccessibilityTimeoutControllerTest {
+
private static final String PREF_KEY = "accessibility_control_timeout_30secs";
- private AccessibilityTimeoutController mController;
-
+ @Rule
+ public final MockitoRule mMockitoRule = MockitoJUnit.rule();
@Mock
private SelectorWithWidgetPreference mMockPref;
- private Context mContext;
- private ContentResolver mContentResolver;
-
@Mock
private PreferenceScreen mScreen;
+ @Mock
+ private AccessibilitySettingsContentObserver mAccessibilitySettingsContentObserver;
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private ContentResolver mContentResolver;
+ private AccessibilityTimeoutController mController;
@Before
public void setup() {
- MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
- mController = new AccessibilityTimeoutController(mContext, mock(Lifecycle.class), PREF_KEY);
- mController.setOnChangeListener(this);
mContentResolver = mContext.getContentResolver();
- String prefTitle = mContext.getResources().getString(R.string.accessibility_timeout_30secs);
-
+ mController = new AccessibilityTimeoutController(mContext, PREF_KEY,
+ mAccessibilitySettingsContentObserver);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mMockPref);
when(mMockPref.getKey()).thenReturn(PREF_KEY);
+ final String prefTitle =
+ mContext.getResources().getString(R.string.accessibility_timeout_30secs);
when(mMockPref.getTitle()).thenReturn(prefTitle);
mController.displayPreference(mScreen);
}
- @Override
- public void onCheckedChanged(Preference preference) {
- mController.updateState(preference);
- }
-
@Test
- public void isAvailable() {
- assertTrue(mController.isAvailable());
+ public void getAvailabilityStatus_shouldReturnAvailable() {
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(
+ BasePreferenceController.AVAILABLE);
}
@Test
@@ -115,4 +111,18 @@
assertThat(accessibilityUiTimeoutValue).isEqualTo("30000");
}
+
+ @Test
+ public void onStart_registerSpecificContentObserverForSpecificKeys() {
+ mController.onStart();
+
+ verify(mAccessibilitySettingsContentObserver).register(mContentResolver);
+ }
+
+ @Test
+ public void onStop_unregisterContentObserver() {
+ mController.onStop();
+
+ verify(mAccessibilitySettingsContentObserver).unregister(mContentResolver);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityTimeoutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityTimeoutPreferenceControllerTest.java
index 50f311e..1e0dbf2 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityTimeoutPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityTimeoutPreferenceControllerTest.java
@@ -21,6 +21,8 @@
import android.content.Context;
import android.provider.Settings;
+import androidx.test.core.app.ApplicationProvider;
+
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
@@ -28,17 +30,16 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
+/** Tests for {@link AccessibilityTimeoutPreferenceController}. */
@RunWith(RobolectricTestRunner.class)
public class AccessibilityTimeoutPreferenceControllerTest {
- private Context mContext;
+ private Context mContext = ApplicationProvider.getApplicationContext();
private AccessibilityTimeoutPreferenceController mController;
@Before
public void setUp() {
- mContext = RuntimeEnvironment.application;
mController = new AccessibilityTimeoutPreferenceController(mContext, "control_timeout");
}
@@ -50,31 +51,31 @@
@Test
public void getSummary_byDefault_shouldReturnDefaultSummary() {
- final String[] timeoutSummarys = mContext.getResources().getStringArray(
+ final String[] timeoutSummaries = mContext.getResources().getStringArray(
R.array.accessibility_timeout_summaries);
Settings.Secure.putString(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS, "0");
- assertThat(mController.getSummary()).isEqualTo(timeoutSummarys[0]);
+ assertThat(mController.getSummary().toString()).isEqualTo(timeoutSummaries[0]);
}
@Test
public void getSummary_invalidTimeout_shouldReturnDefaultSummary() {
- final String[] timeoutSummarys = mContext.getResources().getStringArray(
+ final String[] timeoutSummaries = mContext.getResources().getStringArray(
R.array.accessibility_timeout_summaries);
Settings.Secure.putString(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS, "invalid_timeout");
- assertThat(mController.getSummary()).isEqualTo(timeoutSummarys[0]);
+ assertThat(mController.getSummary().toString()).isEqualTo(timeoutSummaries[0]);
}
@Test
public void getSummary_validTimeout_shouldReturnValidSummary() {
- final String[] timeoutSummarys = mContext.getResources().getStringArray(
+ final String[] timeoutSummaries = mContext.getResources().getStringArray(
R.array.accessibility_timeout_summaries);
Settings.Secure.putString(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS, "60000");
- assertThat(mController.getSummary()).isEqualTo(timeoutSummarys[3]);
+ assertThat(mController.getSummary().toString()).isEqualTo(timeoutSummaries[3]);
}
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityTimeoutUtilsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityTimeoutUtilsTest.java
new file mode 100644
index 0000000..4443162
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityTimeoutUtilsTest.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2022 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 android.content.Context;
+import android.provider.Settings;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+/** Tests for {@link AccessibilityTimeoutUtils}. */
+@RunWith(RobolectricTestRunner.class)
+public final class AccessibilityTimeoutUtilsTest {
+
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+
+ @Test
+ public void getSecureAccessibilityTimeoutValue_byDefault_shouldReturnDefaultValue() {
+ Settings.Secure.putString(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS, "0");
+
+ final int timeOutValue = AccessibilityTimeoutUtils.getSecureAccessibilityTimeoutValue(
+ mContext.getContentResolver());
+ assertThat(timeOutValue).isEqualTo(0);
+ }
+
+ @Test
+ public void getSecureAccessibilityTimeoutValue_invalidTimeout_shouldReturnDefaultValue() {
+ Settings.Secure.putString(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS, "invalid_timeout");
+
+ final int timeOutValue = AccessibilityTimeoutUtils.getSecureAccessibilityTimeoutValue(
+ mContext.getContentResolver());
+ assertThat(timeOutValue).isEqualTo(0);
+ }
+
+ @Test
+ public void getSecureAccessibilityTimeoutValue_validTimeout_shouldReturnValidValue() {
+ Settings.Secure.putString(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS, "60000");
+
+ final int timeOutValue = AccessibilityTimeoutUtils.getSecureAccessibilityTimeoutValue(
+ mContext.getContentResolver());
+ assertThat(timeOutValue).isEqualTo(60000);
+ }
+}