Merge "Add feature flag for enable_separate_external_display_tasks" into main
diff --git a/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt b/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
index 2b364f9..358537c 100644
--- a/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
+++ b/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
@@ -252,6 +252,7 @@
fun initialize(view: View): RecentsDependencies = initialize(view.context)
fun initialize(context: Context): RecentsDependencies {
+ Log.d(TAG, "initializing")
synchronized(this) {
activeRecentsCount++
instance = RecentsDependencies(context.applicationContext)
@@ -286,10 +287,12 @@
activeRecentsCount--
if (activeRecentsCount == 0) {
instance.scopes.clear()
+ Log.d(TAG, "destroyed", Exception("Printing stack trace"))
} else {
- instance.log(
+ Log.d(
+ TAG,
"RecentsDependencies was not destroyed. " +
- "There is still an active RecentsView instance."
+ "There is still an active RecentsView instance.",
)
}
}
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index e037045..b764e42 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -1255,6 +1255,13 @@
public void destroy() {
Log.d(TAG, "destroy");
if (enableRefactorTaskThumbnail()) {
+ try {
+ mTaskViewPool.killOngoingInitializations();
+ mGroupedTaskViewPool.killOngoingInitializations();
+ mDesktopTaskViewPool.killOngoingInitializations();
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Ongoing initializations could not be killed", e);
+ }
mHelper.onDestroy();
RecentsDependencies.destroy();
}
diff --git a/src/com/android/launcher3/util/ViewPool.java b/src/com/android/launcher3/util/ViewPool.java
index 2fa8bf4..1627057 100644
--- a/src/com/android/launcher3/util/ViewPool.java
+++ b/src/com/android/launcher3/util/ViewPool.java
@@ -17,6 +17,7 @@
import android.content.Context;
import android.os.Handler;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -33,6 +34,7 @@
* During initialization, views are inflated on the background thread.
*/
public class ViewPool<T extends View & Reusable> {
+ private static final String TAG = ViewPool.class.getSimpleName();
private final Object[] mPool;
@@ -42,6 +44,9 @@
private int mCurrentSize = 0;
+ @Nullable
+ private Thread mViewPoolInitThread;
+
public ViewPool(Context context, @Nullable ViewGroup parent,
int layoutId, int maxSize, int initialSize) {
this(LayoutInflater.from(context).cloneInContext(context),
@@ -72,12 +77,15 @@
// Inflate views on a non looper thread. This allows us to catch errors like calling
// "new Handler()" in constructor easily.
- new Thread(() -> {
+ mViewPoolInitThread = new Thread(() -> {
for (int i = 0; i < initialSize; i++) {
T view = inflateNewView(inflater);
handler.post(() -> addToPool(view));
}
- }, "ViewPool-init").start();
+ Log.d(TAG, "initPool complete");
+ mViewPoolInitThread = null;
+ }, "ViewPool-init");
+ mViewPoolInitThread.start();
}
@UiThread
@@ -114,6 +122,12 @@
return (T) inflater.inflate(mLayoutId, mParent, false);
}
+ public void killOngoingInitializations() throws InterruptedException {
+ if (mViewPoolInitThread != null) {
+ mViewPoolInitThread.join();
+ }
+ }
+
/**
* Interface to indicate that a view is reusable
*/