diff --git a/res/layout/accessibility_edit_magnification_shortcut.xml b/res/layout/accessibility_edit_magnification_shortcut.xml
new file mode 100644
index 00000000000..bed1255bde7
--- /dev/null
+++ b/res/layout/accessibility_edit_magnification_shortcut.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 2632f5c5a98..3cda6318fdf 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4913,6 +4913,14 @@
Magnify entire screen
Magnify part of screen
+
+ Switch to accessibility button?
+
+ Using triple tap to magnify part of the screen will cause typing and other actions to be delayed.\n\nDo you want to switch to using accessibility button to magnify?
+
+ Switch to accessibility button
+
+ Keep triple tap to magnify
Magnification settings
diff --git a/src/com/android/settings/accessibility/AccessibilityEditDialogUtils.java b/src/com/android/settings/accessibility/AccessibilityEditDialogUtils.java
index 2571a15a802..f349a125085 100644
--- a/src/com/android/settings/accessibility/AccessibilityEditDialogUtils.java
+++ b/src/com/android/settings/accessibility/AccessibilityEditDialogUtils.java
@@ -16,6 +16,7 @@
package com.android.settings.accessibility;
+import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.TypedArray;
@@ -26,6 +27,7 @@ import android.text.TextUtils;
import android.text.style.ImageSpan;
import android.view.LayoutInflater;
import android.view.View;
+import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
@@ -56,12 +58,14 @@ public class AccessibilityEditDialogUtils {
DialogType.EDIT_SHORTCUT_GENERIC,
DialogType.EDIT_SHORTCUT_MAGNIFICATION,
DialogType.EDIT_MAGNIFICATION_MODE,
+ DialogType.EDIT_MAGNIFICATION_SWITCH_SHORTCUT,
})
private @interface DialogType {
int EDIT_SHORTCUT_GENERIC = 0;
int EDIT_SHORTCUT_MAGNIFICATION = 1;
int EDIT_MAGNIFICATION_MODE = 2;
+ int EDIT_MAGNIFICATION_SWITCH_SHORTCUT = 3;
}
/**
@@ -115,6 +119,26 @@ public class AccessibilityEditDialogUtils {
return alertDialog;
}
+ /**
+ * Method to show the magnification edit shortcut dialog in Magnification.
+ *
+ * @param context A valid context
+ * @param dialogTitle The title of magnify edit shortcut dialog
+ * @param listener The listener to determine the action of magnify edit shortcut dialog
+ * @return A magnification edit shortcut dialog in Magnification
+ */
+ public static Dialog showMagnificationSwitchShortcutDialog(Context context,
+ CharSequence dialogTitle, View.OnClickListener listener) {
+ final AlertDialog alertDialog = new AlertDialog.Builder(context)
+ .setView(createSwitchShortcutDialogContentView(context))
+ .setTitle(dialogTitle)
+ .create();
+ alertDialog.show();
+ setEditShortcutButtonsListener(alertDialog, listener);
+ setScrollIndicators(alertDialog);
+ return alertDialog;
+ }
+
private static AlertDialog createDialog(Context context, int dialogType,
CharSequence dialogTitle, DialogInterface.OnClickListener listener) {
@@ -140,6 +164,22 @@ public class AccessibilityEditDialogUtils {
View.SCROLL_INDICATOR_TOP | View.SCROLL_INDICATOR_BOTTOM);
}
+ private static void setEditShortcutButtonsListener(AlertDialog dialog,
+ View.OnClickListener listener) {
+ final View contentView = dialog.findViewById(R.id.container_layout);
+ final Button positiveButton = contentView.findViewById(
+ R.id.switch_shortcut_positive_button);
+ final Button negativeButton = contentView.findViewById(
+ R.id.switch_shortcut_negative_button);
+
+ positiveButton.setOnClickListener(listener);
+ negativeButton.setOnClickListener(v -> dialog.dismiss());
+ }
+
+ private static View createSwitchShortcutDialogContentView(Context context) {
+ return createEditDialogContentView(context, DialogType.EDIT_MAGNIFICATION_SWITCH_SHORTCUT);
+ }
+
/**
* Get a content View for the edit shortcut dialog.
*
@@ -174,6 +214,10 @@ public class AccessibilityEditDialogUtils {
initMagnifyFullScreen(context, contentView);
initMagnifyWindowScreen(context, contentView);
break;
+ case DialogType.EDIT_MAGNIFICATION_SWITCH_SHORTCUT:
+ contentView = inflater.inflate(
+ R.layout.accessibility_edit_magnification_shortcut, null);
+ break;
default:
throw new IllegalArgumentException();
}
diff --git a/src/com/android/settings/accessibility/MagnificationSettingsFragment.java b/src/com/android/settings/accessibility/MagnificationSettingsFragment.java
index f0451c79b58..6b91fab7201 100644
--- a/src/com/android/settings/accessibility/MagnificationSettingsFragment.java
+++ b/src/com/android/settings/accessibility/MagnificationSettingsFragment.java
@@ -16,17 +16,21 @@
package com.android.settings.accessibility;
+import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
+import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
+import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
+
import android.app.Dialog;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.provider.Settings;
+import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
-import androidx.appcompat.app.AlertDialog;
import androidx.preference.Preference;
import com.android.settings.R;
@@ -36,6 +40,8 @@ import com.android.settingslib.search.SearchIndexable;
import com.google.common.primitives.Ints;
+import java.util.StringJoiner;
+
/** Settings page for magnification. */
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
public class MagnificationSettingsFragment extends DashboardFragment {
@@ -45,12 +51,15 @@ public class MagnificationSettingsFragment extends DashboardFragment {
private static final String KEY_CAPABILITY =
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_CAPABILITY;
private static final int DIALOG_MAGNIFICATION_CAPABILITY = 1;
+ private static final int DIALOG_MAGNIFICATION_SWITCH_SHORTCUT = 2;
private static final String EXTRA_CAPABILITY = "capability";
private static final int NONE = 0;
+ private static final char COMPONENT_NAME_SEPARATOR = ':';
private Preference mModePreference;
private int mCapabilities = NONE;
private CheckBox mMagnifyFullScreenCheckBox;
private CheckBox mMagnifyWindowCheckBox;
+ private Dialog mDialog;
static String getMagnificationCapabilitiesSummary(Context context) {
final String[] magnificationModeSummaries = context.getResources().getStringArray(
@@ -102,6 +111,8 @@ public class MagnificationSettingsFragment extends DashboardFragment {
switch (dialogId) {
case DIALOG_MAGNIFICATION_CAPABILITY:
return SettingsEnums.DIALOG_MAGNIFICATION_CAPABILITY;
+ case DIALOG_MAGNIFICATION_SWITCH_SHORTCUT:
+ return SettingsEnums.DIALOG_MAGNIFICATION_SWITCH_SHORTCUT;
default:
return 0;
}
@@ -130,15 +141,23 @@ public class MagnificationSettingsFragment extends DashboardFragment {
@Override
public Dialog onCreateDialog(int dialogId) {
- if (dialogId == DIALOG_MAGNIFICATION_CAPABILITY) {
- final String title = getPrefContext().getString(
- R.string.accessibility_magnification_mode_title);
- AlertDialog alertDialog = AccessibilityEditDialogUtils
- .showMagnificationModeDialog(getPrefContext(), title,
- this::callOnAlertDialogCheckboxClicked);
- initializeDialogCheckBox(alertDialog);
- return alertDialog;
+ final CharSequence title;
+ switch (dialogId) {
+ case DIALOG_MAGNIFICATION_CAPABILITY:
+ title = getPrefContext().getString(
+ R.string.accessibility_magnification_mode_title);
+ mDialog = AccessibilityEditDialogUtils.showMagnificationModeDialog(getPrefContext(),
+ title, this::callOnAlertDialogCheckboxClicked);
+ initializeDialogCheckBox(mDialog);
+ return mDialog;
+ case DIALOG_MAGNIFICATION_SWITCH_SHORTCUT:
+ title = getPrefContext().getString(
+ R.string.accessibility_magnification_switch_shortcut_title);
+ mDialog = AccessibilityEditDialogUtils.showMagnificationSwitchShortcutDialog(
+ getPrefContext(), title, this::onSwitchShortcutDialogPositiveButtonClicked);
+ return mDialog;
}
+
throw new IllegalArgumentException("Unsupported dialogId " + dialogId);
}
@@ -148,7 +167,40 @@ public class MagnificationSettingsFragment extends DashboardFragment {
getMagnificationCapabilitiesSummary(getPrefContext()));
}
- private void initializeDialogCheckBox(AlertDialog dialog) {
+ private void onSwitchShortcutDialogPositiveButtonClicked(View view) {
+ //TODO(b/147990389): Merge this function into util until magnification change format to
+ // Component.
+ optOutMagnificationFromTripleTap();
+ optInMagnificationToAccessibilityButton();
+
+ mDialog.dismiss();
+ }
+
+ private void optOutMagnificationFromTripleTap() {
+ Settings.Secure.putInt(getPrefContext().getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, OFF);
+ }
+
+ private void optInMagnificationToAccessibilityButton() {
+ final String targetKey = Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS;
+ final String targetString = Settings.Secure.getString(getPrefContext().getContentResolver(),
+ targetKey);
+ if (targetString.contains(MAGNIFICATION_CONTROLLER_NAME)) {
+ return;
+ }
+
+ final StringJoiner joiner = new StringJoiner(String.valueOf(COMPONENT_NAME_SEPARATOR));
+
+ if (!TextUtils.isEmpty(targetString)) {
+ joiner.add(targetString);
+ }
+ joiner.add(MAGNIFICATION_CONTROLLER_NAME);
+
+ Settings.Secure.putString(getPrefContext().getContentResolver(), targetKey,
+ joiner.toString());
+ }
+
+ private void initializeDialogCheckBox(Dialog dialog) {
final View dialogFullScreenView = dialog.findViewById(R.id.magnify_full_screen);
final View dialogFullScreenTextArea = dialogFullScreenView.findViewById(R.id.container);
mMagnifyFullScreenCheckBox = dialogFullScreenView.findViewById(R.id.checkbox);
@@ -176,6 +228,10 @@ public class MagnificationSettingsFragment extends DashboardFragment {
windowCheckBox.toggle();
updateCapabilities(false);
updateAlertDialogEnableState(fullScreenTextArea, windowTextArea);
+
+ if (isTripleTapEnabled() && windowCheckBox.isChecked()) {
+ showDialog(DIALOG_MAGNIFICATION_SWITCH_SHORTCUT);
+ }
});
}
@@ -233,6 +289,11 @@ public class MagnificationSettingsFragment extends DashboardFragment {
}
}
+ private boolean isTripleTapEnabled() {
+ return Settings.Secure.getInt(getPrefContext().getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, OFF) == ON;
+ }
+
private void setSecureIntValue(String key, int value) {
Settings.Secure.putIntForUser(getPrefContext().getContentResolver(),
key, value, getPrefContext().getContentResolver().getUserId());