Merge "Guard against null cursor when querying SIM" into ub-contactsdialer-i-dev
diff --git a/src/com/android/contacts/database/SimContactDaoImpl.java b/src/com/android/contacts/database/SimContactDaoImpl.java
index b54f272..be6b323 100644
--- a/src/com/android/contacts/database/SimContactDaoImpl.java
+++ b/src/com/android/contacts/database/SimContactDaoImpl.java
@@ -274,6 +274,10 @@
     private ArrayList<SimContact> loadFrom(Uri uri) {
         synchronized (SIM_READ_LOCK) {
             final Cursor cursor = mResolver.query(uri, null, null, null, null);
+            if (cursor == null) {
+                // Assume null means there are no SIM contacts.
+                return new ArrayList<>(0);
+            }
 
             try {
                 return loadFromCursor(cursor);
diff --git a/tests/src/com/android/contacts/database/SimContactDaoTests.java b/tests/src/com/android/contacts/database/SimContactDaoTests.java
index 8e6edef..18a3f09 100644
--- a/tests/src/com/android/contacts/database/SimContactDaoTests.java
+++ b/tests/src/com/android/contacts/database/SimContactDaoTests.java
@@ -26,14 +26,19 @@
 import static org.hamcrest.Matchers.equalTo;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import android.content.ContentProvider;
 import android.content.ContentProviderOperation;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.OperationApplicationException;
 import android.database.Cursor;
+import android.net.Uri;
+import android.os.CancellationSignal;
 import android.os.RemoteException;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.CommonDataKinds.Email;
@@ -701,6 +706,27 @@
                     .loadContactsForSim(new SimCard("123", "carrier", "sim", null, "us"));
             assertTrue(result.isEmpty());
         }
+
+        @Test
+        public void returnsEmptyListForNullCursor() {
+            mContext = mock(MockContext.class);
+            final MockContentResolver mockResolver = new MockContentResolver();
+            final ContentProvider mockProvider = mock(android.test.mock.MockContentProvider.class);
+            when(mockProvider.query(any(Uri.class), any(String[].class), anyString(),
+                    any(String[].class), anyString()))
+                    .thenReturn(null);
+            when(mockProvider.query(any(Uri.class), any(String[].class), anyString(),
+                    any(String[].class), anyString(), any(CancellationSignal.class)))
+                    .thenReturn(null);
+
+            mockResolver.addProvider("icc", mockProvider);
+            when(mContext.getContentResolver()).thenReturn(mockResolver);
+
+            final SimContactDao sut = SimContactDao.create(mContext);
+            final List<SimContact> result = sut
+                    .loadContactsForSim(new SimCard("123", "carrier", "sim", null, "us"));
+            assertTrue(result.isEmpty());
+        }
     }
 
     @LargeTest