Moving RecentsWindowManager away from the singleton pattern
Test: Built and tested locally
Flag: com.android.launcher3.enable_fallback_overview_in_window
Bug:292269949
Change-Id: Ic70d9a3e65ffb86e369f52982891b94bef4cacd7
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index 22174df..fe1d015 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -294,7 +294,7 @@
private static final int LOG_NO_OP_PAGE_INDEX = -1;
protected final TaskAnimationManager mTaskAnimationManager;
-
+ protected final RecentsWindowManager mRecentsWindowManager;
// Either RectFSpringAnim (if animating home) or ObjectAnimator (from mCurrentShift) otherwise
private RunningWindowAnim[] mRunningWindowAnim;
// Possible second animation running at the same time as mRunningWindowAnim
@@ -355,12 +355,11 @@
public AbsSwipeUpHandler(Context context, RecentsAnimationDeviceState deviceState,
TaskAnimationManager taskAnimationManager, GestureState gestureState,
long touchTimeMs, boolean continuingLastGesture,
- InputConsumerController inputConsumer) {
+ InputConsumerController inputConsumer, RecentsWindowManager recentsWindowManager) {
super(context, deviceState, gestureState);
mContainerInterface = gestureState.getContainerInterface();
- if (Flags.enableFallbackOverviewInWindow()) {
- RecentsWindowManager.Companion.getInstanceOrNull()
- .registerInitListener(this::onActivityInit);
+ if (recentsWindowManager != null && Flags.enableFallbackOverviewInWindow()) {
+ recentsWindowManager.registerInitListener(this::onActivityInit);
}
mActivityInitListener =
mContainerInterface.createActivityInitListener(this::onActivityInit);
@@ -375,6 +374,7 @@
endLauncherTransitionController();
}, new InputProxyHandlerFactory(mContainerInterface, mGestureState));
mTaskAnimationManager = taskAnimationManager;
+ mRecentsWindowManager = recentsWindowManager;
mTouchTimeMs = touchTimeMs;
mContinuingLastGesture = continuingLastGesture;
diff --git a/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java b/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java
index 44e3ac5..7abcfb8 100644
--- a/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java
+++ b/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java
@@ -64,6 +64,7 @@
import com.android.launcher3.util.DisplayController;
import com.android.quickstep.fallback.FallbackRecentsView;
import com.android.quickstep.fallback.RecentsState;
+import com.android.quickstep.fallback.window.RecentsWindowManager;
import com.android.quickstep.util.ActiveGestureLog;
import com.android.quickstep.util.RectFSpringAnim;
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
@@ -105,7 +106,7 @@
TaskAnimationManager taskAnimationManager, GestureState gestureState, long touchTimeMs,
boolean continuingLastGesture, InputConsumerController inputConsumer) {
super(context, deviceState, taskAnimationManager, gestureState, touchTimeMs,
- continuingLastGesture, inputConsumer);
+ continuingLastGesture, inputConsumer, null);
mRunningOverHome = mGestureState.getRunningTask() != null
&& mGestureState.getRunningTask().isHomeTask();
diff --git a/quickstep/src/com/android/quickstep/FallbackWindowInterface.java b/quickstep/src/com/android/quickstep/FallbackWindowInterface.java
index bea62a8..ea478dd 100644
--- a/quickstep/src/com/android/quickstep/FallbackWindowInterface.java
+++ b/quickstep/src/com/android/quickstep/FallbackWindowInterface.java
@@ -51,10 +51,31 @@
*/
public final class FallbackWindowInterface extends BaseWindowInterface{
- public static final FallbackWindowInterface INSTANCE = new FallbackWindowInterface();
+ private static FallbackWindowInterface INSTANCE;
- private FallbackWindowInterface() {
- super( DEFAULT, BACKGROUND_APP);
+ private final RecentsWindowManager mRecentsWindowManager;
+
+ /**
+ * This is only null before init() or after destroy()
+ */
+ @Nullable
+ public static FallbackWindowInterface getInstance(){
+ return INSTANCE;
+ }
+
+ public static void init(RecentsWindowManager recentsWindowManager) {
+ if (INSTANCE == null) {
+ INSTANCE = new FallbackWindowInterface(recentsWindowManager);
+ }
+ }
+
+ private FallbackWindowInterface(RecentsWindowManager recentsWindowManager) {
+ super(DEFAULT, BACKGROUND_APP);
+ mRecentsWindowManager = recentsWindowManager;
+ }
+
+ public void destroy() {
+ INSTANCE = null;
}
/** 2 */
@@ -100,7 +121,7 @@
@Nullable
@Override
public RecentsWindowManager getCreatedContainer() {
- return RecentsWindowManager.Companion.getInstanceOrNull();
+ return mRecentsWindowManager;
}
@Override
diff --git a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
index d2dcd7b..dacafd4 100644
--- a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
+++ b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
@@ -46,6 +46,7 @@
import com.android.launcher3.views.FloatingIconView;
import com.android.launcher3.views.FloatingView;
import com.android.launcher3.widget.LauncherAppWidgetHostView;
+import com.android.quickstep.fallback.window.RecentsWindowManager;
import com.android.quickstep.util.RectFSpringAnim;
import com.android.quickstep.util.ScalingWorkspaceRevealAnim;
import com.android.quickstep.util.StaggeredWorkspaceAnim;
@@ -68,7 +69,7 @@
TaskAnimationManager taskAnimationManager, GestureState gestureState, long touchTimeMs,
boolean continuingLastGesture, InputConsumerController inputConsumer) {
super(context, deviceState, taskAnimationManager, gestureState, touchTimeMs,
- continuingLastGesture, inputConsumer);
+ continuingLastGesture, inputConsumer, null);
}
diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt b/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt
index 76b5b22..66224ae 100644
--- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt
+++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt
@@ -46,19 +46,18 @@
import com.android.quickstep.OverviewCommandHelper.CommandType.TOGGLE
import com.android.quickstep.util.ActiveGestureLog
import com.android.quickstep.views.RecentsView
-import com.android.quickstep.views.RecentsViewContainer
import com.android.quickstep.views.TaskView
import com.android.systemui.shared.recents.model.ThumbnailData
import com.android.systemui.shared.system.InteractionJankMonitorWrapper
+import java.io.PrintWriter
+import java.util.concurrent.ConcurrentLinkedDeque
+import kotlin.coroutines.resume
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.ensureActive
import kotlinx.coroutines.launch
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlinx.coroutines.withTimeout
-import java.io.PrintWriter
-import java.util.concurrent.ConcurrentLinkedDeque
-import kotlin.coroutines.resume
/** Helper class to handle various atomic commands for switching between Overview. */
class OverviewCommandHelper
diff --git a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java
index bdab0e0..a69b831 100644
--- a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java
+++ b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java
@@ -180,7 +180,7 @@
// The default home app is a different launcher. Use the fallback Overview instead.
if (Flags.enableFallbackOverviewInWindow()) {
- mContainerInterface = FallbackWindowInterface.INSTANCE;
+ mContainerInterface = FallbackWindowInterface.getInstance();
} else {
mContainerInterface = FallbackActivityInterface.INSTANCE;
}
diff --git a/quickstep/src/com/android/quickstep/TaskAnimationManager.java b/quickstep/src/com/android/quickstep/TaskAnimationManager.java
index 3b93efb..4beb99a 100644
--- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java
+++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java
@@ -500,8 +500,8 @@
mLastGestureState = null;
mLastAppearedTaskTargets = null;
- if (Flags.enableFallbackOverviewInWindow()) {
- RecentsWindowManager.Companion.getInstanceOrNull().cleanup();
+ if(Flags.enableFallbackOverviewInWindow()) {
+ mRecentsWindowsManager.cleanup();
}
}
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index 8218105..c5791fa 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java
@@ -673,8 +673,8 @@
mDesktopVisibilityController = new DesktopVisibilityController(this);
mTaskbarManager = new TaskbarManager(
this, mAllAppsActionManager, mNavCallbacks, mDesktopVisibilityController);
- if (Flags.enableFallbackOverviewInWindow()) {
- mRecentsWindowManager = RecentsWindowManager.Companion.getOrCreateInstance(this);
+ if(Flags.enableFallbackOverviewInWindow()) {
+ mRecentsWindowManager = new RecentsWindowManager(this);
}
mInputConsumer = InputConsumerController.getRecentsAnimationInputConsumer();
@@ -827,6 +827,10 @@
mTrackpadsConnected.clear();
mTaskbarManager.destroy();
+
+ if (mRecentsWindowManager != null) {
+ mRecentsWindowManager.destroy();
+ }
mDesktopVisibilityController.onDestroy();
sConnected = false;
@@ -1701,6 +1705,6 @@
GestureState gestureState, long touchTimeMs) {
return new RecentsWindowSwipeHandler(this, mDeviceState, mTaskAnimationManager,
gestureState, touchTimeMs, mTaskAnimationManager.isRecentsAnimationRunning(),
- mInputConsumer);
+ mInputConsumer, mRecentsWindowManager);
}
}
diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
index e04e38f..7f0d665 100644
--- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
+++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
@@ -80,7 +80,7 @@
private static BaseContainerInterface<RecentsState, ?> getContainerInterface() {
return Flags.enableFallbackOverviewInWindow()
- ? FallbackWindowInterface.INSTANCE
+ ? FallbackWindowInterface.getInstance()
: FallbackActivityInterface.INSTANCE;
}
diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowContext.kt b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowContext.kt
index df5a8f0..52a7682 100644
--- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowContext.kt
+++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowContext.kt
@@ -56,7 +56,7 @@
override fun getDeviceProfile(): DeviceProfile {
if (deviceProfile == null) {
- deviceProfile = InvariantDeviceProfile.INSTANCE[this].getDeviceProfile(this)
+ deviceProfile = InvariantDeviceProfile.INSTANCE[this].getDeviceProfile(this)
.copy(this)
}
return deviceProfile!!
diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
index 7f59d1c..dafa856 100644
--- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
+++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
@@ -17,7 +17,6 @@
package com.android.quickstep.fallback.window
import android.animation.AnimatorSet
-import android.annotation.SuppressLint
import android.app.ActivityOptions
import android.content.ComponentName
import android.content.Context
@@ -49,11 +48,11 @@
import com.android.launcher3.util.SystemUiController
import com.android.launcher3.views.BaseDragLayer
import com.android.launcher3.views.ScrimView
+import com.android.quickstep.FallbackWindowInterface
import com.android.quickstep.OverviewComponentObserver
import com.android.quickstep.RecentsModel
import com.android.quickstep.RemoteAnimationTargets
import com.android.quickstep.SystemUiProxy
-import com.android.quickstep.TouchInteractionService
import com.android.quickstep.fallback.FallbackRecentsStateController
import com.android.quickstep.fallback.FallbackRecentsView
import com.android.quickstep.fallback.RecentsDragLayer
@@ -77,27 +76,13 @@
* where needed. This allows us to run RecentsView in a window where needed.
* todo: b/365776320, b/365777482
*/
-class RecentsWindowManager private constructor(context: Context) :
+class RecentsWindowManager(context: Context) :
RecentsWindowContext(context), RecentsViewContainer, StatefulContainer<RecentsState> {
- @SuppressLint("StaticFieldLeak")
companion object {
private const val HOME_APPEAR_DURATION: Long = 250
private const val TAG = "RecentsWindowManager"
private const val DEBUG = false
-
- @Volatile private var INSTANCE: RecentsWindowManager? = null
-
- fun getInstanceOrNull(): RecentsWindowManager? {
- return INSTANCE
- }
-
- fun getOrCreateInstance(context: Context): RecentsWindowManager {
- return INSTANCE
- ?: synchronized(this) {
- INSTANCE ?: RecentsWindowManager(context).also { INSTANCE = it }
- }
- }
}
protected var recentsView: FallbackRecentsView<RecentsWindowManager>? = null
@@ -125,6 +110,15 @@
arrayOf(RunnableList(), RunnableList(), RunnableList(), RunnableList())
private var onInitListener: Predicate<Boolean>? = null
+ init {
+ FallbackWindowInterface.init(this)
+ }
+
+ override fun destroy() {
+ super.destroy()
+ FallbackWindowInterface.getInstance()?.destroy()
+ }
+
override fun startHome() {
val recentsView: RecentsView<*, *> = getOverviewPanel()
recentsView.switchToScreenshot {
diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java
index d222feb..34b3d74 100644
--- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java
+++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java
@@ -108,9 +108,10 @@
public RecentsWindowSwipeHandler(Context context, RecentsAnimationDeviceState deviceState,
TaskAnimationManager taskAnimationManager, GestureState gestureState, long touchTimeMs,
- boolean continuingLastGesture, InputConsumerController inputConsumer) {
+ boolean continuingLastGesture, InputConsumerController inputConsumer,
+ RecentsWindowManager recentsWindowManager) {
super(context, deviceState, taskAnimationManager, gestureState, touchTimeMs,
- continuingLastGesture, inputConsumer);
+ continuingLastGesture, inputConsumer, recentsWindowManager);
mRunningOverHome = mGestureState.getRunningTask() != null
&& mGestureState.getRunningTask().isHomeTask();
@@ -188,7 +189,7 @@
// the PiP task appearing.
recentsCallback = () -> {
callback.run();
- RecentsWindowManager.Companion.getInstanceOrNull().startHome();
+ mRecentsWindowManager.startHome();
};
} else {
recentsCallback = callback;
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java
index fc37b59..02426b5 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java
@@ -41,6 +41,7 @@
import androidx.test.platform.app.InstrumentationRegistry;
import com.android.launcher3.DeviceProfile;
+import com.android.launcher3.Flags;
import com.android.launcher3.LauncherRootView;
import com.android.launcher3.dragndrop.DragLayer;
import com.android.launcher3.statemanager.BaseState;
@@ -73,7 +74,7 @@
protected final Context mContext =
InstrumentationRegistry.getInstrumentation().getTargetContext();
protected final RecentsWindowManager mRecentsWindowManager =
- RecentsWindowManager.Companion.getOrCreateInstance(mContext);
+ Flags.enableFallbackOverviewInWindow() ? new RecentsWindowManager(mContext) : null;
protected final TaskAnimationManager mTaskAnimationManager =
new TaskAnimationManager(mContext, mRecentsWindowManager);
protected final RecentsAnimationDeviceState mRecentsAnimationDeviceState =