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

Commit 7b13b501 authored by mincheli's avatar mincheli
Browse files

Notifies AccessibilityManagerService to request system UI to update magnification button UI

AMS should requset system UI to show the magnification button UI when
the magnification scale is changed by a user.
AMS should requset system UI to remove the magnification button UI when
the magnification settings is off or the magnification capability mode
is not all mode.

Bug: 155607476
Test: atest WindowMagnificationGestureHandlerTest FullScreenMagnificationGestureHandlerTest AccessibilityManagerServiceTest
Change-Id: I3083f20d6f9433668bad3eb0ca604e91955af0ec
parent abe31686
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -534,11 +534,11 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo
        MagnificationGestureHandler magnificationGestureHandler;
        if (mAms.getMagnificationMode(displayId)
                == Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW && triggerable) {
            magnificationGestureHandler = new WindowMagnificationGestureHandler(
                    displayContext, mAms.getWindowMagnificationMgr(), displayId);
            magnificationGestureHandler = new WindowMagnificationGestureHandler(displayContext,
                    mAms.getWindowMagnificationMgr(), mAms::onMagnificationScaleChanged, displayId);
        } else {
            magnificationGestureHandler = new FullScreenMagnificationGestureHandler(
                    displayContext, mAms.getMagnificationController(),
            magnificationGestureHandler = new FullScreenMagnificationGestureHandler(displayContext,
                    mAms.getMagnificationController(), mAms::onMagnificationScaleChanged,
                    detectControlGestures, triggerable, displayId);
        }
        return magnificationGestureHandler;
+30 −2
Original line number Diff line number Diff line
@@ -115,6 +115,7 @@ 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.MagnificationGestureHandler;
import com.android.server.accessibility.magnification.WindowMagnificationManager;
import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.WindowManagerInternal;
@@ -147,6 +148,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        AccessibilityUserState.ServiceInfoChangeListener,
        AccessibilityWindowManager.AccessibilityEventSender,
        AccessibilitySecurityPolicy.AccessibilityUserManager,
        MagnificationGestureHandler.ScaleChangedListener,
        SystemActionPerformer.SystemActionsChangedListener {

    private static final boolean DEBUG = false;
@@ -237,7 +239,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
    private final RemoteCallbackList<IAccessibilityManagerClient> mGlobalClients =
            new RemoteCallbackList<>();

    private final SparseArray<AccessibilityUserState> mUserStates = new SparseArray<>();
    @VisibleForTesting
    final SparseArray<AccessibilityUserState> mUserStates = new SparseArray<>();

    private final UiAutomationManager mUiAutomationManager = new UiAutomationManager(mLock);

@@ -278,7 +281,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
            AccessibilitySecurityPolicy securityPolicy,
            SystemActionPerformer systemActionPerformer,
            AccessibilityWindowManager a11yWindowManager,
            AccessibilityDisplayListener a11yDisplayListener) {
            AccessibilityDisplayListener a11yDisplayListener,
            WindowMagnificationManager windowMagnificationMgr) {
        mContext = context;
        mPowerManager =  (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
        mWindowManagerService = LocalServices.getService(WindowManagerInternal.class);
@@ -289,6 +293,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        mSystemActionPerformer = systemActionPerformer;
        mA11yWindowManager = a11yWindowManager;
        mA11yDisplayListener = a11yDisplayListener;
        mWindowMagnificationMgr = windowMagnificationMgr;
        init();
    }

@@ -989,6 +994,17 @@ 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
@@ -3275,6 +3291,18 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
            updateMagnificationModeChangeSettingsLocked(userState);
        }
        updateWindowMagnificationConnectionIfNeeded(userState);
        // Remove magnification button UI when the magnification capability is not all mode or
        // magnification is disabled.
        if (!(userState.isDisplayMagnificationEnabledLocked()
                || userState.isShortcutMagnificationEnabledLocked())
                || userState.getMagnificationCapabilitiesLocked()
                != Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL) {
            final ArrayList<Display> displays = getValidDisplayList();
            for (int i = 0; i < displays.size(); i++) {
                final int displayId = displays.get(i).getDisplayId();
                getWindowMagnificationMgr().removeMagnificationButton(displayId);
            }
        }
    }

    private boolean fallBackMagnificationModeSettingsLocked(AccessibilityUserState userState) {
+3 −2
Original line number Diff line number Diff line
@@ -173,15 +173,16 @@ class FullScreenMagnificationGestureHandler extends MagnificationGestureHandler
     */
    FullScreenMagnificationGestureHandler(Context context,
            MagnificationController magnificationController,
            MagnificationGestureHandler.ScaleChangedListener listener,
            boolean detectTripleTap,
            boolean detectShortcutTrigger,
            int displayId) {
        super(listener);
        if (DEBUG_ALL) {
            Log.i(LOG_TAG,
                    "FullScreenMagnificationGestureHandler(detectTripleTap = " + detectTripleTap
                            + ", detectShortcutTrigger = " + detectShortcutTrigger + ")");
        }

        mMagnificationController = magnificationController;
        mDisplayId = displayId;

@@ -452,7 +453,6 @@ class FullScreenMagnificationGestureHandler extends MagnificationGestureHandler
                mScaling = abs(deltaScale) > mScalingThreshold;
                return mScaling;
            }

            final float initialScale = mMagnificationController.getScale(mDisplayId);
            final float targetScale = initialScale * detector.getScaleFactor();

@@ -477,6 +477,7 @@ class FullScreenMagnificationGestureHandler extends MagnificationGestureHandler
            if (DEBUG_PANNING_SCALING) Slog.i(LOG_TAG, "Scaled content to: " + scale + "x");
            mMagnificationController.setScale(mDisplayId, scale, pivotX, pivotY, false,
                    AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID);
            mListener.onMagnificationScaleChanged(mDisplayId, getMode());
            return /* handled: */ true;
        }

+19 −0
Original line number Diff line number Diff line
@@ -23,6 +23,25 @@ import com.android.server.accessibility.BaseEventStreamTransformation;
 */
public abstract class MagnificationGestureHandler extends BaseEventStreamTransformation {

    protected final MagnificationGestureHandler.ScaleChangedListener mListener;

    protected MagnificationGestureHandler(ScaleChangedListener listener) {
        mListener = listener;
    }

    /**
     * Interface for listening to the magnification scaling gesture.
     */
    public interface ScaleChangedListener {
        /**
         * Called when the magnification scale is changed by users.
         *
         * @param displayId The logical display id
         * @param mode  The magnification mode
         */
        void onMagnificationScaleChanged(int displayId, int mode);
    }

    /**
     * Called when the shortcut target is magnification.
     */
+22 −2
Original line number Diff line number Diff line
@@ -96,7 +96,9 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
     * @param displayId              The logical display id.
     */
    public WindowMagnificationGestureHandler(Context context,
            WindowMagnificationManager windowMagnificationMgr, int displayId) {
            WindowMagnificationManager windowMagnificationMgr,
            MagnificationGestureHandler.ScaleChangedListener listener, int displayId) {
        super(listener);
        if (DEBUG_ALL) {
            Slog.i(LOG_TAG,
                    "WindowMagnificationGestureHandler() , displayId = " + displayId + ")");
@@ -111,7 +113,25 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
        mDetectingState = new DetectingState(context);
        mObservePanningScalingState = new PanningScalingGestureState(
                new PanningScalingHandler(context, MAX_SCALE, MIN_SCALE, true,
                        mWindowMagnificationMgr));
                        new PanningScalingHandler.MagnificationDelegate() {
                            @Override
                            public boolean processScroll(int displayId, float distanceX,
                                    float distanceY) {
                                return mWindowMagnificationMgr.processScroll(displayId, distanceX,
                                        distanceY);
                            }

                            @Override
                            public void setScale(int displayId, float scale) {
                                mWindowMagnificationMgr.setScale(displayId, scale);
                                mListener.onMagnificationScaleChanged(displayId, getMode());
                            }

                            @Override
                            public float getScale(int displayId) {
                                return mWindowMagnificationMgr.getScale(displayId);
                            }
                        }));

        mDebugOutputEventHistory = DEBUG_EVENT_STREAM ? new ArrayDeque<>() : null;

Loading