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 @@
+
+