Handle revoked permissions when resuming the app (1/2)
The activities that create these fragments will request permissions
but if these fragments were created and the permissions were revoked
then Activity's super.onCreate() will recreate these fragments before
the permission activity is started, which causes a bunch of issues
since the original activity never finishes it's onCreate method so
many things aren't initialized for the fragments.
So in activities that maybe start the permission activity and have
visisble fragments, instead of returning, continue initializing
everything.
In the case of editor, not being able to select a raw contact delta
is a legit case so it should have been handled as a failure and in
general we shouldn't be attempting to bind the editors if we don't
have the permissions.
Test: Manually verified removing permissions and going back to the
app from the recent apps screen doesn't crash while viewing:
* main list
* groups view
* first level suggestions
* duplicates view
* account view
* editor
* settings
* pick group member to add view
* pick phone numbers to send to from group
* pick emails to send to from group
The behavior is permissions get requested and will go back to the
original activity (PeopleActivity with main list loaded or the
editor activity).
Bug: 34741297
Change-Id: Ie234b1f44e83372b9c0ad9658fa4a2e9b40572b0
diff --git a/src/com/android/contacts/NonPhoneActivity.java b/src/com/android/contacts/NonPhoneActivity.java
index 066c4d3..ba56d70 100644
--- a/src/com/android/contacts/NonPhoneActivity.java
+++ b/src/com/android/contacts/NonPhoneActivity.java
@@ -44,9 +44,7 @@
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- if (RequestPermissionsActivity.startPermissionActivity(this)) {
- return;
- }
+ RequestPermissionsActivity.startPermissionActivityIfNeeded(this);
final String phoneNumber = getPhoneNumber();
if (TextUtils.isEmpty(phoneNumber)) {
diff --git a/src/com/android/contacts/activities/AttachPhotoActivity.java b/src/com/android/contacts/activities/AttachPhotoActivity.java
index 62e6ca4..bde3dc1 100644
--- a/src/com/android/contacts/activities/AttachPhotoActivity.java
+++ b/src/com/android/contacts/activities/AttachPhotoActivity.java
@@ -95,7 +95,7 @@
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
- if (RequestPermissionsActivity.startPermissionActivity(this)) {
+ if (RequestPermissionsActivity.startPermissionActivityIfNeeded(this)) {
return;
}
diff --git a/src/com/android/contacts/activities/ContactEditorActivity.java b/src/com/android/contacts/activities/ContactEditorActivity.java
index 24e48ef..8f488e1 100644
--- a/src/com/android/contacts/activities/ContactEditorActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorActivity.java
@@ -319,9 +319,7 @@
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
- if (RequestPermissionsActivity.startPermissionActivity(this)) {
- return;
- }
+ RequestPermissionsActivity.startPermissionActivityIfNeeded(this);
final Intent intent = getIntent();
final String action = intent.getAction();
diff --git a/src/com/android/contacts/activities/ContactEditorSpringBoardActivity.java b/src/com/android/contacts/activities/ContactEditorSpringBoardActivity.java
index 5ad05dc..cf2ce9c 100644
--- a/src/com/android/contacts/activities/ContactEditorSpringBoardActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorSpringBoardActivity.java
@@ -84,7 +84,7 @@
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- if (RequestPermissionsActivity.startPermissionActivity(this)) {
+ if (RequestPermissionsActivity.startPermissionActivityIfNeeded(this)) {
return;
}
diff --git a/src/com/android/contacts/activities/ContactSelectionActivity.java b/src/com/android/contacts/activities/ContactSelectionActivity.java
index 654263b..eaa89a1 100644
--- a/src/com/android/contacts/activities/ContactSelectionActivity.java
+++ b/src/com/android/contacts/activities/ContactSelectionActivity.java
@@ -107,9 +107,7 @@
protected void onCreate(Bundle savedState) {
super.onCreate(savedState);
- if (RequestPermissionsActivity.startPermissionActivity(this)) {
- return;
- }
+ RequestPermissionsActivity.startPermissionActivityIfNeeded(this);
if (savedState != null) {
mActionCode = savedState.getInt(KEY_ACTION_CODE);
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index c0798bb..e5ae3a3 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -349,9 +349,7 @@
mAccountTypeManager = AccountTypeManager.getInstance(this);
mContactListFilterController = ContactListFilterController.getInstance(this);
- if (RequestPermissionsActivity.startPermissionActivity(this)) {
- return;
- }
+ RequestPermissionsActivity.startPermissionActivityIfNeeded(this);
if (!processIntent(false)) {
finish();
diff --git a/src/com/android/contacts/activities/RequestPermissionsActivity.java b/src/com/android/contacts/activities/RequestPermissionsActivity.java
index 02ddf34..bcfa128 100644
--- a/src/com/android/contacts/activities/RequestPermissionsActivity.java
+++ b/src/com/android/contacts/activities/RequestPermissionsActivity.java
@@ -18,6 +18,7 @@
import android.Manifest.permission;
import android.app.Activity;
+import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.support.v4.content.LocalBroadcastManager;
@@ -42,7 +43,14 @@
return getPermissions(getPackageManager());
}
- public static boolean startPermissionActivity(Activity activity) {
+ /**
+ * Method to check if the required permissions are given.
+ */
+ public static boolean hasRequiredPermissions(Context context) {
+ return hasPermissions(context, getPermissions(context.getPackageManager()));
+ }
+
+ public static boolean startPermissionActivityIfNeeded(Activity activity) {
return startPermissionActivity(activity,
getPermissions(activity.getPackageManager()),
RequestPermissionsActivity.class);
diff --git a/src/com/android/contacts/activities/ShowOrCreateActivity.java b/src/com/android/contacts/activities/ShowOrCreateActivity.java
index 91c93b9..8c94364 100755
--- a/src/com/android/contacts/activities/ShowOrCreateActivity.java
+++ b/src/com/android/contacts/activities/ShowOrCreateActivity.java
@@ -87,7 +87,7 @@
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
- if (RequestPermissionsActivity.startPermissionActivity(this)) {
+ if (RequestPermissionsActivity.startPermissionActivityIfNeeded(this)) {
return;
}
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index 84c2b1f..d5522dd 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -64,6 +64,7 @@
import com.android.contacts.activities.ContactEditorActivity;
import com.android.contacts.activities.ContactEditorActivity.ContactEditor;
import com.android.contacts.activities.ContactSelectionActivity;
+import com.android.contacts.activities.RequestPermissionsActivity;
import com.android.contacts.editor.AggregationSuggestionEngine.Suggestion;
import com.android.contacts.group.GroupUtil;
import com.android.contacts.list.UiIntentActions;
@@ -1310,7 +1311,8 @@
}
return false;
}
- return true;
+ // Don't attempt to bind anything if we have no permissions.
+ return RequestPermissionsActivity.hasRequiredPermissions(mContext);
}
/**
diff --git a/src/com/android/contacts/editor/RawContactEditorView.java b/src/com/android/contacts/editor/RawContactEditorView.java
index 0c6e029..320a19a 100644
--- a/src/com/android/contacts/editor/RawContactEditorView.java
+++ b/src/com/android/contacts/editor/RawContactEditorView.java
@@ -58,8 +58,6 @@
import com.android.contacts.model.RawContactDeltaList;
import com.android.contacts.model.RawContactModifier;
import com.android.contacts.model.ValuesDelta;
-import com.android.contacts.model.account.AccountDisplayInfo;
-import com.android.contacts.model.account.AccountDisplayInfoFactory;
import com.android.contacts.model.account.AccountInfo;
import com.android.contacts.model.account.AccountType;
import com.android.contacts.model.account.AccountWithDataSet;
@@ -72,7 +70,6 @@
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
@@ -380,7 +377,7 @@
* Get the raw contact ID for the current photo.
*/
public long getPhotoRawContactId() {
- return mCurrentRawContactDelta.getRawContactId();
+ return mCurrentRawContactDelta == null ? - 1 : mCurrentRawContactDelta.getRawContactId();
}
public StructuredNameEditorView getNameEditorView() {
@@ -464,6 +461,11 @@
return;
}
pickRawContactDelta();
+ if (mCurrentRawContactDelta == null) {
+ elog("Couldn't pick a raw contact delta.");
+ if (mListener != null) mListener.onBindEditorsFailed();
+ return;
+ }
// Apply any intent extras now that we have selected a raw contact delta.
applyIntentExtras();
parseRawContactDelta();
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index dc1cfcf..2007e10 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -71,7 +71,6 @@
import android.provider.ContactsContract.Intents;
import android.provider.ContactsContract.QuickContact;
import android.provider.ContactsContract.RawContacts;
-import android.support.graphics.drawable.VectorDrawableCompat;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.content.res.ResourcesCompat;
@@ -719,7 +718,7 @@
Trace.beginSection("onCreate()");
super.onCreate(savedInstanceState);
- if (RequestPermissionsActivity.startPermissionActivity(this)) {
+ if (RequestPermissionsActivity.startPermissionActivityIfNeeded(this)) {
return;
}
diff --git a/src/com/android/contacts/vcard/ExportVCardActivity.java b/src/com/android/contacts/vcard/ExportVCardActivity.java
index 1f1e21b..690f207 100644
--- a/src/com/android/contacts/vcard/ExportVCardActivity.java
+++ b/src/com/android/contacts/vcard/ExportVCardActivity.java
@@ -76,7 +76,7 @@
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
- if (RequestImportVCardPermissionsActivity.startPermissionActivity(this)) {
+ if (RequestImportVCardPermissionsActivity.startPermissionActivityIfNeeded(this)) {
return;
}
diff --git a/src/com/android/contacts/vcard/NfcImportVCardActivity.java b/src/com/android/contacts/vcard/NfcImportVCardActivity.java
index 4eb9b57..b8b76da 100644
--- a/src/com/android/contacts/vcard/NfcImportVCardActivity.java
+++ b/src/com/android/contacts/vcard/NfcImportVCardActivity.java
@@ -170,7 +170,7 @@
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
- if (RequestPermissionsActivity.startPermissionActivity(this)) {
+ if (RequestPermissionsActivity.startPermissionActivityIfNeeded(this)) {
return;
}