diff options
Diffstat (limited to 'core/java/android')
6 files changed, 126 insertions, 2 deletions
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index 0ad9e446dfc7..8e50184c96e0 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -18,6 +18,7 @@ package android.accessibilityservice; import android.accessibilityservice.GestureDescription.MotionEventGenerator; import android.annotation.CallbackExecutor; +import android.annotation.ColorInt; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -2118,6 +2119,27 @@ public abstract class AccessibilityService extends Service { } /** + * Sets the strokeWidth and color of the accessibility focus rectangle. + * + * @param strokeWidth The stroke width of the rectangle in pixels. + * Setting this value to zero results in no focus rectangle being drawn. + * @param color The color of the rectangle. + */ + public void setAccessibilityFocusAppearance(int strokeWidth, @ColorInt int color) { + IAccessibilityServiceConnection connection = + AccessibilityInteractionClient.getInstance().getConnection(mConnectionId); + if (connection != null) { + try { + connection.setFocusAppearance(strokeWidth, color); + } catch (RemoteException re) { + Log.w(LOG_TAG, "Error while setting the strokeWidth and color of the " + + "accessibility focus rectangle", re); + re.rethrowFromSystemServer(); + } + } + } + + /** * Implement to return the implementation of the internal accessibility * service interface. */ diff --git a/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl b/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl index 0b3b9b2ecae1..ab21dc9f14ad 100644 --- a/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl +++ b/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl @@ -115,4 +115,6 @@ interface IAccessibilityServiceConnection { void setGestureDetectionPassthroughRegion(int displayId, in Region region); void setTouchExplorationPassthroughRegion(int displayId, in Region region); + + void setFocusAppearance(int strokeWidth, int color); } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 349b84899f9d..2d633cbeb353 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -119,6 +119,7 @@ import android.graphics.Rect; import android.graphics.Region; import android.graphics.RenderNode; import android.graphics.drawable.Drawable; +import android.graphics.drawable.GradientDrawable; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManager.DisplayListener; import android.hardware.input.InputManager; @@ -4414,6 +4415,14 @@ public final class ViewRootImpl implements ViewParent, mView.mContext.getDrawable(value.resourceId); } } + // Sets the focus appearance data into the accessibility focus drawable. + if (mAttachInfo.mAccessibilityFocusDrawable instanceof GradientDrawable) { + final GradientDrawable drawable = + (GradientDrawable) mAttachInfo.mAccessibilityFocusDrawable; + drawable.setStroke(mAccessibilityManager.getAccessibilityFocusStrokeWidth(), + mAccessibilityManager.getAccessibilityFocusColor()); + } + return mAttachInfo.mAccessibilityFocusDrawable; } diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java index a8534faf43e5..56dcd5951e5e 100644 --- a/core/java/android/view/accessibility/AccessibilityManager.java +++ b/core/java/android/view/accessibility/AccessibilityManager.java @@ -19,9 +19,11 @@ package android.view.accessibility; import static android.accessibilityservice.AccessibilityServiceInfo.FLAG_ENABLE_ACCESSIBILITY_VOLUME; import android.Manifest; +import android.accessibilityservice.AccessibilityService; import android.accessibilityservice.AccessibilityServiceInfo; import android.accessibilityservice.AccessibilityServiceInfo.FeedbackType; import android.accessibilityservice.AccessibilityShortcutInfo; +import android.annotation.ColorInt; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -59,6 +61,7 @@ import android.view.IWindow; import android.view.View; import android.view.accessibility.AccessibilityEvent.EventType; +import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.IntPair; @@ -233,6 +236,11 @@ public final class AccessibilityManager { private int mPerformingAction = 0; + /** The stroke width of the focus rectangle in pixels */ + private int mFocusStrokeWidth; + /** The color of the focus rectangle */ + private int mFocusColor; + @UnsupportedAppUsage private final ArrayMap<AccessibilityStateChangeListener, Handler> mAccessibilityStateChangeListeners = new ArrayMap<>(); @@ -410,6 +418,13 @@ public final class AccessibilityManager { public void setRelevantEventTypes(int eventTypes) { mRelevantEventTypes = eventTypes; } + + @Override + public void setFocusAppearance(int strokeWidth, int color) { + synchronized (mLock) { + updateFocusAppearanceLocked(strokeWidth, color); + } + } }; /** @@ -457,6 +472,7 @@ public final class AccessibilityManager { mHandler = new Handler(context.getMainLooper(), mCallback); mUserId = userId; synchronized (mLock) { + initialFocusAppearanceLocked(context.getResources()); tryConnectToServiceLocked(service); } } @@ -464,18 +480,26 @@ public final class AccessibilityManager { /** * Create an instance. * + * @param context A {@link Context}. * @param handler The handler to use * @param service An interface to the backing service. * @param userId User id under which to run. + * @param serviceConnect {@code true} to connect the service or + * {@code false} not to connect the service. * * @hide */ - public AccessibilityManager(Handler handler, IAccessibilityManager service, int userId) { + @VisibleForTesting + public AccessibilityManager(Context context, Handler handler, IAccessibilityManager service, + int userId, boolean serviceConnect) { mCallback = new MyCallback(); mHandler = handler; mUserId = userId; synchronized (mLock) { - tryConnectToServiceLocked(service); + initialFocusAppearanceLocked(context.getResources()); + if (serviceConnect) { + tryConnectToServiceLocked(service); + } } } @@ -954,6 +978,32 @@ public final class AccessibilityManager { } /** + * Gets the strokeWidth of the focus rectangle. This value can be set by + * {@link AccessibilityService}. + * + * @return The strokeWidth of the focus rectangle in pixels. + * + */ + public int getAccessibilityFocusStrokeWidth() { + synchronized (mLock) { + return mFocusStrokeWidth; + } + } + + /** + * Gets the color of the focus rectangle. This value can be set by + * {@link AccessibilityService}. + * + * @return The color of the focus rectangle. + * + */ + public @ColorInt int getAccessibilityFocusColor() { + synchronized (mLock) { + return mFocusColor; + } + } + + /** * Get the preparers that are registered for an accessibility ID * * @param id The ID of interest @@ -1551,6 +1601,7 @@ public final class AccessibilityManager { setStateLocked(IntPair.first(userStateAndRelevantEvents)); mRelevantEventTypes = IntPair.second(userStateAndRelevantEvents); updateUiTimeout(service.getRecommendedTimeoutMillis()); + updateFocusAppearanceLocked(service.getFocusStrokeWidth(), service.getFocusColor()); mService = service; } catch (RemoteException re) { Log.e(LOG_TAG, "AccessibilityManagerService is dead", re); @@ -1635,6 +1686,40 @@ public final class AccessibilityManager { } /** + * Updates the stroke width and color of the focus rectangle. + * + * @param strokeWidth The strokeWidth of the focus rectangle. + * @param color The color of the focus rectangle. + */ + private void updateFocusAppearanceLocked(int strokeWidth, int color) { + if (mFocusStrokeWidth == strokeWidth && mFocusColor == color) { + return; + } + mFocusStrokeWidth = strokeWidth; + mFocusColor = color; + } + + /** + * Sets the stroke width and color of the focus rectangle to default value. + * + * @param resource The resources. + */ + private void initialFocusAppearanceLocked(Resources resource) { + try { + mFocusStrokeWidth = resource.getDimensionPixelSize( + R.dimen.accessibility_focus_highlight_stroke_width); + mFocusColor = resource.getColor(R.color.accessibility_focus_highlight_color); + } catch (Resources.NotFoundException re) { + // Sets the stroke width and color to default value by hardcoded for making + // the Talkback can work normally. + mFocusStrokeWidth = (int) (4 * resource.getDisplayMetrics().density); + mFocusColor = 0xbf39b500; + Log.e(LOG_TAG, "Error while initialing the focus appearance data then setting to" + + " default value by hardcoded", re); + } + } + + /** * Determines if the accessibility button within the system navigation area is supported. * * @return {@code true} if the accessibility button is supported on this device, diff --git a/core/java/android/view/accessibility/IAccessibilityManager.aidl b/core/java/android/view/accessibility/IAccessibilityManager.aidl index 5d3c72015ee3..c71ea53c414d 100644 --- a/core/java/android/view/accessibility/IAccessibilityManager.aidl +++ b/core/java/android/view/accessibility/IAccessibilityManager.aidl @@ -92,4 +92,8 @@ interface IAccessibilityManager { void associateEmbeddedHierarchy(IBinder host, IBinder embedded); void disassociateEmbeddedHierarchy(IBinder token); + + int getFocusStrokeWidth(); + + int getFocusColor(); } diff --git a/core/java/android/view/accessibility/IAccessibilityManagerClient.aidl b/core/java/android/view/accessibility/IAccessibilityManagerClient.aidl index 94b9ad1c3279..041399ccb8ec 100644 --- a/core/java/android/view/accessibility/IAccessibilityManagerClient.aidl +++ b/core/java/android/view/accessibility/IAccessibilityManagerClient.aidl @@ -29,4 +29,6 @@ oneway interface IAccessibilityManagerClient { void notifyServicesStateChanged(long updatedUiTimeout); void setRelevantEventTypes(int eventTypes); + + void setFocusAppearance(int strokeWidth, int color); } |
