@@ -2,7 +2,9 @@ package ca.bc.gov.vaxcheck.ui.scanner
22
33import android.Manifest
44import android.content.Context
5+ import android.content.Intent
56import android.content.pm.PackageManager
7+ import android.net.Uri
68import android.os.Bundle
79import android.util.Size
810import android.view.View
@@ -29,6 +31,7 @@ import ca.bc.gov.vaxcheck.barcodeanalyzer.ScanningResultListener
2931import ca.bc.gov.vaxcheck.databinding.FragmentBarcodeScannerBinding
3032import ca.bc.gov.vaxcheck.model.ImmunizationStatus
3133import ca.bc.gov.vaxcheck.utils.readJsonFromAsset
34+ import ca.bc.gov.vaxcheck.utils.setSpannableLink
3235import ca.bc.gov.vaxcheck.utils.viewBindings
3336import ca.bc.gov.vaxcheck.viewmodel.BarcodeScanResultViewModel
3437import ca.bc.gov.vaxcheck.viewmodel.SharedViewModel
@@ -72,9 +75,7 @@ class BarcodeScannerFragment : Fragment(R.layout.fragment_barcode_scanner), Scan
7275 if (isGranted) {
7376 setUpCamera()
7477 } else {
75- // TODO: Add Optional screen that explain why your app require permission
76- // For now closing the app
77- findNavController().popBackStack()
78+ showRationalDialog()
7879 }
7980 }
8081 }
@@ -111,7 +112,9 @@ class BarcodeScannerFragment : Fragment(R.layout.fragment_barcode_scanner), Scan
111112 ImmunizationStatus .FULLY_IMMUNIZED ,
112113 ImmunizationStatus .PARTIALLY_IMMUNIZED -> {
113114 sharedViewModel.setStatus(status)
114- findNavController().navigate(R .id.action_barcodeScannerFragment_to_barcodeScanResultFragment)
115+ findNavController().navigate(
116+ R .id.action_barcodeScannerFragment_to_barcodeScanResultFragment
117+ )
115118 }
116119
117120 ImmunizationStatus .INVALID_QR_CODE -> {
@@ -123,6 +126,11 @@ class BarcodeScannerFragment : Fragment(R.layout.fragment_barcode_scanner), Scan
123126
124127 }
125128
129+ binding.txtPrivacyPolicy.setSpannableLink {
130+ val uri = Uri .parse(" https://www2.gov.bc.ca/gov/content/covid-19/vaccine/proof/businesses#app-privacy-policy" )
131+ val intent = Intent (Intent .ACTION_VIEW , uri)
132+ requireContext().startActivity(intent)
133+ }
126134 }
127135
128136 override fun onDestroyView () {
@@ -163,9 +171,12 @@ class BarcodeScannerFragment : Fragment(R.layout.fragment_barcode_scanner), Scan
163171 private fun showRationalDialog () {
164172 MaterialAlertDialogBuilder (requireContext())
165173 .setTitle(getString(R .string.bc_permission_required_title))
174+ .setCancelable(false )
166175 .setMessage(getString(R .string.bc_permission_message))
167176 .setNegativeButton(getString(R .string.exit)) { dialog, which ->
168- findNavController().popBackStack()
177+ if (! findNavController().popBackStack() || ! findNavController().navigateUp()) {
178+ requireActivity().finish()
179+ }
169180 dialog.dismiss()
170181 }
171182 .show()
@@ -193,31 +204,52 @@ class BarcodeScannerFragment : Fragment(R.layout.fragment_barcode_scanner), Scan
193204 .requireLensFacing(CameraSelector .LENS_FACING_BACK )
194205 .build()
195206
196- val resolution = Size (
197- binding.scannerPreview.width,
198- binding.scannerPreview.height
199- )
200- val preview = Preview .Builder ()
201- .apply {
202- setTargetResolution(resolution)
203- }.build()
204-
205- imageAnalysis = ImageAnalysis .Builder ()
206- .setTargetResolution(resolution)
207- .setBackpressureStrategy(ImageAnalysis .STRATEGY_KEEP_ONLY_LATEST )
208- .build()
207+ val hasCamera = cameraProvider.hasCamera(cameraSelector)
208+
209+ if (hasCamera) {
210+
211+ val resolution = Size (
212+ binding.scannerPreview.width,
213+ binding.scannerPreview.height
214+ )
215+ val preview = Preview .Builder ()
216+ .apply {
217+ setTargetResolution(resolution)
218+ }.build()
219+
220+ imageAnalysis = ImageAnalysis .Builder ()
221+ .setTargetResolution(resolution)
222+ .setBackpressureStrategy(ImageAnalysis .STRATEGY_KEEP_ONLY_LATEST )
223+ .build()
224+
225+ imageAnalysis.setAnalyzer(cameraExecutor, BarcodeAnalyzer (this ))
209226
210- imageAnalysis.setAnalyzer(cameraExecutor, BarcodeAnalyzer (this ))
211227
228+ cameraProvider.unbindAll()
212229
213- cameraProvider.unbindAll()
230+ camera = cameraProvider.bindToLifecycle(
231+ viewLifecycleOwner, cameraSelector, preview, imageAnalysis
232+ )
214233
215- camera = cameraProvider.bindToLifecycle(
216- viewLifecycleOwner, cameraSelector, preview, imageAnalysis
217- )
234+ preview.setSurfaceProvider(binding.scannerPreview.surfaceProvider)
218235
219- preview.setSurfaceProvider(binding.scannerPreview.surfaceProvider)
236+ } else {
237+ showNoCameraAlertDialog()
238+ }
239+ }
220240
241+ private fun showNoCameraAlertDialog () {
242+ MaterialAlertDialogBuilder (requireContext())
243+ .setTitle(getString(R .string.bc_no_rear_camera_title))
244+ .setCancelable(false )
245+ .setMessage(getString(R .string.bc_nor_rear_camera_message))
246+ .setNegativeButton(getString(R .string.exit)) { dialog, which ->
247+ if (! findNavController().popBackStack() || ! findNavController().navigateUp()) {
248+ requireActivity().finish()
249+ }
250+ dialog.dismiss()
251+ }
252+ .show()
221253 }
222254
223255 private fun enableFlashControl () {
0 commit comments