Merge "The touch exploration capability is dynamically granted pre-JellyBeanMR2." into jb-mr2-dev

This commit is contained in:
Svetoslav
2013-04-25 01:44:42 +00:00
committed by Android (Google) Code Review
3 changed files with 50 additions and 28 deletions

View File

@@ -375,23 +375,6 @@ public class AccessibilityServiceInfo implements Parcelable {
/* do nothing */
}
/**
* Creates a new instance.
*
* @param isAutomation Whether this is a test automation service.
*
* @hide
*/
public AccessibilityServiceInfo(boolean isAutomation) {
// Automation service can do anything.
if (isAutomation) {
mCapabilities |= CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT
| CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION
| CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY
| CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS;
}
}
/**
* Creates a new instance.
*
@@ -461,8 +444,8 @@ public class AccessibilityServiceInfo implements Parcelable {
mCapabilities |= CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION;
}
if (asAttributes.getBoolean(com.android.internal.R.styleable
.AccessibilityService_canRequestEnhancedWebAccessibility, false)) {
mCapabilities |= CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY;
.AccessibilityService_canRequestEnhancedWebAccessibility, false)) {
mCapabilities |= CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY;
}
if (asAttributes.getBoolean(com.android.internal.R.styleable
.AccessibilityService_canRequestFilterKeyEvents, false)) {
@@ -573,6 +556,23 @@ public class AccessibilityServiceInfo implements Parcelable {
return mCapabilities;
}
/**
* Sets the bit mask of capabilities this accessibility service has such as
* being able to retrieve the active window content, etc.
*
* @param capabilities The capability bit mask.
*
* @see #CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT
* @see #CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION
* @see #CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY
* @see #CAPABILITY_FILTER_KEY_EVENTS
*
* @hide
*/
public void setCapabilities(int capabilities) {
mCapabilities = capabilities;
}
/**
* Gets the non-localized description of the accessibility service.
* <p>

View File

@@ -158,11 +158,15 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub {
private void registerUiTestAutomationServiceLocked(IAccessibilityServiceClient client) {
IAccessibilityManager manager = IAccessibilityManager.Stub.asInterface(
ServiceManager.getService(Context.ACCESSIBILITY_SERVICE));
AccessibilityServiceInfo info = new AccessibilityServiceInfo(true);
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
info.flags |= AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS
| AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS;
info.setCapabilities(AccessibilityServiceInfo.CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT
| AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION
| AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY
| AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS);
try {
// Calling out with a lock held is fine since if the system
// process is gone the client calling in will be killed.

View File

@@ -1261,6 +1261,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
}
private void onUserStateChangedLocked(UserState userState) {
updateLegacyCapabilities(userState);
updateServicesLocked(userState);
updateTouchExplorationLocked(userState);
updateEnhancedWebAccessibilityLocked(userState);
@@ -1268,6 +1269,28 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
scheduleUpdateClientsIfNeededLocked(userState);
}
private void updateLegacyCapabilities(UserState userState) {
// Up to JB-MR1 we had a white list with services that can enable touch
// exploration. When a service is first started we show a dialog to the
// use to get a permission to white list the service.
final int installedServiceCount = userState.mInstalledServices.size();
for (int i = 0; i < installedServiceCount; i++) {
AccessibilityServiceInfo serviceInfo = userState.mInstalledServices.get(i);
ResolveInfo resolveInfo = serviceInfo.getResolveInfo();
if ((serviceInfo.getCapabilities()
& AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION) == 0
&& resolveInfo.serviceInfo.applicationInfo.targetSdkVersion
<= Build.VERSION_CODES.JELLY_BEAN_MR1) {
ComponentName componentName = new ComponentName(
resolveInfo.serviceInfo.packageName, resolveInfo.serviceInfo.name);
if (userState.mTouchExplorationGrantedServices.contains(componentName)) {
serviceInfo.setCapabilities(serviceInfo.getCapabilities()
| AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION);
}
}
}
}
private void updateServicesLocked(UserState userState) {
if (userState.mIsAccessibilityEnabled) {
manageServicesLocked(userState);
@@ -1658,8 +1681,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
Intent mIntent;
boolean mCanRetrieveScreenContent;
boolean mIsAutomation;
final Rect mTempBounds = new Rect();
@@ -1695,15 +1716,11 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
mAccessibilityServiceInfo = accessibilityServiceInfo;
mIsAutomation = (sFakeAccessibilityServiceComponentName.equals(componentName));
if (!mIsAutomation) {
mCanRetrieveScreenContent = (accessibilityServiceInfo.getCapabilities()
& AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION) != 0;
mIntent = new Intent().setComponent(mComponentName);
mIntent.putExtra(Intent.EXTRA_CLIENT_LABEL,
com.android.internal.R.string.accessibility_binding_label);
mIntent.putExtra(Intent.EXTRA_CLIENT_INTENT, PendingIntent.getActivity(
mContext, 0, new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS), 0));
} else {
mCanRetrieveScreenContent = true;
}
setDynamicallyConfigurableProperties(accessibilityServiceInfo);
}
@@ -2152,7 +2169,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
.loadLabel(mContext.getPackageManager()));
pw.append(", feedbackType"
+ AccessibilityServiceInfo.feedbackTypeToString(mFeedbackType));
pw.append(", canRetrieveScreenContent=" + mCanRetrieveScreenContent);
pw.append(", capabilities=" + mAccessibilityServiceInfo.getCapabilities());
pw.append(", eventTypes="
+ AccessibilityEvent.eventTypeToString(mEventTypes));
pw.append(", notificationTimeout=" + mNotificationTimeout);
@@ -2742,7 +2759,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
}
public boolean canRetrieveWindowContent(Service service) {
return service.mCanRetrieveScreenContent;
return (service.mAccessibilityServiceInfo.getCapabilities()
& AccessibilityServiceInfo.CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT) != 0;
}
public void enforceCanRetrieveWindowContent(Service service) throws RemoteException {