summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/accessibilityservice/AccessibilityService.java22
-rw-r--r--core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl2
-rw-r--r--core/java/android/view/ViewRootImpl.java9
-rw-r--r--core/java/android/view/accessibility/AccessibilityManager.java89
-rw-r--r--core/java/android/view/accessibility/IAccessibilityManager.aidl4
-rw-r--r--core/java/android/view/accessibility/IAccessibilityManagerClient.aidl2
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);
}