From 47984597afe8d1de330205c8f1995dcde6855ecc Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 23 Nov 2021 12:01:35 +0100 Subject: [PATCH] Fixed read phone number permission granted in assistant not updating UI --- .../fragments/AbstractPhoneFragment.kt | 13 +++++++--- .../fragments/AccountLoginFragment.kt | 13 +++++++--- .../EchoCancellerCalibrationFragment.kt | 23 +++++++++++------ .../fragments/PhoneAccountCreationFragment.kt | 13 +++++++--- .../fragments/PhoneAccountLinkingFragment.kt | 5 +++- .../assistant/fragments/QrCodeFragment.kt | 25 ++++++++++++------- .../compatibility/Api23Compatibility.kt | 6 +++++ .../compatibility/Api29Compatibility.kt | 5 ---- .../compatibility/Api30Compatibility.kt | 5 ++-- .../linphone/compatibility/Compatibility.kt | 8 +++--- 10 files changed, 79 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/AbstractPhoneFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/AbstractPhoneFragment.kt index 7b92f5652..fbc2db617 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/AbstractPhoneFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/AbstractPhoneFragment.kt @@ -20,6 +20,7 @@ package org.linphone.activities.assistant.fragments +import android.annotation.TargetApi import android.content.pm.PackageManager import androidx.databinding.ViewDataBinding import com.google.android.material.dialog.MaterialAlertDialogBuilder @@ -28,10 +29,15 @@ import org.linphone.activities.GenericFragment import org.linphone.activities.assistant.viewmodels.AbstractPhoneViewModel import org.linphone.compatibility.Compatibility import org.linphone.core.tools.Log +import org.linphone.mediastream.Version import org.linphone.utils.PermissionHelper import org.linphone.utils.PhoneNumberUtils abstract class AbstractPhoneFragment : GenericFragment() { + companion object { + const val READ_PHONE_STATE_PERMISSION_REQUEST_CODE = 0 + } + abstract val viewModel: AbstractPhoneViewModel override fun onRequestPermissionsResult( @@ -39,7 +45,7 @@ abstract class AbstractPhoneFragment : GenericFragment() permissions: Array, grantResults: IntArray ) { - if (requestCode == 0) { + if (requestCode == READ_PHONE_STATE_PERMISSION_REQUEST_CODE) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.i("[Assistant] READ_PHONE_STATE/READ_PHONE_NUMBERS permission granted") updateFromDeviceInfo() @@ -49,11 +55,12 @@ abstract class AbstractPhoneFragment : GenericFragment() } } - protected fun checkPermission() { + @TargetApi(Version.API23_MARSHMALLOW_60) + protected fun checkPermissions() { if (!resources.getBoolean(R.bool.isTablet)) { if (!PermissionHelper.get().hasReadPhoneStateOrPhoneNumbersPermission()) { Log.i("[Assistant] Asking for READ_PHONE_STATE/READ_PHONE_NUMBERS permission") - Compatibility.requestReadPhoneStateOrNumbersPermission(requireActivity(), 0) + Compatibility.requestReadPhoneStateOrNumbersPermission(this, READ_PHONE_STATE_PERMISSION_REQUEST_CODE) } else { updateFromDeviceInfo() } diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/AccountLoginFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/AccountLoginFragment.kt index 1a6e1f264..cfdd675f5 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/AccountLoginFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/AccountLoginFragment.kt @@ -35,6 +35,7 @@ import org.linphone.activities.main.viewmodels.DialogViewModel import org.linphone.activities.navigateToEchoCancellerCalibration import org.linphone.activities.navigateToPhoneAccountValidation import org.linphone.databinding.AssistantAccountLoginFragmentBinding +import org.linphone.mediastream.Version import org.linphone.utils.DialogUtils class AccountLoginFragment : AbstractPhoneFragment() { @@ -52,7 +53,10 @@ class AccountLoginFragment : AbstractPhoneFragment() { + companion object { + const val RECORD_AUDIO_PERMISSION_REQUEST_CODE = 0 + } + private lateinit var viewModel: EchoCancellerCalibrationViewModel override fun getLayoutId(): Int = R.layout.assistant_echo_canceller_calibration_fragment @@ -54,7 +58,7 @@ class EchoCancellerCalibrationFragment : GenericFragment, grantResults: IntArray ) { - val granted = grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED - if (granted) { - Log.i("[Echo Canceller Calibration] RECORD_AUDIO permission granted") - viewModel.startEchoCancellerCalibration() - } else { - Log.w("[Echo Canceller Calibration] RECORD_AUDIO permission denied") - requireActivity().finish() + if (requestCode == RECORD_AUDIO_PERMISSION_REQUEST_CODE) { + val granted = + grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED + if (granted) { + Log.i("[Echo Canceller Calibration] RECORD_AUDIO permission granted") + viewModel.startEchoCancellerCalibration() + } else { + Log.w("[Echo Canceller Calibration] RECORD_AUDIO permission denied") + requireActivity().finish() + } } } } diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountCreationFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountCreationFragment.kt index f396bd059..749ac6449 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountCreationFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountCreationFragment.kt @@ -29,8 +29,10 @@ import org.linphone.activities.assistant.viewmodels.PhoneAccountCreationViewMode import org.linphone.activities.assistant.viewmodels.SharedAssistantViewModel import org.linphone.activities.navigateToPhoneAccountValidation import org.linphone.databinding.AssistantPhoneAccountCreationFragmentBinding +import org.linphone.mediastream.Version -class PhoneAccountCreationFragment : AbstractPhoneFragment() { +class PhoneAccountCreationFragment : + AbstractPhoneFragment() { private lateinit var sharedViewModel: SharedAssistantViewModel override lateinit var viewModel: PhoneAccountCreationViewModel @@ -45,7 +47,10 @@ class PhoneAccountCreationFragment : AbstractPhoneFragment() { private lateinit var sharedViewModel: SharedAssistantViewModel @@ -105,6 +106,8 @@ class PhoneAccountLinkingFragment : AbstractPhoneFragment() { + companion object { + const val CAMERA_PERMISSION_REQUEST_CODE = 0 + } + private lateinit var sharedViewModel: SharedAssistantViewModel private lateinit var viewModel: QrCodeViewModel @@ -64,7 +68,7 @@ class QrCodeFragment : GenericFragment() { if (!PermissionHelper.required(requireContext()).hasCameraPermission()) { Log.i("[QR Code] Asking for CAMERA permission") - requestPermissions(arrayOf(android.Manifest.permission.CAMERA), 0) + requestPermissions(arrayOf(android.Manifest.permission.CAMERA), CAMERA_PERMISSION_REQUEST_CODE) } } @@ -89,14 +93,17 @@ class QrCodeFragment : GenericFragment() { permissions: Array, grantResults: IntArray ) { - val granted = grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED - if (granted) { - Log.i("[QR Code] CAMERA permission granted") - coreContext.core.reloadVideoDevices() - viewModel.setBackCamera() - } else { - Log.w("[QR Code] CAMERA permission denied") - findNavController().navigateUp() + if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) { + val granted = + grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED + if (granted) { + Log.i("[QR Code] CAMERA permission granted") + coreContext.core.reloadVideoDevices() + viewModel.setBackCamera() + } else { + Log.w("[QR Code] CAMERA permission denied") + findNavController().navigateUp() + } } } } diff --git a/app/src/main/java/org/linphone/compatibility/Api23Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api23Compatibility.kt index 080d8f739..4a7505564 100644 --- a/app/src/main/java/org/linphone/compatibility/Api23Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Api23Compatibility.kt @@ -19,10 +19,12 @@ */ package org.linphone.compatibility +import android.Manifest import android.annotation.TargetApi import android.content.Context import android.content.pm.PackageManager import android.provider.Settings +import androidx.fragment.app.Fragment @TargetApi(23) class Api23Compatibility { @@ -31,6 +33,10 @@ class Api23Compatibility { return context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED } + fun requestReadPhoneStatePermission(fragment: Fragment, code: Int) { + fragment.requestPermissions(arrayOf(Manifest.permission.READ_PHONE_STATE), code) + } + fun canDrawOverlay(context: Context): Boolean { return Settings.canDrawOverlays(context) } diff --git a/app/src/main/java/org/linphone/compatibility/Api29Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api29Compatibility.kt index 9ffd1e3ea..1d5c2831c 100644 --- a/app/src/main/java/org/linphone/compatibility/Api29Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Api29Compatibility.kt @@ -21,7 +21,6 @@ package org.linphone.compatibility import android.Manifest import android.annotation.TargetApi -import android.app.Activity import android.app.NotificationChannel import android.app.NotificationManager import android.content.ContentValues @@ -57,10 +56,6 @@ class Api29Compatibility { return granted } - fun requestReadPhoneStatePermission(activity: Activity, code: Int) { - activity.requestPermissions(arrayOf(Manifest.permission.READ_PHONE_STATE), code) - } - fun createMessageChannel( context: Context, notificationManager: NotificationManagerCompat diff --git a/app/src/main/java/org/linphone/compatibility/Api30Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api30Compatibility.kt index 433d4c349..a32a5b4db 100644 --- a/app/src/main/java/org/linphone/compatibility/Api30Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Api30Compatibility.kt @@ -24,6 +24,7 @@ import android.annotation.TargetApi import android.app.Activity import android.content.Context import android.content.pm.ShortcutManager +import androidx.fragment.app.Fragment import org.linphone.core.ChatRoom import org.linphone.core.tools.Log import org.linphone.utils.LinphoneUtils @@ -41,8 +42,8 @@ class Api30Compatibility { return granted } - fun requestReadPhoneNumbersPermission(activity: Activity, code: Int) { - activity.requestPermissions(arrayOf(Manifest.permission.READ_PHONE_NUMBERS), code) + fun requestReadPhoneNumbersPermission(fragment: Fragment, code: Int) { + fragment.requestPermissions(arrayOf(Manifest.permission.READ_PHONE_NUMBERS), code) } fun requestTelecomManagerPermission(activity: Activity, code: Int) { diff --git a/app/src/main/java/org/linphone/compatibility/Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Compatibility.kt index b1dc9d2b5..ca66774c4 100644 --- a/app/src/main/java/org/linphone/compatibility/Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Compatibility.kt @@ -30,6 +30,7 @@ import android.telephony.TelephonyManager import android.view.View import android.view.WindowManager import androidx.core.app.NotificationManagerCompat +import androidx.fragment.app.Fragment import org.linphone.core.ChatRoom import org.linphone.core.Content import org.linphone.mediastream.Version @@ -55,13 +56,14 @@ class Compatibility { } // See https://developer.android.com/about/versions/11/privacy/permissions#phone-numbers - fun requestReadPhoneStateOrNumbersPermission(activity: Activity, code: Int) { + fun requestReadPhoneStateOrNumbersPermission(fragment: Fragment, code: Int) { if (Version.sdkAboveOrEqual(Version.API30_ANDROID_11)) { - Api30Compatibility.requestReadPhoneNumbersPermission(activity, code) + Api30Compatibility.requestReadPhoneNumbersPermission(fragment, code) } else { - Api29Compatibility.requestReadPhoneStatePermission(activity, code) + Api23Compatibility.requestReadPhoneStatePermission(fragment, code) } } + // See https://developer.android.com/about/versions/11/privacy/permissions#phone-numbers fun requestTelecomManagerPermission(activity: Activity, code: Int) { if (Version.sdkAboveOrEqual(Version.API30_ANDROID_11)) {