Merge "Avoiding writing the Metadata in the backup if nothing was changed in the backup" into ub-launcher3-almonte
automerge: 2d26480

* commit '2d264802754e78a98ab1a52c39aa4ceef75b32ae':
  Avoiding writing the Metadata in the backup if nothing was changed in the backup
diff --git a/src/com/android/launcher3/LauncherBackupAgentHelper.java b/src/com/android/launcher3/LauncherBackupAgentHelper.java
index 3d7d3f2..ddfd70d 100644
--- a/src/com/android/launcher3/LauncherBackupAgentHelper.java
+++ b/src/com/android/launcher3/LauncherBackupAgentHelper.java
@@ -32,7 +32,7 @@
 
     private static final String LAUNCHER_DATA_PREFIX = "L";
 
-    static final boolean VERBOSE = true;
+    static final boolean VERBOSE = false;
     static final boolean DEBUG = false;
 
     private static BackupManager sBackupManager;
diff --git a/src/com/android/launcher3/LauncherBackupHelper.java b/src/com/android/launcher3/LauncherBackupHelper.java
index 4faa8ac..32bea5b 100644
--- a/src/com/android/launcher3/LauncherBackupHelper.java
+++ b/src/com/android/launcher3/LauncherBackupHelper.java
@@ -57,6 +57,7 @@
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.zip.CRC32;
@@ -140,9 +141,9 @@
 
     private IconCache mIconCache;
     private BackupManager mBackupManager;
-    private HashMap<ComponentName, AppWidgetProviderInfo> mWidgetMap;
     private byte[] mBuffer = new byte[512];
     private long mLastBackupRestoreTime;
+    private boolean mBackupDataWasUpdated;
 
     private DeviceProfieData mCurrentProfile;
     boolean restoreSuccessful;
@@ -201,7 +202,7 @@
         // Record the time before performing backup so that entries edited while the backup
         // was going on, do not get missed in next backup.
         long newBackupTime = System.currentTimeMillis();
-
+        mBackupDataWasUpdated = false;
         try {
             backupFavorites(data);
             backupScreens(data);
@@ -219,16 +220,30 @@
             for (String deleted: mExistingKeys) {
                 if (VERBOSE) Log.v(TAG, "dropping deleted item " + deleted);
                 data.writeEntityHeader(deleted, -1);
+                mBackupDataWasUpdated = true;
             }
 
             mExistingKeys.clear();
-            mLastBackupRestoreTime = newBackupTime;
+            if (!mBackupDataWasUpdated) {
+                // Check if any metadata has changed
+                mBackupDataWasUpdated = (in.profile == null)
+                        || !Arrays.equals(DeviceProfieData.toByteArray(in.profile),
+                            DeviceProfieData.toByteArray(getDeviceProfieData()))
+                        || (in.backupVersion != BACKUP_VERSION)
+                        || (in.appVersion != getAppVersion());
+            }
 
-            // We store the journal at two places.
-            //   1) Storing it in newState allows us to do partial backups by comparing old state
-            //   2) Storing it in backup data allows us to validate keys during restore
-            Journal state = getCurrentStateJournal();
-            writeRowToBackup(JOURNAL_KEY, state, data);
+            if (mBackupDataWasUpdated) {
+                mLastBackupRestoreTime = newBackupTime;
+
+                // We store the journal at two places.
+                //   1) Storing it in newState allows us to do partial backups by comparing old state
+                //   2) Storing it in backup data allows us to validate keys during restore
+                Journal state = getCurrentStateJournal();
+                writeRowToBackup(JOURNAL_KEY, state, data);
+            } else {
+                if (DEBUG) Log.d(TAG, "Nothing was written during backup");
+            }
         } catch (IOException e) {
             Log.e(TAG, "launcher backup has failed", e);
         }
@@ -1020,6 +1035,7 @@
         byte[] blob = writeCheckedBytes(proto);
         data.writeEntityHeader(backupKey, blob.length);
         data.writeEntityData(blob, blob.length);
+        mBackupDataWasUpdated = true;
         if (VERBOSE) Log.v(TAG, "Writing New entry " + backupKey);
     }