Merge "Guard against null default wallpaper" into ub-now-lunchbox
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 36fa4c1..be3a28b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -25,7 +25,7 @@
     <permission
         android:name="com.android.launcher3.permission.PRELOAD_WORKSPACE"
         android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
-        android:protectionLevel="system|signature" />
+        android:protectionLevel="signatureOrSystem" />
     <permission
         android:name="com.android.launcher.permission.INSTALL_SHORTCUT"
         android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
@@ -47,7 +47,7 @@
     <permission
         android:name="com.android.launcher3.permission.WRITE_SETTINGS"
         android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
-        android:protectionLevel="normal"
+        android:protectionLevel="signatureOrSystem"
         android:label="@string/permlab_write_settings"
         android:description="@string/permdesc_write_settings"/>
 
diff --git a/WallpaperPicker/src/com/android/launcher3/WallpaperPickerActivity.java b/WallpaperPicker/src/com/android/launcher3/WallpaperPickerActivity.java
index 75dfe09..ab25fa9 100644
--- a/WallpaperPicker/src/com/android/launcher3/WallpaperPickerActivity.java
+++ b/WallpaperPicker/src/com/android/launcher3/WallpaperPickerActivity.java
@@ -261,6 +261,7 @@
         public void onSave(WallpaperPickerActivity a) {
             try {
                 WallpaperManager.getInstance(a).clear();
+                a.setResult(RESULT_OK);
             } catch (IOException e) {
                 Log.w("Setting wallpaper to default threw exception", e);
             }
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index c87f9e2..1060a94 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -2887,7 +2887,7 @@
                 mWorkspaceBackgroundDrawable : null);
     }
 
-    protected void changeWallpaperVisiblity(boolean visible) {
+    void updateWallpaperVisibility(boolean visible) {
         int wpflags = visible ? WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER : 0;
         int curflags = getWindow().getAttributes().flags
                 & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
diff --git a/src/com/android/launcher3/LauncherBackupHelper.java b/src/com/android/launcher3/LauncherBackupHelper.java
index c706cf1..62e6f31 100644
--- a/src/com/android/launcher3/LauncherBackupHelper.java
+++ b/src/com/android/launcher3/LauncherBackupHelper.java
@@ -50,9 +50,7 @@
 import android.util.Log;
 
 import java.io.ByteArrayOutputStream;
-import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.net.URISyntaxException;
@@ -188,16 +186,20 @@
         Log.v(TAG, "lastBackupTime = " + lastBackupTime);
 
         ArrayList<Key> keys = new ArrayList<Key>();
-        try {
-            backupFavorites(in, data, out, keys);
-            backupScreens(in, data, out, keys);
-            backupIcons(in, data, out, keys);
-            backupWidgets(in, data, out, keys);
-        } catch (IOException e) {
-            Log.e(TAG, "launcher backup has failed", e);
+        if (launcherIsReady()) {
+            try {
+                backupFavorites(in, data, out, keys);
+                backupScreens(in, data, out, keys);
+                backupIcons(in, data, out, keys);
+                backupWidgets(in, data, out, keys);
+            } catch (IOException e) {
+                Log.e(TAG, "launcher backup has failed", e);
+            }
+            out.key = keys.toArray(new BackupProtos.Key[keys.size()]);
+        } else {
+            out = in;
         }
 
-        out.key = keys.toArray(new BackupProtos.Key[keys.size()]);
         writeJournal(newState, out);
         Log.v(TAG, "onBackup: wrote " + out.bytes + "b in " + out.rows + " rows.");
     }
@@ -1129,6 +1131,26 @@
         return mIconCache != null;
     }
 
+
+   // check if the launcher is in a state to support backup
+    private boolean launcherIsReady() {
+        ContentResolver cr = mContext.getContentResolver();
+        Cursor cursor = cr.query(Favorites.CONTENT_URI, FAVORITE_PROJECTION, null, null, null);
+        if (cursor == null) {
+            // launcher data has been wiped, do nothing
+            return false;
+        }
+        cursor.close();
+
+        if (!initializeIconCache()) {
+            // launcher services are unavailable, try again later
+            dataChanged();
+            return false;
+        }
+
+        return true;
+    }
+
     private class KeyParsingException extends Throwable {
         private KeyParsingException(Throwable cause) {
             super(cause);