Add optional flag to clear old preloaded workspace

Adds an optional extra to the PRELOAD_WORKSPACE broadcast receiver, that
when set to true will clear the database of any previously loaded workspace
if needed.

All new code is guarded by this extra and will only be triggered by the EDU
NfcProvision adding this new flag.

This will allow EDU provisioning flow to override any previous preloads set
by gservices.

Bug: 13474473
Change-Id: I973c613c4ca024de18ba57a903f4a5d78cbdfc98
diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java
index 1d562be..260410d 100644
--- a/src/com/android/launcher2/LauncherModel.java
+++ b/src/com/android/launcher2/LauncherModel.java
@@ -1260,7 +1260,7 @@
             final boolean isSafeMode = manager.isSafeMode();
 
             // Make sure the default workspace is loaded, if needed
-            mApp.getLauncherProvider().loadDefaultFavoritesIfNecessary(0);
+            mApp.getLauncherProvider().loadDefaultFavoritesIfNecessary(0, false);
 
             synchronized (sBgLock) {
                 sBgWorkspaceItems.clear();
diff --git a/src/com/android/launcher2/LauncherProvider.java b/src/com/android/launcher2/LauncherProvider.java
index 8097ac9..2a48573 100644
--- a/src/com/android/launcher2/LauncherProvider.java
+++ b/src/com/android/launcher2/LauncherProvider.java
@@ -55,6 +55,7 @@
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
+import java.io.File;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
@@ -208,10 +209,13 @@
     /**
      * @param workspaceResId that can be 0 to use default or non-zero for specific resource
      */
-    synchronized public void loadDefaultFavoritesIfNecessary(int origWorkspaceResId) {
+    synchronized public void loadDefaultFavoritesIfNecessary(int origWorkspaceResId,
+            boolean overridePrevious) {
         String spKey = LauncherApplication.getSharedPreferencesKey();
         SharedPreferences sp = getContext().getSharedPreferences(spKey, Context.MODE_PRIVATE);
-        if (sp.getBoolean(DB_CREATED_BUT_DEFAULT_WORKSPACE_NOT_LOADED, false)) {
+        boolean dbCreatedNoWorkspace =
+                sp.getBoolean(DB_CREATED_BUT_DEFAULT_WORKSPACE_NOT_LOADED, false);
+        if (dbCreatedNoWorkspace || overridePrevious) {
             int workspaceResId = origWorkspaceResId;
 
             // Use default workspace resource if none provided
@@ -225,11 +229,27 @@
             if (origWorkspaceResId != 0) {
                 editor.putInt(DEFAULT_WORKSPACE_RESOURCE_ID, origWorkspaceResId);
             }
+            if (!dbCreatedNoWorkspace && overridePrevious) {
+                if (LOGD) Log.d(TAG, "Clearing old launcher database");
+                // Workspace has already been loaded, clear the database.
+                deleteDatabase();
+            }
             mOpenHelper.loadFavorites(mOpenHelper.getWritableDatabase(), workspaceResId);
             editor.commit();
         }
     }
 
+    public void deleteDatabase() {
+        // Are you sure? (y/n)
+        final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        final File dbFile = new File(db.getPath());
+        mOpenHelper.close();
+        if (dbFile.exists()) {
+            SQLiteDatabase.deleteDatabase(dbFile);
+        }
+        mOpenHelper = new DatabaseHelper(getContext());
+    }
+
     private static class DatabaseHelper extends SQLiteOpenHelper {
         private static final String TAG_FAVORITES = "favorites";
         private static final String TAG_FAVORITE = "favorite";
diff --git a/src/com/android/launcher2/PreloadReceiver.java b/src/com/android/launcher2/PreloadReceiver.java
index 08350b6..c28c55d 100644
--- a/src/com/android/launcher2/PreloadReceiver.java
+++ b/src/com/android/launcher2/PreloadReceiver.java
@@ -28,6 +28,8 @@
 
     public static final String EXTRA_WORKSPACE_NAME =
             "com.android.launcher.action.EXTRA_WORKSPACE_NAME";
+    public static final String EXTRA_OVERRIDE_PREVIOUS =
+            "com.android.launcher.action.EXTRA_OVERRIDE_PREVIOUS";
 
     @Override
     public void onReceive(Context context, Intent intent) {
@@ -37,13 +39,16 @@
             String name = intent.getStringExtra(EXTRA_WORKSPACE_NAME);
             final int workspaceResId = !TextUtils.isEmpty(name)
                     ? context.getResources().getIdentifier(name, "xml", "com.android.launcher") : 0;
+
+            final boolean overridePrevious =
+                    intent.getBooleanExtra(EXTRA_OVERRIDE_PREVIOUS, false);
             if (LOGD) {
                 Log.d(TAG, "workspace name: " + name + " id: " + workspaceResId);
             }
             new Thread(new Runnable() {
                 @Override
                 public void run() {
-                    provider.loadDefaultFavoritesIfNecessary(workspaceResId);
+                    provider.loadDefaultFavoritesIfNecessary(workspaceResId, overridePrevious);
                 }
             }).start();
         }