From f9184d6ab8d5ab9899e49d49db7e652d6d67c41e Mon Sep 17 00:00:00 2001 From: menghanli Date: Tue, 8 Feb 2022 21:52:29 +0800 Subject: [PATCH] Add new intro attributes for accessibility - Accessibilty service: AccessibilityService_intro - Accesibility shortcut: AccessibilityShortcutTarget_intro Bug: 218407448 Test: atest AccessibilityShortcutInfoTest Change-Id: Ia9977a74e4f60d6ee36e6028ec24d9271656ce40 --- core/api/current.txt | 2 ++ .../AccessibilityServiceInfo.java | 35 +++++++++++++++++++ .../AccessibilityShortcutInfo.java | 18 ++++++++++ core/res/res/values/attrs.xml | 21 ++++++----- core/res/res/values/public.xml | 1 + core/tests/coretests/res/values/strings.xml | 3 ++ .../accessibility_shortcut_test_activity.xml | 2 +- .../AccessibilityShortcutInfoTest.java | 10 ++++++ 8 files changed, 83 insertions(+), 9 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index 77f869af42d3f..05d76c21719a0 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -866,6 +866,7 @@ package android { field public static final int installLocation = 16843447; // 0x10102b7 field public static final int interactiveUiTimeout = 16844181; // 0x1010595 field public static final int interpolator = 16843073; // 0x1010141 + field public static final int intro; field public static final int isAccessibilityTool = 16844353; // 0x1010641 field public static final int isAlwaysSyncable = 16843571; // 0x1010333 field public static final int isAsciiCapable = 16843753; // 0x10103e9 @@ -3247,6 +3248,7 @@ package android.accessibilityservice { method @Nullable public String getTileServiceClassName(); method public boolean isAccessibilityTool(); method public String loadDescription(android.content.pm.PackageManager); + method @Nullable public CharSequence loadIntro(@NonNull android.content.pm.PackageManager); method public CharSequence loadSummary(android.content.pm.PackageManager); method public void setInteractiveUiTimeoutMillis(@IntRange(from=0) int); method public void setNonInteractiveUiTimeoutMillis(@IntRange(from=0) int); diff --git a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java index 85e78540332fc..8af68d7c57620 100644 --- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java +++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java @@ -568,6 +568,11 @@ public class AccessibilityServiceInfo implements Parcelable { */ private String mNonLocalizedSummary; + /** + * Resource id of the intro of the accessibility service. + */ + private int mIntroResId; + /** * Resource id of the description of the accessibility service. */ @@ -737,6 +742,11 @@ public class AccessibilityServiceInfo implements Parcelable { R.styleable.AccessibilityService_isAccessibilityTool, false); mTileServiceClassName = asAttributes.getString( com.android.internal.R.styleable.AccessibilityService_tileService); + peekedValue = asAttributes.peekValue( + com.android.internal.R.styleable.AccessibilityService_intro); + if (peekedValue != null) { + mIntroResId = peekedValue.resourceId; + } asAttributes.recycle(); } catch (NameNotFoundException e) { throw new XmlPullParserException( "Unable to create context for: " @@ -956,6 +966,29 @@ public class AccessibilityServiceInfo implements Parcelable { return null; } + /** + * The localized intro of the accessibility service. + *

+ * Statically set from + * {@link AccessibilityService#SERVICE_META_DATA meta-data}. + *

+ * @return The localized intro if available, and {@code null} if a intro + * has not been provided. + */ + @Nullable + public CharSequence loadIntro(@NonNull PackageManager packageManager) { + if (mIntroResId == /* invalid */ 0) { + return null; + } + ServiceInfo serviceInfo = mResolveInfo.serviceInfo; + CharSequence intro = packageManager.getText(serviceInfo.packageName, + mIntroResId, serviceInfo.applicationInfo); + if (intro != null) { + return intro.toString().trim(); + } + return null; + } + /** * Gets the non-localized description of the accessibility service. *

@@ -1114,6 +1147,7 @@ public class AccessibilityServiceInfo implements Parcelable { parcel.writeString(mNonLocalizedDescription); parcel.writeBoolean(mIsAccessibilityTool); parcel.writeString(mTileServiceClassName); + parcel.writeInt(mIntroResId); } private void initFromParcel(Parcel parcel) { @@ -1137,6 +1171,7 @@ public class AccessibilityServiceInfo implements Parcelable { mNonLocalizedDescription = parcel.readString(); mIsAccessibilityTool = parcel.readBoolean(); mTileServiceClassName = parcel.readString(); + mIntroResId = parcel.readInt(); } @Override diff --git a/core/java/android/accessibilityservice/AccessibilityShortcutInfo.java b/core/java/android/accessibilityservice/AccessibilityShortcutInfo.java index 52a1cad7fd880..9a732199ed827 100644 --- a/core/java/android/accessibilityservice/AccessibilityShortcutInfo.java +++ b/core/java/android/accessibilityservice/AccessibilityShortcutInfo.java @@ -69,6 +69,11 @@ public final class AccessibilityShortcutInfo { */ private final ActivityInfo mActivityInfo; + /** + * Resource id of the intro of the accessibility shortcut target. + */ + private final int mIntroResId; + /** * Resource id of the summary of the accessibility shortcut target. */ @@ -160,6 +165,9 @@ public final class AccessibilityShortcutInfo { // Get tile service class name mTileServiceClassName = asAttributes.getString( com.android.internal.R.styleable.AccessibilityShortcutTarget_tileService); + // Gets intro + mIntroResId = asAttributes.getResourceId( + com.android.internal.R.styleable.AccessibilityShortcutTarget_intro, 0); asAttributes.recycle(); if ((mDescriptionResId == 0 && mHtmlDescriptionRes == 0) || mSummaryResId == 0) { @@ -202,6 +210,16 @@ public final class AccessibilityShortcutInfo { return loadResourceString(packageManager, mActivityInfo, mSummaryResId); } + /** + * The localized intro of the accessibility shortcut target. + * + * @return The localized intro. + */ + @Nullable + public String loadIntro(@NonNull PackageManager packageManager) { + return loadResourceString(packageManager, mActivityInfo, mIntroResId); + } + /** * The localized description of the accessibility shortcut target. * diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 3a9cb2e52ce75..fca2bd15787d1 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -3989,31 +3989,34 @@ + understand how the service can help them. --> - + - - + + + - + - + @@ -4023,6 +4026,8 @@ settings to remind users this accessibility service has a {@link android.service.quicksettings.TileService}. --> + + dummy string + + Accessibility shortcut intro + Accessibility shortcut description diff --git a/core/tests/coretests/res/xml/accessibility_shortcut_test_activity.xml b/core/tests/coretests/res/xml/accessibility_shortcut_test_activity.xml index 5fc536aafd0dd..52fe65d3ad795 100644 --- a/core/tests/coretests/res/xml/accessibility_shortcut_test_activity.xml +++ b/core/tests/coretests/res/xml/accessibility_shortcut_test_activity.xml @@ -23,4 +23,4 @@ android:htmlDescription="@string/accessibility_shortcut_html_description" android:settingsActivity="com.example.shortcut.target.SettingsActivity" android:tileService="com.example.shortcut.target.TileService" -/> \ No newline at end of file + android:intro="@string/accessibility_shortcut_intro" /> \ No newline at end of file diff --git a/core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java b/core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java index 76fb520c91bcd..f605a0075e8a2 100644 --- a/core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java +++ b/core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java @@ -88,6 +88,16 @@ public class AccessibilityShortcutInfoTest { mShortcutInfo.loadSummary(mPackageManager), is(summary)); } + @Test + public void testIntro() { + final String intro = mTargetContext.getResources() + .getString(R.string.accessibility_shortcut_intro); + + assertNotNull("Can't find intro string", intro); + assertThat("Intro is not correct", + mShortcutInfo.loadIntro(mPackageManager), is(intro)); + } + @Test public void testAnimatedImageRes() { assertThat("Animated image resource id is not correct",