diff --git a/src/com/android/settings/homepage/CardContentProvider.java b/src/com/android/settings/homepage/CardContentProvider.java index 640a00b3683..7b087568ca1 100644 --- a/src/com/android/settings/homepage/CardContentProvider.java +++ b/src/com/android/settings/homepage/CardContentProvider.java @@ -61,23 +61,38 @@ public class CardContentProvider extends ContentProvider { @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/src/com/android/settings/utils/ManagedServiceSettings.java b/src/com/android/settings/utils/ManagedServiceSettings.java index d6deba60fb6..e5dfb066e3e 100644 --- a/src/com/android/settings/utils/ManagedServiceSettings.java +++ b/src/com/android/settings/utils/ManagedServiceSettings.java @@ -32,11 +32,6 @@ import android.util.IconDrawableFactory; import android.util.Log; import android.view.View; -import androidx.appcompat.app.AlertDialog; -import androidx.fragment.app.Fragment; -import androidx.preference.PreferenceScreen; -import androidx.preference.SwitchPreference; - import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.Utils; @@ -47,6 +42,11 @@ import com.android.settingslib.applications.ServiceListing; import java.util.List; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.Fragment; +import androidx.preference.PreferenceScreen; +import androidx.preference.SwitchPreference; + public abstract class ManagedServiceSettings extends EmptyTextSettings { private static final String TAG = "ManagedServiceSettings"; private final Config mConfig; @@ -122,7 +122,7 @@ public abstract class ManagedServiceSettings extends EmptyTextSettings { // unlikely, as we are iterating over live services. Log.e(TAG, "can't find package name", e); } - final String finalTitle = title.toString(); + final CharSequence finalTitle = title; final String summary = service.loadLabel(mPm).toString(); final SwitchPreference pref = new AppSwitchPreference(getPrefContext()); pref.setPersistent(false); @@ -143,7 +143,11 @@ public abstract class ManagedServiceSettings extends EmptyTextSettings { } pref.setOnPreferenceChangeListener((preference, newValue) -> { final boolean enable = (boolean) newValue; - return setEnabled(cn, finalTitle, enable); + if (finalTitle != null) { + return setEnabled(cn, finalTitle.toString(), enable); + } else { + return setEnabled(cn, null, enable); + } }); pref.setKey(cn.flattenToString()); screen.addPreference(pref); diff --git a/tests/robotests/config/robolectric.properties b/tests/robotests/config/robolectric.properties index 717f20d8fb6..aae277902fb 100644 --- a/tests/robotests/config/robolectric.properties +++ b/tests/robotests/config/robolectric.properties @@ -1,5 +1,6 @@ manifest=packages/apps/Settings/AndroidManifest.xml sdk=NEWEST_SDK + shadows=\ com.android.settings.testutils.shadow.ShadowThreadUtils,\ - com.android.settings.testutils.shadow.ShadowXmlUtils \ No newline at end of file + com.android.settingslib.testutils.shadow.ShadowXmlUtils diff --git a/tests/robotests/src/com/android/settings/homepage/CardContentProviderTest.java b/tests/robotests/src/com/android/settings/homepage/CardContentProviderTest.java index eec87b0286e..84955e2c8a5 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 @@ public class CardContentProviderTest { @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 @@ public class CardContentProviderTest { @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 @@ public class CardContentProviderTest { 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 @@ public class CardContentProviderTest { 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 @@ public class CardContentProviderTest { 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 @@ public class CardContentProviderTest { 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(); diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowXmlUtils.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowXmlUtils.java deleted file mode 100644 index c2864e5f984..00000000000 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowXmlUtils.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.android.settings.testutils.shadow; - -import static org.robolectric.shadow.api.Shadow.directlyOn; - -import com.android.internal.util.XmlUtils; - -import org.robolectric.Robolectric; -import org.robolectric.annotation.Implementation; -import org.robolectric.annotation.Implements; -import org.robolectric.util.ReflectionHelpers; -import org.robolectric.util.ReflectionHelpers.ClassParameter; - -@Implements(XmlUtils.class) -public class ShadowXmlUtils { - - @Implementation - public static final int convertValueToInt(CharSequence charSeq, int defaultValue) { - final Class xmlUtilsClass = ReflectionHelpers.loadClass( - Robolectric.class.getClassLoader(), "com.android.internal.util.XmlUtils"); - try { - return directlyOn(xmlUtilsClass, "convertValueToInt", - ClassParameter.from(CharSequence.class, charSeq), - ClassParameter.from(int.class, new Integer(defaultValue))); - } catch (NumberFormatException e) { - return defaultValue; - } - } -}