Improved permission request in-app when it has already been denied once

This commit is contained in:
Sylvain Berfini 2025-01-21 17:27:44 +01:00
parent ec9984c86b
commit d05da148e7
7 changed files with 63 additions and 45 deletions

View file

@ -20,9 +20,12 @@
package org.linphone.ui
import android.annotation.SuppressLint
import android.content.Intent
import android.content.res.Configuration
import android.content.res.Resources
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import android.view.ViewGroup
import android.view.WindowManager
import androidx.annotation.DrawableRes
@ -219,6 +222,19 @@ open class GenericActivity : AppCompatActivity() {
}
}
fun goToAndroidPermissionSettings() {
Log.i("$TAG Going into Android settings for our app")
val intent = Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts(
"package",
packageName, null
)
)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
}
private fun enableWindowSecureMode(enable: Boolean) {
val flags: Int = window.attributes.flags
if ((enable && flags and WindowManager.LayoutParams.FLAG_SECURE != 0) ||

View file

@ -27,6 +27,7 @@ import android.view.View
import android.view.ViewGroup
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.UiThread
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.navigation.fragment.findNavController
import androidx.navigation.navGraphViewModels
@ -96,8 +97,13 @@ class QrCodeScannerFragment : GenericFragment() {
}
if (!isCameraPermissionGranted()) {
Log.w("$TAG CAMERA permission wasn't granted yet, asking for it now")
requestPermissionLauncher.launch(Manifest.permission.CAMERA)
if (ActivityCompat.shouldShowRequestPermissionRationale(requireActivity(), Manifest.permission.CAMERA)) {
Log.w("$TAG CAMERA permission wasn't granted yet, asking for it now")
requestPermissionLauncher.launch(Manifest.permission.CAMERA)
} else {
Log.i("$TAG Permission request for CAMERA will be automatically denied, go to android app settings instead")
(requireActivity() as GenericActivity).goToAndroidPermissionSettings()
}
}
}

View file

@ -24,10 +24,8 @@ import android.content.Intent
import android.content.pm.PackageManager
import android.content.res.Resources
import android.graphics.Color
import android.net.Uri
import android.os.Bundle
import android.os.PowerManager
import android.provider.Settings
import androidx.activity.SystemBarStyle
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.contract.ActivityResultContracts
@ -96,7 +94,6 @@ class CallActivity : GenericActivity() {
callViewModel.toggleVideo()
} else {
Log.e("$TAG CAMERA permission has been denied")
goToAndroidPermissionSettings()
}
}
@ -108,7 +105,6 @@ class CallActivity : GenericActivity() {
callViewModel.toggleMuteMicrophone()
} else {
Log.e("$TAG RECORD_AUDIO permission has been denied")
goToAndroidPermissionSettings()
}
}
@ -249,15 +245,25 @@ class CallActivity : GenericActivity() {
callViewModel.requestRecordAudioPermission.observe(this) {
it.consume {
Log.w("$TAG Asking for RECORD_AUDIO permission")
requestRecordAudioPermissionLauncher.launch(Manifest.permission.RECORD_AUDIO)
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) {
Log.w("$TAG Asking for RECORD_AUDIO permission")
requestRecordAudioPermissionLauncher.launch(Manifest.permission.RECORD_AUDIO)
} else {
Log.i("$TAG Permission request for RECORD_AUDIO will be automatically denied, go to android app settings instead")
goToAndroidPermissionSettings()
}
}
}
callViewModel.requestCameraPermission.observe(this) {
it.consume {
Log.w("$TAG Asking for CAMERA permission")
requestCameraPermissionLauncher.launch(Manifest.permission.CAMERA)
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
Log.w("$TAG Asking for CAMERA permission")
requestCameraPermissionLauncher.launch(Manifest.permission.CAMERA)
} else {
Log.i("$TAG Permission request for CAMERA will be automatically denied, go to android app settings instead")
goToAndroidPermissionSettings()
}
}
}
@ -551,17 +557,4 @@ class CallActivity : GenericActivity() {
proximityWakeLock.release(PowerManager.RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY)
}
}
private fun goToAndroidPermissionSettings() {
Log.i("$TAG Going into Android settings for our app")
val intent = Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts(
"package",
packageName, null
)
)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
}
}

View file

@ -37,6 +37,7 @@ import androidx.activity.enableEdgeToEdge
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.UiThread
import androidx.car.app.connection.CarConnection
import androidx.core.app.ActivityCompat
import androidx.core.os.bundleOf
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.core.view.ViewCompat
@ -188,7 +189,13 @@ class MainActivity : GenericActivity() {
viewModel.askPostNotificationsPermissionEvent.observe(this) {
it.consume {
postNotificationsPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.POST_NOTIFICATIONS)) {
Log.w("$TAG Asking for POST_NOTIFICATIONS permission")
postNotificationsPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
} else {
Log.i("$TAG Permission request for POST_NOTIFICATIONS will be automatically denied, go to android app settings instead")
goToAndroidPermissionSettings()
}
}
}

View file

@ -723,8 +723,14 @@ open class ConversationFragment : SlidingPaneChildFragment() {
sendMessageViewModel.askRecordAudioPermissionEvent.observe(viewLifecycleOwner) {
it.consume {
Log.w("$TAG Asking for RECORD_AUDIO permission")
requestRecordAudioPermissionLauncher.launch(Manifest.permission.RECORD_AUDIO)
if (ActivityCompat.shouldShowRequestPermissionRationale(requireActivity(), Manifest.permission.RECORD_AUDIO)) {
Log.w("$TAG Asking for RECORD_AUDIO permission")
requestRecordAudioPermissionLauncher.launch(Manifest.permission.RECORD_AUDIO)
} else {
Log.i("$TAG Permission request for RECORD_AUDIO will be automatically denied, go to android app settings instead")
(requireActivity() as GenericActivity).goToAndroidPermissionSettings()
}
}
}

View file

@ -27,6 +27,7 @@ import android.view.View
import android.view.ViewGroup
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.UiThread
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController
@ -143,8 +144,13 @@ class MeetingWaitingRoomFragment : GenericMainFragment() {
if (!isCameraPermissionGranted()) {
viewModel.isVideoAvailable.value = false
Log.w("$TAG CAMERA permission wasn't granted yet, asking for it now")
requestPermissionLauncher.launch(Manifest.permission.CAMERA)
if (ActivityCompat.shouldShowRequestPermissionRationale(requireActivity(), Manifest.permission.CAMERA)) {
Log.w("$TAG CAMERA permission wasn't granted yet, asking for it now")
requestPermissionLauncher.launch(Manifest.permission.CAMERA)
} else {
Log.i("$TAG Permission request for CAMERA will be automatically denied, go to android app settings instead")
(requireActivity() as GenericActivity).goToAndroidPermissionSettings()
}
}
}

View file

@ -19,10 +19,7 @@
*/
package org.linphone.ui.main.settings.fragment
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@ -31,8 +28,8 @@ import android.widget.ArrayAdapter
import androidx.annotation.UiThread
import androidx.lifecycle.ViewModelProvider
import org.linphone.R
import org.linphone.core.tools.Log
import org.linphone.databinding.SettingsAdvancedFragmentBinding
import org.linphone.ui.GenericActivity
import org.linphone.ui.main.fragment.GenericMainFragment
import org.linphone.ui.main.settings.viewmodel.SettingsViewModel
@ -97,7 +94,7 @@ class SettingsAdvancedFragment : GenericMainFragment() {
}
binding.setAndroidSettingsClickListener {
goToAndroidPermissionSettings()
(requireActivity() as GenericActivity).goToAndroidPermissionSettings()
}
viewModel.mediaEncryptionIndex.observe(viewLifecycleOwner) {
@ -161,17 +158,4 @@ class SettingsAdvancedFragment : GenericMainFragment() {
binding.outputAudioDevice.onItemSelectedListener = outputAudioDeviceDropdownListener
binding.outputAudioDevice.setSelection(index)
}
private fun goToAndroidPermissionSettings() {
Log.i("$TAG Going into Android settings for our app")
val intent = Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts(
"package",
requireContext().packageName, null
)
)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
}
}