diff --git a/src/com/android/settings/accessibility/InvisibleToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/InvisibleToggleAccessibilityServicePreferenceFragment.java index 1ecb94ae2bd..21ac9981a89 100644 --- a/src/com/android/settings/accessibility/InvisibleToggleAccessibilityServicePreferenceFragment.java +++ b/src/com/android/settings/accessibility/InvisibleToggleAccessibilityServicePreferenceFragment.java @@ -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); } } diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java index 213f108bd66..dd6c1d476d2 100644 --- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java @@ -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,13 +332,18 @@ 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 { - AccessibilityUtil.optInAllValuesToSettings(getPrefContext(), shortcutTypes, - mComponentName); - showPopupDialog(DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL); + onAllowButtonFromShortcutToggleClicked(); } } else { AccessibilityUtil.optOutAllValuesFromSettings(getPrefContext(), shortcutTypes, @@ -349,10 +354,20 @@ public class ToggleAccessibilityServicePreferenceFragment extends @Override public void onSettingsClicked(ShortcutPreference preference) { - final boolean isServiceOnOrShortcutAdded = mShortcutPreference.isChecked() - || mToggleServiceSwitchPreference.isChecked(); - showPopupDialog(isServiceOnOrShortcutAdded ? DialogEnums.EDIT_SHORTCUT - : DialogEnums.ENABLE_WARNING_FROM_SHORTCUT); + 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(); + } } @Override @@ -467,7 +482,9 @@ public class ToggleAccessibilityServicePreferenceFragment extends mIsDialogShown.set(false); showPopupDialog(DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL); } - mWarningDialog.dismiss(); + if (mWarningDialog != null) { + mWarningDialog.dismiss(); + } } private void onDenyButtonFromEnableToggleClicked() { @@ -496,7 +513,9 @@ public class ToggleAccessibilityServicePreferenceFragment extends mIsDialogShown.set(false); showPopupDialog(DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL); - mWarningDialog.dismiss(); + if (mWarningDialog != null) { + mWarningDialog.dismiss(); + } mShortcutPreference.setSummary(getShortcutTypeSummary(getPrefContext())); } @@ -522,7 +541,9 @@ public class ToggleAccessibilityServicePreferenceFragment extends mIsDialogShown.set(false); showPopupDialog(DialogEnums.EDIT_SHORTCUT); - mWarningDialog.dismiss(); + if (mWarningDialog != null) { + mWarningDialog.dismiss(); + } } private void onDenyButtonFromShortcutClicked() { @@ -534,13 +555,17 @@ 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 { - handleConfirmServiceEnabled(/* confirmed= */ true); - if (serviceSupportsAccessibilityButton()) { - showPopupDialog(DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL); - } + onAllowButtonFromEnableToggleClicked(); } } else { mToggleServiceSwitchPreference.setChecked(true); diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java index 94df37ef120..8cdb17ea5a6 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java @@ -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; + } } }