Merge "Show customized message for private space lock setup screen" into main
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 84bef3e..6fbaddc 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4612,7 +4612,7 @@
     <string name="accessibility_screen_magnification_navbar_short_summary">Tap a button to zoom</string>
     <!-- Intro for the accessibility preference screen to enable screen magnification gestures. [CHAR LIMIT=none] -->
     <string name="accessibility_screen_magnification_intro_text">Quickly zoom in on the screen to make content larger</string>
-    <!-- Summary for the accessibility preference screen to enable screen magnification gestures. [CHAR LIMIT=none] -->
+    <!-- Instructions on the accessibility preference screen teaching the user how to enable screen magnification gestures. [CHAR LIMIT=none] -->
     <string name="accessibility_screen_magnification_summary">
         <![CDATA[
         <b>To zoom in:</b><br/>
@@ -12565,8 +12565,8 @@
     <string name="color_inversion_state_off">Off</string>
     <!-- The color inversion feature summary displayed as a subtext as an item in a list. -->
     <string name="color_inversion_feature_summary">Turns light screens dark and dark screens light</string>
-    <!-- Short summary explains what magnification feature is. -->
-    <string name="magnification_feature_summary">Quickly zoom in on the screen to make content larger</string>
+    <!-- Summary for the accessibility preference screen to enable screen magnification. [CHAR LIMIT=none] -->
+    <string name="magnification_feature_summary">Zoom in on the screen</string>
     <!-- Summary of the AutoClick feature disabled state. -->
     <string name="autoclick_disabled">Off</string>
     <!-- Summary of the show captions preference disabled state. -->
diff --git a/src/com/android/settings/accessibility/InvisibleToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/InvisibleToggleAccessibilityServicePreferenceFragment.java
index 1ecb94a..21ac998 100644
--- a/src/com/android/settings/accessibility/InvisibleToggleAccessibilityServicePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/InvisibleToggleAccessibilityServicePreferenceFragment.java
@@ -64,7 +64,7 @@
     @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 @@
     @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 213f108..dd6c1d4 100644
--- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
@@ -157,7 +157,7 @@
                 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 @@
                 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 @@
                 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 @@
         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 @@
 
     @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 @@
             mIsDialogShown.set(false);
             showPopupDialog(DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL);
         }
-        mWarningDialog.dismiss();
+        if (mWarningDialog != null) {
+            mWarningDialog.dismiss();
+        }
     }
 
     private void onDenyButtonFromEnableToggleClicked() {
@@ -496,7 +513,9 @@
         mIsDialogShown.set(false);
         showPopupDialog(DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL);
 
-        mWarningDialog.dismiss();
+        if (mWarningDialog != null) {
+            mWarningDialog.dismiss();
+        }
 
         mShortcutPreference.setSummary(getShortcutTypeSummary(getPrefContext()));
     }
@@ -522,7 +541,9 @@
         mIsDialogShown.set(false);
         showPopupDialog(DialogEnums.EDIT_SHORTCUT);
 
-        mWarningDialog.dismiss();
+        if (mWarningDialog != null) {
+            mWarningDialog.dismiss();
+        }
     }
 
     private void onDenyButtonFromShortcutClicked() {
@@ -534,13 +555,17 @@
             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/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
index 886719d..9f6eec3 100644
--- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
@@ -840,9 +840,13 @@
      */
     public static CharSequence getServiceSummary(Context context) {
         // Get the user shortcut type from settings provider.
-        final int uerShortcutType = getUserShortcutTypeFromSettings(context);
-        return (uerShortcutType != AccessibilityUtil.UserShortcutType.EMPTY)
+        final int userShortcutType = getUserShortcutTypeFromSettings(context);
+        final CharSequence featureState =
+                (userShortcutType != AccessibilityUtil.UserShortcutType.EMPTY)
                 ? context.getText(R.string.accessibility_summary_shortcut_enabled)
                 : context.getText(R.string.generic_accessibility_feature_shortcut_off);
+        final CharSequence featureSummary = context.getText(R.string.magnification_feature_summary);
+        return context.getString(R.string.preference_summary_default_combination,
+                featureState, featureSummary);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java
index 94df37e..8cdb17e 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 @@
 
 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.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 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 @@
 @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 @@
             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 @@
         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 @@
         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 @@
 
     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;
+        }
     }
 }
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
index e5ac793..05dc8fa 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
@@ -629,7 +629,9 @@
         assertThat(
                 ToggleScreenMagnificationPreferenceFragment.getServiceSummary(mContext).toString())
                 .isEqualTo(
-                        mContext.getString(R.string.accessibility_summary_shortcut_enabled));
+                        mContext.getString(R.string.preference_summary_default_combination,
+                                mContext.getText(R.string.accessibility_summary_shortcut_enabled),
+                                mContext.getText(R.string.magnification_feature_summary)));
     }
 
     @Test
@@ -639,7 +641,10 @@
         assertThat(
                 ToggleScreenMagnificationPreferenceFragment.getServiceSummary(mContext).toString())
                 .isEqualTo(
-                        mContext.getString(R.string.generic_accessibility_feature_shortcut_off));
+                        mContext.getString(R.string.preference_summary_default_combination,
+                                mContext.getText(
+                                        R.string.generic_accessibility_feature_shortcut_off),
+                                mContext.getText(R.string.magnification_feature_summary)));
     }
 
     @Test
@@ -650,7 +655,10 @@
 
         assertThat(
                 ToggleScreenMagnificationPreferenceFragment.getServiceSummary(mContext).toString())
-                .isEqualTo(mContext.getString(R.string.accessibility_summary_shortcut_enabled));
+                .isEqualTo(
+                        mContext.getString(R.string.preference_summary_default_combination,
+                                mContext.getText(R.string.accessibility_summary_shortcut_enabled),
+                                mContext.getText(R.string.magnification_feature_summary)));
     }
 
     @Test
@@ -662,7 +670,10 @@
         assertThat(
                 ToggleScreenMagnificationPreferenceFragment.getServiceSummary(mContext).toString())
                 .isEqualTo(
-                        mContext.getString(R.string.generic_accessibility_feature_shortcut_off));
+                        mContext.getString(R.string.preference_summary_default_combination,
+                                mContext.getText(
+                                        R.string.generic_accessibility_feature_shortcut_off),
+                                mContext.getText(R.string.magnification_feature_summary)));
     }
 
     private void putStringIntoSettings(String key, String componentName) {