Full backup tweaks

* provide placeholder UI showing backup/restore start/stop/timeout
* don't kill the progress UI in mid stream
* tidy up the pax extended header data writing a little

Change-Id: Ife0cb78e3facb541d8327f1d5ca5fe77faa6cbca
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index a334dbb..77c2a44 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -1710,8 +1710,7 @@
                             IApplicationThread.BACKUP_MODE_FULL);
                     if (agent != null) {
                         try {
-                            ApplicationInfo app = mPackageManager.getApplicationInfo(
-                                    pkg.packageName, 0);
+                            ApplicationInfo app = pkg.applicationInfo;
                             boolean sendApk = mIncludeApks
                                     && ((app.flags & ApplicationInfo.FLAG_FORWARD_LOCK) == 0)
                                     && ((app.flags & ApplicationInfo.FLAG_SYSTEM) == 0 ||
@@ -1742,9 +1741,6 @@
                             } else {
                                 if (DEBUG) Slog.d(TAG, "Full backup success: " + pkg.packageName);
                             }
-                        } catch (NameNotFoundException e) {
-                            Slog.e(TAG, "Package exists but not app info; skipping: "
-                                    + pkg.packageName);
                         } catch (IOException e) {
                             Slog.e(TAG, "Error backing up " + pkg.packageName, e);
                         }
@@ -1816,8 +1812,11 @@
                 // unbind and tidy up even on timeout or failure, just in case
                 mActivityManager.unbindBackupAgent(app);
 
-                // The agent was running with a stub Application object, so shut it down
-                if (app.uid != Process.SYSTEM_UID) {
+                // The agent was running with a stub Application object, so shut it down.
+                // !!! We hardcode the confirmation UI's package name here rather than use a
+                //     manifest flag!  TODO something less direct.
+                if (app.uid != Process.SYSTEM_UID
+                        && !pkg.packageName.equals("com.android.backupconfirm")) {
                     if (DEBUG) Slog.d(TAG, "Backup complete, killing host process");
                     mActivityManager.killApplicationProcess(app.processName, app.uid);
                 } else {