Accessibility settings refresh.

Categories were added to accessibility service info objects so that they can be grouped
in system Settings. Services can declare a category in their accessibility manifest file,
and if no category is defined, the service is placed under the "Other services" category.

Bug: 30374533

Test: Manually tested with BrailleBack & CTS tests modified to validate proper loading of summary.

Change-Id: I8718556764f2be4a18ce4e80e6bbd4950a41e387
This commit is contained in:
Saige McVea
2017-01-20 20:22:35 -08:00
parent 25e333cb3c
commit 08c41bcf5f
5 changed files with 56 additions and 5 deletions

View File

@@ -69,10 +69,10 @@ import static android.content.pm.PackageManager.FEATURE_FINGERPRINT;
* @attr ref android.R.styleable#AccessibilityService_canRequestTouchExplorationMode
* @attr ref android.R.styleable#AccessibilityService_canRetrieveWindowContent
* @attr ref android.R.styleable#AccessibilityService_description
* @attr ref android.R.styleable#AccessibilityService_summary
* @attr ref android.R.styleable#AccessibilityService_notificationTimeout
* @attr ref android.R.styleable#AccessibilityService_packageNames
* @attr ref android.R.styleable#AccessibilityService_settingsActivity
*
* @see AccessibilityService
* @see android.view.accessibility.AccessibilityEvent
* @see android.view.accessibility.AccessibilityManager
@@ -430,6 +430,16 @@ public class AccessibilityServiceInfo implements Parcelable {
*/
private int mCapabilities;
/**
* Resource id of the summary of the accessibility service.
*/
private int mSummaryResId;
/**
* Non-localized summary of the accessibility service.
*/
private String mNonLocalizedSummary;
/**
* Resource id of the description of the accessibility service.
*/
@@ -544,6 +554,15 @@ public class AccessibilityServiceInfo implements Parcelable {
mNonLocalizedDescription = nonLocalizedDescription.toString().trim();
}
}
peekedValue = asAttributes.peekValue(
com.android.internal.R.styleable.AccessibilityService_summary);
if (peekedValue != null) {
mSummaryResId = peekedValue.resourceId;
CharSequence nonLocalizedSummary = peekedValue.coerceToString();
if (nonLocalizedSummary != null) {
mNonLocalizedSummary = nonLocalizedSummary.toString().trim();
}
}
asAttributes.recycle();
} catch (NameNotFoundException e) {
throw new XmlPullParserException( "Unable to create context for: "
@@ -668,6 +687,27 @@ public class AccessibilityServiceInfo implements Parcelable {
mCapabilities = capabilities;
}
/**
* The localized summary of the accessibility service.
* <p>
* <strong>Statically set from
* {@link AccessibilityService#SERVICE_META_DATA meta-data}.</strong>
* </p>
* @return The localized summary.
*/
public String loadSummary(PackageManager packageManager) {
if (mSummaryResId == 0) {
return mNonLocalizedSummary;
}
ServiceInfo serviceInfo = mResolveInfo.serviceInfo;
CharSequence summary = packageManager.getText(serviceInfo.packageName,
mSummaryResId, serviceInfo.applicationInfo);
if (summary != null) {
return summary.toString().trim();
}
return null;
}
/**
* Gets the non-localized description of the accessibility service.
* <p>
@@ -726,6 +766,8 @@ public class AccessibilityServiceInfo implements Parcelable {
parcel.writeParcelable(mResolveInfo, 0);
parcel.writeString(mSettingsActivityName);
parcel.writeInt(mCapabilities);
parcel.writeInt(mSummaryResId);
parcel.writeString(mNonLocalizedSummary);
parcel.writeInt(mDescriptionResId);
parcel.writeString(mNonLocalizedDescription);
}
@@ -740,6 +782,8 @@ public class AccessibilityServiceInfo implements Parcelable {
mResolveInfo = parcel.readParcelable(null);
mSettingsActivityName = parcel.readString();
mCapabilities = parcel.readInt();
mSummaryResId = parcel.readInt();
mNonLocalizedSummary = parcel.readString();
mDescriptionResId = parcel.readInt();
mNonLocalizedDescription = parcel.readString();
}
@@ -790,6 +834,8 @@ public class AccessibilityServiceInfo implements Parcelable {
stringBuilder.append(", ");
stringBuilder.append("settingsActivityName: ").append(mSettingsActivityName);
stringBuilder.append(", ");
stringBuilder.append("summary: ").append(mNonLocalizedSummary);
stringBuilder.append(", ");
appendCapabilities(stringBuilder, mCapabilities);
return stringBuilder.toString();
}