Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5ee4e1ea authored by Daniel Hsieh's avatar Daniel Hsieh Committed by Automerger Merge Worker
Browse files

Merge "Gets node bound when the FLAG_RETRIEVE_INTERACTIVE_WINDOWS is unset"...

Merge "Gets node bound when the FLAG_RETRIEVE_INTERACTIVE_WINDOWS is unset" into tm-dev am: 6c00049c am: ffc52c5c

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17944971



Change-Id: I03382b78ae68802d119ae1dba4f0ca92b0de1a78
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents b88085ce ffc52c5c
Loading
Loading
Loading
Loading
+26 −45
Original line number Diff line number Diff line
@@ -242,6 +242,9 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ

        int getCurrentUserIdLocked();

        Pair<float[], MagnificationSpec> getWindowTransformationMatrixAndMagnificationSpec(
                int windowId);

        boolean isAccessibilityButtonShown();

        /**
@@ -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()) {
@@ -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;
        }
@@ -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()) {
@@ -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;
        }
@@ -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()) {
@@ -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;
        }
@@ -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;
@@ -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;
        }
@@ -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;
@@ -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;
        }
@@ -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);
    }

    /**
+41 −4
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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,
@@ -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()) {
+37 −0
Original line number Diff line number Diff line
@@ -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)) {
+13 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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.
     */
+9 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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