Merge "Import translations. DO NOT MERGE"
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index 049df45..2affd69 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -242,6 +242,9 @@
     /** Rate limit (in milliseconds) for photo cleanup.  Do it at most once per day. */
     private static final int PHOTO_CLEANUP_RATE_LIMIT = 24 * 60 * 60 * 1000;
 
+    /** Maximum length of a phone number that can be inserted into the database */
+    private static final int PHONE_NUMBER_LENGTH_LIMIT = 1000;
+
     /**
      * Default expiration duration for pre-authorized URIs.  May be overridden from a secure
      * setting.
@@ -2805,6 +2808,10 @@
             throw new IllegalArgumentException(Data.MIMETYPE + " is required");
         }
 
+        if (Phone.CONTENT_ITEM_TYPE.equals(mimeType)) {
+            maybeTrimLongPhoneNumber(inputValues);
+        }
+
         // The input seem valid, create a shallow copy.
         final ContentValues values = new ContentValues(inputValues);
 
@@ -4468,6 +4475,13 @@
         return count;
     }
 
+    private void maybeTrimLongPhoneNumber(ContentValues values) {
+        final String data1 = values.getAsString(Data.DATA1);
+        if (data1 != null && data1.length() > PHONE_NUMBER_LENGTH_LIMIT) {
+            values.put(Data.DATA1, data1.substring(0, PHONE_NUMBER_LENGTH_LIMIT));
+        }
+    }
+
     private int updateData(ContentValues values, Cursor c, boolean callerIsSyncAdapter) {
         if (values.size() == 0) {
             return 0;
@@ -4476,6 +4490,10 @@
         final SQLiteDatabase db = mDbHelper.get().getWritableDatabase();
 
         final String mimeType = c.getString(DataRowHandler.DataUpdateQuery.MIMETYPE);
+        if (Phone.CONTENT_ITEM_TYPE.equals(mimeType)) {
+            maybeTrimLongPhoneNumber(values);
+        }
+
         DataRowHandler rowHandler = getDataRowHandler(mimeType);
         boolean updated =
                 rowHandler.update(db, mTransactionContext.get(), values, c,
diff --git a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
index d8e2924..e55ebcb 100644
--- a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
+++ b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
@@ -1024,6 +1024,32 @@
         assertNetworkNotified(true);
     }
 
+    public void testDataInsertPhoneNumberTooLongIsTrimmed() {
+        long rawContactId = RawContactUtil.createRawContactWithName(mResolver, "John", "Doe");
+
+        ContentValues values = new ContentValues();
+        values.put(Data.RAW_CONTACT_ID, rawContactId);
+        values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
+        final StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < 300; i++) {
+            sb.append("12345");
+        }
+        final String phoneNumber1500Chars = sb.toString();
+        values.put(Phone.NUMBER, phoneNumber1500Chars);
+
+        Uri dataUri = mResolver.insert(Data.CONTENT_URI, values);
+        final long dataId = ContentUris.parseId(dataUri);
+
+        sb.setLength(0);
+        for (int i = 0; i < 200; i++) {
+            sb.append("12345");
+        }
+        final String phoneNumber1000Chars = sb.toString();
+        final ContentValues expected = new ContentValues();
+        expected.put(Phone.NUMBER, phoneNumber1000Chars);
+        assertSelection(dataUri, expected, Data._ID, dataId);
+    }
+
     public void testRawContactDataQuery() {
         Account account1 = new Account("a", "b");
         Account account2 = new Account("c", "d");