Fixed read phone number permission granted in assistant not updating UI
This commit is contained in:
parent
613a7558f8
commit
47984597af
10 changed files with 79 additions and 37 deletions
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
@ -75,3 +81,4 @@ class EchoCancellerCalibrationFragment : GenericFragment<AssistantEchoCancellerC
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
@ -100,3 +106,4 @@ class QrCodeFragment : GenericFragment<AssistantQrCodeFragmentBinding>() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
Loading…
Reference in a new issue