diff --git a/res/drawable/accessibility_shortcut_type_hardware.png b/res/drawable/accessibility_shortcut_type_hardware.png new file mode 100644 index 00000000000..141af831ded Binary files /dev/null and b/res/drawable/accessibility_shortcut_type_hardware.png differ diff --git a/res/drawable/accessibility_shortcut_type_software.png b/res/drawable/accessibility_shortcut_type_software.png new file mode 100644 index 00000000000..5b0611dc58e Binary files /dev/null and b/res/drawable/accessibility_shortcut_type_software.png differ diff --git a/res/drawable/accessibility_shortcut_type_software_gesture.png b/res/drawable/accessibility_shortcut_type_software_gesture.png new file mode 100644 index 00000000000..a5df752f290 Binary files /dev/null and b/res/drawable/accessibility_shortcut_type_software_gesture.png differ diff --git a/res/drawable/accessibility_shortcut_type_triple_tap.png b/res/drawable/accessibility_shortcut_type_triple_tap.png new file mode 100644 index 00000000000..5c6ce9564fd Binary files /dev/null and b/res/drawable/accessibility_shortcut_type_triple_tap.png differ diff --git a/res/layout/accessibility_shortcut_secondary_action.xml b/res/layout/accessibility_shortcut_secondary_action.xml index 81d7bd52d22..9d59b2e97a3 100644 --- a/res/layout/accessibility_shortcut_secondary_action.xml +++ b/res/layout/accessibility_shortcut_secondary_action.xml @@ -60,7 +60,7 @@ android:paddingBottom="16dp"> To turn an accessibility service on or off, swipe up from the bottom of the screen with three fingers.\n\nTo switch between services, swipe up with three fingers and hold. Got it + + Use shortcut to open + + Use shortcut to magnify + + Shortcut to open %1$s + + Shortcut to magnify + + Shortcut to open Color correction Accessibility Button diff --git a/src/com/android/settings/accessibility/AccessibilityEditDialogUtils.java b/src/com/android/settings/accessibility/AccessibilityEditDialogUtils.java index 62d6d340098..fb96bfdb801 100644 --- a/src/com/android/settings/accessibility/AccessibilityEditDialogUtils.java +++ b/src/com/android/settings/accessibility/AccessibilityEditDialogUtils.java @@ -170,7 +170,8 @@ public class AccessibilityEditDialogUtils { final String summary = context.getString( R.string.accessibility_shortcut_edit_dialog_summary_hardware); setupShortcutWidget(dialogView, title, summary, - R.drawable.illustration_accessibility_button); + R.drawable.accessibility_shortcut_type_hardware); + // TODO(b/142531156): Use vector drawable instead of temporal png file to avoid distorted. } private static void initMagnifyShortcut(Context context, View view) { @@ -180,7 +181,8 @@ public class AccessibilityEditDialogUtils { final String summary = context.getString( R.string.accessibility_shortcut_edit_dialog_summary_triple_tap); setupShortcutWidget(dialogView, title, summary, - R.drawable.illustration_accessibility_button); + R.drawable.accessibility_shortcut_type_triple_tap); + // TODO(b/142531156): Use vector drawable instead of temporal png file to avoid distorted. } private static void initAdvancedWidget(View view) { @@ -213,8 +215,9 @@ public class AccessibilityEditDialogUtils { private static int retrieveImageResId(Context context) { return isGestureNavigateEnabled(context) - ? R.drawable.illustration_accessibility_button - : R.drawable.illustration_accessibility_button; + ? R.drawable.accessibility_shortcut_type_software_gesture + : R.drawable.accessibility_shortcut_type_software; + // TODO(b/142531156): Use vector drawable instead of temporal png file to avoid distorted. } private static SpannableString getSummaryStringWithIcon(Context context, int lineHeight) { diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java index ea293b7b864..e0a2052991f 100644 --- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java @@ -37,10 +37,15 @@ import android.os.UserHandle; import android.os.storage.StorageManager; import android.provider.Settings; import android.text.TextUtils; +import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.View; +import android.view.ViewGroup; import android.view.accessibility.AccessibilityManager; +import android.widget.CheckBox; + +import androidx.preference.PreferenceScreen; import com.android.internal.widget.LockPatternUtils; import com.android.settings.R; @@ -57,11 +62,33 @@ public class ToggleAccessibilityServicePreferenceFragment extends ToggleFeatureP private static final int DIALOG_ID_ENABLE_WARNING = 1; private static final int DIALOG_ID_DISABLE_WARNING = 2; private static final int DIALOG_ID_LAUNCH_ACCESSIBILITY_TUTORIAL = 3; + private static final int DIALOG_ID_EDIT_SHORTCUT = 4; public static final int ACTIVITY_REQUEST_CONFIRM_CREDENTIAL_FOR_WEAKER_ENCRYPTION = 1; + private CharSequence mDialogTitle; + private LockPatternUtils mLockPatternUtils; + private final DialogInterface.OnClickListener mDialogListener = + (DialogInterface dialog, int id) -> { + if (id == DialogInterface.BUTTON_POSITIVE) { + // TODO(b/142531156): Save the shortcut type preference. + } + }; + + private final View.OnClickListener mSettingButtonListener = (View view) -> showDialog( + DIALOG_ID_EDIT_SHORTCUT); + + private final View.OnClickListener mCheckBoxListener = (View view) -> { + CheckBox checkBox = (CheckBox) view; + if (checkBox.isChecked()) { + // TODO(b/142530063): Enable shortcut when checkbox is checked. + } else { + // TODO(b/142530063): Disable shortcut when checkbox is unchecked. + } + }; + private final SettingsContentObserver mSettingsContentObserver = new SettingsContentObserver(new Handler()) { @Override @@ -126,6 +153,13 @@ public class ToggleAccessibilityServicePreferenceFragment extends ToggleFeatureP mLockPatternUtils = new LockPatternUtils(getActivity()); } + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + initShortcutPreference(); + return super.onCreateView(inflater, container, savedInstanceState); + } + @Override public void onResume() { mSettingsContentObserver.register(getContentResolver()); @@ -195,6 +229,13 @@ public class ToggleAccessibilityServicePreferenceFragment extends ToggleFeatureP } break; } + case DIALOG_ID_EDIT_SHORTCUT: { + final CharSequence dialogTitle = getActivity().getString( + R.string.accessibility_shortcut_edit_dialog_title, mDialogTitle); + mDialog = AccessibilityEditDialogUtils.showEditShortcutDialog(getActivity(), + dialogTitle, mDialogListener); + break; + } default: { throw new IllegalArgumentException(); } @@ -204,10 +245,21 @@ public class ToggleAccessibilityServicePreferenceFragment extends ToggleFeatureP @Override public int getDialogMetricsCategory(int dialogId) { - if (dialogId == DIALOG_ID_ENABLE_WARNING) { - return SettingsEnums.DIALOG_ACCESSIBILITY_SERVICE_ENABLE; - } else { - return SettingsEnums.DIALOG_ACCESSIBILITY_SERVICE_DISABLE; + switch (dialogId) { + case DIALOG_ID_ENABLE_WARNING: + return SettingsEnums.DIALOG_ACCESSIBILITY_SERVICE_ENABLE; + case DIALOG_ID_DISABLE_WARNING: + return SettingsEnums.DIALOG_ACCESSIBILITY_SERVICE_DISABLE; + case DIALOG_ID_LAUNCH_ACCESSIBILITY_TUTORIAL: + return isGestureNavigateEnabled() + ? SettingsEnums.DIALOG_ACCESSIBILITY_SERVICE_DISABLE + : SettingsEnums.DIALOG_ACCESSIBILITY_SERVICE_DISABLE; + // TODO(b/142531156): Create a settings enum to replace it. + case DIALOG_ID_EDIT_SHORTCUT: + return SettingsEnums.DIALOG_ACCESSIBILITY_SERVICE_ENABLE; + // TODO(b/142531156): Create a settings enum to replace it. + default: + return 0; } } @@ -220,6 +272,21 @@ public class ToggleAccessibilityServicePreferenceFragment extends ToggleFeatureP switchBar.setSwitchBarText(switchBarText, switchBarText); } + private void initShortcutPreference() { + final PreferenceScreen preferenceScreen = getPreferenceScreen(); + final ShortcutPreference shortcutPreference = new ShortcutPreference( + preferenceScreen.getContext(), null); + // Put the shortcutPreference before settingsPreference. + shortcutPreference.setOrder(-1); + shortcutPreference.setTitle(R.string.accessibility_shortcut_title); + // TODO(b/142530063): Check the new setting key to decide which summary should be shown. + // TODO(b/142530063): Check if gesture mode is on to decide which summary should be shown. + // TODO(b/142530063): Check the new key to decide whether checkbox should be checked. + shortcutPreference.setSettingButtonListener(mSettingButtonListener); + shortcutPreference.setCheckBoxListener(mCheckBoxListener); + preferenceScreen.addPreference(shortcutPreference); + } + private void updateSwitchBarToggleSwitch() { final boolean checked = AccessibilityUtils.getEnabledServicesFromSettings(getActivity()) .contains(mComponentName); @@ -350,5 +417,9 @@ public class ToggleAccessibilityServicePreferenceFragment extends ToggleFeatureP // Settings html description. mHtmlDescription = arguments.getCharSequence(AccessibilitySettings.EXTRA_HTML_DESCRIPTION); + + // Get Accessibility service name. + mDialogTitle = getAccessibilityServiceInfo().getResolveInfo().loadLabel( + getPackageManager()); } } diff --git a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java index 3cde80a65b8..7716c2dbe67 100644 --- a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java @@ -16,13 +16,21 @@ package com.android.settings.accessibility; +import android.app.Dialog; import android.app.settings.SettingsEnums; import android.content.Context; +import android.content.DialogInterface; import android.content.res.Resources; +import android.os.Bundle; import android.provider.Settings; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckBox; import android.widget.Switch; import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.search.BaseSearchIndexProvider; @@ -30,6 +38,7 @@ import com.android.settings.widget.SwitchBar; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.search.SearchIndexable; +import com.android.settingslib.widget.RadioButtonPreference; import java.util.ArrayList; import java.util.List; @@ -42,6 +51,8 @@ public final class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePrefe public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider(R.xml.accessibility_daltonizer_settings); private static final String ENABLED = Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED; + private static final String RADIOPREFERENCE_KEY = "daltonizer_mode_deuteranomaly"; + private static final int DIALOG_ID_EDIT_SHORTCUT = 1; private static final List sControllers = new ArrayList<>(); private static List buildPreferenceControllers(Context context, @@ -59,6 +70,27 @@ public final class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePrefe return sControllers; } + private final DialogInterface.OnClickListener mDialogListener = + (DialogInterface dialog, int id) -> { + if (id == DialogInterface.BUTTON_POSITIVE) { + // TODO(b/142531156): Save the shortcut type preference. + } + }; + + private final View.OnClickListener mSettingButtonListener = + (View view) -> showDialog(DIALOG_ID_EDIT_SHORTCUT); + + private final View.OnClickListener mCheckBoxListener = (View view) -> { + CheckBox checkBox = (CheckBox) view; + if (checkBox.isChecked()) { + // TODO(b/142530063): Enable shortcut when checkbox is checked. + } else { + // TODO(b/142530063): Disable shortcut when checkbox is unchecked. + } + }; + + private Dialog mDialog; + @Override public void onCheckedChanged(Preference preference) { for (AbstractPreferenceController controller : sControllers) { @@ -66,6 +98,13 @@ public final class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePrefe } } + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + initShortcutPreference(); + return super.onCreateView(inflater, container, savedInstanceState); + } + @Override public void onResume() { super.onResume(); @@ -86,11 +125,32 @@ public final class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePrefe } } + @Override + public Dialog onCreateDialog(int dialogId) { + if (dialogId == DIALOG_ID_EDIT_SHORTCUT) { + final CharSequence dialogTitle = getActivity().getString( + R.string.accessibility_shortcut_edit_dialog_title_daltonizer); + mDialog = AccessibilityEditDialogUtils.showEditShortcutDialog(getActivity(), + dialogTitle, mDialogListener); + } + + return mDialog; + } + @Override public int getMetricsCategory() { return SettingsEnums.ACCESSIBILITY_TOGGLE_DALTONIZER; } + @Override + public int getDialogMetricsCategory(int dialogId) { + if (dialogId == DIALOG_ID_EDIT_SHORTCUT) { + return SettingsEnums.ACCESSIBILITY_TOGGLE_DALTONIZER; + // TODO(b/142531156): Create a settings enum to replace it. + } + return 0; + } + @Override public int getHelpResource() { return R.string.help_url_color_correction; @@ -131,4 +191,20 @@ public final class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePrefe Settings.Secure.getInt(getContentResolver(), ENABLED, 0) == 1); mSwitchBar.addOnSwitchChangeListener(this); } + + private void initShortcutPreference() { + final PreferenceScreen preferenceScreen = getPreferenceScreen(); + final ShortcutPreference shortcutPreference = new ShortcutPreference( + preferenceScreen.getContext(), null); + final RadioButtonPreference radioButtonPreference = findPreference(RADIOPREFERENCE_KEY); + // Put the shortcutPreference before radioButtonPreference. + shortcutPreference.setOrder(radioButtonPreference.getOrder() - 1); + shortcutPreference.setTitle(R.string.accessibility_shortcut_title); + // TODO(b/142530063): Check the new setting key to decide which summary should be shown. + // TODO(b/142530063): Check if gesture mode is on to decide which summary should be shown. + // TODO(b/142530063): Check the new key to decide whether checkbox should be checked. + shortcutPreference.setSettingButtonListener(mSettingButtonListener); + shortcutPreference.setCheckBoxListener(mCheckBoxListener); + preferenceScreen.addPreference(shortcutPreference); + } } diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java index 842ec5cea41..ac54c386d80 100644 --- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java @@ -22,6 +22,7 @@ import android.app.Dialog; import android.app.settings.SettingsEnums; import android.content.ContentResolver; import android.content.Context; +import android.content.DialogInterface; import android.content.res.Resources; import android.graphics.Point; import android.media.AudioManager; @@ -32,8 +33,12 @@ import android.os.Bundle; import android.provider.Settings; import android.text.TextUtils; import android.view.Display; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.view.WindowManager; +import android.widget.CheckBox; import android.widget.ImageView; import android.widget.RelativeLayout.LayoutParams; import android.widget.Switch; @@ -51,6 +56,26 @@ public class ToggleScreenMagnificationPreferenceFragment extends private static final int DIALOG_ID_GESTURE_NAVIGATION_TUTORIAL = 1; private static final int DIALOG_ID_ACCESSIBILITY_BUTTON_TUTORIAL = 2; + private static final int DIALOG_ID_EDIT_SHORTCUT = 3; + + private final DialogInterface.OnClickListener mDialogListener = + (DialogInterface dialog, int id) -> { + if (id == DialogInterface.BUTTON_POSITIVE) { + // TODO(b/142531156): Save the shortcut type preference. + } + }; + + private final View.OnClickListener mSettingButtonListener = + (View view) -> showDialog(DIALOG_ID_EDIT_SHORTCUT); + + private final View.OnClickListener mCheckBoxListener = (View view) -> { + CheckBox checkBox = (CheckBox) view; + if (checkBox.isChecked()) { + // TODO(b/142530063): Enable shortcut when checkbox is checked. + } else { + // TODO(b/142530063): Disable shortcut when checkbox is unchecked. + } + }; private Dialog mDialog; @@ -159,6 +184,13 @@ public class ToggleScreenMagnificationPreferenceFragment extends preferenceScreen.addPreference(mConfigWarningPreference); } + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + initShortcutPreference(); + return super.onCreateView(inflater, container, savedInstanceState); + } + @Override public void onResume() { super.onResume(); @@ -182,6 +214,12 @@ public class ToggleScreenMagnificationPreferenceFragment extends mDialog = AccessibilityGestureNavigationTutorial .showAccessibilityButtonTutorialDialog(getActivity()); break; + case DIALOG_ID_EDIT_SHORTCUT: + final CharSequence dialogTitle = getActivity().getString( + R.string.accessibility_shortcut_edit_dialog_title_magnification); + mDialog = AccessibilityEditDialogUtils.showMagnificationEditShortcutDialog( + getActivity(), dialogTitle, mDialogListener); + break; default: throw new IllegalArgumentException(); } @@ -202,6 +240,9 @@ public class ToggleScreenMagnificationPreferenceFragment extends return SettingsEnums.DIALOG_TOGGLE_SCREEN_MAGNIFICATION_GESTURE_NAVIGATION; case DIALOG_ID_ACCESSIBILITY_BUTTON_TUTORIAL: return SettingsEnums.DIALOG_TOGGLE_SCREEN_MAGNIFICATION_ACCESSIBILITY_BUTTON; + case DIALOG_ID_EDIT_SHORTCUT: + return SettingsEnums.DIALOG_TOGGLE_SCREEN_MAGNIFICATION_ACCESSIBILITY_BUTTON; + // TODO(b/142531156): Create a settings enum to replace it. default: return 0; } @@ -277,6 +318,21 @@ public class ToggleScreenMagnificationPreferenceFragment extends } } + private void initShortcutPreference() { + final PreferenceScreen preferenceScreen = getPreferenceScreen(); + final ShortcutPreference shortcutPreference = new ShortcutPreference( + preferenceScreen.getContext(), null); + // Put the shortcutPreference before videoPreference. + shortcutPreference.setOrder(mVideoPreference.getOrder() - 1); + shortcutPreference.setTitle(R.string.accessibility_magnification_shortcut_title); + // TODO(b/142530063): Check the new setting key to decide which summary should be shown. + // TODO(b/142530063): Check if gesture mode is on to decide which summary should be shown. + // TODO(b/142530063): Check the new key to decide whether checkbox should be checked. + shortcutPreference.setSettingButtonListener(mSettingButtonListener); + shortcutPreference.setCheckBoxListener(mCheckBoxListener); + preferenceScreen.addPreference(shortcutPreference); + } + private boolean isGestureNavigateEnabled() { return getContext().getResources().getInteger( com.android.internal.R.integer.config_navBarInteractionMode)