Skip to content
Snippets Groups Projects
Unverified Commit cd6d6af7 authored by Fabian-K's avatar Fabian-K Committed by GitHub
Browse files

update camera request permission flow (#382)


* update camera request permission flow
- go back to dispatcher if denied
- directly request permission without rational dialog in between

* - show dialog when camera permission is denied permanently

* removed en/de strings

* removed testing code

* removed de strings

Co-authored-by: default avatarJakob Möller <jakob.moeller@sap.com>
Co-authored-by: default avatarLuka Harambasic <luka.harambasic@sap.com>
Co-authored-by: default avatarharambasicluka <64483219+harambasicluka@users.noreply.github.com>
parent d8e73183
No related branches found
No related tags found
No related merge requests found
package de.rki.coronawarnapp.ui.submission package de.rki.coronawarnapp.ui.submission
import android.Manifest import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
...@@ -38,6 +39,7 @@ class SubmissionQRCodeScanFragment : Fragment() { ...@@ -38,6 +39,7 @@ class SubmissionQRCodeScanFragment : Fragment() {
private val viewModel: SubmissionViewModel by activityViewModels() private val viewModel: SubmissionViewModel by activityViewModels()
private var _binding: FragmentSubmissionQrCodeScanBinding? = null private var _binding: FragmentSubmissionQrCodeScanBinding? = null
private val binding: FragmentSubmissionQrCodeScanBinding get() = _binding!! private val binding: FragmentSubmissionQrCodeScanBinding get() = _binding!!
private var showsPermissionDialog = false
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
...@@ -112,14 +114,6 @@ class SubmissionQRCodeScanFragment : Fragment() { ...@@ -112,14 +114,6 @@ class SubmissionQRCodeScanFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
if (!CameraPermissionHelper.hasCameraPermission(requireActivity())) {
if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {
showCameraPermissionRationaleDialog()
} else {
requestCameraPermission()
}
}
binding.submissionQrCodeScanTorch.setOnCheckedChangeListener { _, isChecked -> binding.submissionQrCodeScanTorch.setOnCheckedChangeListener { _, isChecked ->
binding.submissionQrCodeScanPreview.setTorch( binding.submissionQrCodeScanPreview.setTorch(
isChecked isChecked
...@@ -184,6 +178,25 @@ class SubmissionQRCodeScanFragment : Fragment() { ...@@ -184,6 +178,25 @@ class SubmissionQRCodeScanFragment : Fragment() {
DialogHelper.showDialog(invalidScanDialogInstance) DialogHelper.showDialog(invalidScanDialogInstance)
} }
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray
) {
if (requestCode == REQUEST_CAMERA_PERMISSION_CODE) {
// permission was denied
if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_DENIED)) {
if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {
showCameraPermissionRationaleDialog()
} else {
// user permanently denied access to the camera
showCameraPermissionDeniedDialog()
}
}
}
}
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
binding.submissionQrCodeScanContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) binding.submissionQrCodeScanContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT)
...@@ -191,7 +204,32 @@ class SubmissionQRCodeScanFragment : Fragment() { ...@@ -191,7 +204,32 @@ class SubmissionQRCodeScanFragment : Fragment() {
if (CameraPermissionHelper.hasCameraPermission(requireActivity())) { if (CameraPermissionHelper.hasCameraPermission(requireActivity())) {
binding.submissionQrCodeScanPreview.resume() binding.submissionQrCodeScanPreview.resume()
startDecode() startDecode()
return
} }
// we might already show a rational dialog (e.g. when onRequestPermissionsResult was denied
// then do nothing
if (showsPermissionDialog) {
return
}
requestCameraPermission()
}
private fun showCameraPermissionDeniedDialog() {
val permissionDeniedDialog = DialogHelper.DialogInstance(
requireActivity(),
R.string.submission_qr_code_scan_permission_denied_dialog_headline,
R.string.submission_qr_code_scan_permission_denied_dialog_body,
R.string.submission_qr_code_scan_permission_denied_dialog_button,
cancelable = false,
positiveButtonFunction = {
showsPermissionDialog = false
goBack()
}
)
showsPermissionDialog = true
DialogHelper.showDialog(permissionDeniedDialog)
} }
private fun showCameraPermissionRationaleDialog() { private fun showCameraPermissionRationaleDialog() {
...@@ -203,13 +241,16 @@ class SubmissionQRCodeScanFragment : Fragment() { ...@@ -203,13 +241,16 @@ class SubmissionQRCodeScanFragment : Fragment() {
R.string.submission_qr_code_scan_permission_rationale_dialog_button_negative, R.string.submission_qr_code_scan_permission_rationale_dialog_button_negative,
false, false,
{ {
showsPermissionDialog = false
requestCameraPermission() requestCameraPermission()
}, },
{ {
showsPermissionDialog = false
goBack() goBack()
} }
) )
showsPermissionDialog = true
DialogHelper.showDialog(cameraPermissionRationaleDialogInstance) DialogHelper.showDialog(cameraPermissionRationaleDialogInstance)
} }
......
...@@ -701,6 +701,14 @@ ...@@ -701,6 +701,14 @@
<!-- XBUT: Dialog(QR Scan permission rationale) - negative button (left) --> <!-- XBUT: Dialog(QR Scan permission rationale) - negative button (left) -->
<string name="submission_qr_code_scan_permission_rationale_dialog_button_negative">Nicht erlauben</string> <string name="submission_qr_code_scan_permission_rationale_dialog_button_negative">Nicht erlauben</string>
<!-- Permission Denied Dialog -->
<!-- XHED: Dialog headline QR Scan permission denied -->
<string name="submission_qr_code_scan_permission_denied_dialog_headline">Kamera Zugriff benötigt</string>
<!-- YTXT: Dialog Body text for QR Scan permission denied -->
<string name="submission_qr_code_scan_permission_denied_dialog_body">Bitte gehen Sie in die Systemeinstellungen und erlauben Sie der App die Benutzung der Kamera, um den QR-Code zu scannen.</string>
<!-- XBUT: Dialog(QR Scan permission denied) - button -->
<string name="submission_qr_code_scan_permission_denied_dialog_button">OK</string>
<!-- QR Code Scan Invalid Dialog --> <!-- QR Code Scan Invalid Dialog -->
<!-- XHED: Dialog headline for invalid QR code --> <!-- XHED: Dialog headline for invalid QR code -->
<string name="submission_qr_code_scan_invalid_dialog_headline">QR-Code nicht korrekt</string> <string name="submission_qr_code_scan_invalid_dialog_headline">QR-Code nicht korrekt</string>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment