Custom permission handling for vcard importing
Bug: 21029757
Change-Id: I74061f2db5a291b8583009b5f975b37dcd515187
diff --git a/src/com/android/contacts/common/activity/RequestImportVCardPermissionsActivity.java b/src/com/android/contacts/common/activity/RequestImportVCardPermissionsActivity.java
new file mode 100644
index 0000000..a4678f6
--- /dev/null
+++ b/src/com/android/contacts/common/activity/RequestImportVCardPermissionsActivity.java
@@ -0,0 +1,89 @@
+package com.android.contacts.common.activity;
+
+import android.Manifest.permission;
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.Trace;
+
+/**
+ * Activity that requests permissions needed for ImportVCardActivity.
+ */
+public class RequestImportVCardPermissionsActivity extends Activity {
+ public static final String PREVIOUS_ACTIVITY_INTENT = "previous_intent";
+
+ private static final int PERMISSIONS_REQUEST_ALL_PERMISSIONS = 1;
+ private static String[] sPermissions = new String[]{
+ permission.READ_CONTACTS,
+ permission.WRITE_CONTACTS,
+ permission.WRITE_EXTERNAL_STORAGE,
+ };
+
+ private Intent mPreviousActivityIntent;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mPreviousActivityIntent = (Intent) getIntent().getExtras().get(PREVIOUS_ACTIVITY_INTENT);
+ requestPermissions();
+ }
+
+ public static boolean startPermissionActivity(Activity activity) {
+ if (!hasPermissions(activity)) {
+ final Intent intent = new Intent(activity,
+ RequestImportVCardPermissionsActivity.class);
+ intent.putExtra(PREVIOUS_ACTIVITY_INTENT, activity.getIntent());
+ activity.startActivity(intent);
+ activity.finish();
+ return true;
+ }
+ return false;
+ }
+
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, String permissions[],
+ int[] grantResults) {
+ if (isAllGranted(grantResults)) {
+ mPreviousActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
+ startActivity(mPreviousActivityIntent);
+ finish();
+ overridePendingTransition(0, 0);
+ } else {
+ finish();
+ }
+ }
+
+ private boolean isAllGranted(int[] grantResult) {
+ for (int result : grantResult) {
+ if (result != PackageManager.PERMISSION_GRANTED) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void requestPermissions() {
+ Trace.beginSection("requestPermissions");
+ requestPermissions(sPermissions, PERMISSIONS_REQUEST_ALL_PERMISSIONS);
+ Trace.endSection();
+ }
+
+ public static boolean hasPermissions(Context context) {
+ Trace.beginSection("hasPermission");
+ try {
+ for (String permission : sPermissions) {
+ if (context.checkSelfPermission(permission)
+ != PackageManager.PERMISSION_GRANTED) {
+ return false;
+ }
+ }
+ return true;
+ } finally {
+ Trace.endSection();
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/contacts/common/activity/RequestPermissionsActivity.java b/src/com/android/contacts/common/activity/RequestPermissionsActivity.java
index 994f9f5..74cb4a6 100644
--- a/src/com/android/contacts/common/activity/RequestPermissionsActivity.java
+++ b/src/com/android/contacts/common/activity/RequestPermissionsActivity.java
@@ -27,7 +27,14 @@
/**
* Repeatedly ask the user for runtime permissions, until they grant all the permissions.
- * For now only handles activities that are only designed for use in Contacts.
+ * For now this is designed for activities used in Contacts. However, the ImportVCardActivity is
+ * also used in the Dialer. When Dialer begins to support runtime permissions in their app, they
+ * may wish to use a more targeted list of permissions or allow the user to reject using
+ * some permissions.
+ *
+ * At the time of writing this Activity, most permissions cause crashes when not granted.
+ * So it is risky to not possess them.
+ *
*/
public class RequestPermissionsActivity extends Activity {
public static final String PREVIOUS_ACTIVITY_INTENT = "previous_intent";
diff --git a/src/com/android/contacts/common/vcard/ImportVCardActivity.java b/src/com/android/contacts/common/vcard/ImportVCardActivity.java
index 0f12ded..658e65a 100644
--- a/src/com/android/contacts/common/vcard/ImportVCardActivity.java
+++ b/src/com/android/contacts/common/vcard/ImportVCardActivity.java
@@ -46,7 +46,7 @@
import android.widget.Toast;
import com.android.contacts.common.R;
-import com.android.contacts.common.activity.RequestPermissionsActivity;
+import com.android.contacts.common.activity.RequestImportVCardPermissionsActivity;
import com.android.contacts.common.model.AccountTypeManager;
import com.android.contacts.common.model.account.AccountWithDataSet;
import com.android.contacts.common.util.AccountSelectionUtil;
@@ -825,7 +825,7 @@
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
- if (RequestPermissionsActivity.startPermissionActivity(this)) {
+ if (RequestImportVCardPermissionsActivity.startPermissionActivity(this)) {
return;
}