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

Commit d9d05f15 authored by Vinay Joglekar's avatar Vinay Joglekar Committed by Android (Google) Code Review
Browse files

Merge "Define and send callback to notify overview that transition to desktop...

Merge "Define and send callback to notify overview that transition to desktop from overview menu is complete." into main
parents c10e83eb 4f76a636
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@ import com.android.wm.shell.desktopmode.DesktopUserRepositories;
import com.android.wm.shell.desktopmode.DragToDesktopTransitionHandler;
import com.android.wm.shell.desktopmode.EnterDesktopTaskTransitionHandler;
import com.android.wm.shell.desktopmode.ExitDesktopTaskTransitionHandler;
import com.android.wm.shell.desktopmode.OverviewToDesktopTransitionObserver;
import com.android.wm.shell.desktopmode.ReturnToDragStartAnimator;
import com.android.wm.shell.desktopmode.SpringDragToDesktopTransitionHandler;
import com.android.wm.shell.desktopmode.ToggleResizeDesktopTaskTransitionHandler;
@@ -739,7 +740,8 @@ public abstract class WMShellModule {
            DesktopModeUiEventLogger desktopModeUiEventLogger,
            DesktopTilingDecorViewModel desktopTilingDecorViewModel,
            DesktopWallpaperActivityTokenProvider desktopWallpaperActivityTokenProvider,
            Optional<BubbleController> bubbleController) {
            Optional<BubbleController> bubbleController,
            OverviewToDesktopTransitionObserver overviewToDesktopTransitionObserver) {
        return new DesktopTasksController(
                context,
                shellInit,
@@ -772,7 +774,8 @@ public abstract class WMShellModule {
                desktopModeUiEventLogger,
                desktopTilingDecorViewModel,
                desktopWallpaperActivityTokenProvider,
                bubbleController);
                bubbleController,
                overviewToDesktopTransitionObserver);
    }

    @WMSingleton
@@ -1397,4 +1400,10 @@ public abstract class WMShellModule {
        return new Object();
    }

    @WMSingleton
    @Provides
    static OverviewToDesktopTransitionObserver provideOverviewToDesktopTransitionObserver(
            Transitions transitions, ShellInit shellInit) {
        return new OverviewToDesktopTransitionObserver(transitions, shellInit);
    }
}
+26 −2
Original line number Diff line number Diff line
@@ -179,6 +179,7 @@ class DesktopTasksController(
    private val desktopTilingDecorViewModel: DesktopTilingDecorViewModel,
    private val desktopWallpaperActivityTokenProvider: DesktopWallpaperActivityTokenProvider,
    private val bubbleController: Optional<BubbleController>,
    private val overviewToDesktopTransitionObserver: OverviewToDesktopTransitionObserver,
) :
    RemoteCallable<DesktopTasksController>,
    Transitions.TransitionHandler,
@@ -415,17 +416,25 @@ class DesktopTasksController(
    }

    /** Moves task to desktop mode if task is running, else launches it in desktop mode. */
    @JvmOverloads
    fun moveTaskToDesktop(
        taskId: Int,
        wct: WindowContainerTransaction = WindowContainerTransaction(),
        transitionSource: DesktopModeTransitionSource,
        remoteTransition: RemoteTransition? = null,
        callback: IMoveToDesktopCallback? = null,
    ): Boolean {
        val runningTask = shellTaskOrganizer.getRunningTaskInfo(taskId)
        if (runningTask == null) {
            return moveBackgroundTaskToDesktop(taskId, wct, transitionSource, remoteTransition)
            return moveBackgroundTaskToDesktop(
                taskId,
                wct,
                transitionSource,
                remoteTransition,
                callback,
            )
        }
        moveRunningTaskToDesktop(runningTask, wct, transitionSource, remoteTransition)
        moveRunningTaskToDesktop(runningTask, wct, transitionSource, remoteTransition, callback)
        return true
    }

@@ -434,6 +443,7 @@ class DesktopTasksController(
        wct: WindowContainerTransaction,
        transitionSource: DesktopModeTransitionSource,
        remoteTransition: RemoteTransition? = null,
        callback: IMoveToDesktopCallback? = null,
    ): Boolean {
        if (recentTasksController?.findTaskInBackground(taskId) == null) {
            logW("moveBackgroundTaskToDesktop taskId=%d not found", taskId)
@@ -466,6 +476,7 @@ class DesktopTasksController(
        } else {
            // TODO(343149901): Add DPI changes for task launch
            transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource)
            invokeCallbackToOverview(transition, callback)
        }
        desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted(
            FREEFORM_ANIMATION_DURATION
@@ -483,6 +494,7 @@ class DesktopTasksController(
        wct: WindowContainerTransaction = WindowContainerTransaction(),
        transitionSource: DesktopModeTransitionSource,
        remoteTransition: RemoteTransition? = null,
        callback: IMoveToDesktopCallback? = null,
    ) {
        if (
            DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue() &&
@@ -514,6 +526,7 @@ class DesktopTasksController(
            remoteTransitionHandler.setTransition(transition)
        } else {
            transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource)
            invokeCallbackToOverview(transition, callback)
        }
        desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted(
            FREEFORM_ANIMATION_DURATION
@@ -524,6 +537,15 @@ class DesktopTasksController(
        exitResult.asExit()?.runOnTransitionStart?.invoke(transition)
    }

    private fun invokeCallbackToOverview(transition: IBinder, callback: IMoveToDesktopCallback?) {
        // TODO: b/333524374 - Remove this later.
        // This is a temporary implementation for adding CUJ end and
        // should be removed when animation is moved to launcher through remote transition.
        if (callback != null) {
            overviewToDesktopTransitionObserver.addPendingOverviewTransition(transition, callback)
        }
    }

    /**
     * The first part of the animated drag to desktop transition. This is followed with a call to
     * [finalizeDragToDesktop] or [cancelDragToDesktop].
@@ -3023,12 +3045,14 @@ class DesktopTasksController(
            taskId: Int,
            transitionSource: DesktopModeTransitionSource,
            remoteTransition: RemoteTransition?,
            callback: IMoveToDesktopCallback?,
        ) {
            executeRemoteCallWithTaskPermission(controller, "moveTaskToDesktop") { c ->
                c.moveTaskToDesktop(
                    taskId,
                    transitionSource = transitionSource,
                    remoteTransition = remoteTransition,
                    callback = callback,
                )
            }
        }
+3 −1
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.window.RemoteTransition;
import com.android.wm.shell.desktopmode.IDesktopTaskListener;
import com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource;
import com.android.wm.shell.shared.desktopmode.DesktopTaskToFrontReason;
import com.android.wm.shell.desktopmode.IMoveToDesktopCallback;

/**
 * Interface that is exposed to remote callers to manipulate desktop mode features.
@@ -58,7 +59,8 @@ interface IDesktopMode {

    /** Move a task with given `taskId` to desktop */
    void moveToDesktop(int taskId, in DesktopModeTransitionSource transitionSource,
                        in @nullable RemoteTransition remoteTransition);
                        in @nullable RemoteTransition remoteTransition,
                        in @nullable IMoveToDesktopCallback callback);

    /** Remove desktop on the given display */
    oneway void removeDesktop(int displayId);
+22 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.wm.shell.desktopmode;

interface IMoveToDesktopCallback {

    void onTaskMovedToDesktop();
}
 No newline at end of file
+57 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.wm.shell.desktopmode

import android.os.IBinder
import android.os.RemoteException
import android.util.Slog
import com.android.wm.shell.sysui.ShellInit
import com.android.wm.shell.transition.Transitions

/** Callback to Launcher overview to notify that add to desktop from overview menu is completed. */
class OverviewToDesktopTransitionObserver(
    private val transitions: Transitions,
    shellInit: ShellInit,
) : Transitions.TransitionObserver {

    private val transitionToCallback = mutableMapOf<IBinder?, IMoveToDesktopCallback?>()

    init {
        shellInit.addInitCallback(::onInit, this)
    }

    fun onInit() {
        transitions.registerObserver(this)
    }

    override fun onTransitionFinished(transition: IBinder, aborted: Boolean) {
        try {
            transitionToCallback[transition]?.onTaskMovedToDesktop()
            transitionToCallback.clear()
        } catch (e: RemoteException) {
            Slog.e(TAG, "onTransitionFinished: Error calling onTaskMovedToDesktop", e)
        }
    }

    fun addPendingOverviewTransition(transition: IBinder?, callback: IMoveToDesktopCallback?) {
        transitionToCallback += transition to callback
    }

    companion object {
        const val TAG = "OverviewToDesktopTransitionObserver"
    }
}
Loading