Fix crash when launching without READ_PHONE_STATE

This only occurs in the Google Contacts App and was introduced by the SIM
warmup query added here: If3245fad8fb8ea78424bd8d2eaf2ff1b1c8d9cf8

Test
$ adb shell pm revoke com.android.contacts android.permission.READ_CONTACTS
$ adb shell pm revoke com.android.contacts android.permission.WRITE_CONTACTS
$ adb shell pm revoke com.android.contacts android.permission.GET_ACCOUNTS
$ adb shell pm revoke com.android.contacts android.permission.READ_PHONE_STATE
$ adb shell pm revoke com.android.contacts android.permission.READ_CALL_LOG
$ adb shell pm revoke com.android.contacts android.permission.CALL_PHONE
$ adb shell am instrument -w \
$ com.google.android.contacts.tests/android.support.test.runner.AndroidJUnitRunner \
$ -e class com.android.contacts.NoPermissionsLaunchSmokeTest

Bug 31781331

Change-Id: I04d70f7622da94a2f0fb186fbbe053580ef5a025
diff --git a/src/com/android/contacts/common/database/SimContactDao.java b/src/com/android/contacts/common/database/SimContactDao.java
index 5f22287..8d7855f 100644
--- a/src/com/android/contacts/common/database/SimContactDao.java
+++ b/src/com/android/contacts/common/database/SimContactDao.java
@@ -20,6 +20,7 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.OperationApplicationException;
+import android.content.pm.PackageManager;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.AsyncTask;
@@ -32,10 +33,12 @@
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.util.ArraySet;
+import android.util.Log;
 
 import com.android.contacts.common.Experiments;
 import com.android.contacts.common.model.SimContact;
 import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.util.PermissionsUtil;
 import com.android.contacts.util.SharedPreferenceUtil;
 import com.android.contactsbind.experiments.Flags;
 import com.google.common.collect.Sets;
@@ -50,6 +53,8 @@
  * SIM contacts to a CP2 account.
  */
 public class SimContactDao {
+    private static final String TAG = "SimContactDao";
+
     @VisibleForTesting
     public static final Uri ICC_CONTENT_URI = Uri.parse("content://icc/adn");
 
@@ -88,9 +93,20 @@
     }
 
     public boolean shouldLoad() {
-        final Set<String> simIds = getSimCardIds();
-        return !Sets.difference(simIds, SharedPreferenceUtil.getImportedSims(mContext)).isEmpty()
-                && getSimState() != TelephonyManager.SIM_STATE_ABSENT;
+        final Set<String> simIds = hasTelephony() && hasPermissions() ? getSimCardIds() :
+                Collections.<String>emptySet();
+
+        if (Log.isLoggable(TAG, Log.DEBUG)) {
+            Log.d(TAG, "shouldLoad: hasTelephony? " + hasTelephony() +
+                    " hasPermissions? " + hasPermissions() +
+                    " SIM absent? " + (getSimState() != TelephonyManager.SIM_STATE_ABSENT) +
+                    " SIM ids=" + simIds +
+                    " imported=" + SharedPreferenceUtil.getImportedSims(mContext));
+        }
+        return hasTelephony() && hasPermissions() &&
+                getSimState() != TelephonyManager.SIM_STATE_ABSENT &&
+                !Sets.difference(simIds, SharedPreferenceUtil.getImportedSims(mContext))
+                        .isEmpty();
     }
 
     public Set<String> getSimCardIds() {
@@ -190,4 +206,13 @@
             SharedPreferenceUtil.addImportedSim(mContext, id);
         }
     }
+
+    private boolean hasTelephony() {
+        return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
+    }
+
+    private boolean hasPermissions() {
+        return PermissionsUtil.hasContactsPermissions(mContext) &&
+                PermissionsUtil.hasPhonePermissions(mContext);
+    }
 }