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

Commit 126de969 authored by Daniel Norman's avatar Daniel Norman
Browse files

Use A11yManagerService to check if the A11yService warning is required.

Bug: 303511250
Test: m RunSettingsRoboTests ROBOTEST_FILTER=ToggleAccessibilityServicePreferenceFragmentTest
Change-Id: Ibef748bd82ba166e377be0611df113ac09d052bc
parent 9f6e77a0
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -64,7 +64,7 @@ public class InvisibleToggleAccessibilityServicePreferenceFragment extends
    @Override
    void onDialogButtonFromShortcutToggleClicked(View view) {
        super.onDialogButtonFromShortcutToggleClicked(view);
        if (!android.view.accessibility.Flags.deduplicateAccessibilityWarningDialog()) {
        if (!android.view.accessibility.Flags.cleanupAccessibilityWarningDialog()) {
            if (view.getId() == R.id.permission_enable_allow_button) {
                AccessibilityUtils.setAccessibilityServiceState(getContext(), mComponentName,
                        true);
@@ -80,7 +80,7 @@ public class InvisibleToggleAccessibilityServicePreferenceFragment extends
    @Override
    void onAllowButtonFromShortcutToggleClicked() {
        super.onAllowButtonFromShortcutToggleClicked();
        if (android.view.accessibility.Flags.deduplicateAccessibilityWarningDialog()) {
        if (android.view.accessibility.Flags.cleanupAccessibilityWarningDialog()) {
            AccessibilityUtils.setAccessibilityServiceState(getContext(), mComponentName, true);
        }
    }
+29 −8
Original line number Diff line number Diff line
@@ -157,7 +157,7 @@ public class ToggleAccessibilityServicePreferenceFragment extends
                if (info == null) {
                    return null;
                }
                if (android.view.accessibility.Flags.deduplicateAccessibilityWarningDialog()) {
                if (android.view.accessibility.Flags.cleanupAccessibilityWarningDialog()) {
                    mWarningDialog =
                            com.android.internal.accessibility.dialog.AccessibilityServiceWarning
                                    .createAccessibilityServiceWarningDialog(getPrefContext(), info,
@@ -175,7 +175,7 @@ public class ToggleAccessibilityServicePreferenceFragment extends
                if (info == null) {
                    return null;
                }
                if (android.view.accessibility.Flags.deduplicateAccessibilityWarningDialog()) {
                if (android.view.accessibility.Flags.cleanupAccessibilityWarningDialog()) {
                    mWarningDialog =
                            com.android.internal.accessibility.dialog.AccessibilityServiceWarning
                                    .createAccessibilityServiceWarningDialog(getPrefContext(), info,
@@ -193,7 +193,7 @@ public class ToggleAccessibilityServicePreferenceFragment extends
                if (info == null) {
                    return null;
                }
                if (android.view.accessibility.Flags.deduplicateAccessibilityWarningDialog()) {
                if (android.view.accessibility.Flags.cleanupAccessibilityWarningDialog()) {
                    mWarningDialog =
                            com.android.internal.accessibility.dialog.AccessibilityServiceWarning
                                    .createAccessibilityServiceWarningDialog(getPrefContext(), info,
@@ -332,7 +332,14 @@ public class ToggleAccessibilityServicePreferenceFragment extends
        final int shortcutTypes = retrieveUserShortcutType(getPrefContext(),
                mComponentName.flattenToString(), UserShortcutType.SOFTWARE);
        if (preference.isChecked()) {
            if (!mToggleServiceSwitchPreference.isChecked()) {
            final boolean isWarningRequired;
            if (android.view.accessibility.Flags.cleanupAccessibilityWarningDialog()) {
                isWarningRequired = getPrefContext().getSystemService(AccessibilityManager.class)
                        .isAccessibilityServiceWarningRequired(getAccessibilityServiceInfo());
            } else {
                isWarningRequired = !mToggleServiceSwitchPreference.isChecked();
            }
            if (isWarningRequired) {
                preference.setChecked(false);
                showPopupDialog(DialogEnums.ENABLE_WARNING_FROM_SHORTCUT_TOGGLE);
            } else {
@@ -347,9 +354,16 @@ public class ToggleAccessibilityServicePreferenceFragment extends

    @Override
    public void onSettingsClicked(ShortcutPreference preference) {
        final boolean isServiceOnOrShortcutAdded = mShortcutPreference.isChecked()
                || mToggleServiceSwitchPreference.isChecked();
        if (!isServiceOnOrShortcutAdded) {
        final boolean isWarningRequired;
        if (android.view.accessibility.Flags.cleanupAccessibilityWarningDialog()) {
            isWarningRequired = getPrefContext().getSystemService(AccessibilityManager.class)
                    .isAccessibilityServiceWarningRequired(getAccessibilityServiceInfo());
        } else {
            isWarningRequired = !(mShortcutPreference.isChecked()
                    || mToggleServiceSwitchPreference.isChecked());
        }

        if (isWarningRequired) {
            showPopupDialog(DialogEnums.ENABLE_WARNING_FROM_SHORTCUT);
        } else {
            onAllowButtonFromShortcutClicked();
@@ -541,7 +555,14 @@ public class ToggleAccessibilityServicePreferenceFragment extends
            mToggleServiceSwitchPreference.setChecked(false);
            getArguments().putBoolean(AccessibilitySettings.EXTRA_CHECKED,
                    /* disableService */ false);
            if (!mShortcutPreference.isChecked()) {
            final boolean isWarningRequired;
            if (android.view.accessibility.Flags.cleanupAccessibilityWarningDialog()) {
                isWarningRequired = getPrefContext().getSystemService(AccessibilityManager.class)
                        .isAccessibilityServiceWarningRequired(getAccessibilityServiceInfo());
            } else {
                isWarningRequired = !mShortcutPreference.isChecked();
            }
            if (isWarningRequired) {
                showPopupDialog(DialogEnums.ENABLE_WARNING_FROM_TOGGLE);
            } else {
                onAllowButtonFromEnableToggleClicked();
+118 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.settings.accessibility;

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

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
@@ -31,8 +32,13 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.Bundle;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.service.quicksettings.TileService;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.Flags;

import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
@@ -40,8 +46,10 @@ import androidx.test.core.app.ApplicationProvider;

import com.android.settings.R;
import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType;
import com.android.settings.widget.SettingsMainSwitchPreference;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
@@ -59,6 +67,9 @@ import java.util.List;
@RunWith(RobolectricTestRunner.class)
public class ToggleAccessibilityServicePreferenceFragmentTest {

    @Rule
    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();

    private static final String PLACEHOLDER_PACKAGE_NAME = "com.placeholder.example";
    private static final String PLACEHOLDER_PACKAGE_NAME2 = "com.placeholder.example2";
    private static final String PLACEHOLDER_SERVICE_CLASS_NAME = "a11yservice1";
@@ -73,20 +84,25 @@ public class ToggleAccessibilityServicePreferenceFragmentTest {
            PLACEHOLDER_PACKAGE_NAME + "tile.placeholder";
    private static final String PLACEHOLDER_TILE_NAME2 =
            PLACEHOLDER_PACKAGE_NAME + "tile.placeholder2";
    private static final int NO_DIALOG = -1;

    private TestToggleAccessibilityServicePreferenceFragment mFragment;
    private PreferenceScreen mScreen;
    private Context mContext = ApplicationProvider.getApplicationContext();
    private Context mContext;

    private ShadowAccessibilityManager mShadowAccessibilityManager;
    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
    private PreferenceManager mPreferenceManager;
    @Mock
    private AccessibilityManager mMockAccessibilityManager;

    @Before
    public void setUpTestFragment() {
        MockitoAnnotations.initMocks(this);

        mContext = spy(ApplicationProvider.getApplicationContext());
        mFragment = spy(new TestToggleAccessibilityServicePreferenceFragment());
        mFragment.setArguments(new Bundle());
        when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
        when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
        when(mFragment.getContext()).thenReturn(mContext);
@@ -213,6 +229,86 @@ public class ToggleAccessibilityServicePreferenceFragmentTest {
        assertThat(mFragment.serviceSupportsAccessibilityButton()).isFalse();
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_CLEANUP_ACCESSIBILITY_WARNING_DIALOG)
    public void enableService_warningRequired_showWarning() throws Throwable {
        setupServiceWarningRequired(true);
        mFragment.mToggleServiceSwitchPreference =
                new SettingsMainSwitchPreference(mContext, /* attrs= */null);

        mFragment.onCheckedChanged(null, true);

        assertThat(mFragment.mLastShownDialogId).isEqualTo(
                AccessibilityDialogUtils.DialogEnums.ENABLE_WARNING_FROM_TOGGLE);
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_CLEANUP_ACCESSIBILITY_WARNING_DIALOG)
    public void enableService_warningNotRequired_dontShowWarning() throws Throwable {
        final AccessibilityServiceInfo info = setupServiceWarningRequired(false);
        mFragment.mToggleServiceSwitchPreference =
                new SettingsMainSwitchPreference(mContext, /* attrs= */null);
        mFragment.mPreferenceKey = info.getComponentName().flattenToString();

        mFragment.onCheckedChanged(null, true);

        assertThat(mFragment.mLastShownDialogId).isEqualTo(
                AccessibilityDialogUtils.DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL);
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_CLEANUP_ACCESSIBILITY_WARNING_DIALOG)
    public void toggleShortcutPreference_warningRequired_showWarning() throws Throwable {
        setupServiceWarningRequired(true);
        mFragment.mShortcutPreference = new ShortcutPreference(mContext, /* attrs= */null);

        mFragment.mShortcutPreference.setChecked(true);
        mFragment.onToggleClicked(mFragment.mShortcutPreference);

        assertThat(mFragment.mLastShownDialogId).isEqualTo(
                AccessibilityDialogUtils.DialogEnums.ENABLE_WARNING_FROM_SHORTCUT_TOGGLE);
        assertThat(mFragment.mShortcutPreference.isChecked()).isFalse();
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_CLEANUP_ACCESSIBILITY_WARNING_DIALOG)
    public void toggleShortcutPreference_warningNotRequired_dontShowWarning() throws Throwable {
        setupServiceWarningRequired(false);
        mFragment.mShortcutPreference = new ShortcutPreference(mContext, /* attrs= */null);

        mFragment.mShortcutPreference.setChecked(true);
        mFragment.onToggleClicked(mFragment.mShortcutPreference);

        assertThat(mFragment.mLastShownDialogId).isEqualTo(
                AccessibilityDialogUtils.DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL);
        assertThat(mFragment.mShortcutPreference.isChecked()).isTrue();
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_CLEANUP_ACCESSIBILITY_WARNING_DIALOG)
    public void clickShortcutSettingsPreference_warningRequired_showWarning() throws Throwable {
        setupServiceWarningRequired(true);
        mFragment.mShortcutPreference = new ShortcutPreference(mContext, /* attrs= */null);

        mFragment.onSettingsClicked(mFragment.mShortcutPreference);

        assertThat(mFragment.mLastShownDialogId).isEqualTo(
                AccessibilityDialogUtils.DialogEnums.ENABLE_WARNING_FROM_SHORTCUT);
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_CLEANUP_ACCESSIBILITY_WARNING_DIALOG)
    public void clickShortcutSettingsPreference_warningNotRequired_dontShowWarning()
            throws Throwable {
        setupServiceWarningRequired(false);
        mFragment.mShortcutPreference = new ShortcutPreference(mContext, /* attrs= */null);

        mFragment.onSettingsClicked(mFragment.mShortcutPreference);

        assertThat(mFragment.mLastShownDialogId).isEqualTo(
                AccessibilityDialogUtils.DialogEnums.EDIT_SHORTCUT);
    }

    private void setupTileService(String packageName, String name, String tileName) {
        final Intent tileProbe = new Intent(TileService.ACTION_QS_TILE);
        final ResolveInfo info = new ResolveInfo();
@@ -222,6 +318,21 @@ public class ToggleAccessibilityServicePreferenceFragmentTest {
        shadowPackageManager.addResolveInfoForIntent(tileProbe, info);
    }

    private AccessibilityServiceInfo setupServiceWarningRequired(boolean required)
            throws Throwable {
        final AccessibilityServiceInfo info = getFakeAccessibilityServiceInfo(
                PLACEHOLDER_PACKAGE_NAME,
                PLACEHOLDER_SERVICE_CLASS_NAME);
        info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON;
        mFragment.mComponentName = info.getComponentName();
        when(mContext.getSystemService(AccessibilityManager.class))
                .thenReturn(mMockAccessibilityManager);
        when(mMockAccessibilityManager.isAccessibilityServiceWarningRequired(any()))
                .thenReturn(required);
        when(mFragment.getAccessibilityServiceInfo()).thenReturn(info);
        return info;
    }

    private static class FakeServiceInfo extends ServiceInfo {
        private String mTileName;

@@ -255,10 +366,16 @@ public class ToggleAccessibilityServicePreferenceFragmentTest {

    private static class TestToggleAccessibilityServicePreferenceFragment
            extends ToggleAccessibilityServicePreferenceFragment {
        int mLastShownDialogId = NO_DIALOG;

        @Override
        protected ComponentName getTileComponentName() {
            return PLACEHOLDER_TILE_COMPONENT_NAME;
        }

        @Override
        protected void showDialog(int dialogId) {
            mLastShownDialogId = dialogId;
        }
    }
}