Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2457f46f authored by Leon Liao's avatar Leon Liao
Browse files

Add summary with accessibility timeout item

Add summary with accessibility timeout item in Accessibility
Settings. This summary describe its level to time limit of
Accessibility timeout feature.

Bug: 119283926
Test: atest AccessibilitySettingsTest
Test: atest AccessibilityTimeoutControllerTest
Test: make RunSettingsRoboTests
Change-Id: I86c096e6f4adb62150e1ff2af4c22afac240b41e
parent 2315e7b7
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -701,6 +701,15 @@
        <item>120000</item>
    </integer-array>

    <!-- Summaries of accessibility timeout, pairs to Values -->
    <string-array name="accessibility_timeout_summaries" translatable="false">
        <item>@string/accessibility_timeout_default</item>
        <item>@string/accessibility_timeout_10secs</item>
        <item>@string/accessibility_timeout_30secs</item>
        <item>@string/accessibility_timeout_1min</item>
        <item>@string/accessibility_timeout_2mins</item>
    </string-array>

    <!-- Titles for the list of long press timeout options. -->
    <string-array name="long_press_timeout_selector_titles">
        <!-- A title for the option for short long-press timeout [CHAR LIMIT=25] -->
+33 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static android.os.Vibrator.VibrationIntensity;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
@@ -63,6 +64,8 @@ import com.android.settingslib.RestrictedPreference;
import com.android.settingslib.accessibility.AccessibilityUtils;
import com.android.settingslib.search.SearchIndexable;

import com.google.common.primitives.Ints;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@@ -125,6 +128,11 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
            "vibration_preference_screen";
    private static final String DISPLAY_DALTONIZER_PREFERENCE_SCREEN =
            "daltonizer_preference";
    private static final String ACCESSIBILITY_CONTENT_TIMEOUT_PREFERENCE =
            "accessibility_content_timeout_preference_fragment";
    private static final String ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE =
            "accessibility_control_timeout_preference_fragment";


    // Extras passed to sub-fragments.
    static final String EXTRA_PREFERENCE_KEY = "preference_key";
@@ -718,6 +726,31 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
        updateAutoclickSummary(mAutoclickPreferenceScreen);

        updateAccessibilityShortcut(mAccessibilityShortcutPreferenceScreen);

        updateAccessibilityTimeoutSummary(getContentResolver(),
                findPreference(ACCESSIBILITY_CONTENT_TIMEOUT_PREFERENCE));
        updateAccessibilityTimeoutSummary(getContentResolver(),
                findPreference(ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE));
    }

    void updateAccessibilityTimeoutSummary(ContentResolver resolver, Preference pref) {

        String[] timeoutSummarys = getResources().getStringArray(
                R.array.accessibility_timeout_summaries);
        int[] timeoutValues = getResources().getIntArray(
                R.array.accessibility_timeout_selector_values);

        int timeoutValue = 0;
        if (pref.getKey().equals(ACCESSIBILITY_CONTENT_TIMEOUT_PREFERENCE)) {
            timeoutValue = AccessibilityTimeoutController.getSecureAccessibilityTimeoutValue(
                    resolver, AccessibilityTimeoutController.CONTENT_TIMEOUT_SETTINGS_SECURE);
        } else if (pref.getKey().equals(ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE)) {
            timeoutValue = AccessibilityTimeoutController.getSecureAccessibilityTimeoutValue(
                    resolver, AccessibilityTimeoutController.CONTROL_TIMEOUT_SETTINGS_SECURE);
        }

        int idx = Ints.indexOf(timeoutValues, timeoutValue);
        pref.setSummary(timeoutSummarys[idx == -1 ? 0 : idx]);
    }

    private void updateMagnificationSummary(Preference pref) {
+26 −10
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@ import com.android.settings.widget.RadioButtonPreference;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;

import com.google.common.primitives.Ints;

import java.lang.Integer;

import java.util.HashMap;
@@ -38,6 +40,10 @@ import java.util.Map;

public class AccessibilityTimeoutController extends AbstractPreferenceController implements
        LifecycleObserver, RadioButtonPreference.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;

    // pair the preference key and timeout value
    private final Map<String, Integer> mAccessibilityTimeoutKeyToValueMap = new HashMap<>();
@@ -64,6 +70,15 @@ public class AccessibilityTimeoutController extends AbstractPreferenceController
        mfragmentTag = fragmentTag;
    }

    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;
    }

    public void setOnChangeListener(OnChangeListener listener) {
        mOnChangeListener = listener;
    }
@@ -131,16 +146,17 @@ public class AccessibilityTimeoutController extends AbstractPreferenceController
        }
    }

    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);
    private int getAccessibilityTimeoutValue(String fragmentTag) {
        int timeoutValue = 0;
        // two kinds of Secure value, one is content timeout, the other is control timeout.
        if (AccessibilityContentTimeoutPreferenceFragment.TAG.equals(fragmentTag)) {
            timeoutValue = getSecureAccessibilityTimeoutValue(mContentResolver,
                    CONTENT_TIMEOUT_SETTINGS_SECURE);
        } else if (AccessibilityControlTimeoutPreferenceFragment.TAG.equals(fragmentTag)) {
            timeoutValue = getSecureAccessibilityTimeoutValue(mContentResolver,
                    CONTROL_TIMEOUT_SETTINGS_SECURE);
        }
        mAccessibilityUiTimeoutValue = timeoutValue == null? 0: Integer.parseInt(timeoutValue);
        return timeoutValue;
    }

    protected void updatePreferenceCheckedState(int value) {
@@ -153,7 +169,7 @@ public class AccessibilityTimeoutController extends AbstractPreferenceController
    public void updateState(Preference preference) {
        super.updateState(preference);

        getAccessibilityUiValue();
        mAccessibilityUiTimeoutValue = getAccessibilityTimeoutValue(mfragmentTag);

        // reset RadioButton
        mPreference.setChecked(false);
+79 −12
Original line number Diff line number Diff line
@@ -18,10 +18,10 @@ package com.android.settings.accessibility;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;

import android.content.ContentResolver;
import android.content.Context;
import android.os.Vibrator;
import android.provider.Settings;
@@ -32,6 +32,7 @@ import com.android.settings.R;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.XmlTestUtils;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
@@ -42,31 +43,43 @@ import java.util.List;

@RunWith(SettingsRobolectricTestRunner.class)
public class AccessibilitySettingsTest {
    private static final String VIBRATION_PREFERENCE_SCREEN = "vibration_preference_screen";
    private static final String ACCESSIBILITY_CONTENT_TIMEOUT_PREFERENCE =
            "accessibility_content_timeout_preference_fragment";
    private static final String ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE =
            "accessibility_control_timeout_preference_fragment";

    private Context mContext;
    private ContentResolver mContentResolver;
    private AccessibilitySettings mSettings;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        mContext = RuntimeEnvironment.application;
        mContentResolver = mContext.getContentResolver();
        mSettings = spy(new AccessibilitySettings());
        doReturn(mContext).when(mSettings).getContext();
    }

    @Test
    public void testNonIndexableKeys_existInXmlLayout() {
        final Context context = RuntimeEnvironment.application;
        final List<String> niks = AccessibilitySettings.SEARCH_INDEX_DATA_PROVIDER
            .getNonIndexableKeys(context);
            .getNonIndexableKeys(mContext);
        final List<String> keys = new ArrayList<>();

        keys.addAll(XmlTestUtils.getKeysFromPreferenceXml(context, R.xml.accessibility_settings));
        keys.addAll(XmlTestUtils.getKeysFromPreferenceXml(mContext, R.xml.accessibility_settings));

        assertThat(keys).containsAllIn(niks);
    }

    @Test
    public void testUpdateVibrationSummary_shouldUpdateSummary() {
        MockitoAnnotations.initMocks(this);
        final Context mContext = RuntimeEnvironment.application;
        final AccessibilitySettings mSettings = spy(new AccessibilitySettings());

        final Preference mVibrationPreferenceScreen = new Preference(mContext);
        doReturn(mVibrationPreferenceScreen).when(mSettings).findPreference(anyString());
        doReturn(mVibrationPreferenceScreen).when(mSettings).findPreference(
                VIBRATION_PREFERENCE_SCREEN);

        doReturn(mContext).when(mSettings).getContext();

        mVibrationPreferenceScreen.setKey("vibration_preference_screen");
        mVibrationPreferenceScreen.setKey(VIBRATION_PREFERENCE_SCREEN);

        Settings.System.putInt(mContext.getContentResolver(),
                Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
@@ -81,4 +94,58 @@ public class AccessibilitySettingsTest {
                VibrationIntensityPreferenceController.getIntensityString(mContext,
                        Vibrator.VIBRATION_INTENSITY_OFF));
    }

    @Test
    public void testUpdateAccessibilityTimeoutSummary_shouldUpdateSummary() {
        String[] testingValues = {null, "0", "10000", "30000", "60000", "120000"};
        int[] exceptedResIds = {R.string.accessibility_timeout_default,
                R.string.accessibility_timeout_default,
                R.string.accessibility_timeout_10secs,
                R.string.accessibility_timeout_30secs,
                R.string.accessibility_timeout_1min,
                R.string.accessibility_timeout_2mins
        };

        for (int i = 0; i < testingValues.length; i++) {
            Settings.Secure.putString(mContentResolver,
                    Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS, testingValues[i]);

            verifyAccessibilityTimeoutSummary(ACCESSIBILITY_CONTENT_TIMEOUT_PREFERENCE,
                    exceptedResIds[i]);

            Settings.Secure.putString(mContentResolver,
                    Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS, testingValues[i]);

            verifyAccessibilityTimeoutSummary(ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE,
                    exceptedResIds[i]);
        }
    }

    @Test
    public void testUpdateAccessibilityControlTimeoutSummary_invalidData_shouldUpdateSummary() {
        String[] testingValues = {"-9009", "98277466643738977979666555536362343", "Hello,a prank"};

        for (String value : testingValues) {
            Settings.Secure.putString(mContentResolver,
                    Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS, value);

            verifyAccessibilityTimeoutSummary(ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE,
                    R.string.accessibility_timeout_default);

            Settings.Secure.putString(mContentResolver,
                    Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS, value);

            verifyAccessibilityTimeoutSummary(ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE,
                    R.string.accessibility_timeout_default);
        }
    }

    private void verifyAccessibilityTimeoutSummary(String preferenceKey, int resId) {
        final Preference preference = new Preference(mContext);
        doReturn(preference).when(mSettings).findPreference(preferenceKey);
        preference.setKey(preferenceKey);
        mSettings.updateAccessibilityTimeoutSummary(mContentResolver, preference);

        assertThat(preference.getSummary()).isEqualTo(mContext.getResources().getString(resId));
    }
}