merge in nyc-release history after reset to nyc-dev
diff --git a/src/com/android/providers/telephony/TelephonyBackupAgent.java b/src/com/android/providers/telephony/TelephonyBackupAgent.java
index 7a9d701..5f4acaa 100644
--- a/src/com/android/providers/telephony/TelephonyBackupAgent.java
+++ b/src/com/android/providers/telephony/TelephonyBackupAgent.java
@@ -160,14 +160,6 @@
     // Order by Date entries from database. We start backup from the oldest.
     private static final String ORDER_BY_DATE = "date ASC";
 
-    // This is a hard coded string rather than a localized one because we don't want it to
-    // change when you change locale.
-    @VisibleForTesting
-    static final String UNKNOWN_SENDER = "\u02BCUNKNOWN_SENDER!\u02BC";
-
-    // Thread id for UNKNOWN_SENDER.
-    private long mUnknownSenderThreadId;
-
     // Columns from SMS database for backup/restore.
     @VisibleForTesting
     static final String[] SMS_PROJECTION = new String[] {
@@ -238,9 +230,10 @@
     @VisibleForTesting
     int mMaxMsgPerFile = 1000;
 
+
     // Default values for SMS, MMS, Addresses restore.
-    private static ContentValues sDefaultValuesSms = new ContentValues(5);
-    private static ContentValues sDefaultValuesMms = new ContentValues(6);
+    private static final ContentValues sDefaultValuesSms = new ContentValues(3);
+    private static final ContentValues sDefaultValuesMms = new ContentValues(5);
     private static final ContentValues sDefaultValuesAddr = new ContentValues(2);
 
     // Shared preferences for the backup agent.
@@ -259,7 +252,6 @@
         // Consider restored messages read and seen.
         sDefaultValuesSms.put(Telephony.Sms.READ, 1);
         sDefaultValuesSms.put(Telephony.Sms.SEEN, 1);
-        sDefaultValuesSms.put(Telephony.Sms.ADDRESS, UNKNOWN_SENDER);
         // If there is no sub_id with self phone number on restore set it to -1.
         sDefaultValuesSms.put(Telephony.Sms.SUBSCRIPTION_ID, -1);
 
@@ -306,7 +298,6 @@
             }
         }
         mContentResolver = getContentResolver();
-        initUnknownSender();
     }
 
     @VisibleForTesting
@@ -319,13 +310,6 @@
         mPhone2subId = phone2subId;
     }
 
-    @VisibleForTesting
-    void initUnknownSender() {
-        mUnknownSenderThreadId = getOrCreateThreadId(null);
-        sDefaultValuesSms.put(Telephony.Sms.THREAD_ID, mUnknownSenderThreadId);
-        sDefaultValuesMms.put(Telephony.Mms.THREAD_ID, mUnknownSenderThreadId);
-    }
-
     @Override
     public void onFullBackup(FullBackupDataOutput data) throws IOException {
         SharedPreferences sharedPreferences = getSharedPreferences(BACKUP_PREFS, MODE_PRIVATE);
@@ -364,22 +348,18 @@
                 final long smsDate = TimeUnit.MILLISECONDS.toSeconds(getMessageDate(smsCursor));
                 final long mmsDate = getMessageDate(mmsCursor);
                 if (smsDate < mmsDate) {
-                    backupAll(data, smsCursor,
-                            String.format(Locale.US, SMS_BACKUP_FILE_FORMAT, fileNum++));
+                    backupAll(data, smsCursor, String.format(SMS_BACKUP_FILE_FORMAT, fileNum++));
                 } else {
-                    backupAll(data, mmsCursor, String.format(Locale.US,
-                            MMS_BACKUP_FILE_FORMAT, fileNum++));
+                    backupAll(data, mmsCursor, String.format(MMS_BACKUP_FILE_FORMAT, fileNum++));
                 }
             }
 
             while (smsCursor != null && !smsCursor.isAfterLast()) {
-                backupAll(data, smsCursor,
-                        String.format(Locale.US, SMS_BACKUP_FILE_FORMAT, fileNum++));
+                backupAll(data, smsCursor, String.format(SMS_BACKUP_FILE_FORMAT, fileNum++));
             }
 
             while (mmsCursor != null && !mmsCursor.isAfterLast()) {
-                backupAll(data, mmsCursor,
-                        String.format(Locale.US, MMS_BACKUP_FILE_FORMAT, fileNum++));
+                backupAll(data, mmsCursor, String.format(MMS_BACKUP_FILE_FORMAT, fileNum++));
             }
         }
 
@@ -507,11 +487,11 @@
                     final String fileName = file.getName();
                     try (FileInputStream fileInputStream = new FileInputStream(file)) {
                         mTelephonyBackupAgent.doRestoreFile(fileName, fileInputStream.getFD());
-                    } catch (Exception e) {
-                        // Either IOException or RuntimeException.
-                        Log.e(TAG, e.toString());
-                    } finally {
                         file.delete();
+                    } catch (IOException e) {
+                        if (DEBUG) {
+                            Log.e(TAG, e.toString());
+                        }
                     }
                 }
             } finally {
@@ -631,7 +611,7 @@
     private static final int ID_IDX = 0;
 
     private boolean doesSmsExist(ContentValues smsValues) {
-        final String where = String.format(Locale.US, "%s = %d and %s = %s",
+        final String where = String.format("%s = %d and %s = %s",
                 Telephony.Sms.DATE, smsValues.getAsLong(Telephony.Sms.DATE),
                 Telephony.Sms.BODY,
                 DatabaseUtils.sqlEscapeString(smsValues.getAsString(Telephony.Sms.BODY)));
@@ -642,7 +622,7 @@
     }
 
     private boolean doesMmsExist(Mms mms) {
-        final String where = String.format(Locale.US, "%s = %d",
+        final String where = String.format("%s = %d",
                 Telephony.Sms.DATE, mms.values.getAsLong(Telephony.Mms.DATE));
         try (Cursor cursor = mContentResolver.query(Telephony.Mms.CONTENT_URI, PROJECTION_ID, where,
                 null, null)) {
@@ -700,12 +680,8 @@
     }
 
     private void handleThreadId(JsonWriter jsonWriter, long threadId) throws IOException {
-        final List<String> recipients = getRecipientsByThread(threadId);
-        if (recipients == null || recipients.isEmpty()) {
-            return;
-        }
-
-        writeRecipientsToWriter(jsonWriter.name(RECIPIENTS), recipients);
+        writeRecipientsToWriter(jsonWriter.name(RECIPIENTS),
+                getRecipientsByThread(threadId));
         if (!mThreadArchived.containsKey(threadId)) {
             boolean isArchived = isThreadArchived(threadId);
             if (isArchived) {
@@ -726,7 +702,7 @@
 
         try (Cursor cursor = getContentResolver().query(uri, THREAD_ARCHIVED_PROJECTION, null, null,
                 null)) {
-            if (cursor != null && cursor.moveToFirst()) {
+            if (cursor.moveToFirst()) {
                 return cursor.getInt(THREAD_ARCHIVED_IDX) == 1;
             }
         }
@@ -746,7 +722,7 @@
 
     private ContentValues readSmsValuesFromReader(JsonReader jsonReader)
             throws IOException {
-        ContentValues values = new ContentValues(6+sDefaultValuesSms.size());
+        ContentValues values = new ContentValues(8+sDefaultValuesSms.size());
         values.putAll(sDefaultValuesSms);
         long threadId = -1;
         boolean isArchived = false;
@@ -853,7 +829,7 @@
 
     private Mms readMmsFromReader(JsonReader jsonReader) throws IOException {
         Mms mms = new Mms();
-        mms.values = new ContentValues(5+sDefaultValuesMms.size());
+        mms.values = new ContentValues(6+sDefaultValuesMms.size());
         mms.values.putAll(sDefaultValuesMms);
         jsonReader.beginObject();
         String bodyText = null;
@@ -1026,7 +1002,7 @@
         final Uri partUri = Telephony.Mms.CONTENT_URI.buildUpon()
                 .appendPath(String.valueOf(dummyId)).appendPath("part").build();
 
-        final String srcName = String.format(Locale.US, "text.%06d.txt", 0);
+        final String srcName = String.format("text.%06d.txt", 0);
         { // Insert SMIL part.
             final String smilBody = String.format(sSmilTextPart, srcName);
             final String smil = String.format(sSmilTextOnly, smilBody);
@@ -1153,29 +1129,13 @@
     }
 
     private long getOrCreateThreadId(Set<String> recipients) {
-        if (recipients == null) {
-            recipients = new ArraySet<String>();
-        }
-
-        if (recipients.isEmpty()) {
-            recipients.add(UNKNOWN_SENDER);
-        }
-
         if (mCacheGetOrCreateThreadId == null) {
             mCacheGetOrCreateThreadId = new HashMap<>();
         }
 
         if (!mCacheGetOrCreateThreadId.containsKey(recipients)) {
-            long threadId = mUnknownSenderThreadId;
-            try {
-                threadId = Telephony.Threads.getOrCreateThreadId(this, recipients);
-            } catch (RuntimeException e) {
-                if (DEBUG) {
-                    Log.e(TAG, e.toString());
-                }
-            }
-            mCacheGetOrCreateThreadId.put(recipients, threadId);
-            return threadId;
+            mCacheGetOrCreateThreadId.put(recipients,
+                    Telephony.Threads.getOrCreateThreadId(this, recipients));
         }
 
         return mCacheGetOrCreateThreadId.get(recipients);
diff --git a/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java b/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java
index 4866dbd..5869a84 100644
--- a/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java
+++ b/tests/src/com/android/providers/telephony/TelephonyBackupAgentTest.java
@@ -36,6 +36,7 @@
 import android.util.ArraySet;
 import android.util.JsonReader;
 import android.util.JsonWriter;
+import android.util.Log;
 import android.util.SparseArray;
 
 import org.json.JSONArray;
@@ -118,8 +119,8 @@
 
 
         /* Generating test data */
-        mSmsRows = new ContentValues[4];
-        mSmsJson = new String[4];
+        mSmsRows = new ContentValues[3];
+        mSmsJson = new String[3];
         mSmsRows[0] = createSmsRow(1, 1, "+1232132214124", "sms 1", "sms subject", 9087978987l,
                 999999999, 3, 44, 1);
         mSmsJson[0] = "{\"self_phone\":\"+111111111111111\",\"address\":" +
@@ -144,14 +145,6 @@
                 "\"recipients\":[\"+1232221412433\",\"+1232221412444\"]}";
         mThreadProvider.getOrCreateThreadId(new String[]{"+1232221412433", "+1232221412444"});
 
-
-        mSmsRows[3] = createSmsRow(5, 3, null, "sms 4", null,
-                111111111111l, 999999999, 2, 3, 5);
-        mSmsJson[3] = "{\"self_phone\":\"+333333333333333\"," +
-                "\"body\":\"sms 4\",\"date\":\"111111111111\"," +
-                "\"date_sent\":" +
-                "\"999999999\",\"status\":\"2\",\"type\":\"3\"}";
-
         mAllSmsJson = makeJsonArray(mSmsJson);
 
 
@@ -399,7 +392,7 @@
      * @throws Exception
      */
     public void testBackupSms_AllSmsWithExactFileLimit() throws Exception {
-        mTelephonyBackupAgent.mMaxMsgPerFile = 4;
+        mTelephonyBackupAgent.mMaxMsgPerFile = 3;
         mSmsTable.addAll(Arrays.asList(mSmsRows));
         mTelephonyBackupAgent.putSmsMessagesToJson(mSmsCursor, new JsonWriter(mStringWriter));
         assertEquals(mAllSmsJson, mStringWriter.toString());
@@ -423,10 +416,6 @@
         mStringWriter = new StringWriter();
         mTelephonyBackupAgent.putSmsMessagesToJson(mSmsCursor, new JsonWriter(mStringWriter));
         assertEquals("[" + mSmsJson[2] + "]", mStringWriter.toString());
-
-        mStringWriter = new StringWriter();
-        mTelephonyBackupAgent.putSmsMessagesToJson(mSmsCursor, new JsonWriter(mStringWriter));
-        assertEquals("[" + mSmsJson[3] + "]", mStringWriter.toString());
     }
 
     /**
@@ -496,7 +485,6 @@
      * @throws Exception
      */
     public void testRestoreSms_AllSms() throws Exception {
-        mTelephonyBackupAgent.initUnknownSender();
         JsonReader jsonReader = new JsonReader(new StringReader(addRandomDataToJson(mAllSmsJson)));
         FakeSmsProvider smsProvider = new FakeSmsProvider(mSmsRows);
         mMockContentResolver.addProvider("sms", smsProvider);
@@ -538,9 +526,9 @@
      */
     public void testBackup_WithQuotaExceeded() throws Exception {
         mTelephonyBackupAgent.mMaxMsgPerFile = 1;
-        final int backupSize = 7168;
-        final int backupSizeAfterFirstQuotaHit = 6144;
-        final int backupSizeAfterSecondQuotaHit = 5120;
+        final int backupSize = 6144;
+        final int backupSizeAfterFirstQuotaHit = 5120;
+        final int backupSizeAfterSecondQuotaHit = 4096;
 
         mSmsTable.addAll(Arrays.asList(mSmsRows));
         mMmsTable.addAll(Arrays.asList(mMmsRows));
@@ -596,10 +584,6 @@
                 modifiedValues.put(Telephony.Sms.SUBSCRIPTION_ID, -1);
             }
 
-            if (modifiedValues.get(Telephony.Sms.ADDRESS) == null) {
-                modifiedValues.put(Telephony.Sms.ADDRESS, TelephonyBackupAgent.UNKNOWN_SENDER);
-            }
-
             assertEquals(modifiedValues, values);
             return null;
         }
@@ -728,10 +712,6 @@
 
 
         public int getOrCreateThreadId(final String[] recipients) {
-            if (recipients == null || recipients.length == 0) {
-                throw new IllegalArgumentException("Unable to find or allocate a thread ID.");
-            }
-
             Set<Integer> ids = new ArraySet<>();
             for (String rec : recipients) {
                 if (!id2Recipient.contains(rec)) {
@@ -750,10 +730,6 @@
         }
 
         private String getSpaceSepIds(int threadId) {
-            if (id2Thread.size() < threadId) {
-                return null;
-            }
-
             String spaceSepIds = null;
             for (Integer id : id2Thread.get(threadId-1)) {
                 spaceSepIds = (spaceSepIds == null ? "" : spaceSepIds + " ") + String.valueOf(id);