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
This commit is contained in:
@@ -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) {
|
||||
@@ -3712,6 +3722,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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user