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

Commit 8463dc47 authored by Schneider Victor-Tulias's avatar Schneider Victor-Tulias
Browse files

Generalize ActivityTracker to support RecentsWindowManager

Continued quick switch couldn't work using existing infrastructure until RecentsWindowManager could be properly tracked by ActivityTracker. Refactored ActivityTracker into ContextTracker to support this.

Also refactored ActivityInitListener into ContextInitListener to fit the updated pattern.

Flag: com.android.launcher3.enable_fallback_overview_in_window
Fixes: 366023051
Test: RecentsWindowSwipeHandlerTestCase; Attempted continued quick switch from home and launched app
Change-Id: Ic38ebf3611ef22fbfd1ddeb79d72d8a3621940a0
parent 9dbae036
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -15,11 +15,11 @@
 */
package com.android.launcher3;

import com.android.quickstep.util.ActivityInitListener;
import com.android.quickstep.util.ContextInitListener;

import java.util.function.BiPredicate;

public class LauncherInitListener extends ActivityInitListener<Launcher> {
public class LauncherInitListener extends ContextInitListener<Launcher> {

    /**
     * @param onInitListener a callback made when the activity is initialized. The callback should
@@ -31,8 +31,8 @@ public class LauncherInitListener extends ActivityInitListener<Launcher> {
    }

    @Override
    public boolean handleInit(Launcher launcher, boolean alreadyOnHome) {
    public boolean handleInit(Launcher launcher, boolean isHomeStarted) {
        launcher.deferOverlayCallbacksUntilNextResumeOrStop();
        return super.handleInit(launcher, alreadyOnHome);
        return super.handleInit(launcher, isHomeStarted);
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -384,7 +384,7 @@ public class DesktopVisibilityController {
            Log.d(TAG, "markLauncherPaused " + Debug.getCaller());
        }
        StatefulActivity<LauncherState> activity =
                QuickstepLauncher.ACTIVITY_TRACKER.getCreatedActivity();
                QuickstepLauncher.ACTIVITY_TRACKER.getCreatedContext();
        if (activity != null) {
            activity.setPaused();
        }
@@ -404,7 +404,7 @@ public class DesktopVisibilityController {
            Log.d(TAG, "markLauncherResumed " + Debug.getCaller());
        }
        StatefulActivity<LauncherState> activity =
                QuickstepLauncher.ACTIVITY_TRACKER.getCreatedActivity();
                QuickstepLauncher.ACTIVITY_TRACKER.getCreatedContext();
        // Check activity state before calling setResumed(). Launcher may have been actually
        // paused (eg fullscreen task moved to front).
        // In this case we should not mark the activity as resumed.
+13 −17
Original line number Diff line number Diff line
@@ -100,7 +100,6 @@ import com.android.internal.jank.Cuj;
import com.android.internal.util.LatencyTracker;
import com.android.launcher3.AbstractFloatingView;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Flags;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.anim.AnimationSuccessListener;
@@ -125,8 +124,8 @@ import com.android.quickstep.fallback.window.RecentsWindowManager;
import com.android.quickstep.util.ActiveGestureErrorDetector;
import com.android.quickstep.util.ActiveGestureLog;
import com.android.quickstep.util.ActiveGestureProtoLogProxy;
import com.android.quickstep.util.ActivityInitListener;
import com.android.quickstep.util.AnimatorControllerWithResistance;
import com.android.quickstep.util.ContextInitListener;
import com.android.quickstep.util.InputConsumerProxy;
import com.android.quickstep.util.InputProxyHandlerFactory;
import com.android.quickstep.util.MotionPauseDetector;
@@ -156,8 +155,6 @@ import com.android.wm.shell.shared.TransactionPool;
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
import com.android.wm.shell.shared.startingsurface.SplashScreenExitAnimationUtils;

import kotlin.Unit;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -167,6 +164,8 @@ import java.util.Optional;
import java.util.OptionalInt;
import java.util.function.Consumer;

import kotlin.Unit;

/**
 * Handles the navigation gestures when Launcher is the default home activity.
 */
@@ -184,7 +183,7 @@ public abstract class AbsSwipeUpHandler<

    protected final BaseContainerInterface<STATE, RECENTS_CONTAINER> mContainerInterface;
    protected final InputConsumerProxy mInputConsumerProxy;
    protected final ActivityInitListener mActivityInitListener;
    protected final ContextInitListener mContextInitListener;
    // Callbacks to be made once the recents animation starts
    private final ArrayList<Runnable> mRecentsAnimationStartCallbacks = new ArrayList<>();
    private final OnScrollChangedListener mOnRecentsScrollListener = this::onRecentsViewScroll;
@@ -357,10 +356,7 @@ public abstract class AbsSwipeUpHandler<
            InputConsumerController inputConsumer, RecentsWindowManager recentsWindowManager) {
        super(context, deviceState, gestureState);
        mContainerInterface = gestureState.getContainerInterface();
        if (recentsWindowManager != null && Flags.enableFallbackOverviewInWindow()) {
            recentsWindowManager.registerInitListener(this::onActivityInit);
        }
        mActivityInitListener =
        mContextInitListener =
                mContainerInterface.createActivityInitListener(this::onActivityInit);
        mInputConsumerProxy =
                new InputConsumerProxy(context, /* rotationSupplier = */ () -> {
@@ -482,7 +478,7 @@ public abstract class AbsSwipeUpHandler<
                this::resetStateForAnimationCancel);
    }

    protected boolean onActivityInit(Boolean alreadyOnHome) {
    protected boolean onActivityInit(Boolean isHomeStarted) {
        if (mStateCallback.hasStates(STATE_HANDLER_INVALIDATED)) {
            return false;
        }
@@ -510,11 +506,11 @@ public abstract class AbsSwipeUpHandler<
            initStateCallbacks();
            mStateCallback.setState(oldState);
        }
        mWasLauncherAlreadyVisible = alreadyOnHome;
        mWasLauncherAlreadyVisible = isHomeStarted;
        mContainer = container;
        // Override the visibility of the activity until the gesture actually starts and we swipe
        // up, or until we transition home and the home animation is composed
        if (alreadyOnHome) {
        if (isHomeStarted) {
            mContainer.clearForceInvisibleFlag(STATE_HANDLER_INVISIBILITY_FLAGS);
        } else {
            mContainer.addForceInvisibleFlag(STATE_HANDLER_INVISIBILITY_FLAGS);
@@ -524,7 +520,7 @@ public abstract class AbsSwipeUpHandler<
        mRecentsView.setOnPageTransitionEndCallback(null);

        mStateCallback.setState(STATE_LAUNCHER_PRESENT);
        if (alreadyOnHome) {
        if (isHomeStarted) {
            onLauncherStart();
        } else {
            container.addEventCallback(EVENT_STARTED, mLauncherOnStartCallback);
@@ -985,7 +981,7 @@ public abstract class AbsSwipeUpHandler<
    @Override
    public void onRecentsAnimationCanceled(HashMap<Integer, ThumbnailData> thumbnailDatas) {
        ActiveGestureProtoLogProxy.logAbsSwipeUpHandlerOnRecentsAnimationCanceled();
        mActivityInitListener.unregister("AbsSwipeUpHandler.onRecentsAnimationCanceled");
        mContextInitListener.unregister("AbsSwipeUpHandler.onRecentsAnimationCanceled");
        mStateCallback.setStateOnUiThread(STATE_GESTURE_CANCELLED | STATE_HANDLER_INVALIDATED);
        // Defer clearing the controller and the targets until after we've updated the state
        mRecentsAnimationController = null;
@@ -1989,7 +1985,7 @@ public abstract class AbsSwipeUpHandler<

        // Cleanup when switching handlers
        mInputConsumerProxy.unregisterOnTouchDownCallback();
        mActivityInitListener.unregister("AbsSwipeUpHandler.cancelCurrentAnimation");
        mContextInitListener.unregister("AbsSwipeUpHandler.cancelCurrentAnimation");
        TaskStackChangeListeners.getInstance().unregisterTaskStackListener(
                mActivityRestartListener);
        mTaskSnapshotCache.clear();
@@ -2007,7 +2003,7 @@ public abstract class AbsSwipeUpHandler<
            mGestureEndCallback.run();
        }

        mActivityInitListener.unregister("AbsSwipeUpHandler.invalidateHandler");
        mContextInitListener.unregister("AbsSwipeUpHandler.invalidateHandler");
        TaskStackChangeListeners.getInstance().unregisterTaskStackListener(
                mActivityRestartListener);
        mTaskSnapshotCache.clear();
@@ -2516,7 +2512,7 @@ public abstract class AbsSwipeUpHandler<
        // Preload the plan
        RecentsModel.INSTANCE.get(mContext).getTasks(null);

        mActivityInitListener.register(reasonString);
        mContextInitListener.register(reasonString);
    }

    private boolean shouldFadeOutTargetsForKeyboardQuickSwitch(
+2 −2
Original line number Diff line number Diff line
@@ -47,8 +47,8 @@ import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.WindowBounds;
import com.android.launcher3.views.ScrimView;
import com.android.quickstep.orientation.RecentsPagedOrientationHandler;
import com.android.quickstep.util.ActivityInitListener;
import com.android.quickstep.util.AnimatorControllerWithResistance;
import com.android.quickstep.util.ContextInitListener;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.RecentsViewContainer;
import com.android.systemui.shared.recents.model.ThumbnailData;
@@ -134,7 +134,7 @@ public abstract class BaseContainerInterface<STATE_TYPE extends BaseState<STATE_
            RecentsAnimationDeviceState deviceState, boolean activityVisible,
            Consumer<AnimatorControllerWithResistance> callback);

    public abstract ActivityInitListener createActivityInitListener(
    public abstract ContextInitListener createActivityInitListener(
            Predicate<Boolean> onInitListener);
    /**
     * Returns the expected STATE_TYPE from the provided GestureEndTarget.
+4 −4
Original line number Diff line number Diff line
@@ -36,8 +36,8 @@ import com.android.launcher3.util.DisplayController;
import com.android.quickstep.GestureState.GestureEndTarget;
import com.android.quickstep.fallback.RecentsState;
import com.android.quickstep.orientation.RecentsPagedOrientationHandler;
import com.android.quickstep.util.ActivityInitListener;
import com.android.quickstep.util.AnimatorControllerWithResistance;
import com.android.quickstep.util.ContextInitListener;
import com.android.quickstep.views.RecentsView;

import java.util.function.Consumer;
@@ -88,16 +88,16 @@ public final class FallbackActivityInterface extends
    }

    @Override
    public ActivityInitListener createActivityInitListener(
    public ContextInitListener<RecentsActivity> createActivityInitListener(
            Predicate<Boolean> onInitListener) {
        return new ActivityInitListener<>((activity, alreadyOnHome) ->
        return new ContextInitListener<>((activity, alreadyOnHome) ->
                onInitListener.test(alreadyOnHome), RecentsActivity.ACTIVITY_TRACKER);
    }

    @Nullable
    @Override
    public RecentsActivity getCreatedContainer() {
        return RecentsActivity.ACTIVITY_TRACKER.getCreatedActivity();
        return RecentsActivity.ACTIVITY_TRACKER.getCreatedContext();
    }

    @Override
Loading