Merge "Fix software shortcut in dialog did not update when content change." into sc-v2-dev am: 56e82fe112 am: 33914ed556
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/16005288
Change-Id: I061d40c46ff678d6199db650e212d32d23ce57db
diff --git a/src/com/android/settings/accessibility/AccessibilityDialogUtils.java b/src/com/android/settings/accessibility/AccessibilityDialogUtils.java
index b353805..f06138f 100644
--- a/src/com/android/settings/accessibility/AccessibilityDialogUtils.java
+++ b/src/com/android/settings/accessibility/AccessibilityDialogUtils.java
@@ -180,6 +180,23 @@
return alertDialog;
}
+ /**
+ * Updates the software shortcut in edit shortcut dialog.
+ *
+ * @param context A valid context
+ * @param editShortcutDialog Need to be a type of edit shortcut dialog
+ * @return True if the update is successful
+ */
+ public static boolean updateSoftwareShortcutInDialog(Context context,
+ Dialog editShortcutDialog) {
+ final View container = editShortcutDialog.findViewById(R.id.container_layout);
+ if (container != null) {
+ initSoftwareShortcut(context, container);
+ return true;
+ }
+ return false;
+ }
+
private static AlertDialog createDialog(Context context, int dialogType,
CharSequence dialogTitle, DialogInterface.OnClickListener listener) {
diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
index 4f45b03..c25abf3 100644
--- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
@@ -79,6 +79,7 @@
protected Preference mSettingsPreference;
protected AccessibilityFooterPreferenceController mFooterPreferenceController;
protected String mPreferenceKey;
+ protected Dialog mDialog;
protected CharSequence mSettingsTitle;
protected Intent mSettingsIntent;
@@ -106,6 +107,7 @@
public static final int NOT_SET = -1;
// Save user's shortcutType value when savedInstance has value (e.g. device rotated).
protected int mSavedCheckBoxValue = NOT_SET;
+ private boolean mSavedAccessibilityFloatingMenuEnabled;
// For html description of accessibility service, must follow the rule, such as
// <img src="R.drawable.fileName"/>, a11y settings will get the resources successfully.
@@ -127,7 +129,6 @@
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
-
// Restore the user shortcut type.
if (savedInstanceState != null && savedInstanceState.containsKey(
KEY_SAVED_USER_SHORTCUT_TYPE)) {
@@ -200,6 +201,8 @@
mSettingsContentObserver.register(getContentResolver());
updateShortcutPreferenceData();
updateShortcutPreference();
+
+ updateEditShortcutDialogIfNeeded();
}
@Override
@@ -208,6 +211,8 @@
AccessibilityManager.class);
am.removeTouchExplorationStateChangeListener(mTouchExplorationStateChangeListener);
mSettingsContentObserver.unregister(getContentResolver());
+ mSavedAccessibilityFloatingMenuEnabled = AccessibilityUtil.isFloatingMenuEnabled(
+ getContext());
super.onPause();
}
@@ -222,24 +227,23 @@
@Override
public Dialog onCreateDialog(int dialogId) {
- Dialog dialog;
switch (dialogId) {
case DialogEnums.EDIT_SHORTCUT:
final CharSequence dialogTitle = getPrefContext().getString(
R.string.accessibility_shortcut_title, mPackageName);
final int dialogType = WizardManagerHelper.isAnySetupWizard(getIntent())
? DialogType.EDIT_SHORTCUT_GENERIC_SUW : DialogType.EDIT_SHORTCUT_GENERIC;
- dialog = AccessibilityDialogUtils.showEditShortcutDialog(
+ mDialog = AccessibilityDialogUtils.showEditShortcutDialog(
getPrefContext(), dialogType, dialogTitle,
this::callOnAlertDialogCheckboxClicked);
- setupEditShortcutDialog(dialog);
- return dialog;
+ setupEditShortcutDialog(mDialog);
+ return mDialog;
case DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL:
- dialog = AccessibilityGestureNavigationTutorial
+ mDialog = AccessibilityGestureNavigationTutorial
.createAccessibilityTutorialDialog(getPrefContext(),
getUserShortcutTypes());
- dialog.setCanceledOnTouchOutside(false);
- return dialog;
+ mDialog.setCanceledOnTouchOutside(false);
+ return mDialog;
default:
throw new IllegalArgumentException("Unsupported dialogId " + dialogId);
}
@@ -733,6 +737,20 @@
}
}
+ private void updateEditShortcutDialogIfNeeded() {
+ if (mDialog == null || !mDialog.isShowing()) {
+ return;
+ }
+
+ // Content in software shortcut need to be adjusted depend on the accessibility button
+ // mode status which can be changed in background.
+ final boolean valueChanged = mSavedAccessibilityFloatingMenuEnabled
+ != AccessibilityUtil.isFloatingMenuEnabled(getContext());
+ if (valueChanged) {
+ AccessibilityDialogUtils.updateSoftwareShortcutInDialog(getContext(), mDialog);
+ }
+ }
+
@VisibleForTesting
void saveNonEmptyUserShortcutType(int type) {
if (type == UserShortcutType.EMPTY) {
diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
index c152174..6b4a5f2 100644
--- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
@@ -38,7 +38,6 @@
import android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener;
import android.widget.CheckBox;
-import androidx.appcompat.app.AlertDialog;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
@@ -132,12 +131,11 @@
@Override
public Dialog onCreateDialog(int dialogId) {
if (mDialogDelegate != null) {
- final Dialog dialog = mDialogDelegate.onCreateDialog(dialogId);
- if (dialog != null) {
- return dialog;
+ mDialog = mDialogDelegate.onCreateDialog(dialogId);
+ if (mDialog != null) {
+ return mDialog;
}
}
- final AlertDialog dialog;
switch (dialogId) {
case DialogEnums.GESTURE_NAVIGATION_TUTORIAL:
return AccessibilityGestureNavigationTutorial
@@ -148,10 +146,10 @@
final int dialogType = WizardManagerHelper.isAnySetupWizard(getIntent())
? DialogType.EDIT_SHORTCUT_MAGNIFICATION_SUW
: DialogType.EDIT_SHORTCUT_MAGNIFICATION;
- dialog = AccessibilityDialogUtils.showEditShortcutDialog(getPrefContext(),
+ mDialog = AccessibilityDialogUtils.showEditShortcutDialog(getPrefContext(),
dialogType, dialogTitle, this::callOnAlertDialogCheckboxClicked);
- setupMagnificationEditShortcutDialog(dialog);
- return dialog;
+ setupMagnificationEditShortcutDialog(mDialog);
+ return mDialog;
default:
return super.onCreateDialog(dialogId);
}
@@ -209,7 +207,7 @@
}
@VisibleForTesting
- void setupMagnificationEditShortcutDialog(AlertDialog dialog) {
+ void setupMagnificationEditShortcutDialog(Dialog dialog) {
final View dialogSoftwareView = dialog.findViewById(R.id.software_shortcut);
mSoftwareTypeCheckBox = dialogSoftwareView.findViewById(R.id.checkbox);
setDialogTextAreaClickListener(dialogSoftwareView, mSoftwareTypeCheckBox);
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityDialogUtilsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityDialogUtilsTest.java
new file mode 100644
index 0000000..83bba14
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityDialogUtilsTest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+/** Tests for {@link AccessibilityDialogUtils} */
+@RunWith(RobolectricTestRunner.class)
+public class AccessibilityDialogUtilsTest {
+
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+
+ @Before
+ public void setUp() {
+ mContext.setTheme(R.style.Theme_AppCompat);
+ }
+
+ @Test
+ public void updateSoftwareShortcutInDialog_correctDialogType_success() {
+ final AlertDialog dialog = AccessibilityDialogUtils.showEditShortcutDialog(
+ mContext, AccessibilityDialogUtils.DialogType.EDIT_SHORTCUT_GENERIC, "Title",
+ null);
+
+ assertThat(
+ AccessibilityDialogUtils.updateSoftwareShortcutInDialog(mContext, dialog)).isTrue();
+ }
+
+ @Test
+ public void updateSoftwareShortcutInDialog_useNotSupportedDialog_fail() {
+ final AlertDialog dialog = new AlertDialog.Builder(mContext).setTitle("Title").show();
+
+ assertThat(AccessibilityDialogUtils.updateSoftwareShortcutInDialog(mContext,
+ dialog)).isFalse();
+ }
+}