diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0a842620b0d1eb4d5e5e51fdcbb05d8ed2da7063..6ed4aa1ed232a6886cec4a2c213be4e3f5b8aceb 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -10,6 +10,8 @@
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+
 
     <application
         android:name=".BondomanApp"
diff --git a/app/src/main/java/com/example/bondoman/ui/hub/scan/NetworkManager.kt b/app/src/main/java/com/example/bondoman/ui/hub/scan/NetworkManager.kt
new file mode 100644
index 0000000000000000000000000000000000000000..efa52868be3c43cde19c2ab1d0a2ceded5264c93
--- /dev/null
+++ b/app/src/main/java/com/example/bondoman/ui/hub/scan/NetworkManager.kt
@@ -0,0 +1,46 @@
+package com.example.bondoman.ui.hub.scan
+
+import android.content.Context
+import android.net.ConnectivityManager
+import android.net.Network
+import android.net.NetworkCapabilities
+import android.net.NetworkRequest
+import com.example.bondoman.viewmodel.scan.ScanViewModel
+
+class NetworkManager(private val context: Context, private val viewModel: ScanViewModel) :
+    ConnectivityManager.NetworkCallback() {
+    private val connectivityManager: ConnectivityManager by lazy {
+        context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+    }
+
+    private fun isConnected(): Boolean = connectivityManager.activeNetworkInfo != null
+
+    private fun updateViewModel() {
+        viewModel.isCameraBtnEnabled.postValue(isConnected())
+        viewModel.isSelectBtnEnabled.postValue(isConnected())
+        viewModel.showSnackbar.postValue(!isConnected())
+    }
+
+    fun activate() {
+        updateViewModel()
+
+        connectivityManager.registerNetworkCallback(
+            NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
+                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build(), this
+        )
+    }
+
+    fun deactivate() {
+        connectivityManager.unregisterNetworkCallback(this)
+    }
+
+    override fun onLost(network: Network) {
+        super.onLost(network)
+        updateViewModel()
+    }
+
+    override fun onAvailable(network: Network) {
+        super.onAvailable(network)
+        updateViewModel()
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/bondoman/ui/hub/scan/ScanFragment.kt b/app/src/main/java/com/example/bondoman/ui/hub/scan/ScanFragment.kt
index d4e2f2c92d7bf0026309cfc33a94cba50c6c9f05..935b334ce82ac1725ba4c0c6eea055dbe0982543 100644
--- a/app/src/main/java/com/example/bondoman/ui/hub/scan/ScanFragment.kt
+++ b/app/src/main/java/com/example/bondoman/ui/hub/scan/ScanFragment.kt
@@ -31,6 +31,7 @@ import com.example.bondoman.database.repository.TransactionRepository
 import com.example.bondoman.databinding.FragmentScanBinding
 import com.example.bondoman.viewmodel.scan.ScanViewModel
 import com.example.bondoman.viewmodel.scan.ScanViewModelFactory
+import com.google.android.material.snackbar.Snackbar
 import okhttp3.MediaType
 import okhttp3.RequestBody
 import java.io.ByteArrayOutputStream
@@ -46,6 +47,9 @@ class ScanFragment : Fragment() {
     private lateinit var cameraExecutor: ExecutorService
 
     private val scanDialog: ScanDialogFragment = ScanDialogFragment()
+    private lateinit var networkManager: NetworkManager
+
+    private lateinit var snackbar: Snackbar
 
     private val activityResultLauncher = registerForActivityResult(
         ActivityResultContracts.RequestPermission()
@@ -73,6 +77,22 @@ class ScanFragment : Fragment() {
         }
     }
 
+    private val cameraBtnObserver = Observer<Boolean> {
+        binding.imageCaptureButton.isEnabled = it
+    }
+
+    private val selectBtnObserver = Observer<Boolean> {
+        binding.selectPhotoButton.isEnabled = it
+    }
+
+    private val snackbarObserver = Observer<Boolean> {
+        if (it && this::snackbar.isInitialized) {
+            snackbar.show()
+        } else if (!it && this::snackbar.isInitialized) {
+            snackbar.dismiss()
+        }
+    }
+
     companion object {
         private const val TAG = "ScanFragment"
         private const val CAMERA_PERMISSION = Manifest.permission.CAMERA
@@ -91,10 +111,28 @@ class ScanFragment : Fragment() {
         scanViewModel.isCameraPermissionGranted.observe(
             viewLifecycleOwner, cameraPermissionObserver
         )
+        scanViewModel.isSelectBtnEnabled.observe(
+            viewLifecycleOwner, cameraBtnObserver
+        )
+        scanViewModel.isSelectBtnEnabled.observe(
+            viewLifecycleOwner, selectBtnObserver
+        )
+        scanViewModel.showSnackbar.observe(
+            viewLifecycleOwner, snackbarObserver
+        )
 
         binding.imageCaptureButton.setOnClickListener(::onImageCaptureClick)
         binding.selectPhotoButton.setOnClickListener(::onSelectPhotoClick)
 
+        snackbar = Snackbar.make(
+            requireActivity().findViewById(android.R.id.content),
+            getString(R.string.connection_lost),
+            Snackbar.LENGTH_INDEFINITE
+        )
+
+        networkManager = NetworkManager(requireContext(), scanViewModel)
+        networkManager.activate()
+
         cameraExecutor = Executors.newSingleThreadExecutor()
 
         return binding.root
@@ -118,10 +156,12 @@ class ScanFragment : Fragment() {
 
     override fun onDestroyView() {
         super.onDestroyView()
+        networkManager.deactivate()
         cameraExecutor.shutdown()
     }
 
 
+    @Deprecated("")
     override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
         if (requestCode == 1) {
             val image = data?.data
diff --git a/app/src/main/java/com/example/bondoman/viewmodel/scan/ScanViewModel.kt b/app/src/main/java/com/example/bondoman/viewmodel/scan/ScanViewModel.kt
index bac7cfc971ae67e9d7276145316c606bce9958ee..4ff1fa0402ba7f24d0bbad25a98faab57752aa7b 100644
--- a/app/src/main/java/com/example/bondoman/viewmodel/scan/ScanViewModel.kt
+++ b/app/src/main/java/com/example/bondoman/viewmodel/scan/ScanViewModel.kt
@@ -8,6 +8,9 @@ import okhttp3.RequestBody
 
 class ScanViewModel(private val repository: TransactionRepository) : ViewModel() {
     val isCameraPermissionGranted = MutableLiveData(false)
+    val isCameraBtnEnabled = MutableLiveData(false)
+    val isSelectBtnEnabled = MutableLiveData(false)
+    val showSnackbar = MutableLiveData(false)
 
     suspend fun uploadNota(imageReqBody: RequestBody): List<TransactionEntity> {
         return repository.postUploadNota(imageReqBody)
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 691cd10ed1acd8bc4b13b50cded288c03989d4d4..6497dfad1943110a4b6b2ff15610b5e1eecb6e5f 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -76,4 +76,6 @@
     <string name="get_latest_location">Get latest location</string>
     <string name="delete_location">Delete location</string>
     <string name="no_location_data">No location data</string>
+
+    <string name="connection_lost">Connection Lost</string>
 </resources>