syncslides: Marshmallow requires dynamic permission requests.

Android 6.0 (Marshmallow) requires that the app ask at runtime
for permission to access the contacts.  This change switches
the code to do that.  Rather than trying to support devices
older than 6.0, the app now requires 6.0.

Changed the build.gradle applicationId to io.v.syncslides23
because one of my devices refused to let me upload an apk
with the old name.  Ugh.

Change-Id: I96bf5f47198a078baf072084747139ef6381bd8d
diff --git a/android/app/build.gradle b/android/app/build.gradle
index a507a38..42f51da 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -29,8 +29,8 @@
         targetCompatibility JavaVersion.VERSION_1_8
     }
     defaultConfig {
-        applicationId "io.v.syncslides"
-        minSdkVersion 22
+        applicationId "io.v.syncslides23"
+        minSdkVersion 23
         targetSdkVersion 23
         versionCode 1
         versionName "1.0"
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 2e8ea3c..e187071 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -3,7 +3,7 @@
     package="io.v.syncslides"
     xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <uses-sdk android:minSdkVersion="22"/>
+    <uses-sdk android:minSdkVersion="23"/>
 
     <!-- SignInActivity has the user select an email address. -->
     <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
diff --git a/android/app/src/main/java/io/v/syncslides/SignInActivity.java b/android/app/src/main/java/io/v/syncslides/SignInActivity.java
index 8fc2adb..40f8a80 100644
--- a/android/app/src/main/java/io/v/syncslides/SignInActivity.java
+++ b/android/app/src/main/java/io/v/syncslides/SignInActivity.java
@@ -4,6 +4,7 @@
 
 package io.v.syncslides;
 
+import android.Manifest;
 import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.accounts.AccountManagerCallback;
@@ -14,6 +15,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
 import android.database.Cursor;
 import android.os.AsyncTask;
 import android.os.Handler;
@@ -51,6 +53,7 @@
 
     private static final int REQUEST_CODE_PICK_ACCOUNT = 1000;
     private static final int REQUEST_CODE_FETCH_USER_PROFILE_APPROVAL = 1001;
+    private static final int REQUEST_CODE_ASK_PERMISSIONS = 1002;
 
     private static final String OAUTH_PROFILE = "email";
     private static final String OAUTH_SCOPE = "oauth2:" + OAUTH_PROFILE;
@@ -108,6 +111,12 @@
         if (mAccountName.isEmpty()) {
             mProgressDialog.setMessage("Signing in...");
             mProgressDialog.show();
+            if (checkSelfPermission(Manifest.permission.READ_CONTACTS) !=
+                    PackageManager.PERMISSION_GRANTED) {
+                requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
+                        REQUEST_CODE_ASK_PERMISSIONS);
+                return;
+            }
             pickAccount();
         } else {
             finishActivity();
@@ -136,6 +145,27 @@
         }
     }
 
+    @Override
+    public void onRequestPermissionsResult(int requestCode, String[] permissions,
+                                           int[] grantResults) {
+        switch (requestCode) {
+            case REQUEST_CODE_ASK_PERMISSIONS:
+                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+                    pickAccount();
+                    return;
+                } else {
+                    Toast.makeText(
+                            this, "Access to contacts required to pick account",
+                            Toast.LENGTH_LONG).show();
+                    requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
+                            REQUEST_CODE_ASK_PERMISSIONS);
+                    return;
+                }
+            default:
+                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+        }
+    }
+
     private void pickAccount() {
         Intent chooseIntent = AccountManager.newChooseAccountIntent(
                 null, null, new String[]{"com.google"}, false, null, null, null, null);