Merge remote-tracking branch 'aosp/android12L-release' into 12.1-dev
This commit is contained in:
@@ -62,6 +62,7 @@ import com.android.launcher3.pm.InstallSessionTracker;
|
||||
import com.android.launcher3.pm.PackageInstallInfo;
|
||||
import com.android.launcher3.pm.UserCache;
|
||||
import com.android.launcher3.shortcuts.ShortcutRequest;
|
||||
import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.util.IntSet;
|
||||
import com.android.launcher3.util.ItemInfoMatcher;
|
||||
import com.android.launcher3.util.PackageUserKey;
|
||||
@@ -74,6 +75,7 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CancellationException;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
@@ -97,9 +99,10 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
|
||||
// our monitoring of the package manager provides all updates and we never
|
||||
// need to do a requery. This is only ever touched from the loader thread.
|
||||
private boolean mModelLoaded;
|
||||
private boolean mModelDestroyed = false;
|
||||
public boolean isModelLoaded() {
|
||||
synchronized (mLock) {
|
||||
return mModelLoaded && mLoaderTask == null;
|
||||
return mModelLoaded && mLoaderTask == null && !mModelDestroyed;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,10 +129,12 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
|
||||
}
|
||||
};
|
||||
|
||||
LauncherModel(Context context, LauncherAppState app, IconCache iconCache, AppFilter appFilter) {
|
||||
LauncherModel(Context context, LauncherAppState app, IconCache iconCache, AppFilter appFilter,
|
||||
boolean isPrimaryInstance) {
|
||||
mApp = app;
|
||||
mBgAllAppsList = new AllAppsList(iconCache, appFilter);
|
||||
mModelDelegate = ModelDelegate.newInstance(context, app, mBgAllAppsList, mBgDataModel);
|
||||
mModelDelegate = ModelDelegate.newInstance(context, app, mBgAllAppsList, mBgDataModel,
|
||||
isPrimaryInstance);
|
||||
}
|
||||
|
||||
public ModelDelegate getModelDelegate() {
|
||||
@@ -146,9 +151,10 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
|
||||
enqueueModelUpdateTask(new AddWorkspaceItemsTask(itemList));
|
||||
}
|
||||
|
||||
public ModelWriter getWriter(boolean hasVerticalHotseat, boolean verifyChanges) {
|
||||
public ModelWriter getWriter(boolean hasVerticalHotseat, boolean verifyChanges,
|
||||
@Nullable Callbacks owner) {
|
||||
return new ModelWriter(mApp.getContext(), this, mBgDataModel,
|
||||
hasVerticalHotseat, verifyChanges);
|
||||
hasVerticalHotseat, verifyChanges, owner);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -245,6 +251,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
|
||||
* Called when the model is destroyed
|
||||
*/
|
||||
public void destroy() {
|
||||
mModelDestroyed = true;
|
||||
MODEL_EXECUTOR.execute(mModelDelegate::destroy);
|
||||
}
|
||||
|
||||
@@ -331,7 +338,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
|
||||
public boolean addCallbacksAndLoad(Callbacks callbacks) {
|
||||
synchronized (mLock) {
|
||||
addCallbacks(callbacks);
|
||||
return startLoader();
|
||||
return startLoader(new Callbacks[] { callbacks });
|
||||
|
||||
}
|
||||
}
|
||||
@@ -342,6 +349,12 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
|
||||
public void addCallbacks(Callbacks callbacks) {
|
||||
Preconditions.assertUIThread();
|
||||
synchronized (mCallbacksList) {
|
||||
if (TestProtocol.sDebugTracing) {
|
||||
Log.d(TestProtocol.NULL_INT_SET, "addCallbacks pointer: "
|
||||
+ callbacks
|
||||
+ ", name: "
|
||||
+ callbacks.getClass().getName(), new Exception());
|
||||
}
|
||||
mCallbacksList.add(callbacks);
|
||||
}
|
||||
}
|
||||
@@ -351,26 +364,32 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
|
||||
* @return true if the page could be bound synchronously.
|
||||
*/
|
||||
public boolean startLoader() {
|
||||
return startLoader(new Callbacks[0]);
|
||||
}
|
||||
|
||||
private boolean startLoader(Callbacks[] newCallbacks) {
|
||||
// Enable queue before starting loader. It will get disabled in Launcher#finishBindingItems
|
||||
ItemInstallQueue.INSTANCE.get(mApp.getContext())
|
||||
.pauseModelPush(ItemInstallQueue.FLAG_LOADER_RUNNING);
|
||||
synchronized (mLock) {
|
||||
// Don't bother to start the thread if we know it's not going to do anything
|
||||
final Callbacks[] callbacksList = getCallbacks();
|
||||
// If there is already one running, tell it to stop.
|
||||
boolean wasRunning = stopLoader();
|
||||
boolean bindDirectly = mModelLoaded && !mIsLoaderTaskRunning;
|
||||
boolean bindAllCallbacks = wasRunning || !bindDirectly || newCallbacks.length == 0;
|
||||
final Callbacks[] callbacksList = bindAllCallbacks ? getCallbacks() : newCallbacks;
|
||||
|
||||
if (callbacksList.length > 0) {
|
||||
// Clear any pending bind-runnables from the synchronized load process.
|
||||
for (Callbacks cb : callbacksList) {
|
||||
MAIN_EXECUTOR.execute(cb::clearPendingBinds);
|
||||
}
|
||||
|
||||
// If there is already one running, tell it to stop.
|
||||
stopLoader();
|
||||
LoaderResults loaderResults = new LoaderResults(
|
||||
mApp, mBgDataModel, mBgAllAppsList, callbacksList);
|
||||
if (mModelLoaded && !mIsLoaderTaskRunning) {
|
||||
if (bindDirectly) {
|
||||
// Divide the set of loaded items into those that we are binding synchronously,
|
||||
// and everything else that is to be bound normally (asynchronously).
|
||||
loaderResults.bindWorkspace();
|
||||
loaderResults.bindWorkspace(bindAllCallbacks);
|
||||
// For now, continue posting the binding of AllApps as there are other
|
||||
// issues that arise from that.
|
||||
loaderResults.bindAllApps();
|
||||
@@ -378,7 +397,13 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
|
||||
loaderResults.bindWidgets();
|
||||
return true;
|
||||
} else {
|
||||
startLoaderForResults(loaderResults);
|
||||
stopLoader();
|
||||
mLoaderTask = new LoaderTask(
|
||||
mApp, mBgAllAppsList, mBgDataModel, mModelDelegate, loaderResults);
|
||||
|
||||
// Always post the loader task, instead of running directly
|
||||
// (even on same thread) so that we exit any nested synchronized blocks
|
||||
MODEL_EXECUTOR.post(mLoaderTask);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -389,7 +414,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
|
||||
* If there is already a loader task running, tell it to stop.
|
||||
* @return true if an existing loader was stopped.
|
||||
*/
|
||||
public boolean stopLoader() {
|
||||
private boolean stopLoader() {
|
||||
synchronized (mLock) {
|
||||
LoaderTask oldTask = mLoaderTask;
|
||||
mLoaderTask = null;
|
||||
@@ -401,25 +426,17 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
|
||||
}
|
||||
}
|
||||
|
||||
public void startLoaderForResults(LoaderResults results) {
|
||||
/**
|
||||
* Loads the model if not loaded
|
||||
* @param callback called with the data model upon successful load or null on model thread.
|
||||
*/
|
||||
public void loadAsync(Consumer<BgDataModel> callback) {
|
||||
synchronized (mLock) {
|
||||
stopLoader();
|
||||
mLoaderTask = new LoaderTask(
|
||||
mApp, mBgAllAppsList, mBgDataModel, mModelDelegate, results);
|
||||
|
||||
// Always post the loader task, instead of running directly (even on same thread) so
|
||||
// that we exit any nested synchronized blocks
|
||||
MODEL_EXECUTOR.post(mLoaderTask);
|
||||
}
|
||||
}
|
||||
|
||||
public void startLoaderForResultsIfNotLoaded(LoaderResults results) {
|
||||
synchronized (mLock) {
|
||||
if (!isModelLoaded()) {
|
||||
Log.d(TAG, "Workspace not loaded, loading now");
|
||||
startLoaderForResults(results);
|
||||
if (!mModelLoaded && !mIsLoaderTaskRunning) {
|
||||
startLoader();
|
||||
}
|
||||
}
|
||||
MODEL_EXECUTOR.post(() -> callback.accept(isModelLoaded() ? mBgDataModel : null));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -553,6 +570,9 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
|
||||
}
|
||||
|
||||
public void enqueueModelUpdateTask(ModelUpdateTask task) {
|
||||
if (mModelDestroyed) {
|
||||
return;
|
||||
}
|
||||
task.init(mApp, this, mBgDataModel, mBgAllAppsList, MAIN_EXECUTOR);
|
||||
MODEL_EXECUTOR.execute(task);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user