summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authormincheli <mincheli@google.com>2021-09-22 15:20:33 +0800
committermincheli <mincheli@google.com>2022-01-03 10:31:54 +0800
commitbe41ea676c6bfa13d4a2b4cf3bc7f2048773243f (patch)
tree1724feae164192237bb5904305404923f3d6da2e /core/java/android
parenta75f5a9aed511e6551c624afb0b799f9964e7ce8 (diff)
Notifies window magnifcation changes for AccessibilityService (1/n)
See Design doc: go/b200769372 To make the behavior consistent on the new platform, The legcay callback, onMagnificationChanged(MagnificationController controller, Region region, float scale, float centerX, float centerY) keep notifying only full-screen magnification change as before. To support listening to the magnification changes of all magnification modes, the service should overide The new callback proposed in T, onMagnificationChanged(MagnificationController controller, Region region, MagnificationConfig config). TODO: Notify magnifcation change when window magnifier turns off Bug: 203013925 Test: atest AccessibilityMagnificationTest, atest MagnificationControllerTest, atest WindowMagnificationManagerTest, atest WindowMagnificationControllerTest, atest FullScreenMagnificationControllerTest, Change-Id: Ia73195a71f55bb26ef3f2eafce0dc73d8a65583b
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/accessibilityservice/AccessibilityService.java77
-rw-r--r--core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl3
-rw-r--r--core/java/android/app/UiAutomation.java3
3 files changed, 56 insertions, 27 deletions
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index 3d3855164274..08230c550aeb 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -587,7 +587,7 @@ public abstract class AccessibilityService extends Service {
boolean onKeyEvent(KeyEvent event);
/** Magnification changed callbacks for different displays */
void onMagnificationChanged(int displayId, @NonNull Region region,
- float scale, float centerX, float centerY);
+ MagnificationConfig config);
/** Callbacks for receiving motion events. */
void onMotionEvent(MotionEvent event);
/** Callback for tuch state changes. */
@@ -1183,14 +1183,14 @@ public abstract class AccessibilityService extends Service {
}
}
- private void onMagnificationChanged(int displayId, @NonNull Region region, float scale,
- float centerX, float centerY) {
+ private void onMagnificationChanged(int displayId, @NonNull Region region,
+ MagnificationConfig config) {
MagnificationController controller;
synchronized (mLock) {
controller = mMagnificationControllers.get(displayId);
}
if (controller != null) {
- controller.dispatchMagnificationChanged(region, scale, centerX, centerY);
+ controller.dispatchMagnificationChanged(region, config);
}
}
@@ -1328,8 +1328,8 @@ public abstract class AccessibilityService extends Service {
* Dispatches magnification changes to any registered listeners. This
* should be called on the service's main thread.
*/
- void dispatchMagnificationChanged(final @NonNull Region region, final float scale,
- final float centerX, final float centerY) {
+ void dispatchMagnificationChanged(final @NonNull Region region,
+ final MagnificationConfig config) {
final ArrayMap<OnMagnificationChangedListener, Handler> entries;
synchronized (mLock) {
if (mListeners == null || mListeners.isEmpty()) {
@@ -1348,16 +1348,13 @@ public abstract class AccessibilityService extends Service {
final OnMagnificationChangedListener listener = entries.keyAt(i);
final Handler handler = entries.valueAt(i);
if (handler != null) {
- handler.post(new Runnable() {
- @Override
- public void run() {
- listener.onMagnificationChanged(MagnificationController.this,
- region, scale, centerX, centerY);
- }
+ handler.post(() -> {
+ listener.onMagnificationChanged(MagnificationController.this,
+ region, config);
});
} else {
// We're already on the main thread, just run the listener.
- listener.onMagnificationChanged(this, region, scale, centerX, centerY);
+ listener.onMagnificationChanged(this, region, config);
}
}
}
@@ -1665,6 +1662,10 @@ public abstract class AccessibilityService extends Service {
public interface OnMagnificationChangedListener {
/**
* Called when the magnified region, scale, or center changes.
+ * <p>
+ * <strong>Note:</strong> This legacy callback notifies only full-screen
+ * magnification change.
+ * </p>
*
* @param controller the magnification controller
* @param region the magnification region
@@ -1676,6 +1677,38 @@ public abstract class AccessibilityService extends Service {
*/
void onMagnificationChanged(@NonNull MagnificationController controller,
@NonNull Region region, float scale, float centerX, float centerY);
+
+ /**
+ * Called when the magnified region, mode, scale, or center changes of
+ * all magnification modes.
+ * <p>
+ * <strong>Note:</strong> This method can be overridden to listen to the
+ * magnification changes of all magnification modes then the legacy callback
+ * would not receive the notifications.
+ * Skipping calling super when overriding this method results in
+ * {@link #onMagnificationChanged(MagnificationController, Region, float, float, float)}
+ * not getting called.
+ * </p>
+ *
+ * @param controller the magnification controller
+ * @param region the magnification region
+ * If the config mode is
+ * {@link MagnificationConfig#MAGNIFICATION_MODE_FULLSCREEN},
+ * it is the region of the screen currently active for magnification.
+ * that is the same region as {@link #getMagnificationRegion()}.
+ * If the config mode is
+ * {@link MagnificationConfig#MAGNIFICATION_MODE_WINDOW},
+ * it is the region of screen projected on the magnification window.
+ * @param config The magnification config. That has the controlling magnification
+ * mode, the new scale and the new screen-relative center position
+ */
+ default void onMagnificationChanged(@NonNull MagnificationController controller,
+ @NonNull Region region, @NonNull MagnificationConfig config) {
+ if (config.getMode() == MAGNIFICATION_MODE_FULLSCREEN) {
+ onMagnificationChanged(controller, region,
+ config.getScale(), config.getCenterX(), config.getCenterY());
+ }
+ }
}
}
@@ -2370,9 +2403,8 @@ public abstract class AccessibilityService extends Service {
@Override
public void onMagnificationChanged(int displayId, @NonNull Region region,
- float scale, float centerX, float centerY) {
- AccessibilityService.this.onMagnificationChanged(displayId, region, scale,
- centerX, centerY);
+ MagnificationConfig config) {
+ AccessibilityService.this.onMagnificationChanged(displayId, region, config);
}
@Override
@@ -2496,12 +2528,10 @@ public abstract class AccessibilityService extends Service {
/** Magnification changed callbacks for different displays */
public void onMagnificationChanged(int displayId, @NonNull Region region,
- float scale, float centerX, float centerY) {
+ MagnificationConfig config) {
final SomeArgs args = SomeArgs.obtain();
args.arg1 = region;
- args.arg2 = scale;
- args.arg3 = centerX;
- args.arg4 = centerY;
+ args.arg2 = config;
args.argi1 = displayId;
final Message message = mCaller.obtainMessageO(DO_ON_MAGNIFICATION_CHANGED, args);
@@ -2660,13 +2690,10 @@ public abstract class AccessibilityService extends Service {
if (mConnectionId != AccessibilityInteractionClient.NO_ID) {
final SomeArgs args = (SomeArgs) message.obj;
final Region region = (Region) args.arg1;
- final float scale = (float) args.arg2;
- final float centerX = (float) args.arg3;
- final float centerY = (float) args.arg4;
+ final MagnificationConfig config = (MagnificationConfig) args.arg2;
final int displayId = args.argi1;
args.recycle();
- mCallback.onMagnificationChanged(displayId, region, scale,
- centerX, centerY);
+ mCallback.onMagnificationChanged(displayId, region, config);
}
return;
}
diff --git a/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl b/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl
index 651c50f475c6..375383d5d858 100644
--- a/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl
+++ b/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl
@@ -21,6 +21,7 @@ import android.graphics.Region;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityWindowInfo;
import android.accessibilityservice.AccessibilityGestureEvent;
+import android.accessibilityservice.MagnificationConfig;
import android.view.KeyEvent;
import android.view.MotionEvent;
@@ -43,7 +44,7 @@ import android.view.MotionEvent;
void onKeyEvent(in KeyEvent event, int sequence);
- void onMagnificationChanged(int displayId, in Region region, float scale, float centerX, float centerY);
+ void onMagnificationChanged(int displayId, in Region region, in MagnificationConfig config);
void onMotionEvent(in MotionEvent event);
diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java
index 58ded716cf40..00903a880834 100644
--- a/core/java/android/app/UiAutomation.java
+++ b/core/java/android/app/UiAutomation.java
@@ -22,6 +22,7 @@ import android.accessibilityservice.AccessibilityService.IAccessibilityServiceCl
import android.accessibilityservice.AccessibilityServiceInfo;
import android.accessibilityservice.IAccessibilityServiceClient;
import android.accessibilityservice.IAccessibilityServiceConnection;
+import android.accessibilityservice.MagnificationConfig;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -1581,7 +1582,7 @@ public final class UiAutomation {
@Override
public void onMagnificationChanged(int displayId, @NonNull Region region,
- float scale, float centerX, float centerY) {
+ MagnificationConfig config) {
/* do nothing */
}