Fixed read phone number permission granted in assistant not updating UI

This commit is contained in:
Sylvain Berfini 2021-11-23 12:01:35 +01:00
parent 613a7558f8
commit 47984597af
10 changed files with 79 additions and 37 deletions

View file

@ -20,6 +20,7 @@
package org.linphone.activities.assistant.fragments package org.linphone.activities.assistant.fragments
import android.annotation.TargetApi
import android.content.pm.PackageManager import android.content.pm.PackageManager
import androidx.databinding.ViewDataBinding import androidx.databinding.ViewDataBinding
import com.google.android.material.dialog.MaterialAlertDialogBuilder 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.activities.assistant.viewmodels.AbstractPhoneViewModel
import org.linphone.compatibility.Compatibility import org.linphone.compatibility.Compatibility
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
import org.linphone.mediastream.Version
import org.linphone.utils.PermissionHelper import org.linphone.utils.PermissionHelper
import org.linphone.utils.PhoneNumberUtils import org.linphone.utils.PhoneNumberUtils
abstract class AbstractPhoneFragment<T : ViewDataBinding> : GenericFragment<T>() { abstract class AbstractPhoneFragment<T : ViewDataBinding> : GenericFragment<T>() {
companion object {
const val READ_PHONE_STATE_PERMISSION_REQUEST_CODE = 0
}
abstract val viewModel: AbstractPhoneViewModel abstract val viewModel: AbstractPhoneViewModel
override fun onRequestPermissionsResult( override fun onRequestPermissionsResult(
@ -39,7 +45,7 @@ abstract class AbstractPhoneFragment<T : ViewDataBinding> : GenericFragment<T>()
permissions: Array<out String>, permissions: Array<out String>,
grantResults: IntArray grantResults: IntArray
) { ) {
if (requestCode == 0) { if (requestCode == READ_PHONE_STATE_PERMISSION_REQUEST_CODE) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.i("[Assistant] READ_PHONE_STATE/READ_PHONE_NUMBERS permission granted") Log.i("[Assistant] READ_PHONE_STATE/READ_PHONE_NUMBERS permission granted")
updateFromDeviceInfo() updateFromDeviceInfo()
@ -49,11 +55,12 @@ abstract class AbstractPhoneFragment<T : ViewDataBinding> : GenericFragment<T>()
} }
} }
protected fun checkPermission() { @TargetApi(Version.API23_MARSHMALLOW_60)
protected fun checkPermissions() {
if (!resources.getBoolean(R.bool.isTablet)) { if (!resources.getBoolean(R.bool.isTablet)) {
if (!PermissionHelper.get().hasReadPhoneStateOrPhoneNumbersPermission()) { if (!PermissionHelper.get().hasReadPhoneStateOrPhoneNumbersPermission()) {
Log.i("[Assistant] Asking for READ_PHONE_STATE/READ_PHONE_NUMBERS permission") 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 { } else {
updateFromDeviceInfo() updateFromDeviceInfo()
} }

View file

@ -35,6 +35,7 @@ import org.linphone.activities.main.viewmodels.DialogViewModel
import org.linphone.activities.navigateToEchoCancellerCalibration import org.linphone.activities.navigateToEchoCancellerCalibration
import org.linphone.activities.navigateToPhoneAccountValidation import org.linphone.activities.navigateToPhoneAccountValidation
import org.linphone.databinding.AssistantAccountLoginFragmentBinding import org.linphone.databinding.AssistantAccountLoginFragmentBinding
import org.linphone.mediastream.Version
import org.linphone.utils.DialogUtils import org.linphone.utils.DialogUtils
class AccountLoginFragment : AbstractPhoneFragment<AssistantAccountLoginFragmentBinding>() { class AccountLoginFragment : AbstractPhoneFragment<AssistantAccountLoginFragmentBinding>() {
@ -52,7 +53,10 @@ class AccountLoginFragment : AbstractPhoneFragment<AssistantAccountLoginFragment
ViewModelProvider(this)[SharedAssistantViewModel::class.java] ViewModelProvider(this)[SharedAssistantViewModel::class.java]
} }
viewModel = ViewModelProvider(this, AccountLoginViewModelFactory(sharedViewModel.getAccountCreator()))[AccountLoginViewModel::class.java] viewModel = ViewModelProvider(
this,
AccountLoginViewModelFactory(sharedViewModel.getAccountCreator())
)[AccountLoginViewModel::class.java]
binding.viewModel = viewModel binding.viewModel = viewModel
if (resources.getBoolean(R.bool.isTablet)) { if (resources.getBoolean(R.bool.isTablet)) {
@ -105,7 +109,8 @@ class AccountLoginFragment : AbstractPhoneFragment<AssistantAccountLoginFragment
viewLifecycleOwner, viewLifecycleOwner,
{ {
it.consume { it.consume {
val dialogViewModel = DialogViewModel(getString(R.string.assistant_error_invalid_credentials)) val dialogViewModel =
DialogViewModel(getString(R.string.assistant_error_invalid_credentials))
val dialog: Dialog = DialogUtils.getDialog(requireContext(), dialogViewModel) val dialog: Dialog = DialogUtils.getDialog(requireContext(), dialogViewModel)
dialogViewModel.showCancelButton { dialogViewModel.showCancelButton {
@ -135,6 +140,8 @@ class AccountLoginFragment : AbstractPhoneFragment<AssistantAccountLoginFragment
} }
) )
checkPermission() if (Version.sdkAboveOrEqual(Version.API23_MARSHMALLOW_60)) {
checkPermissions()
}
} }
} }

View file

@ -31,6 +31,10 @@ import org.linphone.databinding.AssistantEchoCancellerCalibrationFragmentBinding
import org.linphone.utils.PermissionHelper import org.linphone.utils.PermissionHelper
class EchoCancellerCalibrationFragment : GenericFragment<AssistantEchoCancellerCalibrationFragmentBinding>() { class EchoCancellerCalibrationFragment : GenericFragment<AssistantEchoCancellerCalibrationFragmentBinding>() {
companion object {
const val RECORD_AUDIO_PERMISSION_REQUEST_CODE = 0
}
private lateinit var viewModel: EchoCancellerCalibrationViewModel private lateinit var viewModel: EchoCancellerCalibrationViewModel
override fun getLayoutId(): Int = R.layout.assistant_echo_canceller_calibration_fragment override fun getLayoutId(): Int = R.layout.assistant_echo_canceller_calibration_fragment
@ -54,7 +58,7 @@ class EchoCancellerCalibrationFragment : GenericFragment<AssistantEchoCancellerC
if (!PermissionHelper.required(requireContext()).hasRecordAudioPermission()) { if (!PermissionHelper.required(requireContext()).hasRecordAudioPermission()) {
Log.i("[Echo Canceller Calibration] Asking for RECORD_AUDIO permission") Log.i("[Echo Canceller Calibration] Asking for RECORD_AUDIO permission")
requestPermissions(arrayOf(android.Manifest.permission.RECORD_AUDIO), 0) requestPermissions(arrayOf(android.Manifest.permission.RECORD_AUDIO), RECORD_AUDIO_PERMISSION_REQUEST_CODE)
} else { } else {
viewModel.startEchoCancellerCalibration() viewModel.startEchoCancellerCalibration()
} }
@ -65,7 +69,9 @@ class EchoCancellerCalibrationFragment : GenericFragment<AssistantEchoCancellerC
permissions: Array<out String>, permissions: Array<out String>,
grantResults: IntArray grantResults: IntArray
) { ) {
val granted = grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED if (requestCode == RECORD_AUDIO_PERMISSION_REQUEST_CODE) {
val granted =
grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED
if (granted) { if (granted) {
Log.i("[Echo Canceller Calibration] RECORD_AUDIO permission granted") Log.i("[Echo Canceller Calibration] RECORD_AUDIO permission granted")
viewModel.startEchoCancellerCalibration() viewModel.startEchoCancellerCalibration()
@ -74,4 +80,5 @@ class EchoCancellerCalibrationFragment : GenericFragment<AssistantEchoCancellerC
requireActivity().finish() requireActivity().finish()
} }
} }
}
} }

View file

@ -29,8 +29,10 @@ import org.linphone.activities.assistant.viewmodels.PhoneAccountCreationViewMode
import org.linphone.activities.assistant.viewmodels.SharedAssistantViewModel import org.linphone.activities.assistant.viewmodels.SharedAssistantViewModel
import org.linphone.activities.navigateToPhoneAccountValidation import org.linphone.activities.navigateToPhoneAccountValidation
import org.linphone.databinding.AssistantPhoneAccountCreationFragmentBinding import org.linphone.databinding.AssistantPhoneAccountCreationFragmentBinding
import org.linphone.mediastream.Version
class PhoneAccountCreationFragment : AbstractPhoneFragment<AssistantPhoneAccountCreationFragmentBinding>() { class PhoneAccountCreationFragment :
AbstractPhoneFragment<AssistantPhoneAccountCreationFragmentBinding>() {
private lateinit var sharedViewModel: SharedAssistantViewModel private lateinit var sharedViewModel: SharedAssistantViewModel
override lateinit var viewModel: PhoneAccountCreationViewModel override lateinit var viewModel: PhoneAccountCreationViewModel
@ -45,7 +47,10 @@ class PhoneAccountCreationFragment : AbstractPhoneFragment<AssistantPhoneAccount
ViewModelProvider(this)[SharedAssistantViewModel::class.java] ViewModelProvider(this)[SharedAssistantViewModel::class.java]
} }
viewModel = ViewModelProvider(this, PhoneAccountCreationViewModelFactory(sharedViewModel.getAccountCreator()))[PhoneAccountCreationViewModel::class.java] viewModel = ViewModelProvider(
this,
PhoneAccountCreationViewModelFactory(sharedViewModel.getAccountCreator())
)[PhoneAccountCreationViewModel::class.java]
binding.viewModel = viewModel binding.viewModel = viewModel
binding.setInfoClickListener { binding.setInfoClickListener {
@ -77,6 +82,8 @@ class PhoneAccountCreationFragment : AbstractPhoneFragment<AssistantPhoneAccount
} }
) )
checkPermission() if (Version.sdkAboveOrEqual(Version.API23_MARSHMALLOW_60)) {
checkPermissions()
}
} }
} }

View file

@ -30,6 +30,7 @@ import org.linphone.activities.navigateToEchoCancellerCalibration
import org.linphone.activities.navigateToPhoneAccountValidation import org.linphone.activities.navigateToPhoneAccountValidation
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
import org.linphone.databinding.AssistantPhoneAccountLinkingFragmentBinding import org.linphone.databinding.AssistantPhoneAccountLinkingFragmentBinding
import org.linphone.mediastream.Version
class PhoneAccountLinkingFragment : AbstractPhoneFragment<AssistantPhoneAccountLinkingFragmentBinding>() { class PhoneAccountLinkingFragment : AbstractPhoneFragment<AssistantPhoneAccountLinkingFragmentBinding>() {
private lateinit var sharedViewModel: SharedAssistantViewModel private lateinit var sharedViewModel: SharedAssistantViewModel
@ -105,6 +106,8 @@ class PhoneAccountLinkingFragment : AbstractPhoneFragment<AssistantPhoneAccountL
} }
) )
checkPermission() if (Version.sdkAboveOrEqual(Version.API23_MARSHMALLOW_60)) {
checkPermissions()
}
} }
} }

View file

@ -34,6 +34,10 @@ import org.linphone.databinding.AssistantQrCodeFragmentBinding
import org.linphone.utils.PermissionHelper import org.linphone.utils.PermissionHelper
class QrCodeFragment : GenericFragment<AssistantQrCodeFragmentBinding>() { class QrCodeFragment : GenericFragment<AssistantQrCodeFragmentBinding>() {
companion object {
const val CAMERA_PERMISSION_REQUEST_CODE = 0
}
private lateinit var sharedViewModel: SharedAssistantViewModel private lateinit var sharedViewModel: SharedAssistantViewModel
private lateinit var viewModel: QrCodeViewModel private lateinit var viewModel: QrCodeViewModel
@ -64,7 +68,7 @@ class QrCodeFragment : GenericFragment<AssistantQrCodeFragmentBinding>() {
if (!PermissionHelper.required(requireContext()).hasCameraPermission()) { if (!PermissionHelper.required(requireContext()).hasCameraPermission()) {
Log.i("[QR Code] Asking for CAMERA permission") 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,7 +93,9 @@ class QrCodeFragment : GenericFragment<AssistantQrCodeFragmentBinding>() {
permissions: Array<out String>, permissions: Array<out String>,
grantResults: IntArray grantResults: IntArray
) { ) {
val granted = grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {
val granted =
grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED
if (granted) { if (granted) {
Log.i("[QR Code] CAMERA permission granted") Log.i("[QR Code] CAMERA permission granted")
coreContext.core.reloadVideoDevices() coreContext.core.reloadVideoDevices()
@ -99,4 +105,5 @@ class QrCodeFragment : GenericFragment<AssistantQrCodeFragmentBinding>() {
findNavController().navigateUp() findNavController().navigateUp()
} }
} }
}
} }

View file

@ -19,10 +19,12 @@
*/ */
package org.linphone.compatibility package org.linphone.compatibility
import android.Manifest
import android.annotation.TargetApi import android.annotation.TargetApi
import android.content.Context import android.content.Context
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.provider.Settings import android.provider.Settings
import androidx.fragment.app.Fragment
@TargetApi(23) @TargetApi(23)
class Api23Compatibility { class Api23Compatibility {
@ -31,6 +33,10 @@ class Api23Compatibility {
return context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED 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 { fun canDrawOverlay(context: Context): Boolean {
return Settings.canDrawOverlays(context) return Settings.canDrawOverlays(context)
} }

View file

@ -21,7 +21,6 @@ package org.linphone.compatibility
import android.Manifest import android.Manifest
import android.annotation.TargetApi import android.annotation.TargetApi
import android.app.Activity
import android.app.NotificationChannel import android.app.NotificationChannel
import android.app.NotificationManager import android.app.NotificationManager
import android.content.ContentValues import android.content.ContentValues
@ -57,10 +56,6 @@ class Api29Compatibility {
return granted return granted
} }
fun requestReadPhoneStatePermission(activity: Activity, code: Int) {
activity.requestPermissions(arrayOf(Manifest.permission.READ_PHONE_STATE), code)
}
fun createMessageChannel( fun createMessageChannel(
context: Context, context: Context,
notificationManager: NotificationManagerCompat notificationManager: NotificationManagerCompat

View file

@ -24,6 +24,7 @@ import android.annotation.TargetApi
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.content.pm.ShortcutManager import android.content.pm.ShortcutManager
import androidx.fragment.app.Fragment
import org.linphone.core.ChatRoom import org.linphone.core.ChatRoom
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
import org.linphone.utils.LinphoneUtils import org.linphone.utils.LinphoneUtils
@ -41,8 +42,8 @@ class Api30Compatibility {
return granted return granted
} }
fun requestReadPhoneNumbersPermission(activity: Activity, code: Int) { fun requestReadPhoneNumbersPermission(fragment: Fragment, code: Int) {
activity.requestPermissions(arrayOf(Manifest.permission.READ_PHONE_NUMBERS), code) fragment.requestPermissions(arrayOf(Manifest.permission.READ_PHONE_NUMBERS), code)
} }
fun requestTelecomManagerPermission(activity: Activity, code: Int) { fun requestTelecomManagerPermission(activity: Activity, code: Int) {

View file

@ -30,6 +30,7 @@ import android.telephony.TelephonyManager
import android.view.View import android.view.View
import android.view.WindowManager import android.view.WindowManager
import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat
import androidx.fragment.app.Fragment
import org.linphone.core.ChatRoom import org.linphone.core.ChatRoom
import org.linphone.core.Content import org.linphone.core.Content
import org.linphone.mediastream.Version import org.linphone.mediastream.Version
@ -55,13 +56,14 @@ class Compatibility {
} }
// See https://developer.android.com/about/versions/11/privacy/permissions#phone-numbers // 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)) { if (Version.sdkAboveOrEqual(Version.API30_ANDROID_11)) {
Api30Compatibility.requestReadPhoneNumbersPermission(activity, code) Api30Compatibility.requestReadPhoneNumbersPermission(fragment, code)
} else { } else {
Api29Compatibility.requestReadPhoneStatePermission(activity, code) Api23Compatibility.requestReadPhoneStatePermission(fragment, code)
} }
} }
// See https://developer.android.com/about/versions/11/privacy/permissions#phone-numbers // See https://developer.android.com/about/versions/11/privacy/permissions#phone-numbers
fun requestTelecomManagerPermission(activity: Activity, code: Int) { fun requestTelecomManagerPermission(activity: Activity, code: Int) {
if (Version.sdkAboveOrEqual(Version.API30_ANDROID_11)) { if (Version.sdkAboveOrEqual(Version.API30_ANDROID_11)) {