From bf21700e19be24f3fbb5ffa0f91886cd7f4d2e55 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Sun, 29 Jan 2023 23:49:49 -0500 Subject: [PATCH] Get mic permission when setting up dialler integration --- .../ui/ManageAccountActivity.java | 47 +++++++++++++++++-- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/src/cheogram/java/eu/siacs/conversations/ui/ManageAccountActivity.java b/src/cheogram/java/eu/siacs/conversations/ui/ManageAccountActivity.java index 3d08ac4bdd8f301b1917b88939e622482c6c79bb..69bc4206298cbc201136392c51d523cc2ce3e161 100644 --- a/src/cheogram/java/eu/siacs/conversations/ui/ManageAccountActivity.java +++ b/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 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)) {