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

Commit 9f0f172a authored by mincheli's avatar mincheli Committed by Minche Li
Browse files

Refactoring for magnification [1/n]

This change doesn't change any user behavior.
It's refactoring that reduce the common code and logic.
1. Adds the common varibles to the parent class, MagnificationGestureHandler
for fullscreen and window MagnificationGestureHandler.
2. Moves the implementation of  onMagnificationScaleChanged() from
AccessibilityManagerService to MagnificationController.

Bug: 174291719
Test: atest AccessibilityManagerServiceTest FullScreenMagnificationGestureHandlerTest
  MagnificationControllerTest WindowMagnificationGestureHandlerTest
Change-Id: Ic4d6c966600a113fd06e7165353e014aca3189bf
parent 26ca287d
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -558,12 +558,13 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo
        if (mAms.getMagnificationMode(displayId)
                == Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW) {
            magnificationGestureHandler = new WindowMagnificationGestureHandler(displayContext,
                    mAms.getWindowMagnificationMgr(), mAms::onMagnificationScaleChanged,
                    detectControlGestures, triggerable, displayId);
                    mAms.getWindowMagnificationMgr(), mAms.getMagnificationController(),
                    detectControlGestures, triggerable,
                    displayId);
        } else {
            magnificationGestureHandler = new FullScreenMagnificationGestureHandler(displayContext,
                    mAms.getFullScreenMagnificationController(),
                    mAms::onMagnificationScaleChanged, detectControlGestures, triggerable,
                    mAms.getFullScreenMagnificationController(), mAms.getMagnificationController(),
                    detectControlGestures, triggerable,
                    new WindowMagnificationPromptController(displayContext, mUserId), displayId);
        }
        return magnificationGestureHandler;
+12 −13
Original line number Diff line number Diff line
@@ -119,7 +119,6 @@ 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.WindowMagnificationManager;
import com.android.server.pm.UserManagerInternal;
import com.android.server.wm.ActivityTaskManagerInternal;
@@ -153,7 +152,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        AccessibilityUserState.ServiceInfoChangeListener,
        AccessibilityWindowManager.AccessibilityEventSender,
        AccessibilitySecurityPolicy.AccessibilityUserManager,
        MagnificationGestureHandler.ScaleChangedListener,
        SystemActionPerformer.SystemActionsChangedListener {

    private static final boolean DEBUG = false;
@@ -1066,17 +1064,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        }
    }

    @Override
    public void onMagnificationScaleChanged(int displayId, int mode) {
        synchronized (mLock) {
            final int capabilities =
                    getCurrentUserStateLocked().getMagnificationCapabilitiesLocked();
            if (capabilities == Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL) {
                getWindowMagnificationMgr().showMagnificationButton(displayId, mode);
            }
        }
    }

    /**
     * Called by AccessibilityInputFilter when it creates or destroys the motionEventInjector.
     * Not using a getter because the AccessibilityInputFilter isn't thread-safe
@@ -3000,6 +2987,17 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        }
    }

    /**
     * Getter of {@link MagnificationController}.
     *
     * @return MagnificationController
     */
    MagnificationController getMagnificationController() {
        synchronized (mLock) {
            return mMagnificationController;
        }
    }

    @Override
    public void associateEmbeddedHierarchy(@NonNull IBinder host, @NonNull IBinder embedded) {
        synchronized (mLock) {
@@ -3584,6 +3582,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
                Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN, userState.mUserId);
        if (capabilities != userState.getMagnificationCapabilitiesLocked()) {
            userState.setMagnificationCapabilitiesLocked(capabilities);
            mMagnificationController.setMagnificationCapabilities(capabilities);
            return true;
        }
        return false;
+1 −30
Original line number Diff line number Diff line
@@ -139,41 +139,15 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
    private final ScreenStateReceiver mScreenStateReceiver;
    private final WindowMagnificationPromptController mPromptController;

    /**
     * {@code true} if this detector should detect and respond to triple-tap
     * gestures for engaging and disengaging magnification,
     * {@code false} if it should ignore such gestures
     */
    final boolean mDetectTripleTap;

    /**
     * Whether {@link DetectingState#mShortcutTriggered shortcut} is enabled
     */
    final boolean mDetectShortcutTrigger;

    @VisibleForTesting State mCurrentState;
    @VisibleForTesting State mPreviousState;

    private PointerCoords[] mTempPointerCoords;
    private PointerProperties[] mTempPointerProperties;

    private final int mDisplayId;

    private final Queue<MotionEvent> mDebugInputEventHistory;
    private final Queue<MotionEvent> mDebugOutputEventHistory;

    /**
     * @param context Context for resolving various magnification-related resources
     * @param fullScreenMagnificationController the {@link FullScreenMagnificationController}
     *
     * @param detectTripleTap {@code true} if this detector should detect and respond to triple-tap
     *                                gestures for engaging and disengaging magnification,
     *                                {@code false} if it should ignore such gestures
     * @param detectShortcutTrigger {@code true} if this detector should be "triggerable" by some
     *                           external shortcut invoking {@link #notifyShortcutTriggered},
     *                           {@code false} if it should ignore such triggers.
     * @param displayId The logical display id.
     */
    public FullScreenMagnificationGestureHandler(Context context,
            FullScreenMagnificationController fullScreenMagnificationController,
            ScaleChangedListener listener,
@@ -181,7 +155,7 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
            boolean detectShortcutTrigger,
            @NonNull WindowMagnificationPromptController promptController,
            int displayId) {
        super(listener);
        super(displayId, detectTripleTap, detectShortcutTrigger, listener);
        if (DEBUG_ALL) {
            Log.i(LOG_TAG,
                    "FullScreenMagnificationGestureHandler(detectTripleTap = " + detectTripleTap
@@ -189,15 +163,12 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
        }
        mFullScreenMagnificationController = fullScreenMagnificationController;
        mPromptController = promptController;
        mDisplayId = displayId;

        mDelegatingState = new DelegatingState();
        mDetectingState = new DetectingState(context);
        mViewportDraggingState = new ViewportDraggingState();
        mPanningScalingState = new PanningScalingState(context);

        mDetectTripleTap = detectTripleTap;
        mDetectShortcutTrigger = detectShortcutTrigger;
        if (mDetectShortcutTrigger) {
            mScreenStateReceiver = new ScreenStateReceiver(context, this);
            mScreenStateReceiver.register();
+16 −2
Original line number Diff line number Diff line
@@ -37,7 +37,8 @@ import com.android.server.accessibility.AccessibilityManagerService;
 * Handles all magnification controllers initialization, generic interactions
 * and magnification mode transition.
 */
public class MagnificationController implements WindowMagnificationManager.Callback {
public class MagnificationController implements WindowMagnificationManager.Callback,
        MagnificationGestureHandler.ScaleChangedListener {

    private static final boolean DEBUG = false;
    private static final String TAG = "MagnificationController";
@@ -50,6 +51,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb

    private FullScreenMagnificationController mFullScreenMagnificationController;
    private WindowMagnificationManager mWindowMagnificationMgr;
    private int mMagnificationCapabilities = ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN;

    /**
     * A callback to inform the magnification transition result.
@@ -82,10 +84,18 @@ public class MagnificationController implements WindowMagnificationManager.Callb
    public void onPerformScaleAction(int displayId, float scale) {
        getWindowMagnificationMgr().setScale(displayId, scale);
        getWindowMagnificationMgr().persistScale(displayId);
        mAms.onMagnificationScaleChanged(displayId,
        onMagnificationScaleChanged(displayId,
                Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW);
    }

    @Override
    public void onMagnificationScaleChanged(int displayId, int mode) {
        if (mMagnificationCapabilities != Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL) {
            return;
        }
        getWindowMagnificationMgr().showMagnificationButton(displayId, mode);
    }

    /**
     * Transitions to the target Magnification mode with current center of the magnification mode
     * if it is available.
@@ -182,6 +192,10 @@ public class MagnificationController implements WindowMagnificationManager.Callb
        }
    }

    public void setMagnificationCapabilities(int capabilities) {
        mMagnificationCapabilities = capabilities;
    }

    private DisableMagnificationCallback getDisableMagnificationEndRunnableLocked(
            int displayId) {
        return mMagnificationEndRunnableSparseArray.get(displayId);
+30 −6
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.server.accessibility.magnification;

import android.annotation.NonNull;

import com.android.server.accessibility.BaseEventStreamTransformation;

/**
@@ -23,15 +25,26 @@ import com.android.server.accessibility.BaseEventStreamTransformation;
 */
public abstract class MagnificationGestureHandler extends BaseEventStreamTransformation {

    protected final ScaleChangedListener mListener;
    /**
     * The logical display id.
     */
    protected final int mDisplayId;

    protected MagnificationGestureHandler(ScaleChangedListener listener) {
        mListener = listener;
    }
    /**
     * {@code true} if this detector should be "triggerable" by some
     * external shortcut invoking {@link #notifyShortcutTriggered},
     * {@code false} if it should ignore such triggers.
     */
    protected final boolean mDetectShortcutTrigger;

    /**
     * Interface for listening to the magnification scaling gesture.
     * {@code true} if this detector should detect and respond to triple-tap
     * gestures for engaging and disengaging magnification,
     * {@code false} if it should ignore such gestures
     */
    protected final boolean mDetectTripleTap;

    /** Interface for listening to the magnification scaling gesture. */
    public interface ScaleChangedListener {
        /**
         * Called when the magnification scale is changed by users.
@@ -42,6 +55,17 @@ public abstract class MagnificationGestureHandler extends BaseEventStreamTransfo
        void onMagnificationScaleChanged(int displayId, int mode);
    }

    protected final ScaleChangedListener mListener;

    protected MagnificationGestureHandler(int displayId, boolean detectTripleTap,
            boolean detectShortcutTrigger,
            @NonNull ScaleChangedListener listener) {
        mDisplayId = displayId;
        mDetectTripleTap = detectTripleTap;
        mDetectShortcutTrigger = detectShortcutTrigger;
        mListener = listener;
    }

    /**
     * Called when the shortcut target is magnification.
     */
Loading