Use A11yManagerService to check if the A11yService warning is required.

Bug: 303511250
Test: m RunSettingsRoboTests ROBOTEST_FILTER=ToggleAccessibilityServicePreferenceFragmentTest
Change-Id: Ibef748bd82ba166e377be0611df113ac09d052bc
This commit is contained in:
Daniel Norman
2023-11-27 21:21:46 +00:00
parent 9f6e77a094
commit 126de9691a
3 changed files with 149 additions and 11 deletions

View File

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

View File

@@ -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();

View File

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