Synchronizing loader preload to avoid launcher getting stuck in loading state,
which could be caused by the following sequence of events

  1) Starts preload => execution moved to background thread
     a) check if loader is running
     ... execution moved to ui thread

  2) Launcher starts
  3) Cancels any running loader and starts a new loader
     .... Execution on background thread
    b) Cancels any running loader and starts a new loader

Synchronizing (3), and [a, b] under same lock would avoid this case
Bug: 73399920

Change-Id: I6b01f797fd6f4a2e5b3c078bb374ad40fcc311c8
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index 929606e..a4d188f 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -493,6 +493,15 @@
         }
     }
 
+    public void startLoaderForResultsIfNotLoaded(LoaderResults results) {
+        synchronized (mLock) {
+            if (!isModelLoaded()) {
+                Log.d(TAG, "Workspace not loaded, loading now");
+                startLoaderForResults(results);
+            }
+        }
+    }
+
     /**
      * Loads the workspace screen ids in an ordered list.
      */
diff --git a/src/com/android/launcher3/model/ModelPreload.java b/src/com/android/launcher3/model/ModelPreload.java
index 6f33bed..f186e95 100644
--- a/src/com/android/launcher3/model/ModelPreload.java
+++ b/src/com/android/launcher3/model/ModelPreload.java
@@ -49,11 +49,8 @@
 
     @Override
     public final void run() {
-        if (!mModel.isModelLoaded()) {
-            Log.d(TAG, "Workspace not loaded, loading now");
-            mModel.startLoaderForResults(
-                    new LoaderResults(mApp, mBgDataModel, mAllAppsList, 0, null));
-        }
+        mModel.startLoaderForResultsIfNotLoaded(
+                new LoaderResults(mApp, mBgDataModel, mAllAppsList, 0, null));
         Log.d(TAG, "Preload completed : " + mModel.isModelLoaded());
         onComplete(mModel.isModelLoaded());
     }