summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTony <twickham@google.com>2017-07-31 23:29:42 -0700
committerTony Wickham <twickham@google.com>2017-08-04 11:52:42 -0700
commit2917a8bf2b83c0d17400b1475f01a9a8d9137f62 (patch)
tree997ee0bcefeac147867f0e8612594ea739ed3048
parent00abdaca619d3a91aad9f9cc2c192650705c6b98 (diff)
downloadandroid_packages_apps_Trebuchet-2917a8bf2b83c0d17400b1475f01a9a8d9137f62.tar.gz
android_packages_apps_Trebuchet-2917a8bf2b83c0d17400b1475f01a9a8d9137f62.tar.bz2
android_packages_apps_Trebuchet-2917a8bf2b83c0d17400b1475f01a9a8d9137f62.zip
Defer some work until after workspace fade-in
Defer: - Setting all apps - Setting widgets Also set the launcher-loader thread to THREAD_PRIORITY_BACKGROUND for the duration of the animation. Bug: 37965432 Change-Id: I8364940805b84aecb8353a473ab4d575c27bfec4
-rw-r--r--src/com/android/launcher3/Launcher.java24
-rw-r--r--src/com/android/launcher3/LauncherModel.java4
-rw-r--r--src/com/android/launcher3/util/ViewOnDrawExecutor.java14
3 files changed, 42 insertions, 0 deletions
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 7c258616f..615ec4716 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -144,6 +144,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import java.util.concurrent.Executor;
/**
* Default launcher application.
@@ -1855,6 +1856,8 @@ public class Launcher extends BaseActivity
LauncherAnimUtils.onDestroyActivity();
+ clearPendingBinds();
+
if (mLauncherCallbacks != null) {
mLauncherCallbacks.onDestroy();
}
@@ -3705,6 +3708,13 @@ public class Launcher extends BaseActivity
}
if (mAppsView != null) {
+ Executor pendingExecutor = getPendingExecutor();
+ if (pendingExecutor != null && mState != State.APPS) {
+ // Wait until the fade in animation has finished before setting all apps list.
+ mTmpAppsList = apps;
+ pendingExecutor.execute(mBindAllApplicationsRunnable);
+ return;
+ }
mAppsView.setApps(apps);
}
if (mLauncherCallbacks != null) {
@@ -3713,6 +3723,14 @@ public class Launcher extends BaseActivity
}
/**
+ * Returns an Executor that will run after the launcher is first drawn (including after the
+ * initial fade in animation). Returns null if the first draw has already occurred.
+ */
+ public @Nullable Executor getPendingExecutor() {
+ return mPendingExecutor != null && mPendingExecutor.canQueue() ? mPendingExecutor : null;
+ }
+
+ /**
* Copies LauncherModel's map of activities to shortcut ids to Launcher's. This is necessary
* because LauncherModel's map is updated in the background, while Launcher runs on the UI.
*/
@@ -3904,6 +3922,12 @@ public class Launcher extends BaseActivity
}
if (mWidgetsView != null && allWidgets != null) {
+ Executor pendingExecutor = getPendingExecutor();
+ if (pendingExecutor != null && mState != State.WIDGETS) {
+ mAllWidgets = allWidgets;
+ pendingExecutor.execute(mBindAllWidgetsRunnable);
+ return;
+ }
mWidgetsView.setWidgets(allWidgets);
mAllWidgets = null;
}
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index f1638fda2..100774866 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -689,4 +689,8 @@ public class LauncherModel extends BroadcastReceiver
public static Looper getWorkerLooper() {
return sWorkerThread.getLooper();
}
+
+ public static void setWorkerPriority(final int priority) {
+ Process.setThreadPriority(sWorkerThread.getThreadId(), priority);
+ }
}
diff --git a/src/com/android/launcher3/util/ViewOnDrawExecutor.java b/src/com/android/launcher3/util/ViewOnDrawExecutor.java
index 4cb6ca831..e5c1dd1b4 100644
--- a/src/com/android/launcher3/util/ViewOnDrawExecutor.java
+++ b/src/com/android/launcher3/util/ViewOnDrawExecutor.java
@@ -16,11 +16,13 @@
package com.android.launcher3.util;
+import android.os.Process;
import android.view.View;
import android.view.View.OnAttachStateChangeListener;
import android.view.ViewTreeObserver.OnDrawListener;
import com.android.launcher3.Launcher;
+import com.android.launcher3.LauncherModel;
import java.util.ArrayList;
import java.util.concurrent.Executor;
@@ -37,6 +39,7 @@ public class ViewOnDrawExecutor implements Executor, OnDrawListener, Runnable,
private Launcher mLauncher;
private View mAttachedView;
private boolean mCompleted;
+ private boolean mIsExecuting;
private boolean mLoadAnimationCompleted;
private boolean mFirstDrawCompleted;
@@ -62,6 +65,7 @@ public class ViewOnDrawExecutor implements Executor, OnDrawListener, Runnable,
@Override
public void execute(Runnable command) {
mTasks.add(command);
+ LauncherModel.setWorkerPriority(Process.THREAD_PRIORITY_BACKGROUND);
}
@Override
@@ -78,6 +82,13 @@ public class ViewOnDrawExecutor implements Executor, OnDrawListener, Runnable,
mAttachedView.post(this);
}
+ /**
+ * Returns whether the executor is still queuing tasks and hasn't yet executed them.
+ */
+ public boolean canQueue() {
+ return !mIsExecuting && !mCompleted;
+ }
+
public void onLoadAnimationCompleted() {
mLoadAnimationCompleted = true;
if (mAttachedView != null) {
@@ -89,6 +100,7 @@ public class ViewOnDrawExecutor implements Executor, OnDrawListener, Runnable,
public void run() {
// Post the pending tasks after both onDraw and onLoadAnimationCompleted have been called.
if (mLoadAnimationCompleted && mFirstDrawCompleted && !mCompleted) {
+ mIsExecuting = true;
for (final Runnable r : mTasks) {
mExecutor.execute(r);
}
@@ -99,6 +111,7 @@ public class ViewOnDrawExecutor implements Executor, OnDrawListener, Runnable,
public void markCompleted() {
mTasks.clear();
mCompleted = true;
+ mIsExecuting = false;
if (mAttachedView != null) {
mAttachedView.getViewTreeObserver().removeOnDrawListener(this);
mAttachedView.removeOnAttachStateChangeListener(this);
@@ -106,5 +119,6 @@ public class ViewOnDrawExecutor implements Executor, OnDrawListener, Runnable,
if (mLauncher != null) {
mLauncher.clearPendingExecutor(this);
}
+ LauncherModel.setWorkerPriority(Process.THREAD_PRIORITY_DEFAULT);
}
}