From 492e70d906730739965aac2e3982a2969766cf6f Mon Sep 17 00:00:00 2001 From: Peter_Liang Date: Mon, 20 Jan 2020 10:15:43 +0800 Subject: Multiple shortcut menu for android R (8/n). 1. Fix that magnification has different access format from others into setting provider. - Replace String with ComponentName 2. Remove legacy png and replace it with vector drawable. 3. Revise strings. 4. Fix that shouldn't remove legacy target item when software button triggered. Bug: b/147389656 Test: manual test Change-Id: I733959702b2d520f73a759ec90a20b39193a417b --- .../app/AccessibilityButtonChooserActivity.java | 119 +++++++++++---------- .../ic_accessibility_magnification.png | Bin 4018 -> 0 bytes .../ic_accessibility_magnification.png | Bin 2573 -> 0 bytes .../ic_accessibility_magnification.png | Bin 5547 -> 0 bytes .../ic_accessibility_magnification.png | Bin 8939 -> 0 bytes .../ic_accessibility_magnification.png | Bin 12945 -> 0 bytes .../drawable/ic_accessibility_color_correction.xml | 15 +++ .../drawable/ic_accessibility_color_inversion.xml | 15 +++ .../drawable/ic_accessibility_magnification.xml | 114 ++++++++++++++++++++ core/res/res/values/strings.xml | 6 +- 10 files changed, 209 insertions(+), 60 deletions(-) delete mode 100755 core/res/res/drawable-hdpi/ic_accessibility_magnification.png delete mode 100755 core/res/res/drawable-mdpi/ic_accessibility_magnification.png delete mode 100755 core/res/res/drawable-xhdpi/ic_accessibility_magnification.png delete mode 100755 core/res/res/drawable-xxhdpi/ic_accessibility_magnification.png delete mode 100755 core/res/res/drawable-xxxhdpi/ic_accessibility_magnification.png create mode 100644 core/res/res/drawable/ic_accessibility_magnification.xml diff --git a/core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java b/core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java index 457c0331c141..384275f64e3d 100644 --- a/core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java +++ b/core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java @@ -27,6 +27,7 @@ import static com.android.internal.app.AccessibilityButtonChooserActivity.WhiteL import static com.android.internal.app.AccessibilityButtonChooserActivity.WhiteListingFeatureElementIndex.ICON_ID; import static com.android.internal.app.AccessibilityButtonChooserActivity.WhiteListingFeatureElementIndex.LABEL_ID; import static com.android.internal.app.AccessibilityButtonChooserActivity.WhiteListingFeatureElementIndex.SETTINGS_KEY; +import static com.android.internal.util.Preconditions.checkArgument; import android.accessibilityservice.AccessibilityServiceInfo; import android.annotation.IntDef; @@ -75,15 +76,10 @@ public class AccessibilityButtonChooserActivity extends Activity { private static final char SERVICES_SEPARATOR = ':'; private static final TextUtils.SimpleStringSplitter sStringColonSplitter = new TextUtils.SimpleStringSplitter(SERVICES_SEPARATOR); - @UserShortcutType - private static final int ACCESSIBILITY_BUTTON_USER_TYPE = convertToUserType( - ACCESSIBILITY_BUTTON); - @UserShortcutType - private static final int ACCESSIBILITY_SHORTCUT_KEY_USER_TYPE = convertToUserType( - ACCESSIBILITY_SHORTCUT_KEY); - @ShortcutType private int mShortcutType; + @UserShortcutType + private int mShortcutUserType; private final List mTargets = new ArrayList<>(); private AlertDialog mAlertDialog; private TargetAdapter mTargetAdapter; @@ -213,11 +209,12 @@ public class AccessibilityButtonChooserActivity extends Activity { } mShortcutType = getIntent().getIntExtra(AccessibilityManager.EXTRA_SHORTCUT_TYPE, - ACCESSIBILITY_BUTTON); - if ((mShortcutType != ACCESSIBILITY_BUTTON) - && (mShortcutType != ACCESSIBILITY_SHORTCUT_KEY)) { - throw new IllegalStateException("Unexpected shortcut type: " + mShortcutType); - } + /* unexpectedShortcutType */ -1); + final boolean existInShortcutType = (mShortcutType == ACCESSIBILITY_BUTTON) + || (mShortcutType == ACCESSIBILITY_SHORTCUT_KEY); + checkArgument(existInShortcutType, "Unexpected shortcut type: " + mShortcutType); + + mShortcutUserType = convertToUserType(mShortcutType); mTargets.addAll(getServiceTargets(this, mShortcutType)); @@ -343,13 +340,11 @@ public class AccessibilityButtonChooserActivity extends Activity { } } - private void disableService(ComponentName componentName) { - final String componentId = componentName.flattenToString(); - + private void disableService(String componentId) { if (isWhiteListingService(componentId)) { - setWhiteListingServiceEnabled(componentName.flattenToString(), - /* settingsValueOff */ 0); + setWhiteListingServiceEnabled(componentId, /* settingsValueOff */ 0); } else { + final ComponentName componentName = ComponentName.unflattenFromString(componentId); setAccessibilityServiceState(this, componentName, /* enabled= */ false); } } @@ -620,18 +615,17 @@ public class AccessibilityButtonChooserActivity extends Activity { private void onTargetDeleted(AdapterView parent, View view, int position, long id) { final AccessibilityButtonTarget target = mTargets.get(position); - final ComponentName targetComponentName = - ComponentName.unflattenFromString(target.getId()); + final String componentId = target.getId(); switch (target.getFragmentType()) { case AccessibilityServiceFragmentType.LEGACY: - onLegacyTargetDeleted(targetComponentName); + onLegacyTargetDeleted(position, componentId); break; case AccessibilityServiceFragmentType.INVISIBLE: - onInvisibleTargetDeleted(targetComponentName); + onInvisibleTargetDeleted(position, componentId); break; case AccessibilityServiceFragmentType.INTUITIVE: - onIntuitiveTargetDeleted(targetComponentName); + onIntuitiveTargetDeleted(position, componentId); break; case AccessibilityServiceFragmentType.BOUNCE: // Do nothing @@ -640,44 +634,36 @@ public class AccessibilityButtonChooserActivity extends Activity { throw new IllegalStateException("Unexpected fragment type"); } - mTargets.remove(position); - mTargetAdapter.notifyDataSetChanged(); - if (mTargets.isEmpty()) { mAlertDialog.dismiss(); } } - private void onLegacyTargetDeleted(ComponentName componentName) { + private void onLegacyTargetDeleted(int position, String componentId) { if (mShortcutType == ACCESSIBILITY_SHORTCUT_KEY) { - optOutValueFromSettings(this, ACCESSIBILITY_SHORTCUT_KEY_USER_TYPE, componentName); + optOutValueFromSettings(this, mShortcutUserType, componentId); + + mTargets.remove(position); + mTargetAdapter.notifyDataSetChanged(); } } - private void onInvisibleTargetDeleted(ComponentName componentName) { - if (mShortcutType == ACCESSIBILITY_BUTTON) { - optOutValueFromSettings(this, ACCESSIBILITY_BUTTON_USER_TYPE, componentName); + private void onInvisibleTargetDeleted(int position, String componentId) { + optOutValueFromSettings(this, mShortcutUserType, componentId); - if (!hasValueInSettings(this, - ACCESSIBILITY_SHORTCUT_KEY_USER_TYPE, componentName)) { - disableService(componentName); - } - } else if (mShortcutType == ACCESSIBILITY_SHORTCUT_KEY) { - optOutValueFromSettings(this, ACCESSIBILITY_SHORTCUT_KEY_USER_TYPE, componentName); - - if (!hasValueInSettings(this, - ACCESSIBILITY_BUTTON_USER_TYPE, componentName)) { - disableService(componentName); - } + final int shortcutTypes = UserShortcutType.SOFTWARE | UserShortcutType.HARDWARE; + if (!hasValuesInSettings(this, shortcutTypes, componentId)) { + disableService(componentId); } + + mTargets.remove(position); + mTargetAdapter.notifyDataSetChanged(); } - private void onIntuitiveTargetDeleted(ComponentName componentName) { - if (mShortcutType == ACCESSIBILITY_BUTTON) { - optOutValueFromSettings(this, ACCESSIBILITY_BUTTON_USER_TYPE, componentName); - } else if (mShortcutType == ACCESSIBILITY_SHORTCUT_KEY) { - optOutValueFromSettings(this, ACCESSIBILITY_SHORTCUT_KEY_USER_TYPE, componentName); - } + private void onIntuitiveTargetDeleted(int position, String componentId) { + optOutValueFromSettings(this, mShortcutUserType, componentId); + mTargets.remove(position); + mTargetAdapter.notifyDataSetChanged(); } private void onCancelButtonClicked() { @@ -786,10 +772,10 @@ public class AccessibilityButtonChooserActivity extends Activity { * * @param context The current context. * @param shortcutType The preferred shortcut type user selected. - * @param componentName The component name that need to be opted out from Settings. + * @param componentId The component id that need to be opted out from Settings. */ private void optOutValueFromSettings( - Context context, @UserShortcutType int shortcutType, ComponentName componentName) { + Context context, @UserShortcutType int shortcutType, String componentId) { final StringJoiner joiner = new StringJoiner(String.valueOf(SERVICES_SEPARATOR)); final String targetsKey = convertToKey(shortcutType); final String targetsValue = Settings.Secure.getString(context.getContentResolver(), @@ -801,26 +787,47 @@ public class AccessibilityButtonChooserActivity extends Activity { sStringColonSplitter.setString(targetsValue); while (sStringColonSplitter.hasNext()) { - final String name = sStringColonSplitter.next(); - if (TextUtils.isEmpty(name) || (componentName.flattenToString()).equals(name)) { + final String id = sStringColonSplitter.next(); + if (TextUtils.isEmpty(id) || componentId.equals(id)) { continue; } - joiner.add(name); + joiner.add(id); } Settings.Secure.putString(context.getContentResolver(), targetsKey, joiner.toString()); } + /** + * Returns if component name existed in one of {@code shortcutTypes} string in Settings. + * + * @param context The current context. + * @param shortcutTypes A combination of {@link UserShortcutType}. + * @param componentId The component name that need to be checked existed in Settings. + * @return {@code true} if componentName existed in Settings. + */ + private boolean hasValuesInSettings(Context context, int shortcutTypes, + @NonNull String componentId) { + boolean exist = false; + if ((shortcutTypes & UserShortcutType.SOFTWARE) == UserShortcutType.SOFTWARE) { + exist = hasValueInSettings(context, UserShortcutType.SOFTWARE, componentId); + } + if (((shortcutTypes & UserShortcutType.HARDWARE) == UserShortcutType.HARDWARE)) { + exist |= hasValueInSettings(context, UserShortcutType.HARDWARE, componentId); + } + return exist; + } + + /** * Returns if component name existed in Settings. * * @param context The current context. * @param shortcutType The preferred shortcut type user selected. - * @param componentName The component name that need to be checked existed in Settings. + * @param componentId The component id that need to be checked existed in Settings. * @return {@code true} if componentName existed in Settings. */ private boolean hasValueInSettings(Context context, @UserShortcutType int shortcutType, - @NonNull ComponentName componentName) { + @NonNull String componentId) { final String targetKey = convertToKey(shortcutType); final String targetString = Settings.Secure.getString(context.getContentResolver(), targetKey); @@ -831,8 +838,8 @@ public class AccessibilityButtonChooserActivity extends Activity { sStringColonSplitter.setString(targetString); while (sStringColonSplitter.hasNext()) { - final String name = sStringColonSplitter.next(); - if ((componentName.flattenToString()).equals(name)) { + final String id = sStringColonSplitter.next(); + if (componentId.equals(id)) { return true; } } diff --git a/core/res/res/drawable-hdpi/ic_accessibility_magnification.png b/core/res/res/drawable-hdpi/ic_accessibility_magnification.png deleted file mode 100755 index a91bc6ec90ed..000000000000 Binary files a/core/res/res/drawable-hdpi/ic_accessibility_magnification.png and /dev/null differ diff --git a/core/res/res/drawable-mdpi/ic_accessibility_magnification.png b/core/res/res/drawable-mdpi/ic_accessibility_magnification.png deleted file mode 100755 index 9ec51075a5ed..000000000000 Binary files a/core/res/res/drawable-mdpi/ic_accessibility_magnification.png and /dev/null differ diff --git a/core/res/res/drawable-xhdpi/ic_accessibility_magnification.png b/core/res/res/drawable-xhdpi/ic_accessibility_magnification.png deleted file mode 100755 index 0b3a32ed1792..000000000000 Binary files a/core/res/res/drawable-xhdpi/ic_accessibility_magnification.png and /dev/null differ diff --git a/core/res/res/drawable-xxhdpi/ic_accessibility_magnification.png b/core/res/res/drawable-xxhdpi/ic_accessibility_magnification.png deleted file mode 100755 index 3eeb1c9f8dd8..000000000000 Binary files a/core/res/res/drawable-xxhdpi/ic_accessibility_magnification.png and /dev/null differ diff --git a/core/res/res/drawable-xxxhdpi/ic_accessibility_magnification.png b/core/res/res/drawable-xxxhdpi/ic_accessibility_magnification.png deleted file mode 100755 index 7d376126b4d7..000000000000 Binary files a/core/res/res/drawable-xxxhdpi/ic_accessibility_magnification.png and /dev/null differ diff --git a/core/res/res/drawable/ic_accessibility_color_correction.xml b/core/res/res/drawable/ic_accessibility_color_correction.xml index 02fa4b807155..ed09d5704ad2 100644 --- a/core/res/res/drawable/ic_accessibility_color_correction.xml +++ b/core/res/res/drawable/ic_accessibility_color_correction.xml @@ -1,3 +1,18 @@ + diff --git a/core/res/res/drawable/ic_accessibility_color_inversion.xml b/core/res/res/drawable/ic_accessibility_color_inversion.xml index 97b30b0df4d5..d69a169d0fb3 100644 --- a/core/res/res/drawable/ic_accessibility_color_inversion.xml +++ b/core/res/res/drawable/ic_accessibility_color_inversion.xml @@ -1,3 +1,18 @@ + diff --git a/core/res/res/drawable/ic_accessibility_magnification.xml b/core/res/res/drawable/ic_accessibility_magnification.xml new file mode 100644 index 000000000000..5dab47951cda --- /dev/null +++ b/core/res/res/drawable/ic_accessibility_magnification.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index a81565a81670..f25f97c39f7e 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -4359,10 +4359,8 @@ You can change the feature in Settings > Accessibility. - - Empty - - + Edit shortcuts -- cgit v1.2.3-59-g8ed1b