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

Commit 8ac93740 authored by Naomi Musgrave's avatar Naomi Musgrave
Browse files

Introduce provider for drag resize handle sizes.

Bug: 335850704
Test: atest WMShellUnitTests:ResizeHandleSizeRepositoryTests
Test: atest WMShellUnitTests:ResizeHandleSizeRepositoryParamaterizedTests
Flag: com.android.window.flags.enable_windowing_edge_drag_resize
Change-Id: I68802939f7ad419175c491cbc00d1001d223e580
parent 9c0687ee
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -100,6 +100,7 @@ import com.android.wm.shell.unfold.qualifier.UnfoldShellTransition;
import com.android.wm.shell.unfold.qualifier.UnfoldTransition;
import com.android.wm.shell.windowdecor.CaptionWindowDecorViewModel;
import com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModel;
import com.android.wm.shell.windowdecor.ResizeHandleSizeRepository;
import com.android.wm.shell.windowdecor.WindowDecorViewModel;

import dagger.Binds;
@@ -220,7 +221,8 @@ public abstract class WMShellModule {
            SyncTransactionQueue syncQueue,
            Transitions transitions,
            Optional<DesktopTasksController> desktopTasksController,
            RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer) {
            RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
            ResizeHandleSizeRepository resizeHandleSizeRepository) {
        if (DesktopModeStatus.canEnterDesktopMode(context)) {
            return new DesktopModeWindowDecorViewModel(
                    context,
@@ -237,7 +239,8 @@ public abstract class WMShellModule {
                    syncQueue,
                    transitions,
                    desktopTasksController,
                    rootTaskDisplayAreaOrganizer);
                    rootTaskDisplayAreaOrganizer,
                    resizeHandleSizeRepository);
        }
        return new CaptionWindowDecorViewModel(
                context,
@@ -247,7 +250,8 @@ public abstract class WMShellModule {
                displayController,
                rootTaskDisplayAreaOrganizer,
                syncQueue,
                transitions);
                transitions,
                resizeHandleSizeRepository);
    }

    //
@@ -529,7 +533,8 @@ public abstract class WMShellModule {
                exitDesktopTransitionHandler, toggleResizeDesktopTaskTransitionHandler,
                dragToDesktopTransitionHandler, desktopModeTaskRepository,
                desktopModeLoggerTransitionObserver, launchAdjacentController,
                recentsTransitionHandler, multiInstanceHelper, mainExecutor, desktopTasksLimiter);
                recentsTransitionHandler, multiInstanceHelper,
                mainExecutor, desktopTasksLimiter);
    }

    @WMSingleton
@@ -622,6 +627,12 @@ public abstract class WMShellModule {
        return new DesktopModeEventLogger();
    }

    @WMSingleton
    @Provides
    static ResizeHandleSizeRepository provideResizeHandleSizeRepository() {
        return new ResizeHandleSizeRepository();
    }

    //
    // Drag and drop
    //
+6 −2
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel {
    private final RootTaskDisplayAreaOrganizer mRootTaskDisplayAreaOrganizer;
    private final SyncTransactionQueue mSyncQueue;
    private final Transitions mTransitions;
    private final ResizeHandleSizeRepository mResizeHandleSizeRepository;
    private TaskOperations mTaskOperations;

    private final SparseArray<CaptionWindowDecoration> mWindowDecorByTaskId = new SparseArray<>();
@@ -75,7 +76,8 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel {
            DisplayController displayController,
            RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
            SyncTransactionQueue syncQueue,
            Transitions transitions) {
            Transitions transitions,
            ResizeHandleSizeRepository resizeHandleSizeRepository) {
        mContext = context;
        mMainHandler = mainHandler;
        mMainChoreographer = mainChoreographer;
@@ -84,6 +86,7 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel {
        mRootTaskDisplayAreaOrganizer = rootTaskDisplayAreaOrganizer;
        mSyncQueue = syncQueue;
        mTransitions = transitions;
        mResizeHandleSizeRepository = resizeHandleSizeRepository;
        if (!Transitions.ENABLE_SHELL_TRANSITIONS) {
            mTaskOperations = new TaskOperations(null, mContext, mSyncQueue);
        }
@@ -231,7 +234,8 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel {
                        taskSurface,
                        mMainHandler,
                        mMainChoreographer,
                        mSyncQueue);
                        mSyncQueue,
                        mResizeHandleSizeRepository);
        mWindowDecorByTaskId.put(taskInfo.taskId, windowDecoration);

        final FluidResizeTaskPositioner taskPositioner =
+26 −8
Original line number Diff line number Diff line
@@ -16,11 +16,11 @@

package com.android.wm.shell.windowdecor;

import static com.android.wm.shell.windowdecor.DragResizeWindowGeometry.getFineResizeCornerSize;
import static com.android.wm.shell.windowdecor.DragResizeWindowGeometry.getLargeResizeCornerSize;
import static com.android.wm.shell.windowdecor.DragResizeWindowGeometry.getResizeEdgeHandleSize;
import static com.android.wm.shell.windowdecor.ResizeHandleSizeRepository.getFineResizeCornerPixels;
import static com.android.wm.shell.windowdecor.ResizeHandleSizeRepository.getLargeResizeCornerPixels;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.WindowConfiguration;
import android.app.WindowConfiguration.WindowingMode;
@@ -45,6 +45,8 @@ import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.SyncTransactionQueue;

import java.util.function.Consumer;

/**
 * Defines visuals and behaviors of a window decoration of a caption bar and shadows. It works with
 * {@link CaptionWindowDecorViewModel}. The caption bar contains a back button, minimize button,
@@ -58,12 +60,28 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL
    private View.OnClickListener mOnCaptionButtonClickListener;
    private View.OnTouchListener mOnCaptionTouchListener;
    private DragPositioningCallback mDragPositioningCallback;
    // Listener for handling drag resize events. Will be null if the task cannot be resized.
    @Nullable
    private DragResizeInputListener mDragResizeListener;
    private DragDetector mDragDetector;

    private RelayoutParams mRelayoutParams = new RelayoutParams();
    private final RelayoutResult<WindowDecorLinearLayout> mResult =
            new RelayoutResult<>();
    private final ResizeHandleSizeRepository mResizeHandleSizeRepository;
    private final Consumer<ResizeHandleSizeRepository> mResizeHandleSizeChangedFunction =
            (ResizeHandleSizeRepository sizeRepository) -> {
                if (mDragResizeListener == null) {
                    return;
                }
                final Resources res = mResult.mRootView.getResources();
                mDragResizeListener.setGeometry(
                        new DragResizeWindowGeometry(0 /* taskCornerRadius */,
                                new Size(mResult.mWidth, mResult.mHeight),
                                sizeRepository.getResizeEdgeHandlePixels(res),
                                getFineResizeCornerPixels(res), getLargeResizeCornerPixels(res)),
                        mDragDetector.getTouchSlop());
            };

    CaptionWindowDecoration(
            Context context,
@@ -73,13 +91,16 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL
            SurfaceControl taskSurface,
            Handler handler,
            Choreographer choreographer,
            SyncTransactionQueue syncQueue) {
            SyncTransactionQueue syncQueue,
            ResizeHandleSizeRepository resizeHandleSizeRepository) {
        super(context, displayController, taskOrganizer, taskInfo, taskSurface,
                taskInfo.getConfiguration());

        mHandler = handler;
        mChoreographer = choreographer;
        mSyncQueue = syncQueue;
        mResizeHandleSizeRepository = resizeHandleSizeRepository;
        mResizeHandleSizeRepository.registerSizeChangeFunction(mResizeHandleSizeChangedFunction);
    }

    void setCaptionListeners(
@@ -238,10 +259,7 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL
                .getScaledTouchSlop();
        mDragDetector.setTouchSlop(touchSlop);

        final Resources res = mResult.mRootView.getResources();
        mDragResizeListener.setGeometry(new DragResizeWindowGeometry(0 /* taskCornerRadius */,
                new Size(mResult.mWidth, mResult.mHeight), getResizeEdgeHandleSize(res),
                getFineResizeCornerSize(res), getLargeResizeCornerSize(res)), touchSlop);
        mResizeHandleSizeChangedFunction.accept(mResizeHandleSizeRepository);
    }

    /**
+10 −4
Original line number Diff line number Diff line
@@ -149,6 +149,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
            new DesktopModeKeyguardChangeListener();
    private final RootTaskDisplayAreaOrganizer mRootTaskDisplayAreaOrganizer;
    private final DisplayInsetsController mDisplayInsetsController;
    private final ResizeHandleSizeRepository mResizeHandleSizeRepository;
    private final Region mExclusionRegion = Region.obtain();
    private boolean mInImmersiveMode;

@@ -181,7 +182,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
            SyncTransactionQueue syncQueue,
            Transitions transitions,
            Optional<DesktopTasksController> desktopTasksController,
            RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer
            RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
            ResizeHandleSizeRepository resizeHandleSizeRepository
    ) {
        this(
                context,
@@ -202,7 +204,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
                new InputMonitorFactory(),
                SurfaceControl.Transaction::new,
                rootTaskDisplayAreaOrganizer,
                new SparseArray<>());
                new SparseArray<>(),
                resizeHandleSizeRepository);
    }

    @VisibleForTesting
@@ -225,7 +228,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
            InputMonitorFactory inputMonitorFactory,
            Supplier<SurfaceControl.Transaction> transactionFactory,
            RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
            SparseArray<DesktopModeWindowDecoration> windowDecorByTaskId) {
            SparseArray<DesktopModeWindowDecoration> windowDecorByTaskId,
            ResizeHandleSizeRepository resizeHandleSizeRepository) {
        mContext = context;
        mMainExecutor = shellExecutor;
        mMainHandler = mainHandler;
@@ -246,6 +250,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
        mRootTaskDisplayAreaOrganizer = rootTaskDisplayAreaOrganizer;
        mInputManager = mContext.getSystemService(InputManager.class);
        mWindowDecorByTaskId = windowDecorByTaskId;
        mResizeHandleSizeRepository = resizeHandleSizeRepository;

        shellInit.addInitCallback(this::onInit, this);
    }
@@ -1060,7 +1065,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
                        mMainHandler,
                        mMainChoreographer,
                        mSyncQueue,
                        mRootTaskDisplayAreaOrganizer);
                        mRootTaskDisplayAreaOrganizer,
                        mResizeHandleSizeRepository);
        mWindowDecorByTaskId.put(taskInfo.taskId, windowDecoration);

        final DragPositioningCallback dragPositioningCallback;
+33 −14
Original line number Diff line number Diff line
@@ -24,11 +24,11 @@ import static android.view.MotionEvent.ACTION_DOWN;
import static android.view.MotionEvent.ACTION_UP;

import static com.android.launcher3.icons.BaseIconFactory.MODE_DEFAULT;
import static com.android.wm.shell.windowdecor.DragResizeWindowGeometry.getFineResizeCornerSize;
import static com.android.wm.shell.windowdecor.DragResizeWindowGeometry.getLargeResizeCornerSize;
import static com.android.wm.shell.windowdecor.DragResizeWindowGeometry.getResizeEdgeHandleSize;
import static com.android.wm.shell.windowdecor.ResizeHandleSizeRepository.getFineResizeCornerPixels;
import static com.android.wm.shell.windowdecor.ResizeHandleSizeRepository.getLargeResizeCornerPixels;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.WindowConfiguration.WindowingMode;
import android.content.Context;
@@ -75,6 +75,7 @@ import com.android.wm.shell.windowdecor.viewholder.DesktopModeWindowDecorationVi

import kotlin.Unit;

import java.util.function.Function;
import java.util.function.Supplier;

/**
@@ -96,6 +97,8 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
    private View.OnLongClickListener mOnCaptionLongClickListener;
    private View.OnGenericMotionListener mOnCaptionGenericMotionListener;
    private DragPositioningCallback mDragPositioningCallback;
    // Listener for handling drag resize events. Will be null if the task cannot be resized.
    @Nullable
    private DragResizeInputListener mDragResizeListener;
    private DragDetector mDragDetector;

@@ -118,6 +121,19 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin

    private final RootTaskDisplayAreaOrganizer mRootTaskDisplayAreaOrganizer;

    private final ResizeHandleSizeRepository mResizeHandleSizeRepository;
    private final Function<ResizeHandleSizeRepository, Boolean> mResizeHandleSizeChangedFunction =
            (ResizeHandleSizeRepository sizeRepository) -> {
                final Resources res = mResult.mRootView.getResources();
                return mDragResizeListener == null || mDragResizeListener.setGeometry(
                        new DragResizeWindowGeometry(mRelayoutParams.mCornerRadius,
                                new Size(mResult.mWidth, mResult.mHeight),
                                sizeRepository.getResizeEdgeHandlePixels(res),
                                getFineResizeCornerPixels(res),
                                getLargeResizeCornerPixels(res)),
                        mDragDetector.getTouchSlop());
            };

    DesktopModeWindowDecoration(
            Context context,
            DisplayController displayController,
@@ -128,12 +144,13 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
            Handler handler,
            Choreographer choreographer,
            SyncTransactionQueue syncQueue,
            RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer) {
            RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
            ResizeHandleSizeRepository resizeHandleSizeRepository) {
        this (context, displayController, taskOrganizer, taskInfo, taskSurface, windowDecorConfig,
                handler, choreographer, syncQueue, rootTaskDisplayAreaOrganizer,
                SurfaceControl.Builder::new, SurfaceControl.Transaction::new,
                WindowContainerTransaction::new, SurfaceControl::new,
                new SurfaceControlViewHostFactory() {});
                resizeHandleSizeRepository, SurfaceControl.Builder::new,
                SurfaceControl.Transaction::new, WindowContainerTransaction::new,
                SurfaceControl::new, new SurfaceControlViewHostFactory() {});
    }

    DesktopModeWindowDecoration(
@@ -147,6 +164,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
            Choreographer choreographer,
            SyncTransactionQueue syncQueue,
            RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
            ResizeHandleSizeRepository resizeHandleSizeRepository,
            Supplier<SurfaceControl.Builder> surfaceControlBuilderSupplier,
            Supplier<SurfaceControl.Transaction> surfaceControlTransactionSupplier,
            Supplier<WindowContainerTransaction> windowContainerTransactionSupplier,
@@ -160,6 +178,9 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
        mChoreographer = choreographer;
        mSyncQueue = syncQueue;
        mRootTaskDisplayAreaOrganizer = rootTaskDisplayAreaOrganizer;
        mResizeHandleSizeRepository = resizeHandleSizeRepository;
        mResizeHandleSizeRepository.registerSizeChangeFunction(
                mResizeHandleSizeChangedFunction::apply);
    }

    void setCaptionListeners(
@@ -305,11 +326,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin

        // If either task geometry or position have changed, update this task's
        // exclusion region listener
        final Resources res = mResult.mRootView.getResources();
        if (mDragResizeListener.setGeometry(
                new DragResizeWindowGeometry(mRelayoutParams.mCornerRadius,
                        new Size(mResult.mWidth, mResult.mHeight), getResizeEdgeHandleSize(res),
                        getFineResizeCornerSize(res), getLargeResizeCornerSize(res)), touchSlop)
        if (mResizeHandleSizeChangedFunction.apply(mResizeHandleSizeRepository)
                || !mTaskInfo.positionInParent.equals(mPositionInParent)) {
            updateExclusionRegion();
        }
@@ -936,7 +953,8 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
                Handler handler,
                Choreographer choreographer,
                SyncTransactionQueue syncQueue,
                RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer) {
                RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
                ResizeHandleSizeRepository resizeHandleSizeRepository) {
            final Configuration windowDecorConfig =
                    DesktopTasksController.isDesktopDensityOverrideSet()
                    ? context.getResources().getConfiguration() // Use system context
@@ -951,7 +969,8 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
                    handler,
                    choreographer,
                    syncQueue,
                    rootTaskDisplayAreaOrganizer);
                    rootTaskDisplayAreaOrganizer,
                    resizeHandleSizeRepository);
        }
    }

Loading