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

Commit 2337e152 authored by Minche Li's avatar Minche Li Committed by Android (Google) Code Review
Browse files

Merge "Refactoring magnification controller for accessibility service connection"

parents 5ced92ca 692a15c2
Loading
Loading
Loading
Loading
+23 −48
Original line number Diff line number Diff line
@@ -86,7 +86,7 @@ import com.android.internal.util.DumpUtils;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.LocalServices;
import com.android.server.accessibility.AccessibilityWindowManager.RemoteAccessibilityConnection;
import com.android.server.accessibility.magnification.FullScreenMagnificationController;
import com.android.server.accessibility.magnification.MagnificationProcessor;
import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.WindowManagerInternal;

@@ -223,10 +223,10 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
        @Nullable FingerprintGestureDispatcher getFingerprintGestureDispatcher();

        /**
         * @return The magnification controller
         * @return The magnification processor
         */
        @NonNull
        FullScreenMagnificationController getFullScreenMagnificationController();
        MagnificationProcessor getMagnificationProcessor();

        /**
         * Called back to notify system that the client has changed
@@ -975,7 +975,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
        }
        final long identity = Binder.clearCallingIdentity();
        try {
            return mSystemSupport.getFullScreenMagnificationController().getScale(displayId);
            return mSystemSupport.getMagnificationProcessor().getScale(displayId);
        } finally {
            Binder.restoreCallingIdentity(identity);
        }
@@ -991,19 +991,15 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
            if (!hasRightsToCurrentUserLocked()) {
                return region;
            }
            FullScreenMagnificationController magnificationController =
                    mSystemSupport.getFullScreenMagnificationController();
            boolean registeredJustForThisCall =
                    registerMagnificationIfNeeded(displayId, magnificationController);
            MagnificationProcessor magnificationProcessor =
                    mSystemSupport.getMagnificationProcessor();
            final long identity = Binder.clearCallingIdentity();
            try {
                magnificationController.getMagnificationRegion(displayId, region);
                magnificationProcessor.getMagnificationRegion(displayId, region,
                        mSecurityPolicy.canControlMagnification(this));
                return region;
            } finally {
                Binder.restoreCallingIdentity(identity);
                if (registeredJustForThisCall) {
                    magnificationController.unregister(displayId);
                }
            }
        }
    }
@@ -1017,18 +1013,14 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
            if (!hasRightsToCurrentUserLocked()) {
                return 0.0f;
            }
            FullScreenMagnificationController magnificationController =
                    mSystemSupport.getFullScreenMagnificationController();
            boolean registeredJustForThisCall =
                    registerMagnificationIfNeeded(displayId, magnificationController);
            MagnificationProcessor magnificationProcessor =
                    mSystemSupport.getMagnificationProcessor();
            final long identity = Binder.clearCallingIdentity();
            try {
                return magnificationController.getCenterX(displayId);
                return magnificationProcessor.getCenterX(displayId,
                        mSecurityPolicy.canControlMagnification(this));
            } finally {
                Binder.restoreCallingIdentity(identity);
                if (registeredJustForThisCall) {
                    magnificationController.unregister(displayId);
                }
            }
        }
    }
@@ -1042,32 +1034,18 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
            if (!hasRightsToCurrentUserLocked()) {
                return 0.0f;
            }
            FullScreenMagnificationController magnificationController =
                    mSystemSupport.getFullScreenMagnificationController();
            boolean registeredJustForThisCall =
                    registerMagnificationIfNeeded(displayId, magnificationController);
            MagnificationProcessor magnificationProcessor =
                    mSystemSupport.getMagnificationProcessor();
            final long identity = Binder.clearCallingIdentity();
            try {
                return magnificationController.getCenterY(displayId);
                return magnificationProcessor.getCenterY(displayId,
                        mSecurityPolicy.canControlMagnification(this));
            } finally {
                Binder.restoreCallingIdentity(identity);
                if (registeredJustForThisCall) {
                    magnificationController.unregister(displayId);
                }
            }
        }
    }

    private boolean registerMagnificationIfNeeded(int displayId,
            FullScreenMagnificationController magnificationController) {
        if (!magnificationController.isRegistered(displayId)
                && mSecurityPolicy.canControlMagnification(this)) {
            magnificationController.register(displayId);
            return true;
        }
        return false;
    }

    @Override
    public boolean resetMagnification(int displayId, boolean animate) {
        if (svcConnTracingEnabled()) {
@@ -1083,10 +1061,10 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
        }
        final long identity = Binder.clearCallingIdentity();
        try {
            FullScreenMagnificationController magnificationController =
                    mSystemSupport.getFullScreenMagnificationController();
            return (magnificationController.reset(displayId, animate)
                    || !magnificationController.isMagnifying(displayId));
            MagnificationProcessor magnificationProcessor =
                    mSystemSupport.getMagnificationProcessor();
            return (magnificationProcessor.reset(displayId, animate)
                    || !magnificationProcessor.isMagnifying(displayId));
        } finally {
            Binder.restoreCallingIdentity(identity);
        }
@@ -1109,12 +1087,9 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
            }
            final long identity = Binder.clearCallingIdentity();
            try {
                FullScreenMagnificationController magnificationController =
                        mSystemSupport.getFullScreenMagnificationController();
                if (!magnificationController.isRegistered(displayId)) {
                    magnificationController.register(displayId);
                }
                return magnificationController
                MagnificationProcessor magnificationProcessor =
                        mSystemSupport.getMagnificationProcessor();
                return magnificationProcessor
                        .setScaleAndCenter(displayId, scale, centerX, centerY, animate, mId);
            } finally {
                Binder.restoreCallingIdentity(identity);
+2 −1
Original line number Diff line number Diff line
@@ -608,7 +608,8 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo
            final Context uiContext = displayContext.createWindowContext(
                    TYPE_MAGNIFICATION_OVERLAY, null /* options */);
            magnificationGestureHandler = new FullScreenMagnificationGestureHandler(uiContext,
                    mAms.getFullScreenMagnificationController(), mAms.getTraceManager(),
                    mAms.getMagnificationController().getFullScreenMagnificationController(),
                    mAms.getTraceManager(),
                    mAms.getMagnificationController(), detectControlGestures, triggerable,
                    new WindowMagnificationPromptController(displayContext, mUserId), displayId);
        }
+19 −14
Original line number Diff line number Diff line
@@ -126,8 +126,8 @@ import com.android.internal.util.DumpUtils;
import com.android.internal.util.IntPair;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.accessibility.magnification.FullScreenMagnificationController;
import com.android.server.accessibility.magnification.MagnificationController;
import com.android.server.accessibility.magnification.MagnificationProcessor;
import com.android.server.accessibility.magnification.WindowMagnificationManager;
import com.android.server.pm.UserManagerInternal;
import com.android.server.wm.ActivityTaskManagerInternal;
@@ -219,6 +219,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub

    private final ActivityTaskManagerInternal mActivityTaskManagerService;

    private final MagnificationController mMagnificationController;
    private final MagnificationProcessor mMagnificationProcessor;

    private final MainHandler mMainHandler;

    // Lazily initialized - access through getSystemActionPerfomer()
@@ -261,7 +264,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub

    private Point mTempPoint = new Point();
    private boolean mIsAccessibilityButtonShown;
    private MagnificationController mMagnificationController;

    private AccessibilityUserState getCurrentUserStateLocked() {
        return getUserStateLocked(mCurrentUserId);
@@ -308,6 +310,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        mA11yWindowManager = a11yWindowManager;
        mA11yDisplayListener = a11yDisplayListener;
        mMagnificationController = magnificationController;
        mMagnificationProcessor = new MagnificationProcessor(mMagnificationController);
        init();
    }

@@ -336,6 +339,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
                mWindowManagerService, this, mSecurityPolicy, this, mTraceManager);
        mA11yDisplayListener = new AccessibilityDisplayListener(mContext, mMainHandler);
        mMagnificationController = new MagnificationController(this, mLock, mContext);
        mMagnificationProcessor = new MagnificationProcessor(mMagnificationController);
        init();
    }

@@ -2535,7 +2539,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub

        if (mUiAutomationManager.suppressingAccessibilityServicesLocked()
                && mMagnificationController.isFullScreenMagnificationControllerInitialized()) {
            getFullScreenMagnificationController().unregisterAll();
            getMagnificationController().getFullScreenMagnificationController().unregisterAll();
            return;
        }

@@ -2547,7 +2551,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
                || userState.isShortcutMagnificationEnabledLocked()) {
            for (int i = 0; i < displays.size(); i++) {
                final Display display = displays.get(i);
                getFullScreenMagnificationController().register(display.getDisplayId());
                getMagnificationController().getFullScreenMagnificationController().register(
                        display.getDisplayId());
            }
            return;
        }
@@ -2557,9 +2562,11 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
            final Display display = displays.get(i);
            final int displayId = display.getDisplayId();
            if (userHasListeningMagnificationServicesLocked(userState, displayId)) {
                getFullScreenMagnificationController().register(displayId);
                getMagnificationController().getFullScreenMagnificationController().register(
                        displayId);
            } else if (mMagnificationController.isFullScreenMagnificationControllerInitialized()) {
                getFullScreenMagnificationController().unregister(displayId);
                getMagnificationController().getFullScreenMagnificationController().unregister(
                        displayId);
            }
        }
    }
@@ -2922,7 +2929,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        }
        // In case user assigned magnification to the given shortcut.
        if (targetName.equals(MAGNIFICATION_CONTROLLER_NAME)) {
            final boolean enabled = !getFullScreenMagnificationController().isMagnifying(displayId);
            final boolean enabled =
                    !getMagnificationController().getFullScreenMagnificationController()
                            .isMagnifying(displayId);
            logAccessibilityShortcutActivated(mContext, MAGNIFICATION_COMPONENT_NAME, shortcutType,
                    enabled);
            sendAccessibilityButtonToInputFilter(displayId);
@@ -3259,10 +3268,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
     * @return MagnificationController
     */
    MagnificationController getMagnificationController() {
        synchronized (mLock) {
        return mMagnificationController;
    }
    }

    @Override
    public void associateEmbeddedHierarchy(@NonNull IBinder host, @NonNull IBinder embedded) {
@@ -3378,10 +3385,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
    }

    @Override
    public FullScreenMagnificationController getFullScreenMagnificationController() {
        synchronized (mLock) {
            return mMagnificationController.getFullScreenMagnificationController();
        }
    public MagnificationProcessor getMagnificationProcessor() {
        return mMagnificationProcessor;
    }

    @Override
+2 −2
Original line number Diff line number Diff line
@@ -123,7 +123,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
        AccessibilityUserState userState = mUserStateWeakReference.get();
        if (userState == null) return;
        userState.removeServiceLocked(this);
        mSystemSupport.getFullScreenMagnificationController().resetAllIfNeeded(mId);
        mSystemSupport.getMagnificationProcessor().resetAllIfNeeded(mId);
        mActivityTaskManagerService.setAllowAppSwitches(mComponentName.flattenToString(), -1,
                userState.mUserId);
        resetLocked();
@@ -334,7 +334,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
                userState.serviceDisconnectedLocked(this);
            }
            resetLocked();
            mSystemSupport.getFullScreenMagnificationController().resetAllIfNeeded(mId);
            mSystemSupport.getMagnificationProcessor().resetAllIfNeeded(mId);
            mSystemSupport.onClientChangeLocked(false);
        }
    }
+155 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.accessibility.magnification;

import android.annotation.NonNull;
import android.graphics.Region;

/**
 * Processor class for AccessibilityService connection to control magnification on the specified
 * display. This wraps the function of magnification controller.
 *
 * @see MagnificationController
 * @see FullScreenMagnificationController
 */
public class MagnificationProcessor {

    private final MagnificationController mController;

    public MagnificationProcessor(MagnificationController controller) {
        mController = controller;
    }

    /**
     * {@link FullScreenMagnificationController#getScale(int)}
     */
    public float getScale(int displayId) {
        return mController.getFullScreenMagnificationController().getScale(displayId);
    }

    /**
     * {@link FullScreenMagnificationController#getCenterX(int)}
     */
    public float getCenterX(int displayId, boolean canControlMagnification) {
        boolean registeredJustForThisCall = registerMagnificationIfNeeded(displayId,
                canControlMagnification);
        try {
            return mController.getFullScreenMagnificationController().getCenterX(displayId);
        } finally {
            if (registeredJustForThisCall) {
                unregister(displayId);
            }
        }
    }

    /**
     * {@link FullScreenMagnificationController#getCenterY(int)}
     */
    public float getCenterY(int displayId, boolean canControlMagnification) {
        boolean registeredJustForThisCall = registerMagnificationIfNeeded(displayId,
                canControlMagnification);
        try {
            return mController.getFullScreenMagnificationController().getCenterY(displayId);
        } finally {
            if (registeredJustForThisCall) {
                unregister(displayId);
            }
        }
    }

    /**
     * {@link FullScreenMagnificationController#getMagnificationRegion(int, Region)}
     */
    public Region getMagnificationRegion(int displayId, @NonNull Region outRegion,
            boolean canControlMagnification) {
        boolean registeredJustForThisCall = registerMagnificationIfNeeded(displayId,
                canControlMagnification);
        try {
            mController.getFullScreenMagnificationController().getMagnificationRegion(displayId,
                    outRegion);
            return outRegion;
        } finally {
            if (registeredJustForThisCall) {
                unregister(displayId);
            }
        }
    }

    /**
     * {@link FullScreenMagnificationController#setScaleAndCenter(int, float, float, float, boolean,
     * int)}
     */
    public boolean setScaleAndCenter(int displayId, float scale, float centerX, float centerY,
            boolean animate, int id) {
        if (!isRegistered(displayId)) {
            register(displayId);
        }
        return mController.getFullScreenMagnificationController().setScaleAndCenter(displayId,
                scale,
                centerX, centerY, animate, id);
    }

    /**
     * {@link FullScreenMagnificationController#reset(int, boolean)}
     */
    public boolean reset(int displayId, boolean animate) {
        return mController.getFullScreenMagnificationController().reset(displayId, animate);
    }

    /**
     * {@link FullScreenMagnificationController#resetIfNeeded(int, boolean)}
     */
    public void resetAllIfNeeded(int connectionId) {
        mController.getFullScreenMagnificationController().resetAllIfNeeded(connectionId);
    }

    /**
     * {@link FullScreenMagnificationController#register(int)}
     */
    public void register(int displayId) {
        mController.getFullScreenMagnificationController().register(displayId);
    }

    /**
     * {@link FullScreenMagnificationController#unregister(int)} (int)}
     */
    public void unregister(int displayId) {
        mController.getFullScreenMagnificationController().unregister(displayId);
    }

    /**
     * {@link FullScreenMagnificationController#isMagnifying(int)}
     */
    public boolean isMagnifying(int displayId) {
        return mController.getFullScreenMagnificationController().isMagnifying(displayId);
    }

    /**
     * {@link FullScreenMagnificationController#isRegistered(int)}
     */
    public boolean isRegistered(int displayId) {
        return mController.getFullScreenMagnificationController().isRegistered(displayId);
    }

    private boolean registerMagnificationIfNeeded(int displayId, boolean canControlMagnification) {
        if (!isRegistered(displayId) && canControlMagnification) {
            register(displayId);
            return true;
        }
        return false;
    }
}
Loading