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

Commit 92319a40 authored by Jon @'s avatar Jon @ Committed by Android (Google) Code Review
Browse files

Merge "Notify HomeTransitionObserver when transition finishes with toHome=false" into main

parents f997cb4b 1f2a74f9
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -103,6 +103,7 @@ import com.android.wm.shell.sysui.ShellInterface;
import com.android.wm.shell.taskview.TaskViewFactory;
import com.android.wm.shell.taskview.TaskViewFactoryController;
import com.android.wm.shell.taskview.TaskViewTransitions;
import com.android.wm.shell.transition.HomeTransitionObserver;
import com.android.wm.shell.transition.ShellTransitions;
import com.android.wm.shell.transition.Transitions;
import com.android.wm.shell.unfold.ShellUnfoldProgressProvider;
@@ -613,14 +614,22 @@ public abstract class WMShellBaseModule {
            @ShellMainThread ShellExecutor mainExecutor,
            @ShellMainThread Handler mainHandler,
            @ShellAnimationThread ShellExecutor animExecutor,
            RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer) {
            RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
            HomeTransitionObserver homeTransitionObserver) {
        if (!context.getResources().getBoolean(R.bool.config_registerShellTransitionsOnInit)) {
            // TODO(b/238217847): Force override shell init if registration is disabled
            shellInit = new ShellInit(mainExecutor);
        }
        return new Transitions(context, shellInit, shellCommandHandler, shellController, organizer,
                pool, displayController, mainExecutor, mainHandler, animExecutor,
                rootTaskDisplayAreaOrganizer);
                rootTaskDisplayAreaOrganizer, homeTransitionObserver);
    }

    @WMSingleton
    @Provides
    static HomeTransitionObserver provideHomeTransitionObserver(Context context,
            @ShellMainThread ShellExecutor mainExecutor) {
        return new HomeTransitionObserver(context, mainExecutor);
    }

    @WMSingleton
+4 −2
Original line number Diff line number Diff line
@@ -78,6 +78,7 @@ import com.android.wm.shell.sysui.ShellController;
import com.android.wm.shell.sysui.ShellInit;
import com.android.wm.shell.taskview.TaskViewTransitions;
import com.android.wm.shell.transition.DefaultMixedHandler;
import com.android.wm.shell.transition.HomeTransitionObserver;
import com.android.wm.shell.transition.Transitions;
import com.android.wm.shell.unfold.ShellUnfoldProgressProvider;
import com.android.wm.shell.unfold.UnfoldAnimationController;
@@ -380,9 +381,10 @@ public abstract class WMShellModule {
    static RecentsTransitionHandler provideRecentsTransitionHandler(
            ShellInit shellInit,
            Transitions transitions,
            Optional<RecentTasksController> recentTasksController) {
            Optional<RecentTasksController> recentTasksController,
            HomeTransitionObserver homeTransitionObserver) {
        return new RecentsTransitionHandler(shellInit, transitions,
                recentTasksController.orElse(null));
                recentTasksController.orElse(null), homeTransitionObserver);
    }

    //
+11 −1
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ import com.android.internal.protolog.common.ProtoLog;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
import com.android.wm.shell.sysui.ShellInit;
import com.android.wm.shell.transition.HomeTransitionObserver;
import com.android.wm.shell.transition.Transitions;
import com.android.wm.shell.util.TransitionUtil;

@@ -85,11 +86,15 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler {
     */
    private final ArrayList<RecentsMixedHandler> mMixers = new ArrayList<>();

    private final HomeTransitionObserver mHomeTransitionObserver;

    public RecentsTransitionHandler(ShellInit shellInit, Transitions transitions,
            @Nullable RecentTasksController recentTasksController) {
            @Nullable RecentTasksController recentTasksController,
            HomeTransitionObserver homeTransitionObserver) {
        mTransitions = transitions;
        mExecutor = transitions.getMainExecutor();
        mRecentTasksController = recentTasksController;
        mHomeTransitionObserver = homeTransitionObserver;
        if (!Transitions.ENABLE_SHELL_TRANSITIONS) return;
        if (recentTasksController == null) return;
        shellInit.addInitCallback(() -> {
@@ -911,6 +916,11 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler {
                Slog.e(TAG, "Duplicate call to finish");
                return;
            }
            if (!toHome) {
                // For some transitions, we may have notified home activity that it became visible.
                // We need to notify the observer that we are no longer going home.
                mHomeTransitionObserver.notifyHomeVisibilityChanged(false);
            }
            ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
                    "[%d] RecentsController.finishInner: toHome=%b userLeave=%b "
                            + "willFinishToHome=%b state=%d",
+23 −15
Original line number Diff line number Diff line
@@ -38,24 +38,15 @@ import com.android.wm.shell.util.TransitionUtil;
 */
public class HomeTransitionObserver implements TransitionObserver,
        RemoteCallable<HomeTransitionObserver> {
    private final SingleInstanceRemoteListener<HomeTransitionObserver, IHomeTransitionListener>
    private SingleInstanceRemoteListener<HomeTransitionObserver, IHomeTransitionListener>
            mListener;

    private @NonNull final Context mContext;
    private @NonNull final ShellExecutor mMainExecutor;
    private @NonNull final Transitions mTransitions;

    public HomeTransitionObserver(@NonNull Context context,
            @NonNull ShellExecutor mainExecutor,
            @NonNull Transitions transitions) {
            @NonNull ShellExecutor mainExecutor) {
        mContext = context;
        mMainExecutor = mainExecutor;
        mTransitions = transitions;

        mListener = new SingleInstanceRemoteListener<>(this,
                c -> mTransitions.registerObserver(this),
                c -> mTransitions.unregisterObserver(this));

    }

    @Override
@@ -72,7 +63,7 @@ public class HomeTransitionObserver implements TransitionObserver,
            final int mode = change.getMode();
            if (taskInfo.getActivityType() == ACTIVITY_TYPE_HOME
                    && TransitionUtil.isOpenOrCloseMode(mode)) {
                mListener.call(l -> l.onHomeVisibilityChanged(TransitionUtil.isOpeningType(mode)));
                notifyHomeVisibilityChanged(TransitionUtil.isOpeningType(mode));
            }
        }
    }
@@ -92,7 +83,14 @@ public class HomeTransitionObserver implements TransitionObserver,
     * Sets the home transition listener that receives any transitions resulting in a change of
     *
     */
    public void setHomeTransitionListener(IHomeTransitionListener listener) {
    public void setHomeTransitionListener(Transitions transitions,
            IHomeTransitionListener listener) {
        if (mListener == null) {
            mListener = new SingleInstanceRemoteListener<>(this,
                    c -> transitions.registerObserver(this),
                    c -> transitions.unregisterObserver(this));
        }

        if (listener != null) {
            mListener.register(listener);
        } else {
@@ -100,6 +98,16 @@ public class HomeTransitionObserver implements TransitionObserver,
        }
    }

    /**
     * Notifies the listener that the home visibility has changed.
     * @param isVisible true when home activity is visible, false otherwise.
     */
    public void notifyHomeVisibilityChanged(boolean isVisible) {
        if (mListener != null) {
            mListener.call(l -> l.onHomeVisibilityChanged(isVisible));
        }
    }

    @Override
    public Context getContext() {
        return mContext;
@@ -113,7 +121,7 @@ public class HomeTransitionObserver implements TransitionObserver,
    /**
     * Invalidates this controller, preventing future calls to send updates.
     */
    public void invalidate() {
        mTransitions.unregisterObserver(this);
    public void invalidate(Transitions transitions) {
        transitions.unregisterObserver(this);
    }
}
+13 −10
Original line number Diff line number Diff line
@@ -192,6 +192,8 @@ public class Transitions implements RemoteCallable<Transitions>,

    private final ArrayList<TransitionObserver> mObservers = new ArrayList<>();

    private HomeTransitionObserver mHomeTransitionObserver;

    /** List of {@link Runnable} instances to run when the last active transition has finished.  */
    private final ArrayList<Runnable> mRunWhenIdleQueue = new ArrayList<>();

@@ -267,10 +269,11 @@ public class Transitions implements RemoteCallable<Transitions>,
            @NonNull DisplayController displayController,
            @NonNull ShellExecutor mainExecutor,
            @NonNull Handler mainHandler,
            @NonNull ShellExecutor animExecutor) {
            @NonNull ShellExecutor animExecutor,
            @NonNull HomeTransitionObserver observer) {
        this(context, shellInit, new ShellCommandHandler(), shellController, organizer, pool,
                displayController, mainExecutor, mainHandler, animExecutor,
                new RootTaskDisplayAreaOrganizer(mainExecutor, context, shellInit));
                new RootTaskDisplayAreaOrganizer(mainExecutor, context, shellInit), observer);
    }

    public Transitions(@NonNull Context context,
@@ -283,7 +286,8 @@ public class Transitions implements RemoteCallable<Transitions>,
            @NonNull ShellExecutor mainExecutor,
            @NonNull Handler mainHandler,
            @NonNull ShellExecutor animExecutor,
            @NonNull RootTaskDisplayAreaOrganizer rootTDAOrganizer) {
            @NonNull RootTaskDisplayAreaOrganizer rootTDAOrganizer,
            @NonNull HomeTransitionObserver observer) {
        mOrganizer = organizer;
        mContext = context;
        mMainExecutor = mainExecutor;
@@ -302,6 +306,7 @@ public class Transitions implements RemoteCallable<Transitions>,
        mHandlers.add(mRemoteTransitionHandler);
        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "addHandler: Remote");
        shellInit.addInitCallback(this::onInit, this);
        mHomeTransitionObserver = observer;
    }

    private void onInit() {
@@ -351,7 +356,7 @@ public class Transitions implements RemoteCallable<Transitions>,
    }

    private ExternalInterfaceBinder createExternalInterface() {
        return new IShellTransitionsImpl(mContext, getMainExecutor(), this);
        return new IShellTransitionsImpl(this);
    }

    @Override
@@ -1397,12 +1402,9 @@ public class Transitions implements RemoteCallable<Transitions>,
    private static class IShellTransitionsImpl extends IShellTransitions.Stub
            implements ExternalInterfaceBinder {
        private Transitions mTransitions;
        private final HomeTransitionObserver mHomeTransitionObserver;

        IShellTransitionsImpl(Context context, ShellExecutor executor, Transitions transitions) {
        IShellTransitionsImpl(Transitions transitions) {
            mTransitions = transitions;
            mHomeTransitionObserver = new HomeTransitionObserver(context, executor,
                    mTransitions);
        }

        /**
@@ -1410,7 +1412,7 @@ public class Transitions implements RemoteCallable<Transitions>,
         */
        @Override
        public void invalidate() {
            mHomeTransitionObserver.invalidate();
            mTransitions.mHomeTransitionObserver.invalidate(mTransitions);
            mTransitions = null;
        }

@@ -1440,7 +1442,8 @@ public class Transitions implements RemoteCallable<Transitions>,
        public void setHomeTransitionListener(IHomeTransitionListener listener) {
            executeRemoteCallWithTaskPermission(mTransitions, "setHomeTransitionListener",
                    (transitions) -> {
                        mHomeTransitionObserver.setHomeTransitionListener(listener);
                        transitions.mHomeTransitionObserver.setHomeTransitionListener(mTransitions,
                                listener);
                    });
        }
    }
Loading