Add more useful-for-debug info to 'dumpsys backup'

Change-Id: I52e20bac01ff63feaf28920a79311881992293a3
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index 15290c1..d4cebef 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -163,8 +163,10 @@
     IBackupAgent mConnectedAgent;
     volatile boolean mConnecting;
     volatile boolean mBackupOrRestoreInProgress = false;
+    volatile long mLastBackupPass;
+    volatile long mNextBackupPass;
 
-    // A similar synchronicity mechanism around clearing apps' data for restore
+    // A similar synchronization mechanism around clearing apps' data for restore
     final Object mClearDataLock = new Object();
     volatile boolean mClearingData;
 
@@ -634,6 +636,9 @@
             switch (msg.what) {
             case MSG_RUN_BACKUP:
             {
+                mLastBackupPass = System.currentTimeMillis();
+                mNextBackupPass = mLastBackupPass + BACKUP_INTERVAL;
+
                 IBackupTransport transport = getTransport(mCurrentTransport);
                 if (transport == null) {
                     Log.v(TAG, "Backup requested but no transport available");
@@ -1988,6 +1993,7 @@
         long when = System.currentTimeMillis() + delayBeforeFirstBackup;
         mAlarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, when,
                 BACKUP_INTERVAL, mRunBackupIntent);
+        mNextBackupPass = when;
     }
 
     // Report whether the backup mechanism is currently enabled
@@ -2194,28 +2200,43 @@
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         synchronized (mQueueLock) {
             pw.println("Backup Manager is " + (mEnabled ? "enabled" : "disabled")
-                    + " / " + (!mProvisioned ? "not " : "") + "provisioned");
+                    + " / " + (!mProvisioned ? "not " : "") + "provisioned / "
+                    + (!mBackupOrRestoreInProgress ? "not " : "") + "in progress / "
+                    + (this.mPendingInits.size() == 0 ? "not " : "") + "pending init / "
+                    + (!mInitInProgress ? "not " : "") + "initializing");
+            pw.println("Last backup pass: " + mLastBackupPass
+                    + " (now = " + System.currentTimeMillis() + ')');
+            pw.println("  next scheduled: " + mNextBackupPass);
+
             pw.println("Available transports:");
             for (String t : listAllTransports()) {
                 String pad = (t.equals(mCurrentTransport)) ? "  * " : "    ";
                 pw.println(pad + t);
             }
+
+            pw.println("Pending init: " + mPendingInits.size());
+            for (String s : mPendingInits) {
+                pw.println("    " + s);
+            }
+
             int N = mBackupParticipants.size();
-            pw.println("Participants: " + N);
+            pw.println("Participants:");
             for (int i=0; i<N; i++) {
                 int uid = mBackupParticipants.keyAt(i);
                 pw.print("  uid: ");
                 pw.println(uid);
                 HashSet<ApplicationInfo> participants = mBackupParticipants.valueAt(i);
                 for (ApplicationInfo app: participants) {
-                    pw.println("    " + app.toString());
+                    pw.println("    " + app.packageName);
                 }
             }
+
             pw.println("Ever backed up: " + mEverStoredApps.size());
             for (String pkg : mEverStoredApps) {
                 pw.println("    " + pkg);
             }
-            pw.println("Pending: " + mPendingBackups.size());
+
+            pw.println("Pending backup: " + mPendingBackups.size());
             for (BackupRequest req : mPendingBackups.values()) {
                 pw.println("    " + req);
             }