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);
+ }
}