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