Loading services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java +26 −45 Original line number Diff line number Diff line Loading @@ -242,6 +242,9 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ int getCurrentUserIdLocked(); Pair<float[], MagnificationSpec> getWindowTransformationMatrixAndMagnificationSpec( int windowId); boolean isAccessibilityButtonShown(); /** Loading Loading @@ -551,8 +554,6 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ final int resolvedWindowId; RemoteAccessibilityConnection connection; Region partialInteractiveRegion = Region.obtain(); final MagnificationSpec spec; final float[] transformMatrix; synchronized (mLock) { mUsesAccessibilityCache = true; if (!hasRightsToCurrentUserLocked()) { Loading @@ -576,11 +577,11 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ partialInteractiveRegion.recycle(); partialInteractiveRegion = null; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getTransformMatrixAndSpecLocked(resolvedWindowId); transformMatrix = transformMatrixAndSpec.first; spec = transformMatrixAndSpec.second; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getWindowTransformationMatrixAndMagnificationSpec(resolvedWindowId); final float[] transformMatrix = transformMatrixAndSpec.first; final MagnificationSpec spec = transformMatrixAndSpec.second; if (!mSecurityPolicy.checkAccessibilityAccess(this)) { return null; } Loading Loading @@ -628,8 +629,6 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ final int resolvedWindowId; RemoteAccessibilityConnection connection; Region partialInteractiveRegion = Region.obtain(); final MagnificationSpec spec; final float [] transformMatrix; synchronized (mLock) { mUsesAccessibilityCache = true; if (!hasRightsToCurrentUserLocked()) { Loading @@ -653,11 +652,11 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ partialInteractiveRegion.recycle(); partialInteractiveRegion = null; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getTransformMatrixAndSpecLocked(resolvedWindowId); transformMatrix = transformMatrixAndSpec.first; spec = transformMatrixAndSpec.second; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getWindowTransformationMatrixAndMagnificationSpec(resolvedWindowId); final float[] transformMatrix = transformMatrixAndSpec.first; final MagnificationSpec spec = transformMatrixAndSpec.second; if (!mSecurityPolicy.checkAccessibilityAccess(this)) { return null; } Loading Loading @@ -706,8 +705,6 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ final int resolvedWindowId; RemoteAccessibilityConnection connection; Region partialInteractiveRegion = Region.obtain(); final MagnificationSpec spec; final float[] transformMatrix; synchronized (mLock) { mUsesAccessibilityCache = true; if (!hasRightsToCurrentUserLocked()) { Loading @@ -731,11 +728,11 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ partialInteractiveRegion.recycle(); partialInteractiveRegion = null; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getTransformMatrixAndSpecLocked(resolvedWindowId); transformMatrix = transformMatrixAndSpec.first; spec = transformMatrixAndSpec.second; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getWindowTransformationMatrixAndMagnificationSpec(resolvedWindowId); final float[] transformMatrix = transformMatrixAndSpec.first; final MagnificationSpec spec = transformMatrixAndSpec.second; if (!mSecurityPolicy.checkAccessibilityAccess(this)) { return null; } Loading Loading @@ -786,8 +783,6 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ final int resolvedWindowId; RemoteAccessibilityConnection connection; Region partialInteractiveRegion = Region.obtain(); final MagnificationSpec spec; final float[] transformMatrix; synchronized (mLock) { if (!hasRightsToCurrentUserLocked()) { return null; Loading @@ -811,11 +806,11 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ partialInteractiveRegion.recycle(); partialInteractiveRegion = null; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getTransformMatrixAndSpecLocked(resolvedWindowId); transformMatrix = transformMatrixAndSpec.first; spec = transformMatrixAndSpec.second; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getWindowTransformationMatrixAndMagnificationSpec(resolvedWindowId); final float[] transformMatrix = transformMatrixAndSpec.first; final MagnificationSpec spec = transformMatrixAndSpec.second; if (!mSecurityPolicy.checkAccessibilityAccess(this)) { return null; } Loading Loading @@ -865,8 +860,6 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ final int resolvedWindowId; RemoteAccessibilityConnection connection; Region partialInteractiveRegion = Region.obtain(); final MagnificationSpec spec; final float[] transformMatrix; synchronized (mLock) { if (!hasRightsToCurrentUserLocked()) { return null; Loading @@ -889,12 +882,11 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ partialInteractiveRegion.recycle(); partialInteractiveRegion = null; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getTransformMatrixAndSpecLocked(resolvedWindowId); transformMatrix = transformMatrixAndSpec.first; spec = transformMatrixAndSpec.second; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getWindowTransformationMatrixAndMagnificationSpec(resolvedWindowId); final float[] transformMatrix = transformMatrixAndSpec.first; final MagnificationSpec spec = transformMatrixAndSpec.second; if (!mSecurityPolicy.checkAccessibilityAccess(this)) { return null; } Loading Loading @@ -1672,21 +1664,10 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ mInvocationHandler.startInputLocked(connection, editorInfo, restarting); } @Nullable Pair<float[], MagnificationSpec> getTransformMatrixAndSpecLocked(int resolvedWindowId) { final WindowInfo windowInfo = mA11yWindowManager.findWindowInfoByIdLocked(resolvedWindowId); if (windowInfo == null) { Slog.w(LOG_TAG, "getTransformMatrixAndSpec, windowInfo is null window id = " + resolvedWindowId); return new Pair<>(null, null); } final MagnificationSpec spec = new MagnificationSpec(); spec.setTo(windowInfo.mMagnificationSpec); return new Pair<>(windowInfo.mTransformMatrix, spec); private Pair<float[], MagnificationSpec> getWindowTransformationMatrixAndMagnificationSpec( int resolvedWindowId) { return mSystemSupport.getWindowTransformationMatrixAndMagnificationSpec(resolvedWindowId); } /** Loading services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +41 −4 Original line number Diff line number Diff line Loading @@ -68,6 +68,7 @@ import android.content.pm.PackageManagerInternal; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.database.ContentObserver; import android.graphics.Matrix; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Region; Loading Loading @@ -99,6 +100,7 @@ import android.text.TextUtils; import android.text.TextUtils.SimpleStringSplitter; import android.util.ArraySet; import android.util.IntArray; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; import android.view.Display; Loading Loading @@ -457,6 +459,41 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub return mIsAccessibilityButtonShown; } @Override public Pair<float[], MagnificationSpec> getWindowTransformationMatrixAndMagnificationSpec( int windowId) { WindowInfo windowInfo; synchronized (mLock) { windowInfo = mA11yWindowManager.findWindowInfoByIdLocked(windowId); } if (windowInfo != null) { final MagnificationSpec spec = new MagnificationSpec(); spec.setTo(windowInfo.mMagnificationSpec); return new Pair<>(windowInfo.mTransformMatrix, spec); } else { // If the framework doesn't track windows, we fall back to get the pair of // transformation matrix and MagnificationSpe from the WindowManagerService's // WindowState. IBinder token; synchronized (mLock) { token = mA11yWindowManager.getWindowTokenForUserAndWindowIdLocked(mCurrentUserId, windowId); } Pair<Matrix, MagnificationSpec> pair = mWindowManagerService.getWindowTransformationMatrixAndMagnificationSpec(token); final float[] outTransformationMatrix = new float[9]; final Matrix tmpMatrix = pair.first; final MagnificationSpec spec = pair.second; if (!spec.isNop()) { tmpMatrix.postScale(spec.scale, spec.scale); tmpMatrix.postTranslate(spec.offsetX, spec.offsetY); } tmpMatrix.getValues(outTransformationMatrix); return new Pair<>(outTransformationMatrix, pair.second); } } @Override public void onServiceInfoChangedLocked(AccessibilityUserState userState) { mSecurityPolicy.onBoundServicesChangedLocked(userState.mUserId, Loading Loading @@ -3750,12 +3787,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub boundsInScreenBeforeMagnification.centerY()); // Invert magnification if needed. final WindowInfo windowInfo = mA11yWindowManager.findWindowInfoByIdLocked( focus.getWindowId()); final Pair<float[], MagnificationSpec> pair = getWindowTransformationMatrixAndMagnificationSpec(focus.getWindowId()); MagnificationSpec spec = null; if (windowInfo != null) { if (pair != null && pair.second != null) { spec = new MagnificationSpec(); spec.setTo(windowInfo.mMagnificationSpec); spec.setTo(pair.second); } if (spec != null && !spec.isNop()) { Loading services/core/java/com/android/server/wm/AccessibilityController.java +37 −0 Original line number Diff line number Diff line Loading @@ -446,6 +446,43 @@ final class AccessibilityController { // Not relevant for the window observer. } public Pair<Matrix, MagnificationSpec> getWindowTransformationMatrixAndMagnificationSpec( IBinder token) { synchronized (mService.mGlobalLock) { final Matrix transformationMatrix = new Matrix(); final MagnificationSpec magnificationSpec = new MagnificationSpec(); final WindowState windowState = mService.mWindowMap.get(token); if (windowState != null) { windowState.getTransformationMatrix(new float[9], transformationMatrix); if (hasCallbacks()) { final MagnificationSpec otherMagnificationSpec = getMagnificationSpecForWindow(windowState); if (otherMagnificationSpec != null && !otherMagnificationSpec.isNop()) { magnificationSpec.setTo(otherMagnificationSpec); } } } return new Pair<>(transformationMatrix, magnificationSpec); } } MagnificationSpec getMagnificationSpecForWindow(WindowState windowState) { if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) { mAccessibilityTracing.logTrace(TAG + ".getMagnificationSpecForWindow", FLAGS_MAGNIFICATION_CALLBACK, "windowState={" + windowState + "}"); } final int displayId = windowState.getDisplayId(); final DisplayMagnifier displayMagnifier = mDisplayMagnifiers.get(displayId); if (displayMagnifier != null) { return displayMagnifier.getMagnificationSpecForWindow(windowState); } return null; } boolean hasCallbacks() { if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK | FLAGS_WINDOWS_FOR_ACCESSIBILITY_CALLBACK)) { Loading services/core/java/com/android/server/wm/WindowManagerInternal.java +13 −0 Original line number Diff line number Diff line Loading @@ -23,11 +23,13 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ClipData; import android.content.Context; import android.graphics.Matrix; import android.graphics.Rect; import android.graphics.Region; import android.hardware.display.DisplayManagerInternal; import android.os.Bundle; import android.os.IBinder; import android.util.Pair; import android.view.Display; import android.view.IInputFilter; import android.view.IRemoteAnimationFinishedCallback; Loading Loading @@ -458,6 +460,17 @@ public abstract class WindowManagerInternal { */ public abstract void getWindowFrame(IBinder token, Rect outBounds); /** * Get the transformation matrix and MagnificationSpec given its token. * * @param token The token. * @return The pair of the transformation matrix and magnification spec. */ // TODO (b/231663133): Long term solution for tracking window when the // FLAG_RETRIEVE_INTERACTIVE_WINDOWS is unset. public abstract Pair<Matrix, MagnificationSpec> getWindowTransformationMatrixAndMagnificationSpec(IBinder token); /** * Opens the global actions dialog. */ Loading services/core/java/com/android/server/wm/WindowManagerService.java +9 −0 Original line number Diff line number Diff line Loading @@ -173,6 +173,7 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.database.ContentObserver; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; Loading Loading @@ -224,6 +225,7 @@ import android.util.ArraySet; import android.util.DisplayMetrics; import android.util.EventLog; import android.util.MergedConfiguration; import android.util.Pair; import android.util.Slog; import android.util.SparseBooleanArray; import android.util.TimeUtils; Loading Loading @@ -7768,6 +7770,13 @@ public class WindowManagerService extends IWindowManager.Stub } } @Override public Pair<Matrix, MagnificationSpec> getWindowTransformationMatrixAndMagnificationSpec( IBinder token) { return mAccessibilityController .getWindowTransformationMatrixAndMagnificationSpec(token); } @Override public void waitForAllWindowsDrawn(Runnable callback, long timeout, int displayId) { final WindowContainer container = displayId == INVALID_DISPLAY Loading Loading
services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java +26 −45 Original line number Diff line number Diff line Loading @@ -242,6 +242,9 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ int getCurrentUserIdLocked(); Pair<float[], MagnificationSpec> getWindowTransformationMatrixAndMagnificationSpec( int windowId); boolean isAccessibilityButtonShown(); /** Loading Loading @@ -551,8 +554,6 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ final int resolvedWindowId; RemoteAccessibilityConnection connection; Region partialInteractiveRegion = Region.obtain(); final MagnificationSpec spec; final float[] transformMatrix; synchronized (mLock) { mUsesAccessibilityCache = true; if (!hasRightsToCurrentUserLocked()) { Loading @@ -576,11 +577,11 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ partialInteractiveRegion.recycle(); partialInteractiveRegion = null; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getTransformMatrixAndSpecLocked(resolvedWindowId); transformMatrix = transformMatrixAndSpec.first; spec = transformMatrixAndSpec.second; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getWindowTransformationMatrixAndMagnificationSpec(resolvedWindowId); final float[] transformMatrix = transformMatrixAndSpec.first; final MagnificationSpec spec = transformMatrixAndSpec.second; if (!mSecurityPolicy.checkAccessibilityAccess(this)) { return null; } Loading Loading @@ -628,8 +629,6 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ final int resolvedWindowId; RemoteAccessibilityConnection connection; Region partialInteractiveRegion = Region.obtain(); final MagnificationSpec spec; final float [] transformMatrix; synchronized (mLock) { mUsesAccessibilityCache = true; if (!hasRightsToCurrentUserLocked()) { Loading @@ -653,11 +652,11 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ partialInteractiveRegion.recycle(); partialInteractiveRegion = null; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getTransformMatrixAndSpecLocked(resolvedWindowId); transformMatrix = transformMatrixAndSpec.first; spec = transformMatrixAndSpec.second; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getWindowTransformationMatrixAndMagnificationSpec(resolvedWindowId); final float[] transformMatrix = transformMatrixAndSpec.first; final MagnificationSpec spec = transformMatrixAndSpec.second; if (!mSecurityPolicy.checkAccessibilityAccess(this)) { return null; } Loading Loading @@ -706,8 +705,6 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ final int resolvedWindowId; RemoteAccessibilityConnection connection; Region partialInteractiveRegion = Region.obtain(); final MagnificationSpec spec; final float[] transformMatrix; synchronized (mLock) { mUsesAccessibilityCache = true; if (!hasRightsToCurrentUserLocked()) { Loading @@ -731,11 +728,11 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ partialInteractiveRegion.recycle(); partialInteractiveRegion = null; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getTransformMatrixAndSpecLocked(resolvedWindowId); transformMatrix = transformMatrixAndSpec.first; spec = transformMatrixAndSpec.second; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getWindowTransformationMatrixAndMagnificationSpec(resolvedWindowId); final float[] transformMatrix = transformMatrixAndSpec.first; final MagnificationSpec spec = transformMatrixAndSpec.second; if (!mSecurityPolicy.checkAccessibilityAccess(this)) { return null; } Loading Loading @@ -786,8 +783,6 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ final int resolvedWindowId; RemoteAccessibilityConnection connection; Region partialInteractiveRegion = Region.obtain(); final MagnificationSpec spec; final float[] transformMatrix; synchronized (mLock) { if (!hasRightsToCurrentUserLocked()) { return null; Loading @@ -811,11 +806,11 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ partialInteractiveRegion.recycle(); partialInteractiveRegion = null; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getTransformMatrixAndSpecLocked(resolvedWindowId); transformMatrix = transformMatrixAndSpec.first; spec = transformMatrixAndSpec.second; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getWindowTransformationMatrixAndMagnificationSpec(resolvedWindowId); final float[] transformMatrix = transformMatrixAndSpec.first; final MagnificationSpec spec = transformMatrixAndSpec.second; if (!mSecurityPolicy.checkAccessibilityAccess(this)) { return null; } Loading Loading @@ -865,8 +860,6 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ final int resolvedWindowId; RemoteAccessibilityConnection connection; Region partialInteractiveRegion = Region.obtain(); final MagnificationSpec spec; final float[] transformMatrix; synchronized (mLock) { if (!hasRightsToCurrentUserLocked()) { return null; Loading @@ -889,12 +882,11 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ partialInteractiveRegion.recycle(); partialInteractiveRegion = null; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getTransformMatrixAndSpecLocked(resolvedWindowId); transformMatrix = transformMatrixAndSpec.first; spec = transformMatrixAndSpec.second; } final Pair<float[], MagnificationSpec> transformMatrixAndSpec = getWindowTransformationMatrixAndMagnificationSpec(resolvedWindowId); final float[] transformMatrix = transformMatrixAndSpec.first; final MagnificationSpec spec = transformMatrixAndSpec.second; if (!mSecurityPolicy.checkAccessibilityAccess(this)) { return null; } Loading Loading @@ -1672,21 +1664,10 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ mInvocationHandler.startInputLocked(connection, editorInfo, restarting); } @Nullable Pair<float[], MagnificationSpec> getTransformMatrixAndSpecLocked(int resolvedWindowId) { final WindowInfo windowInfo = mA11yWindowManager.findWindowInfoByIdLocked(resolvedWindowId); if (windowInfo == null) { Slog.w(LOG_TAG, "getTransformMatrixAndSpec, windowInfo is null window id = " + resolvedWindowId); return new Pair<>(null, null); } final MagnificationSpec spec = new MagnificationSpec(); spec.setTo(windowInfo.mMagnificationSpec); return new Pair<>(windowInfo.mTransformMatrix, spec); private Pair<float[], MagnificationSpec> getWindowTransformationMatrixAndMagnificationSpec( int resolvedWindowId) { return mSystemSupport.getWindowTransformationMatrixAndMagnificationSpec(resolvedWindowId); } /** Loading
services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +41 −4 Original line number Diff line number Diff line Loading @@ -68,6 +68,7 @@ import android.content.pm.PackageManagerInternal; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.database.ContentObserver; import android.graphics.Matrix; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Region; Loading Loading @@ -99,6 +100,7 @@ import android.text.TextUtils; import android.text.TextUtils.SimpleStringSplitter; import android.util.ArraySet; import android.util.IntArray; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; import android.view.Display; Loading Loading @@ -457,6 +459,41 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub return mIsAccessibilityButtonShown; } @Override public Pair<float[], MagnificationSpec> getWindowTransformationMatrixAndMagnificationSpec( int windowId) { WindowInfo windowInfo; synchronized (mLock) { windowInfo = mA11yWindowManager.findWindowInfoByIdLocked(windowId); } if (windowInfo != null) { final MagnificationSpec spec = new MagnificationSpec(); spec.setTo(windowInfo.mMagnificationSpec); return new Pair<>(windowInfo.mTransformMatrix, spec); } else { // If the framework doesn't track windows, we fall back to get the pair of // transformation matrix and MagnificationSpe from the WindowManagerService's // WindowState. IBinder token; synchronized (mLock) { token = mA11yWindowManager.getWindowTokenForUserAndWindowIdLocked(mCurrentUserId, windowId); } Pair<Matrix, MagnificationSpec> pair = mWindowManagerService.getWindowTransformationMatrixAndMagnificationSpec(token); final float[] outTransformationMatrix = new float[9]; final Matrix tmpMatrix = pair.first; final MagnificationSpec spec = pair.second; if (!spec.isNop()) { tmpMatrix.postScale(spec.scale, spec.scale); tmpMatrix.postTranslate(spec.offsetX, spec.offsetY); } tmpMatrix.getValues(outTransformationMatrix); return new Pair<>(outTransformationMatrix, pair.second); } } @Override public void onServiceInfoChangedLocked(AccessibilityUserState userState) { mSecurityPolicy.onBoundServicesChangedLocked(userState.mUserId, Loading Loading @@ -3750,12 +3787,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub boundsInScreenBeforeMagnification.centerY()); // Invert magnification if needed. final WindowInfo windowInfo = mA11yWindowManager.findWindowInfoByIdLocked( focus.getWindowId()); final Pair<float[], MagnificationSpec> pair = getWindowTransformationMatrixAndMagnificationSpec(focus.getWindowId()); MagnificationSpec spec = null; if (windowInfo != null) { if (pair != null && pair.second != null) { spec = new MagnificationSpec(); spec.setTo(windowInfo.mMagnificationSpec); spec.setTo(pair.second); } if (spec != null && !spec.isNop()) { Loading
services/core/java/com/android/server/wm/AccessibilityController.java +37 −0 Original line number Diff line number Diff line Loading @@ -446,6 +446,43 @@ final class AccessibilityController { // Not relevant for the window observer. } public Pair<Matrix, MagnificationSpec> getWindowTransformationMatrixAndMagnificationSpec( IBinder token) { synchronized (mService.mGlobalLock) { final Matrix transformationMatrix = new Matrix(); final MagnificationSpec magnificationSpec = new MagnificationSpec(); final WindowState windowState = mService.mWindowMap.get(token); if (windowState != null) { windowState.getTransformationMatrix(new float[9], transformationMatrix); if (hasCallbacks()) { final MagnificationSpec otherMagnificationSpec = getMagnificationSpecForWindow(windowState); if (otherMagnificationSpec != null && !otherMagnificationSpec.isNop()) { magnificationSpec.setTo(otherMagnificationSpec); } } } return new Pair<>(transformationMatrix, magnificationSpec); } } MagnificationSpec getMagnificationSpecForWindow(WindowState windowState) { if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) { mAccessibilityTracing.logTrace(TAG + ".getMagnificationSpecForWindow", FLAGS_MAGNIFICATION_CALLBACK, "windowState={" + windowState + "}"); } final int displayId = windowState.getDisplayId(); final DisplayMagnifier displayMagnifier = mDisplayMagnifiers.get(displayId); if (displayMagnifier != null) { return displayMagnifier.getMagnificationSpecForWindow(windowState); } return null; } boolean hasCallbacks() { if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK | FLAGS_WINDOWS_FOR_ACCESSIBILITY_CALLBACK)) { Loading
services/core/java/com/android/server/wm/WindowManagerInternal.java +13 −0 Original line number Diff line number Diff line Loading @@ -23,11 +23,13 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ClipData; import android.content.Context; import android.graphics.Matrix; import android.graphics.Rect; import android.graphics.Region; import android.hardware.display.DisplayManagerInternal; import android.os.Bundle; import android.os.IBinder; import android.util.Pair; import android.view.Display; import android.view.IInputFilter; import android.view.IRemoteAnimationFinishedCallback; Loading Loading @@ -458,6 +460,17 @@ public abstract class WindowManagerInternal { */ public abstract void getWindowFrame(IBinder token, Rect outBounds); /** * Get the transformation matrix and MagnificationSpec given its token. * * @param token The token. * @return The pair of the transformation matrix and magnification spec. */ // TODO (b/231663133): Long term solution for tracking window when the // FLAG_RETRIEVE_INTERACTIVE_WINDOWS is unset. public abstract Pair<Matrix, MagnificationSpec> getWindowTransformationMatrixAndMagnificationSpec(IBinder token); /** * Opens the global actions dialog. */ Loading
services/core/java/com/android/server/wm/WindowManagerService.java +9 −0 Original line number Diff line number Diff line Loading @@ -173,6 +173,7 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.database.ContentObserver; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; Loading Loading @@ -224,6 +225,7 @@ import android.util.ArraySet; import android.util.DisplayMetrics; import android.util.EventLog; import android.util.MergedConfiguration; import android.util.Pair; import android.util.Slog; import android.util.SparseBooleanArray; import android.util.TimeUtils; Loading Loading @@ -7768,6 +7770,13 @@ public class WindowManagerService extends IWindowManager.Stub } } @Override public Pair<Matrix, MagnificationSpec> getWindowTransformationMatrixAndMagnificationSpec( IBinder token) { return mAccessibilityController .getWindowTransformationMatrixAndMagnificationSpec(token); } @Override public void waitForAllWindowsDrawn(Runnable callback, long timeout, int displayId) { final WindowContainer container = displayId == INVALID_DISPLAY Loading