Merge "Support for storing geo information in the recorded mp4/3gpp file."
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index b524ad6..dc920a7 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -3545,7 +3545,6 @@
      * Example: Adding formatted date string to an accessibility event in addition
      *          to the text added by the super implementation.
      * </p><p><pre><code>
-     * @Override
      * public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
      *     super.onPopulateAccessibilityEvent(event);
      *     final int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_WEEKDAY;
@@ -3573,7 +3572,6 @@
      * Example: Setting the password property of an event in addition
      *          to properties set by the super implementation.
      * </p><p><pre><code>
-     * @Override
      * public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
      *    super.onInitializeAccessibilityEvent(event);
      *    event.setPassword(true);
diff --git a/libs/utils/BackupHelpers.cpp b/libs/utils/BackupHelpers.cpp
index cfb013e..e15875f 100644
--- a/libs/utils/BackupHelpers.cpp
+++ b/libs/utils/BackupHelpers.cpp
@@ -468,6 +468,19 @@
     sprintf(buf + 148, "%06o", sum); // the trailing space is already in place
 }
 
+// Returns number of bytes written
+static int write_pax_header_entry(char* buf, const char* key, const char* value) {
+    // start with the size of "1 key=value\n"
+    int len = strlen(key) + strlen(value) + 4;
+    if (len > 9) len++;
+    if (len > 99) len++;
+    if (len > 999) len++;
+    // since PATH_MAX is 4096 we don't expect to have to generate any single
+    // header entry longer than 9999 characters
+
+    return sprintf(buf, "%d %s=%s\n", len, key, value);
+}
+
 int write_tarfile(const String8& packageName, const String8& domain,
         const String8& rootpath, const String8& filepath, BackupDataWriter* writer)
 {
@@ -525,8 +538,7 @@
     }
 
     // Good to go -- first construct the standard tar header at the start of the buffer
-    memset(buf, 0, 512);    // tar header is 512 bytes
-    memset(paxHeader, 0, 512);
+    memset(buf, 0, BUFSIZE);
 
     // Magic fields for the ustar file format
     strcat(buf + 257, "ustar");
@@ -602,24 +614,20 @@
     // If we're using a pax extended header, build & write that here; lengths are
     // already preflighted
     if (needExtended) {
+        char sizeStr[32];   // big enough for a 64-bit unsigned value in decimal
+        char* p = paxData;
+
         // construct the pax extended header data block
         memset(paxData, 0, BUFSIZE - (paxData - buf));
-        char* p = paxData;
         int len;
 
         // size header -- calc len in digits by actually rendering the number
         // to a string - brute force but simple
-        len = sprintf(p, "%lld", s.st_size) + 8;  // 8 for "1 size=" and final LF
-        if (len >= 10) len++;
-
-        memset(p, 0, 512);
-        p += sprintf(p, "%d size=%lld\n", len, s.st_size);
+        snprintf(sizeStr, sizeof(sizeStr), "%lld", s.st_size);
+        p += write_pax_header_entry(p, "size", sizeStr);
 
         // fullname was generated above with the ustar paths
-        len = fullname.length() + 8;        // 8 for "1 path=" and final LF
-        if (len >= 10) len++;
-        if (len >= 100) len++;
-        p += sprintf(p, "%d path=%s\n", len, fullname.string());
+        p += write_pax_header_entry(p, "path", fullname.string());
 
         // Now we know how big the pax data is
         int paxLen = p - paxData;
diff --git a/packages/BackupRestoreConfirmation/src/com/android/backupconfirm/BackupRestoreConfirmation.java b/packages/BackupRestoreConfirmation/src/com/android/backupconfirm/BackupRestoreConfirmation.java
index 805b905..4b42067 100644
--- a/packages/BackupRestoreConfirmation/src/com/android/backupconfirm/BackupRestoreConfirmation.java
+++ b/packages/BackupRestoreConfirmation/src/com/android/backupconfirm/BackupRestoreConfirmation.java
@@ -24,7 +24,6 @@
 import android.content.Intent;
 import android.os.Bundle;
 import android.os.Handler;
-import android.os.Looper;
 import android.os.Message;
 import android.os.RemoteException;
 import android.os.ServiceManager;
@@ -77,7 +76,7 @@
         public void handleMessage(Message msg) {
             switch (msg.what) {
                 case MSG_START_BACKUP: {
-                    Toast.makeText(mContext, "!!! Backup starting !!!", Toast.LENGTH_LONG);
+                    Toast.makeText(mContext, "!!! Backup starting !!!", Toast.LENGTH_LONG).show();
                 }
                 break;
 
@@ -88,12 +87,13 @@
                 break;
 
                 case MSG_END_BACKUP: {
-                    Toast.makeText(mContext, "!!! Backup ended !!!", Toast.LENGTH_SHORT);
+                    Toast.makeText(mContext, "!!! Backup ended !!!", Toast.LENGTH_SHORT).show();
+                    finish();
                 }
                 break;
 
                 case MSG_START_RESTORE: {
-                    Toast.makeText(mContext, "!!! Restore starting !!!", Toast.LENGTH_LONG);
+                    Toast.makeText(mContext, "!!! Restore starting !!!", Toast.LENGTH_LONG).show();
                 }
                 break;
 
@@ -102,11 +102,13 @@
                 break;
 
                 case MSG_END_RESTORE: {
-                    Toast.makeText(mContext, "!!! Restore ended !!!", Toast.LENGTH_SHORT);
+                    Toast.makeText(mContext, "!!! Restore ended !!!", Toast.LENGTH_SHORT).show();
+                    finish();
                 }
                 break;
 
                 case MSG_TIMEOUT: {
+                    Toast.makeText(mContext, "!!! TIMED OUT !!!", Toast.LENGTH_LONG).show();
                 }
                 break;
             }
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 {