Get mic permission when setting up dialler integration

Stephen Paul Weber created

Change summary

src/cheogram/java/eu/siacs/conversations/ui/ManageAccountActivity.java | 47 
1 file changed, 42 insertions(+), 5 deletions(-)

Detailed changes

src/cheogram/java/eu/siacs/conversations/ui/ManageAccountActivity.java 🔗

@@ -1,8 +1,10 @@
 package eu.siacs.conversations.ui;
 
+import android.Manifest;
 import android.content.ActivityNotFoundException;
 import android.content.ComponentName;
 import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.os.Build;
 import android.os.Bundle;
 import android.security.KeyChain;
@@ -46,6 +48,7 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
     private final String STATE_SELECTED_ACCOUNT = "selected_account";
 
     private static final int REQUEST_IMPORT_BACKUP = 0x63fb;
+    private static final int REQUEST_MICROPHONE = 0x63fb1;
 
     protected Account selectedAccount = null;
     protected Jid selectedAccountJid = null;
@@ -54,6 +57,7 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
     protected ListView accountListView;
     protected AccountAdapter mAccountAdapter;
     protected AtomicBoolean mInvokedAddAccount = new AtomicBoolean(false);
+    protected Intent mMicIntent = null;
 
     protected Pair<Integer, Intent> mPostponedActivityResult = null;
 
@@ -78,13 +82,14 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
 
         findViewById(R.id.phone_accounts).setVisibility(View.GONE);
         findViewById(R.id.phone_accounts).setOnClickListener((View v) -> {
-            Intent intent = new Intent();
-            intent.setComponent(new ComponentName("com.android.server.telecom",
+            mMicIntent = new Intent();
+            mMicIntent.setComponent(new ComponentName("com.android.server.telecom",
                 "com.android.server.telecom.settings.EnableAccountPreferenceActivity"));
-            startActivity(intent);
+            requestMicPermission();
         });
         findViewById(R.id.phone_accounts_settings).setOnClickListener((View v) -> {
-            startActivity(new Intent(android.telecom.TelecomManager.ACTION_CHANGE_PHONE_ACCOUNTS));
+            mMicIntent = new Intent(android.telecom.TelecomManager.ACTION_CHANGE_PHONE_ACCOUNTS);
+            requestMicPermission();
         });
 
         if (Build.VERSION.SDK_INT < 23) return;
@@ -251,18 +256,50 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
         return super.onOptionsItemSelected(item);
     }
 
+    private void requestMicPermission() {
+        final String[] permissions;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+            permissions = new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.BLUETOOTH_CONNECT};
+        } else {
+            permissions = new String[]{Manifest.permission.RECORD_AUDIO};
+        }
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            if (checkSelfPermission(Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED && shouldShowRequestPermissionRationale(Manifest.permission.RECORD_AUDIO)) {
+                final AlertDialog.Builder builder = new AlertDialog.Builder(this);
+                builder.setTitle("Dialler Integration");
+                builder.setMessage("You will be asked to grant microphone permission, which is needed for the dialler integration to function.");
+                builder.setPositiveButton("I Understand", (dialog, which) -> {
+                    requestPermissions(permissions, REQUEST_MICROPHONE);
+                });
+                builder.setCancelable(true);
+                final AlertDialog dialog = builder.create();
+                dialog.setCanceledOnTouchOutside(true);
+                dialog.show();
+            } else {
+                requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_MICROPHONE);
+            }
+        }
+    }
 
     @Override
     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
         if (grantResults.length > 0) {
             if (allGranted(grantResults)) {
                 switch (requestCode) {
+                    case REQUEST_MICROPHONE:
+                        startActivity(mMicIntent);
+                        mMicIntent = null;
+                        return;
                     case REQUEST_IMPORT_BACKUP:
                         startActivity(new Intent(this, ImportBackupActivity.class));
                         break;
                 }
             } else {
-                Toast.makeText(this, R.string.no_storage_permission, Toast.LENGTH_SHORT).show();
+                if (requestCode == REQUEST_MICROPHONE) {
+                    Toast.makeText(this, "Microphone access was denied", Toast.LENGTH_SHORT).show();
+                } else {
+                    Toast.makeText(this, R.string.no_storage_permission, Toast.LENGTH_SHORT).show();
+                }
             }
         }
         if (writeGranted(grantResults, permissions)) {