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

Commit 7c2a525e authored by ryanlwlin's avatar ryanlwlin
Browse files

Move magnification-relatd stuff to MagnificationController

We moved most of magnification-related stuff to MagnificationController
to centeralize the common magnification logic and the interaction
between magnification modes.

Test: atest CtsAccessibilityServiceTestCases
      atest com.android.server.accessibility
      atest com.android.server.accessibility.magnification
Change-Id: I30face9d94a29844dfa1d4a98139628bf1d79fec
parent 5f99e1b8
Loading
Loading
Loading
Loading
+14 −35
Original line number Diff line number Diff line
@@ -119,8 +119,8 @@ 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.MagnificationGestureHandler;
import com.android.server.accessibility.magnification.MagnificationTransitionController;
import com.android.server.accessibility.magnification.WindowMagnificationManager;
import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.WindowManagerInternal;
@@ -219,16 +219,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
    // Lazily initialized - access through getSystemActionPerfomer()
    private SystemActionPerformer mSystemActionPerformer;

    private FullScreenMagnificationController mFullScreenMagnificationController;

    private InteractionBridge mInteractionBridge;

    private AlertDialog mEnableTouchExplorationDialog;

    private AccessibilityInputFilter mInputFilter;

    private WindowMagnificationManager mWindowMagnificationMgr;

    private boolean mHasInputFilter;

    private KeyEventDispatcher mKeyEventDispatcher;
@@ -259,7 +255,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub

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

    private AccessibilityUserState getCurrentUserStateLocked() {
        return getUserStateLocked(mCurrentUserId);
@@ -292,7 +288,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
            SystemActionPerformer systemActionPerformer,
            AccessibilityWindowManager a11yWindowManager,
            AccessibilityDisplayListener a11yDisplayListener,
            WindowMagnificationManager windowMagnificationMgr) {
            MagnificationController magnificationController) {
        mContext = context;
        mPowerManager =  (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
        mWindowManagerService = LocalServices.getService(WindowManagerInternal.class);
@@ -303,8 +299,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        mSystemActionPerformer = systemActionPerformer;
        mA11yWindowManager = a11yWindowManager;
        mA11yDisplayListener = a11yDisplayListener;
        mWindowMagnificationMgr = windowMagnificationMgr;
        mMagnificationTransitionController = new MagnificationTransitionController(this, mLock);
        mMagnificationController = magnificationController;
        init();
    }

@@ -324,7 +319,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        mA11yWindowManager = new AccessibilityWindowManager(mLock, mMainHandler,
                mWindowManagerService, this, mSecurityPolicy, this);
        mA11yDisplayListener = new AccessibilityDisplayListener(mContext, mMainHandler);
        mMagnificationTransitionController = new MagnificationTransitionController(this, mLock);
        mMagnificationController = new MagnificationController(this, mLock, mContext);
        init();
    }

@@ -1195,9 +1190,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
            // The user changed.
            mCurrentUserId = userId;

            if (mWindowMagnificationMgr != null) {
                mWindowMagnificationMgr.setUserId(mCurrentUserId);
            }
            mMagnificationController.updateUserIdIfNeeded(mCurrentUserId);
            AccessibilityUserState userState = getCurrentUserStateLocked();

            readConfigurationForUserStateLocked(userState);
@@ -1554,7 +1547,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        if (fallBackMagnificationModeSettingsLocked(userState)) {
            return;
        }
        mMagnificationTransitionController.transitionMagnificationModeLocked(
        mMagnificationController.transitionMagnificationModeLocked(
                Display.DEFAULT_DISPLAY, userState.getMagnificationModeLocked(),
                this::onMagnificationTransitionEndedLocked);
    }
@@ -2310,13 +2303,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
            return;
        }

        if (mFullScreenMagnificationController != null) {
            mFullScreenMagnificationController.setUserId(userState.mUserId);
        }

        if (mUiAutomationManager.suppressingAccessibilityServicesLocked()
                && mFullScreenMagnificationController != null) {
            mFullScreenMagnificationController.unregisterAll();
                && mMagnificationController.isFullScreenMagnificationControllerInitialized()) {
            getFullScreenMagnificationController().unregisterAll();
            return;
        }

@@ -2339,8 +2328,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
            final int displayId = display.getDisplayId();
            if (userHasListeningMagnificationServicesLocked(userState, displayId)) {
                getFullScreenMagnificationController().register(displayId);
            } else if (mFullScreenMagnificationController != null) {
                mFullScreenMagnificationController.unregister(displayId);
            } else if (mMagnificationController.isFullScreenMagnificationControllerInitialized()) {
                getFullScreenMagnificationController().unregister(displayId);
            }
        }
    }
@@ -2990,10 +2979,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
     */
    public WindowMagnificationManager getWindowMagnificationMgr() {
        synchronized (mLock) {
            if (mWindowMagnificationMgr == null) {
                mWindowMagnificationMgr = new WindowMagnificationManager(mContext, mCurrentUserId);
            }
            return mWindowMagnificationMgr;
            return mMagnificationController.getWindowMagnificationMgr();
        }
    }

@@ -3060,12 +3046,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
    @Override
    public FullScreenMagnificationController getFullScreenMagnificationController() {
        synchronized (mLock) {
            if (mFullScreenMagnificationController == null) {
                mFullScreenMagnificationController = new FullScreenMagnificationController(mContext,
                        this, mLock);
                mFullScreenMagnificationController.setUserId(mCurrentUserId);
            }
            return mFullScreenMagnificationController;
            return mMagnificationController.getFullScreenMagnificationController();
        }
    }

@@ -3307,9 +3288,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
                    }
                }
            }
            if (mFullScreenMagnificationController != null) {
                mFullScreenMagnificationController.onDisplayRemoved(displayId);
            }
            mMagnificationController.onDisplayRemoved(displayId);
            mA11yWindowManager.stopTrackingWindows(displayId);
        }

+100 −18
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.Region;
@@ -29,21 +30,26 @@ import android.util.Slog;
import android.util.SparseArray;
import android.view.accessibility.MagnificationAnimationCallback;

import com.android.internal.annotations.VisibleForTesting;
import com.android.server.accessibility.AccessibilityManagerService;

/**
 * Handles magnification mode transition.
 * Handles all magnification controllers initialization, generic interactions
 * and magnification mode transition.
 */
public class MagnificationTransitionController {
public class MagnificationController {

    private static final boolean DEBUG = false;
    private static final String TAG = "MagnificationController";
    private final AccessibilityManagerService mAms;
    private final PointF mTempPoint = new PointF();
    private final Object mLock;
    private final Context mContext;
    private final SparseArray<DisableMagnificationCallback>
            mMagnificationEndRunnableSparseArray = new SparseArray();

    private FullScreenMagnificationController mFullScreenMagnificationController;
    private WindowMagnificationManager mWindowMagnificationMgr;

    /**
     * A callback to inform the magnification transition result.
@@ -56,9 +62,20 @@ public class MagnificationTransitionController {
        void onResult(boolean success);
    }

    public MagnificationTransitionController(AccessibilityManagerService ams, Object lock) {
    public MagnificationController(AccessibilityManagerService ams, Object lock,
            Context context) {
        mAms = ams;
        mLock = lock;
        mContext = context;
    }

    @VisibleForTesting
    public MagnificationController(AccessibilityManagerService ams, Object lock,
            Context context, FullScreenMagnificationController fullScreenMagnificationController,
            WindowMagnificationManager windowMagnificationManager) {
        this(ams, lock, context);
        mFullScreenMagnificationController = fullScreenMagnificationController;
        mWindowMagnificationMgr = windowMagnificationManager;
    }

    /**
@@ -97,7 +114,7 @@ public class MagnificationTransitionController {
        }
        final FullScreenMagnificationController screenMagnificationController =
                getFullScreenMagnificationController();
        final WindowMagnificationManager windowMagnificationMgr = getWindowMagnificationManager();
        final WindowMagnificationManager windowMagnificationMgr = getWindowMagnificationMgr();
        final float scale = windowMagnificationMgr.getPersistedScale();
        final DisableMagnificationCallback animationEndCallback =
                new DisableMagnificationCallback(transitionCallBack, displayId, targetMode,
@@ -111,6 +128,39 @@ public class MagnificationTransitionController {
        setDisableMagnificationCallbackLocked(displayId, animationEndCallback);
    }

    /**
     * Updates the active user ID of {@link FullScreenMagnificationController} and {@link
     * WindowMagnificationManager}.
     *
     * @param userId the currently active user ID
     */
    public void updateUserIdIfNeeded(int userId) {
        synchronized (mLock) {
            if (mFullScreenMagnificationController != null) {
                mFullScreenMagnificationController.setUserId(userId);
            }
            if (mWindowMagnificationMgr != null) {
                mWindowMagnificationMgr.setUserId(userId);
            }
        }
    }

    /**
     * Removes the magnification instance with given id.
     *
     * @param displayId The logical display id.
     */
    public void onDisplayRemoved(int displayId) {
        synchronized (mLock) {
            if (mFullScreenMagnificationController != null) {
                mFullScreenMagnificationController.onDisplayRemoved(displayId);
            }
            if (mWindowMagnificationMgr != null) {
                mWindowMagnificationMgr.onDisplayRemoved(displayId);
            }
        }
    }

    private DisableMagnificationCallback getDisableMagnificationEndRunnableLocked(
            int displayId) {
        return mMagnificationEndRunnableSparseArray.get(displayId);
@@ -125,31 +175,63 @@ public class MagnificationTransitionController {
        }
    }

    private FullScreenMagnificationController getFullScreenMagnificationController() {
        return mAms.getFullScreenMagnificationController();
    /**
     * Getter of {@link FullScreenMagnificationController}.
     *
     * @return {@link FullScreenMagnificationController}.
     */
    public FullScreenMagnificationController getFullScreenMagnificationController() {
        synchronized (mLock) {
            if (mFullScreenMagnificationController == null) {
                mFullScreenMagnificationController = new FullScreenMagnificationController(mContext,
                        mAms, mLock);
                mFullScreenMagnificationController.setUserId(mAms.getCurrentUserIdLocked());
            }
        }
        return mFullScreenMagnificationController;
    }

    /**
     * Is {@link #mFullScreenMagnificationController} is initialized.
     * @return {code true} if {@link #mFullScreenMagnificationController} is initialized.
     */
    public boolean isFullScreenMagnificationControllerInitialized() {
        synchronized (mLock) {
            return mFullScreenMagnificationController != null;
        }
    }

    private WindowMagnificationManager getWindowMagnificationManager() {
        return mAms.getWindowMagnificationMgr();
    /**
     * Getter of {@link WindowMagnificationManager}.
     *
     * @return {@link WindowMagnificationManager}.
     */
    public WindowMagnificationManager getWindowMagnificationMgr() {
        synchronized (mLock) {
            if (mWindowMagnificationMgr == null) {
                mWindowMagnificationMgr = new WindowMagnificationManager(mContext,
                        mAms.getCurrentUserIdLocked());
            }
            return mWindowMagnificationMgr;
        }
    }

    private @Nullable
            PointF getCurrentMagnificationBoundsCenterLocked(int displayId, int targetMode) {
        if (targetMode == ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN) {
            final WindowMagnificationManager magnificationManager = getWindowMagnificationManager();
            if (!magnificationManager.isWindowMagnifierEnabled(displayId)) {
            if (mWindowMagnificationMgr == null
                    || !mWindowMagnificationMgr.isWindowMagnifierEnabled(displayId)) {
                return null;
            }
            mTempPoint.set(magnificationManager.getCenterX(displayId),
                    magnificationManager.getCenterY(displayId));
            mTempPoint.set(mWindowMagnificationMgr.getCenterX(displayId),
                    mWindowMagnificationMgr.getCenterY(displayId));
        } else {
            final FullScreenMagnificationController screenMagnificationController =
                    getFullScreenMagnificationController();
            if (!screenMagnificationController.isMagnifying(displayId)) {
            if (mFullScreenMagnificationController == null
                    || !mFullScreenMagnificationController.isMagnifying(displayId)) {
                return null;
            }
            mTempPoint.set(screenMagnificationController.getCenterX(displayId),
                    screenMagnificationController.getCenterY(displayId));
            mTempPoint.set(mFullScreenMagnificationController.getCenterX(displayId),
                    mFullScreenMagnificationController.getCenterY(displayId));
        }
        return mTempPoint;
    }
@@ -228,7 +310,7 @@ public class MagnificationTransitionController {
                        mCurrentCenter.y, true,
                        AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID);
            } else {
                getWindowMagnificationManager().enableWindowMagnification(mDisplayId,
                getWindowMagnificationMgr().enableWindowMagnification(mDisplayId,
                        mCurrentScale, mCurrentCenter.x,
                        mCurrentCenter.y);
            }
+9 −0
Original line number Diff line number Diff line
@@ -452,6 +452,15 @@ public class WindowMagnificationManager implements
        return magnifier;
    }

    /**
     * Removes the window magnifier with given id.
     *
     * @param displayId The logical display id.
     */
    void onDisplayRemoved(int displayId) {
        disableWindowMagnification(displayId, true);
    }

    private class ConnectionCallback extends IWindowMagnificationConnectionCallback.Stub implements
            IBinder.DeathRecipient {
        private boolean mExpiredDeathRecipient = false;
+5 −1
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ import androidx.test.InstrumentationRegistry;

import com.android.server.LocalServices;
import com.android.server.accessibility.AccessibilityManagerService.AccessibilityDisplayListener;
import com.android.server.accessibility.magnification.MagnificationController;
import com.android.server.accessibility.magnification.WindowMagnificationManager;
import com.android.server.accessibility.test.MessageCapturingHandler;
import com.android.server.wm.ActivityTaskManagerInternal;
@@ -94,6 +95,7 @@ public class AccessibilityManagerServiceTest extends AndroidTestCase {
    @Mock private IBinder mMockBinder;
    @Mock private IAccessibilityServiceClient mMockServiceClient;
    @Mock private WindowMagnificationManager mMockWindowMagnificationMgr;
    @Mock private MagnificationController mMockMagnificationController;
    private AccessibilityUserState mUserState;

    private MessageCapturingHandler mHandler = new MessageCapturingHandler(null);
@@ -110,6 +112,8 @@ public class AccessibilityManagerServiceTest extends AndroidTestCase {
        LocalServices.addService(
                ActivityTaskManagerInternal.class, mMockActivityTaskManagerInternal);

        when(mMockMagnificationController.getWindowMagnificationMgr()).thenReturn(
                mMockWindowMagnificationMgr);
        mA11yms = new AccessibilityManagerService(
            InstrumentationRegistry.getContext(),
            mMockPackageManager,
@@ -117,7 +121,7 @@ public class AccessibilityManagerServiceTest extends AndroidTestCase {
            mMockSystemActionPerformer,
            mMockA11yWindowManager,
            mMockA11yDisplayListener,
            mMockWindowMagnificationMgr);
            mMockMagnificationController);

        final AccessibilityUserState userState = new AccessibilityUserState(
                mA11yms.getCurrentUserIdLocked(), mMockContext, mA11yms);
+32 −18
Original line number Diff line number Diff line
@@ -62,7 +62,7 @@ import org.mockito.MockitoAnnotations;
 * Tests for MagnificationController.
 */
@RunWith(AndroidJUnit4.class)
public class MagnificationTransitionControllerTest {
public class MagnificationControllerTest {

    private static final int TEST_DISPLAY = Display.DEFAULT_DISPLAY;
    private static final Region MAGNIFICATION_REGION = new Region(0, 0, 500, 600);
@@ -75,7 +75,7 @@ public class MagnificationTransitionControllerTest {
            Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN;

    @Mock private AccessibilityManagerService mService;
    @Mock private MagnificationTransitionController.TransitionCallBack mTransitionCallBack;
    @Mock private MagnificationController.TransitionCallBack mTransitionCallBack;
    @Mock private Context mContext;
    @Mock private FullScreenMagnificationController mScreenMagnificationController;
    @Captor private ArgumentCaptor<MagnificationAnimationCallback> mCallbackArgumentCaptor;
@@ -83,7 +83,7 @@ public class MagnificationTransitionControllerTest {
    private MockWindowMagnificationConnection mMockConnection;
    private WindowMagnificationManager mWindowMagnificationManager;
    private MockContentResolver mMockResolver;
    private MagnificationTransitionController mMagnificationTransitionController;
    private MagnificationController mMagnificationController;

    @Before
    public void setUp() throws Exception {
@@ -95,14 +95,12 @@ public class MagnificationTransitionControllerTest {
        Settings.Secure.putFloatForUser(mMockResolver,
                Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, DEFAULT_SCALE,
                CURRENT_USER_ID);
        mWindowMagnificationManager = new WindowMagnificationManager(mContext, CURRENT_USER_ID);
        when(mService.getFullScreenMagnificationController()).thenReturn(
                mScreenMagnificationController);
        when(mService.getWindowMagnificationMgr()).thenReturn(mWindowMagnificationManager);
        mWindowMagnificationManager = Mockito.spy(
                new WindowMagnificationManager(mContext, CURRENT_USER_ID));
        mMockConnection = new MockWindowMagnificationConnection(true);
        mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
        mMagnificationTransitionController = new MagnificationTransitionController(mService,
                new Object());
        mMagnificationController = new MagnificationController(mService, new Object(), mContext,
                mScreenMagnificationController, mWindowMagnificationManager);
    }

    @After
@@ -113,7 +111,7 @@ public class MagnificationTransitionControllerTest {
    @Test
    public void transitionToWindowMode_notMagnifying_doNothing() throws RemoteException {
        setMagnificationModeSettings(MODE_FULLSCREEN);
        mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY,
        mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY,
                MODE_WINDOW,
                mTransitionCallBack);

@@ -130,7 +128,7 @@ public class MagnificationTransitionControllerTest {
            throws RemoteException {
        setMagnificationEnabled(MODE_FULLSCREEN);

        mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY,
        mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY,
                MODE_WINDOW,
                mTransitionCallBack);

@@ -147,11 +145,11 @@ public class MagnificationTransitionControllerTest {
    public void transitionToWindowMode_disablingWindowMode_enablingWindowWithFormerCenter()
            throws RemoteException {
        setMagnificationEnabled(MODE_WINDOW);
        mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY,
        mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY,
                MODE_FULLSCREEN,
                mTransitionCallBack);

        mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY,
        mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY,
                MODE_WINDOW,
                mTransitionCallBack);

@@ -166,7 +164,7 @@ public class MagnificationTransitionControllerTest {
            throws RemoteException {
        setMagnificationEnabled(MODE_WINDOW);

        mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY,
        mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY,
                MODE_FULLSCREEN,
                mTransitionCallBack);
        mMockConnection.invokeCallbacks();
@@ -186,7 +184,7 @@ public class MagnificationTransitionControllerTest {
                magnificationBounds.bottom + 100);
        setMagnificationEnabled(MODE_WINDOW, magnifiedCenter.x, magnifiedCenter.y);

        mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY,
        mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY,
                MODE_FULLSCREEN,
                mTransitionCallBack);
        mMockConnection.invokeCallbacks();
@@ -202,11 +200,11 @@ public class MagnificationTransitionControllerTest {
    public void transitionToFullScreenMode_disablingFullScreen_enableFullScreenWithFormerCenter()
            throws RemoteException {
        setMagnificationEnabled(MODE_FULLSCREEN);
        mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY,
        mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY,
                MODE_WINDOW,
                mTransitionCallBack);

        mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY,
        mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY,
                MODE_FULLSCREEN,
                mTransitionCallBack);

@@ -221,7 +219,7 @@ public class MagnificationTransitionControllerTest {
    public void interruptDuringTransitionToFullScreenMode_windowMagnifying_notifyTransitionFailed()
            throws RemoteException {
        setMagnificationEnabled(MODE_WINDOW);
        mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY,
        mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY,
                MODE_FULLSCREEN,
                mTransitionCallBack);

@@ -237,7 +235,23 @@ public class MagnificationTransitionControllerTest {
        verify(mTransitionCallBack).onResult(false);
    }

    @Test
    public void onDisplayRemoved_notifyAllModules() {
        mMagnificationController.onDisplayRemoved(TEST_DISPLAY);

        verify(mScreenMagnificationController).onDisplayRemoved(TEST_DISPLAY);
        verify(mWindowMagnificationManager).onDisplayRemoved(TEST_DISPLAY);
    }

    @Test
    public void updateUserIdIfNeeded_AllModulesAvailable_setUserId() {
        mMagnificationController.updateUserIdIfNeeded(CURRENT_USER_ID);

        verify(mScreenMagnificationController).setUserId(CURRENT_USER_ID);
        verify(mWindowMagnificationManager).setUserId(CURRENT_USER_ID);
    }
    private void setMagnificationEnabled(int mode) throws RemoteException {

        setMagnificationEnabled(mode, MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y);
    }

Loading