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

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

Merge "Window magnification supports multi-display in systemUI"

parents 1e6d04b8 2ef01aaf
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@ import android.view.Display;

import androidx.annotation.NonNull;

import java.util.function.Consumer;

/**
 * Supplies the instance with given display Id. It generates a new instance if the corresponding
 * one is not existed. It should run in single thread to avoid race conditions.
@@ -101,4 +103,15 @@ abstract class DisplayIdIndexSupplier<T> {
    public int getSize() {
        return mSparseArray.size();
    }

    /**
     * Runs task for each object.
     *
     * @param task of each object
     */
    public void forEach(Consumer<T> task) {
        for (int i = 0; i < mSparseArray.size(); i++) {
            task.accept(mSparseArray.valueAt(i));
        }
    }
}
+2 −6
Original line number Diff line number Diff line
@@ -87,12 +87,8 @@ public class ModeSwitchesController {
     */
    @MainThread
    void onConfigurationChanged(int configDiff) {
        for (int i = 0; i < mSwitchSupplier.getSize(); i++) {
            final MagnificationModeSwitch magnificationModeSwitch = mSwitchSupplier.valueAt(i);
            if (magnificationModeSwitch != null) {
                magnificationModeSwitch.onConfigurationChanged(configDiff);
            }
        }
        mSwitchSupplier.forEach(
                switchController -> switchController.onConfigurationChanged(configDiff));
    }

    private static class SwitchSupplier extends DisplayIdIndexSupplier<MagnificationModeSwitch> {
+65 −20
Original line number Diff line number Diff line
@@ -22,7 +22,9 @@ import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.hardware.display.DisplayManager;
import android.os.Handler;
import android.view.Display;
import android.view.SurfaceControl;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.IRemoteMagnificationAnimationCallback;
@@ -52,8 +54,6 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall
            ActivityInfo.CONFIG_DENSITY | ActivityInfo.CONFIG_ORIENTATION
                    | ActivityInfo.CONFIG_LOCALE;

    @VisibleForTesting
    protected WindowMagnificationAnimationController mWindowMagnificationAnimationController;
    private final ModeSwitchesController mModeSwitchesController;
    private final Handler mHandler;
    private final AccessibilityManager mAccessibilityManager;
@@ -62,6 +62,43 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall
    private WindowMagnificationConnectionImpl mWindowMagnificationConnectionImpl;
    private Configuration mLastConfiguration;

    private static class AnimationControllerSupplier extends
            DisplayIdIndexSupplier<WindowMagnificationAnimationController> {

        private final Context mContext;
        private final Handler mHandler;
        private final NavigationModeController mNavigationModeController;
        private final WindowMagnifierCallback mWindowMagnifierCallback;

        AnimationControllerSupplier(Context context, Handler handler,
                NavigationModeController navigationModeController,
                WindowMagnifierCallback windowMagnifierCallback, DisplayManager displayManager) {
            super(displayManager);
            mContext = context;
            mHandler = handler;
            mNavigationModeController = navigationModeController;
            mWindowMagnifierCallback = windowMagnifierCallback;
        }

        @Override
        protected WindowMagnificationAnimationController createInstance(Display display) {
            final Context context = (display.getDisplayId() == Display.DEFAULT_DISPLAY)
                    ? mContext
                    : mContext.createDisplayContext(display);
            final WindowMagnificationController controller = new WindowMagnificationController(
                    mContext,
                    mHandler, new SfVsyncFrameCallbackProvider(), null,
                    new SurfaceControl.Transaction(), mWindowMagnifierCallback);
            final int navBarMode = mNavigationModeController.addListener(
                    controller::onNavigationModeChanged);
            controller.onNavigationModeChanged(navBarMode);
            return new WindowMagnificationAnimationController(context, controller);
        }
    }

    @VisibleForTesting
    DisplayIdIndexSupplier<WindowMagnificationAnimationController> mAnimationControllerSupplier;

    @Inject
    public WindowMagnification(Context context, @Main Handler mainHandler,
            CommandQueue commandQueue, ModeSwitchesController modeSwitchesController,
@@ -72,14 +109,9 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall
        mAccessibilityManager = mContext.getSystemService(AccessibilityManager.class);
        mCommandQueue = commandQueue;
        mModeSwitchesController = modeSwitchesController;
        final WindowMagnificationController controller = new WindowMagnificationController(mContext,
                mHandler, new SfVsyncFrameCallbackProvider(), null,
                new SurfaceControl.Transaction(), this);
        final int navBarMode = navigationModeController.addListener(
                controller::onNavigationModeChanged);
        controller.onNavigationModeChanged(navBarMode);
        mWindowMagnificationAnimationController = new WindowMagnificationAnimationController(
                mContext, controller);
        mAnimationControllerSupplier = new AnimationControllerSupplier(context,
                mHandler, navigationModeController, this,
                context.getSystemService(DisplayManager.class));
    }

    @Override
@@ -89,7 +121,8 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall
            return;
        }
        mLastConfiguration.setTo(newConfig);
        mWindowMagnificationAnimationController.onConfigurationChanged(configDiff);
        mAnimationControllerSupplier.forEach(
                animationController -> animationController.onConfigurationChanged(configDiff));
        if (mModeSwitchesController != null) {
            mModeSwitchesController.onConfigurationChanged(configDiff);
        }
@@ -103,28 +136,40 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall
    @MainThread
    void enableWindowMagnification(int displayId, float scale, float centerX, float centerY,
            @Nullable IRemoteMagnificationAnimationCallback callback) {
        //TODO: b/144080869 support multi-display.
        mWindowMagnificationAnimationController.enableWindowMagnification(scale, centerX, centerY,
                callback);
        final WindowMagnificationAnimationController windowMagnificationAnimationController =
                mAnimationControllerSupplier.get(displayId);
        if (windowMagnificationAnimationController != null) {
            windowMagnificationAnimationController.enableWindowMagnification(scale, centerX,
                    centerY, callback);
        }
    }

    @MainThread
    void setScale(int displayId, float scale) {
        //TODO: b/144080869 support multi-display.
        mWindowMagnificationAnimationController.setScale(scale);
        final WindowMagnificationAnimationController windowMagnificationAnimationController =
                mAnimationControllerSupplier.get(displayId);
        if (windowMagnificationAnimationController != null) {
            windowMagnificationAnimationController.setScale(scale);
        }
    }

    @MainThread
    void moveWindowMagnifier(int displayId, float offsetX, float offsetY) {
        //TODO: b/144080869 support multi-display.
        mWindowMagnificationAnimationController.moveWindowMagnifier(offsetX, offsetY);
        final WindowMagnificationAnimationController windowMagnificationAnimationController =
                mAnimationControllerSupplier.get(displayId);
        if (windowMagnificationAnimationController != null) {
            windowMagnificationAnimationController.moveWindowMagnifier(offsetX, offsetY);
        }
    }

    @MainThread
    void disableWindowMagnification(int displayId,
            @Nullable IRemoteMagnificationAnimationCallback callback) {
        //TODO: b/144080869 support multi-display.
        mWindowMagnificationAnimationController.deleteWindowMagnification(callback);
        final WindowMagnificationAnimationController windowMagnificationAnimationController =
                mAnimationControllerSupplier.get(displayId);
        if (windowMagnificationAnimationController != null) {
            windowMagnificationAnimationController.deleteWindowMagnification(callback);
        }
    }

    @Override
+17 −2
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.verify;

import android.content.Context;
import android.hardware.display.DisplayManager;
import android.os.RemoteException;
import android.provider.Settings;
import android.testing.AndroidTestingRunner;
@@ -84,8 +85,9 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase {
        mWindowMagnification = new WindowMagnification(getContext(),
                getContext().getMainThreadHandler(), mCommandQueue, mModeSwitchesController,
                mNavigationModeController);
        mWindowMagnification.mWindowMagnificationAnimationController =
                mWindowMagnificationAnimationController;
        mWindowMagnification.mAnimationControllerSupplier = new FakeAnimationControllerSupplier(
                mContext.getSystemService(DisplayManager.class));

        mWindowMagnification.requestWindowMagnificationConnection(true);
        assertNotNull(mIWindowMagnificationConnection);
        mIWindowMagnificationConnection.setConnectionCallback(mConnectionCallback);
@@ -144,5 +146,18 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase {

        verify(mModeSwitchesController).removeButton(TEST_DISPLAY);
    }

    private class FakeAnimationControllerSupplier extends
            DisplayIdIndexSupplier<WindowMagnificationAnimationController> {

        FakeAnimationControllerSupplier(DisplayManager displayManager) {
            super(displayManager);
        }

        @Override
        protected WindowMagnificationAnimationController createInstance(Display display) {
            return mWindowMagnificationAnimationController;
        }
    }
}