diff --git a/app/src/main/java/org/linphone/ui/GenericActivity.kt b/app/src/main/java/org/linphone/ui/GenericActivity.kt index 5ab9172a9..6f82a5992 100644 --- a/app/src/main/java/org/linphone/ui/GenericActivity.kt +++ b/app/src/main/java/org/linphone/ui/GenericActivity.kt @@ -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) || diff --git a/app/src/main/java/org/linphone/ui/assistant/fragment/QrCodeScannerFragment.kt b/app/src/main/java/org/linphone/ui/assistant/fragment/QrCodeScannerFragment.kt index c8ef57958..e11e3201c 100644 --- a/app/src/main/java/org/linphone/ui/assistant/fragment/QrCodeScannerFragment.kt +++ b/app/src/main/java/org/linphone/ui/assistant/fragment/QrCodeScannerFragment.kt @@ -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() + } } } diff --git a/app/src/main/java/org/linphone/ui/call/CallActivity.kt b/app/src/main/java/org/linphone/ui/call/CallActivity.kt index 9f939d959..f4523570d 100644 --- a/app/src/main/java/org/linphone/ui/call/CallActivity.kt +++ b/app/src/main/java/org/linphone/ui/call/CallActivity.kt @@ -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) - } } diff --git a/app/src/main/java/org/linphone/ui/main/MainActivity.kt b/app/src/main/java/org/linphone/ui/main/MainActivity.kt index 0885cb902..cdf83555f 100644 --- a/app/src/main/java/org/linphone/ui/main/MainActivity.kt +++ b/app/src/main/java/org/linphone/ui/main/MainActivity.kt @@ -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() + } } } diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt index ab46b938a..c6105c347 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt @@ -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() + } } } diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt index acdeff2c7..3c035cd98 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt @@ -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() + } } } diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsAdvancedFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsAdvancedFragment.kt index af9538b31..92a310759 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsAdvancedFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsAdvancedFragment.kt @@ -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) - } }