Merge "Added the bulkInsert for CardContentProvider"
diff --git a/src/com/android/settings/homepage/CardContentProvider.java b/src/com/android/settings/homepage/CardContentProvider.java
index 640a00b..7b08756 100644
--- a/src/com/android/settings/homepage/CardContentProvider.java
+++ b/src/com/android/settings/homepage/CardContentProvider.java
@@ -61,23 +61,38 @@
 
     @Override
     public Uri insert(Uri uri, ContentValues values) {
+        final ContentValues[] cvs = {values};
+        bulkInsert(uri, cvs);
+        return uri;
+    }
+
+    @Override
+    public int bulkInsert(Uri uri, ContentValues[] values) {
         final StrictMode.ThreadPolicy oldPolicy = StrictMode.getThreadPolicy();
+        int numInserted = 0;
+        final SQLiteDatabase database = mDBHelper.getWritableDatabase();
+
         try {
             maybeEnableStrictMode();
 
-            final SQLiteDatabase database = mDBHelper.getWritableDatabase();
             final String table = getTableFromMatch(uri);
-            final long ret = database.insert(table, null, values);
-            if (ret != -1) {
-                getContext().getContentResolver().notifyChange(uri, null);
-            } else {
-                Log.e(TAG, "The CardContentProvider insertion failed! Plase check SQLiteDatabase's "
-                        + "message.");
+            database.beginTransaction();
+            for (ContentValues value : values) {
+                long ret = database.insert(table, null, value);
+                if (ret != -1L) {
+                    numInserted++;
+                } else {
+                    Log.e(TAG, "The row " + value.getAsString(CardDatabaseHelper.CardColumns.NAME)
+                            + " insertion failed! Please check your data.");
+                }
             }
+            database.setTransactionSuccessful();
+            getContext().getContentResolver().notifyChange(uri, null);
         } finally {
+            database.endTransaction();
             StrictMode.setThreadPolicy(oldPolicy);
         }
-        return uri;
+        return numInserted;
     }
 
     @Override
diff --git a/tests/robotests/src/com/android/settings/homepage/CardContentProviderTest.java b/tests/robotests/src/com/android/settings/homepage/CardContentProviderTest.java
index eec87b0..84955e2 100644
--- a/tests/robotests/src/com/android/settings/homepage/CardContentProviderTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/CardContentProviderTest.java
@@ -72,16 +72,25 @@
 
     @Test
     public void cardData_insert() {
-        final int cnt_before_instert = getRowCount();
-        mResolver.insert(mUri, insertOneRow());
-        final int cnt_after_instert = getRowCount();
+        final int rowsBeforeInsert = getRowCount();
+        mResolver.insert(mUri, generateOneRow());
+        final int rowsAfterInsert = getRowCount();
 
-        assertThat(cnt_after_instert - cnt_before_instert).isEqualTo(1);
+        assertThat(rowsAfterInsert - rowsBeforeInsert).isEqualTo(1);
+    }
+
+    @Test
+    public void cardData_bulkInsert_twoRows() {
+        final int rowsBeforeInsert = getRowCount();
+        mResolver.bulkInsert(mUri, generateTwoRows());
+        final int rowsAfterInsert = getRowCount();
+
+        assertThat(rowsAfterInsert - rowsBeforeInsert).isEqualTo(2);
     }
 
     @Test
     public void cardData_query() {
-        mResolver.insert(mUri, insertOneRow());
+        mResolver.insert(mUri, generateOneRow());
         final int count = getRowCount();
 
         assertThat(count).isGreaterThan(0);
@@ -89,24 +98,24 @@
 
     @Test
     public void cardData_delete() {
-        mResolver.insert(mUri, insertOneRow());
-        final int del_count = mResolver.delete(mUri, null, null);
+        mResolver.insert(mUri, generateOneRow());
+        final int delCount = mResolver.delete(mUri, null, null);
 
-        assertThat(del_count).isGreaterThan(0);
+        assertThat(delCount).isGreaterThan(0);
     }
 
     @Test
     public void cardData_update() {
-        mResolver.insert(mUri, insertOneRow());
+        mResolver.insert(mUri, generateOneRow());
 
         final double updatingScore = 0.87;
         final ContentValues values = new ContentValues();
         values.put(CardDatabaseHelper.CardColumns.SCORE, updatingScore);
         final String strWhere = CardDatabaseHelper.CardColumns.NAME + "=?";
         final String[] selectionArgs = {"auto_rotate"};
-        final int update_count = mResolver.update(mUri, values, strWhere, selectionArgs);
+        final int updateCount = mResolver.update(mUri, values, strWhere, selectionArgs);
 
-        assertThat(update_count).isGreaterThan(0);
+        assertThat(updateCount).isGreaterThan(0);
 
         final String[] columns = {CardDatabaseHelper.CardColumns.SCORE};
         final Cursor cr = mResolver.query(mUri, columns, strWhere, selectionArgs, null);
@@ -122,7 +131,7 @@
         ShadowThreadUtils.setIsMainThread(true);
         ReflectionHelpers.setStaticField(Build.class, "IS_DEBUGGABLE", true);
 
-        mProvider.insert(mUri, insertOneRow());
+        mProvider.insert(mUri, generateOneRow());
 
         verify(mProvider).enableStrictMode();
     }
@@ -164,7 +173,7 @@
         ShadowThreadUtils.setIsMainThread(false);
         ReflectionHelpers.setStaticField(Build.class, "IS_DEBUGGABLE", true);
 
-        mProvider.insert(mUri, insertOneRow());
+        mProvider.insert(mUri, generateOneRow());
 
         verify(mProvider, never()).enableStrictMode();
     }
@@ -217,10 +226,10 @@
         mProvider.getTableFromMatch(invalid_Uri);
     }
 
-    private ContentValues insertOneRow() {
+    private ContentValues generateOneRow() {
         final ContentValues values = new ContentValues();
         values.put(CardDatabaseHelper.CardColumns.NAME, "auto_rotate");
-        values.put(CardDatabaseHelper.CardColumns.TYPE, 0);
+        values.put(CardDatabaseHelper.CardColumns.TYPE, 1);
         values.put(CardDatabaseHelper.CardColumns.SCORE, 0.9);
         values.put(CardDatabaseHelper.CardColumns.SLICE_URI,
                 "content://com.android.settings.slices/action/auto_rotate");
@@ -231,6 +240,24 @@
         return values;
     }
 
+    private ContentValues[] generateTwoRows() {
+        final ContentValues[] twoRows = new ContentValues[2];
+        twoRows[0] = generateOneRow();
+
+        final ContentValues values = new ContentValues();
+        values.put(CardDatabaseHelper.CardColumns.NAME, "toggle_airplane");
+        values.put(CardDatabaseHelper.CardColumns.TYPE, 1);
+        values.put(CardDatabaseHelper.CardColumns.SCORE, 0.95);
+        values.put(CardDatabaseHelper.CardColumns.SLICE_URI,
+                "content://com.android.settings.slices/action/toggle_airplane");
+        values.put(CardDatabaseHelper.CardColumns.CATEGORY, 2);
+        values.put(CardDatabaseHelper.CardColumns.PACKAGE_NAME, "com.android.settings");
+        values.put(CardDatabaseHelper.CardColumns.APP_VERSION, "1.0.0");
+        twoRows[1] = values;
+
+        return twoRows;
+    }
+
     private int getRowCount() {
         final Cursor cr = mResolver.query(mUri, null, null, null);
         final int count = cr.getCount();