From d4d499cc997077b44e2a7a59d544783a21219c25 Mon Sep 17 00:00:00 2001 From: Peter_Liang Date: Thu, 31 Oct 2019 11:47:19 +0800 Subject: [PATCH] Support the rich content for accessibility service (2/n) New attributes for accessibility service 1. android:animatedImageDrawable 2. android:htmlDescription Bug: 136292241 Test: Maunal Change-Id: I59cafb44ae81aa64a3e28bdcdbf99fc5f283d29d --- api/current.txt | 4 ++ .../AccessibilityServiceInfo.java | 72 +++++++++++++++++++ core/res/res/values/attrs.xml | 8 +++ core/res/res/values/public.xml | 2 + 4 files changed, 86 insertions(+) diff --git a/api/current.txt b/api/current.txt index 28e90815d81cd..a5f2a121bef54 100644 --- a/api/current.txt +++ b/api/current.txt @@ -299,6 +299,7 @@ package android { field public static final int animateFirstView = 16843477; // 0x10102d5 field public static final int animateLayoutChanges = 16843506; // 0x10102f2 field public static final int animateOnClick = 16843356; // 0x101025c + field public static final int animatedImageDrawable = 16844298; // 0x101060a field public static final int animation = 16843213; // 0x10101cd field public static final int animationCache = 16842989; // 0x10100ed field public static final int animationDuration = 16843026; // 0x1010112 @@ -723,6 +724,7 @@ package android { field public static final int host = 16842792; // 0x1010028 field public static final int hotSpotX = 16844055; // 0x1010517 field public static final int hotSpotY = 16844056; // 0x1010518 + field public static final int htmlDescription = 16844299; // 0x101060b field public static final int hyphenationFrequency = 16843998; // 0x10104de field public static final int icon = 16842754; // 0x1010002 field @Deprecated public static final int iconPreview = 16843337; // 0x1010249 @@ -2925,6 +2927,7 @@ package android.accessibilityservice { method public int describeContents(); method public static String feedbackTypeToString(int); method public static String flagToString(int); + method public int getAnimatedImageRes(); method @Deprecated public boolean getCanRetrieveWindowContent(); method public int getCapabilities(); method @Deprecated public String getDescription(); @@ -2934,6 +2937,7 @@ package android.accessibilityservice { method public android.content.pm.ResolveInfo getResolveInfo(); method public String getSettingsActivityName(); method public String loadDescription(android.content.pm.PackageManager); + method @Nullable public String loadHtmlDescription(@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 61c5dac03da69..289eae7d197aa 100644 --- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java +++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java @@ -21,6 +21,8 @@ import static android.content.pm.PackageManager.FEATURE_FINGERPRINT; import android.accessibilityservice.AccessibilityButtonController.AccessibilityButtonCallback; import android.annotation.IntDef; import android.annotation.IntRange; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.UnsupportedAppUsage; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledAfter; @@ -521,6 +523,21 @@ public class AccessibilityServiceInfo implements Parcelable { @EnabledAfter(targetSdkVersion = android.os.Build.VERSION_CODES.Q) private static final long REQUEST_ACCESSIBILITY_BUTTON_CHANGE = 136293963L; + /** + * Resource id of the animated image of the accessibility service. + */ + private int mAnimatedImageRes; + + /** + * Resource id of the html description of the accessibility service. + */ + private int mHtmlDescriptionRes; + + /** + * Non localized html description of the accessibility service. + */ + private String mNonLocalizedHtmlDescription; + /** * Creates a new instance. */ @@ -636,6 +653,20 @@ public class AccessibilityServiceInfo implements Parcelable { mNonLocalizedSummary = nonLocalizedSummary.toString().trim(); } } + peekedValue = asAttributes.peekValue( + com.android.internal.R.styleable.AccessibilityService_animatedImageDrawable); + if (peekedValue != null) { + mAnimatedImageRes = peekedValue.resourceId; + } + peekedValue = asAttributes.peekValue( + com.android.internal.R.styleable.AccessibilityService_htmlDescription); + if (peekedValue != null) { + mHtmlDescriptionRes = peekedValue.resourceId; + final CharSequence nonLocalizedHtmlDescription = peekedValue.coerceToString(); + if (nonLocalizedHtmlDescription != null) { + mNonLocalizedHtmlDescription = nonLocalizedHtmlDescription.toString().trim(); + } + } asAttributes.recycle(); } catch (NameNotFoundException e) { throw new XmlPullParserException( "Unable to create context for: " @@ -737,6 +768,18 @@ public class AccessibilityServiceInfo implements Parcelable { return mSettingsActivityName; } + /** + * The animated image resource id. + *

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

+ * @return The animated image resource id. + */ + public int getAnimatedImageRes() { + return mAnimatedImageRes; + } + /** * Whether this service can retrieve the current window's content. *

@@ -843,6 +886,29 @@ public class AccessibilityServiceInfo implements Parcelable { return null; } + /** + * The localized html description of the accessibility service. + *

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

+ * @return The localized html description. + */ + @Nullable + public String loadHtmlDescription(@NonNull PackageManager packageManager) { + if (mHtmlDescriptionRes == 0) { + return mNonLocalizedHtmlDescription; + } + + final ServiceInfo serviceInfo = mResolveInfo.serviceInfo; + final CharSequence htmlDescription = packageManager.getText(serviceInfo.packageName, + mHtmlDescriptionRes, serviceInfo.applicationInfo); + if (htmlDescription != null) { + return htmlDescription.toString().trim(); + } + return null; + } + /** * Set the recommended time that non-interactive controls need to remain on the screen to * support the user. @@ -926,7 +992,10 @@ public class AccessibilityServiceInfo implements Parcelable { parcel.writeInt(mSummaryResId); parcel.writeString(mNonLocalizedSummary); parcel.writeInt(mDescriptionResId); + parcel.writeInt(mAnimatedImageRes); + parcel.writeInt(mHtmlDescriptionRes); parcel.writeString(mNonLocalizedDescription); + parcel.writeString(mNonLocalizedHtmlDescription); } private void initFromParcel(Parcel parcel) { @@ -945,7 +1014,10 @@ public class AccessibilityServiceInfo implements Parcelable { mSummaryResId = parcel.readInt(); mNonLocalizedSummary = parcel.readString(); mDescriptionResId = parcel.readInt(); + mAnimatedImageRes = parcel.readInt(); + mHtmlDescriptionRes = parcel.readInt(); mNonLocalizedDescription = parcel.readString(); + mNonLocalizedHtmlDescription = parcel.readString(); } @Override diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 642dc929e88a5..a528d946c792b 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -3752,6 +3752,14 @@

--> + + + + + + diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index cde95aa5c2808..00c24e5681087 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -3002,6 +3002,8 @@ + +