diff --git a/app/src/main/java/com/example/abe/data/network/Retrofit.kt b/app/src/main/java/com/example/abe/data/network/Retrofit.kt
index bd9b8605b78f7b6f4714a7d04256661d3cb9bc53..21536640fdf2b360b5306ab1bbbe4817ef1b918c 100644
--- a/app/src/main/java/com/example/abe/data/network/Retrofit.kt
+++ b/app/src/main/java/com/example/abe/data/network/Retrofit.kt
@@ -126,7 +126,6 @@ class Retrofit {
             }
 
             override fun onFailure(call: Call<ItemsRoot>, t: Throwable) {
-                Log.d("ABE-PHO", "Failed to send request: " + t.message)
                 callback.onFailure("Failed to send photo")
             }
         })
diff --git a/app/src/main/java/com/example/abe/ui/scanner/ScannerFragment.kt b/app/src/main/java/com/example/abe/ui/scanner/ScannerFragment.kt
index 8fe010b7d3bb0da3083171c84767c0bf2d3c72a7..7988086650124b35ef44585061d22ff331e78b83 100644
--- a/app/src/main/java/com/example/abe/ui/scanner/ScannerFragment.kt
+++ b/app/src/main/java/com/example/abe/ui/scanner/ScannerFragment.kt
@@ -139,15 +139,20 @@ class ScannerFragment : Fragment(), UploadResultCallback {
         }
 
         lifecycleScope.launch {
-            user =  (activity as MainActivity).preferenceDataStoreHelper.getFirstPreference(
-                PreferenceDataStoreConstants.USER,"")
+            user = (activity as MainActivity).preferenceDataStoreHelper.getFirstPreference(
+                PreferenceDataStoreConstants.USER, ""
+            )
         }
 
         binding.captureButton.setOnClickListener {
             if (cameraPermissionGranted()) {
                 takePicture()
             } else {
-                Toast.makeText(requireContext(), "Please allow camera to take photos", Toast.LENGTH_SHORT).show()
+                Toast.makeText(
+                    requireContext(),
+                    "Please allow camera to take photos",
+                    Toast.LENGTH_SHORT
+                ).show()
             }
         }
 
@@ -196,13 +201,17 @@ class ScannerFragment : Fragment(), UploadResultCallback {
     private fun attemptUpload(imageFile: File) {
         lifecycleScope.launch {
             val retrofit = Retrofit()
-            val token = (activity as MainActivity).preferenceDataStoreHelper.getFirstPreference(PreferenceDataStoreConstants.TOKEN, "")
+            val token = (activity as MainActivity).preferenceDataStoreHelper.getFirstPreference(
+                PreferenceDataStoreConstants.TOKEN,
+                ""
+            )
             retrofit.upload(token, imageFile, this@ScannerFragment)
         }
     }
 
     private fun showPreviewDialog(imageUri: Uri) {
         val dialog = Dialog(requireContext()).apply {
+            setCancelable(false)
             setContentView(R.layout.dialog_image_preview)
             window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
         }
@@ -218,23 +227,25 @@ class ScannerFragment : Fragment(), UploadResultCallback {
 
         confirmButton.setOnClickListener {
             val activity = activity as MainActivity
-            if(!isConnected(activity.getNetworkState())) {
+            if (!isConnected(activity.getNetworkState())) {
                 dialog.dismiss()
                 binding.scanLayout.visibility = View.GONE
                 binding.noNetworkLayout.visibility = View.VISIBLE
+                isProcessingPhoto = false
             } else {
-            val filePath = imageUri.path
-            if (filePath != null) {
-                val imageFile = File(filePath)
-                attemptUpload(imageFile)
+                val filePath = imageUri.path
+                if (filePath != null) {
+                    val imageFile = File(filePath)
+                    attemptUpload(imageFile)
 
-                val msg = "Uploading photo, please wait"
-                Toast.makeText(requireContext(), msg, Toast.LENGTH_LONG).show()
+                    val msg = "Uploading photo, please wait"
+                    Toast.makeText(requireContext(), msg, Toast.LENGTH_LONG).show()
 
-                dialog.dismiss()
-            } else {
-                dialog.dismiss()
-            }
+                    dialog.dismiss()
+                } else {
+                    isProcessingPhoto = false
+                    dialog.dismiss()
+                }
             }
         }
 
@@ -245,6 +256,7 @@ class ScannerFragment : Fragment(), UploadResultCallback {
 
         cancelButton.setOnClickListener {
             dialog.dismiss()
+            isProcessingPhoto = false
         }
 
         dialog.show()
@@ -252,7 +264,11 @@ class ScannerFragment : Fragment(), UploadResultCallback {
 
     private fun takePicture() {
         if (isProcessingPhoto) {
-            Toast.makeText(requireContext(), "Unable to take picture, processing previous image", Toast.LENGTH_SHORT).show()
+            Toast.makeText(
+                requireContext(),
+                "Unable to take picture, processing previous image",
+                Toast.LENGTH_SHORT
+            ).show()
             return
         }
 
@@ -279,7 +295,6 @@ class ScannerFragment : Fragment(), UploadResultCallback {
                 override fun onImageSaved(output: ImageCapture.OutputFileResults) {
                     val savedUri = Uri.fromFile(photoFile)
                     showPreviewDialog(savedUri)
-                    isProcessingPhoto = false
                 }
             }
         )
@@ -386,7 +401,11 @@ class ScannerFragment : Fragment(), UploadResultCallback {
 
     private fun openGallery() {
         if (isProcessingPhoto) {
-            Toast.makeText(requireContext(), "Unable choose image, processing previous image", Toast.LENGTH_SHORT).show()
+            Toast.makeText(
+                requireContext(),
+                "Unable choose image, processing previous image",
+                Toast.LENGTH_SHORT
+            ).show()
             return
         }
 
diff --git a/app/src/main/java/com/example/abe/ui/twibbon/TwibbonFragment.kt b/app/src/main/java/com/example/abe/ui/twibbon/TwibbonFragment.kt
index 0e0d14031ea1dbc825c23120e0fee0b9c498efaa..ffc798f88d346c698bf7e8ee551b7f6dd55dd0e4 100644
--- a/app/src/main/java/com/example/abe/ui/twibbon/TwibbonFragment.kt
+++ b/app/src/main/java/com/example/abe/ui/twibbon/TwibbonFragment.kt
@@ -47,6 +47,8 @@ class TwibbonFragment : Fragment() {
 
     private var imageCapture: ImageCapture? = null
 
+    private var isProcessingPhoto = false
+
     companion object {
         private const val TAG = "ABE-TWB"
         private const val FILENAME_FORMAT = "yyyy-MM-dd-HH-mm-ss-SSS"
@@ -64,7 +66,13 @@ class TwibbonFragment : Fragment() {
             requestCameraPermissions()
         }
 
-        binding.btnCaptureTwibbon.setOnClickListener { previewTwibbon() }
+        binding.btnCaptureTwibbon.setOnClickListener {
+            if (cameraPermissionsGranted()) {
+                previewTwibbon()
+            } else {
+                Toast.makeText(requireContext(), "Please allow camera to take photos", Toast.LENGTH_SHORT).show()
+            }
+        }
 
         return binding.root
     }
@@ -115,6 +123,12 @@ class TwibbonFragment : Fragment() {
         }
 
     private fun previewTwibbon() {
+        if (isProcessingPhoto) {
+            Toast.makeText(requireContext(), "Unable to take picture, processing previous image", Toast.LENGTH_SHORT).show()
+            return
+        }
+
+        isProcessingPhoto = true
         Toast.makeText(requireContext(), "Generating twibbon", Toast.LENGTH_SHORT).show()
         val imageCapture = imageCapture ?: return
         deletePreviousTwibbons()
@@ -138,6 +152,7 @@ class TwibbonFragment : Fragment() {
                 override fun onError(exc: ImageCaptureException) {
                     Toast.makeText(requireContext(), "Photo capture failed", Toast.LENGTH_SHORT)
                         .show()
+                    isProcessingPhoto = false
                 }
 
                 override fun onImageSaved(output: ImageCapture.OutputFileResults) {
@@ -151,8 +166,6 @@ class TwibbonFragment : Fragment() {
 
     private fun overlayTwibbonToImage(imageUri: Uri) {
         try {
-            Log.d(TAG, "Start overlaying twibbon")
-
             val exifIms = requireActivity().contentResolver.openInputStream(imageUri) ?: return
             val exif = ExifInterface(exifIms)
             val orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1)
@@ -255,7 +268,6 @@ class TwibbonFragment : Fragment() {
             fos.flush()
             fos.close()
 
-            Log.d(TAG, "Finished overlaying twibbon")
         } catch (e: FileNotFoundException) {
             e.printStackTrace()
         }
@@ -272,9 +284,8 @@ class TwibbonFragment : Fragment() {
     }
 
     private fun showPreviewDialog(imageUri: Uri) {
-        Log.d(TAG, "Previewing twibbon")
-
         val dialog = Dialog(requireContext()).apply {
+            setCancelable(false)
             setContentView(R.layout.dialog_twibbon_preview)
             window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
         }
@@ -288,6 +299,7 @@ class TwibbonFragment : Fragment() {
         val closeButton = dialog.findViewById<Button>(R.id.btnCloseTwibbon)
 
         closeButton.setOnClickListener {
+            isProcessingPhoto = false
             dialog.dismiss()
         }