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
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<T : ViewDataBinding> : GenericFragment<T>() {
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<T : ViewDataBinding> : GenericFragment<T>()
permissions: Array<out String>,
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<T : ViewDataBinding> : GenericFragment<T>()
}
}
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()
}

View file

@ -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<AssistantAccountLoginFragmentBinding>() {
@ -52,7 +53,10 @@ class AccountLoginFragment : AbstractPhoneFragment<AssistantAccountLoginFragment
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
if (resources.getBoolean(R.bool.isTablet)) {
@ -105,7 +109,8 @@ class AccountLoginFragment : AbstractPhoneFragment<AssistantAccountLoginFragment
viewLifecycleOwner,
{
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)
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
class EchoCancellerCalibrationFragment : GenericFragment<AssistantEchoCancellerCalibrationFragmentBinding>() {
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<AssistantEchoCancellerC
if (!PermissionHelper.required(requireContext()).hasRecordAudioPermission()) {
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 {
viewModel.startEchoCancellerCalibration()
}
@ -65,13 +69,16 @@ class EchoCancellerCalibrationFragment : GenericFragment<AssistantEchoCancellerC
permissions: Array<out String>,
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()
}
}
}
}

View file

@ -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<AssistantPhoneAccountCreationFragmentBinding>() {
class PhoneAccountCreationFragment :
AbstractPhoneFragment<AssistantPhoneAccountCreationFragmentBinding>() {
private lateinit var sharedViewModel: SharedAssistantViewModel
override lateinit var viewModel: PhoneAccountCreationViewModel
@ -45,7 +47,10 @@ class PhoneAccountCreationFragment : AbstractPhoneFragment<AssistantPhoneAccount
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.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.core.tools.Log
import org.linphone.databinding.AssistantPhoneAccountLinkingFragmentBinding
import org.linphone.mediastream.Version
class PhoneAccountLinkingFragment : AbstractPhoneFragment<AssistantPhoneAccountLinkingFragmentBinding>() {
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
class QrCodeFragment : GenericFragment<AssistantQrCodeFragmentBinding>() {
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<AssistantQrCodeFragmentBinding>() {
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<AssistantQrCodeFragmentBinding>() {
permissions: Array<out String>,
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()
}
}
}
}

View file

@ -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)
}

View file

@ -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

View file

@ -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) {

View file

@ -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)) {