diff --git a/app/src/main/java/com/example/bondoyap/MainActivity.kt b/app/src/main/java/com/example/bondoyap/MainActivity.kt
index 5dccf720c62fa19893068bd478242e6466492047..5ac8d1fb73b41a0e5ace944a96de93b533fa7169 100644
--- a/app/src/main/java/com/example/bondoyap/MainActivity.kt
+++ b/app/src/main/java/com/example/bondoyap/MainActivity.kt
@@ -14,6 +14,7 @@ import androidx.navigation.ui.AppBarConfiguration
 import androidx.navigation.ui.setupActionBarWithNavController
 import androidx.navigation.ui.setupWithNavController
 import com.example.bondoyap.databinding.ActivityMainBinding
+import com.example.bondoyap.service.NetworkObserver
 import com.example.bondoyap.service.api.Constants
 import com.example.bondoyap.service.api.Constants.SHARED_PREFS_NAME
 import com.example.bondoyap.service.jwt.JwtService
@@ -22,7 +23,6 @@ import com.example.bondoyap.ui.transactions.TransactionsApplication
 import com.example.bondoyap.ui.transactions.TransactionsBroadcastReceiver
 import com.example.bondoyap.ui.transactions.TransactionsViewModel
 import com.example.bondoyap.ui.transactions.TransactionsViewModelFactory
-import com.example.bondoyap.service.NetworkObserver
 import com.google.android.material.bottomnavigation.BottomNavigationView
 
 class MainActivity : AppCompatActivity() {
diff --git a/app/src/main/java/com/example/bondoyap/ui/scanner/ScannerFragment.kt b/app/src/main/java/com/example/bondoyap/ui/scanner/ScannerFragment.kt
index 94353b0bae865f894553b87498625e90e009a073..f2049e0bd499ad41bbae2e8f2960ad0bfd4720cc 100644
--- a/app/src/main/java/com/example/bondoyap/ui/scanner/ScannerFragment.kt
+++ b/app/src/main/java/com/example/bondoyap/ui/scanner/ScannerFragment.kt
@@ -11,6 +11,7 @@ import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.widget.Toast
 import androidx.activity.result.ActivityResultLauncher
 import androidx.activity.result.contract.ActivityResultContracts
 import androidx.camera.core.CameraSelector
@@ -25,6 +26,7 @@ import androidx.navigation.NavController
 import androidx.navigation.fragment.findNavController
 import com.example.bondoyap.R
 import com.example.bondoyap.databinding.FragmentScannerBinding
+import com.example.bondoyap.service.NetworkObserver
 import com.example.bondoyap.service.api.ApiClient
 import com.example.bondoyap.service.api.data.BillResponse
 import com.example.bondoyap.service.api.data.Items
@@ -44,6 +46,7 @@ class ScannerFragment : Fragment() {
     private var _binding: FragmentScannerBinding? = null
     private val binding get() = _binding!!
     private lateinit var navController: NavController
+    private lateinit var networkObserver: NetworkObserver
 
     // Camera
     private var isBackCamera = true
@@ -71,6 +74,8 @@ class ScannerFragment : Fragment() {
         val root: View = binding.root
 
         navController = findNavController()
+        networkObserver = NetworkObserver(requireContext())
+
         cacheDir = requireContext().cacheDir
         contentResolver = requireContext().contentResolver
         apiClient = ApiClient()
@@ -86,7 +91,9 @@ class ScannerFragment : Fragment() {
         changeImage = registerForActivityResult(
             ActivityResultContracts.StartActivityForResult()
         ) {
-            if (it.resultCode == Activity.RESULT_OK) {
+            if (networkObserver.isConnected.value == false) {
+                Toast.makeText(requireContext(), "Tidak ada koneksi", Toast.LENGTH_SHORT).show()
+            } else if (it.resultCode == Activity.RESULT_OK) {
                 try {
                     val data = it.data
                     val imgUri = data?.data ?: throw Exception("Image Uri is null")
@@ -136,7 +143,11 @@ class ScannerFragment : Fragment() {
 
         binding.uploadButton.isClickable = false
         binding.uploadButton.setOnClickListener {
-            cameraImageFile?.let { it1 -> uploadPhoto(it1) }
+            if (networkObserver.isConnected.value == false) {
+                Toast.makeText(requireContext(), "Tidak ada koneksi", Toast.LENGTH_SHORT).show()
+            } else {
+                cameraImageFile?.let { it1 -> uploadPhoto(it1) }
+            }
         }
 
         return root
diff --git a/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt b/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt
index 4f415981d062e9ffd6f5e1af86636b4a812c704d..2f4af36937a36b9053169cffa0d4f60724940616 100644
--- a/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt
+++ b/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt
@@ -1,137 +1,145 @@
-package com.example.bondoyap.ui.settings
-
-import android.app.AlertDialog
-import android.content.DialogInterface
-import android.content.Intent
-import android.content.pm.PackageManager
-import android.os.Bundle
-import android.util.Log
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.Toast
-import androidx.core.app.ActivityCompat
-import androidx.core.content.ContextCompat
-import androidx.fragment.app.Fragment
-import androidx.fragment.app.viewModels
-import androidx.lifecycle.ViewModelProvider
-import androidx.localbroadcastmanager.content.LocalBroadcastManager
-import com.example.bondoyap.databinding.FragmentSettingsBinding
-import com.example.bondoyap.service.api.Constants.ACTION_RANDOMIZE_TRANSACTIONS
-import com.example.bondoyap.ui.login.LoginActivity
-import com.example.bondoyap.ui.transactions.TransactionsApplication
-import com.example.bondoyap.ui.transactions.TransactionsViewModel
-import com.example.bondoyap.ui.transactions.TransactionsViewModelFactory
-import android.Manifest
-
-class SettingsFragment : Fragment() {
-
-    private var _binding: FragmentSettingsBinding? = null
-    private val binding get() = _binding!!
-    private lateinit var settingsViewModel: SettingsViewModel
-
-    private val transactionsViewModel: TransactionsViewModel by viewModels {
-        TransactionsViewModelFactory((requireContext().applicationContext as TransactionsApplication).repository)
-    }
-
-    override fun onCreateView(
-        inflater: LayoutInflater,
-        container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ): View {
-        _binding = FragmentSettingsBinding.inflate(inflater, container, false)
-
-        if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
-            ActivityCompat.requestPermissions(requireActivity(), arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), PERMISSION_REQUEST_CODE)
-        }
-
-        return binding.root
-    }
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        super.onViewCreated(view, savedInstanceState)
-
-        val factory = context?.let { SettingsViewModelFactory(it) }
-        if (factory != null) {
-            settingsViewModel = ViewModelProvider(this, factory)[SettingsViewModel::class.java]
-        } else {
-            throw IllegalStateException("Context is null. Cannot create SettingsViewModelFactory.")
-        }
-        val textView = binding.textSettings
-        val logoutButton = binding.logoutButton
-        val randomButton = binding.randomTransactions
-        val saveButton = binding.saveTransactions
-        val sendButton = binding.sendTransactions
-
-        settingsViewModel.getUser()?.let { user ->
-            val loggedInUserText = "Masuk dengan akun:\n ${user.email}"
-            textView.text = loggedInUserText
-        }
-        val appContext = context?.applicationContext
-
-        logoutButton.setOnClickListener {
-            settingsViewModel.getUser()
-            settingsViewModel.logout()
-//            findNavController().navigate(R.id.navigation_login)
-
-            val activity = requireActivity()
-            val intent = Intent(activity, LoginActivity::class.java)
-            Toast.makeText(appContext, "Logout Sukses!", Toast.LENGTH_SHORT).show()
-            activity.startActivity(intent)
-            activity.finish()
-        }
-
-        randomButton.setOnClickListener {
-            Toast.makeText(appContext, "Membuat transaksi random ...", Toast.LENGTH_SHORT).show()
-
-            val intent = Intent(ACTION_RANDOMIZE_TRANSACTIONS)
-            intent.putExtra("message", "Randomize from setting!")
-            LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(intent)
-
-            Log.d("BroadcastDebug", "Sending broadcast from SettingsFragment")
-        }
-
-        val exporter = TransactionsExporter(transactionsViewModel, requireContext())
-
-        saveButton.setOnClickListener {
-            if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
-                Toast.makeText(appContext, "Allow storage permission untuk menyimpan transaksi ke file xls/xlsx", Toast.LENGTH_SHORT).show()
-            } else {
-                val formats = arrayOf("XLS", "XLSX")
-                val builder = AlertDialog.Builder(requireContext())
-                builder.setTitle("Pilih Format File")
-                builder.setItems(formats) { dialog: DialogInterface, which: Int ->
-                    when (which) {
-                        0 -> {
-                            Toast.makeText(appContext, "Menyimpan transaksi ke xls...", Toast.LENGTH_SHORT).show()
-                            exporter.exportToXLS()
-                            Toast.makeText(appContext, "Penyimpanan xls pada folder Documents berhasil...", Toast.LENGTH_SHORT).show()
-                        }
-                        1 -> {
-                            Toast.makeText(appContext, "Menyimpan transaksi ke xlsx...", Toast.LENGTH_SHORT).show()
-                            exporter.exportToXLSX()
-                            Toast.makeText(appContext, "Penyimpanan xlsx pada folder Documents berhasil...", Toast.LENGTH_SHORT).show()
-                        }
-                    }
-                    dialog.dismiss()
-                }
-                builder.create().show()
-            }
-        }
-
-        sendButton.setOnClickListener {
-            Toast.makeText(appContext, "Mengirimkan transaksi ...", Toast.LENGTH_SHORT).show()
-            //todo
-        }
-
-    }
-
-    companion object {
-        private const val PERMISSION_REQUEST_CODE = 1001
-    }
-
-    override fun onDestroyView() {
-        super.onDestroyView()
-        _binding = null
-    }
+package com.example.bondoyap.ui.settings
+
+import android.app.AlertDialog
+import android.content.DialogInterface
+import android.content.Intent
+import android.content.pm.PackageManager
+import android.os.Bundle
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Toast
+import androidx.core.app.ActivityCompat
+import androidx.core.content.ContextCompat
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
+import androidx.lifecycle.ViewModelProvider
+import androidx.localbroadcastmanager.content.LocalBroadcastManager
+import com.example.bondoyap.databinding.FragmentSettingsBinding
+import com.example.bondoyap.service.api.Constants.ACTION_RANDOMIZE_TRANSACTIONS
+import com.example.bondoyap.service.NetworkObserver
+import com.example.bondoyap.ui.login.LoginActivity
+import com.example.bondoyap.ui.transactions.TransactionsApplication
+import com.example.bondoyap.ui.transactions.TransactionsViewModel
+import com.example.bondoyap.ui.transactions.TransactionsViewModelFactory
+import android.Manifest
+
+class SettingsFragment : Fragment() {
+
+    private var _binding: FragmentSettingsBinding? = null
+    private val binding get() = _binding!!
+    
+    private lateinit var settingsViewModel: SettingsViewModel
+    private lateinit var networkObserver: NetworkObserver
+
+    private val transactionsViewModel: TransactionsViewModel by viewModels {
+        TransactionsViewModelFactory((requireContext().applicationContext as TransactionsApplication).repository)
+    }
+
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View {
+        _binding = FragmentSettingsBinding.inflate(inflater, container, false)
+        networkObserver = NetworkObserver(requireContext())
+
+        if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
+            ActivityCompat.requestPermissions(requireActivity(), arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), PERMISSION_REQUEST_CODE)
+        }
+
+        return binding.root
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        val factory = context?.let { SettingsViewModelFactory(it) }
+        if (factory != null) {
+            settingsViewModel = ViewModelProvider(this, factory)[SettingsViewModel::class.java]
+        } else {
+            throw IllegalStateException("Context is null. Cannot create SettingsViewModelFactory.")
+        }
+        val textView = binding.textSettings
+        val logoutButton = binding.logoutButton
+        val randomButton = binding.randomTransactions
+        val saveButton = binding.saveTransactions
+        val sendButton = binding.sendTransactions
+
+        settingsViewModel.getUser()?.let { user ->
+            val loggedInUserText = "Masuk dengan akun:\n ${user.email}"
+            textView.text = loggedInUserText
+        }
+        val appContext = context?.applicationContext
+
+        logoutButton.setOnClickListener {
+            settingsViewModel.getUser()
+            settingsViewModel.logout()
+//            findNavController().navigate(R.id.navigation_login)
+
+            val activity = requireActivity()
+            val intent = Intent(activity, LoginActivity::class.java)
+            Toast.makeText(appContext, "Logout Sukses!", Toast.LENGTH_SHORT).show()
+            activity.startActivity(intent)
+            activity.finish()
+        }
+
+        randomButton.setOnClickListener {
+            Toast.makeText(appContext, "Membuat transaksi random ...", Toast.LENGTH_SHORT).show()
+
+            val intent = Intent(ACTION_RANDOMIZE_TRANSACTIONS)
+            intent.putExtra("message", "Randomize from setting!")
+            LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(intent)
+
+            Log.d("BroadcastDebug", "Sending broadcast from SettingsFragment")
+        }
+
+        val exporter = TransactionsExporter(transactionsViewModel, requireContext())
+
+        saveButton.setOnClickListener {
+            if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
+                Toast.makeText(appContext, "Allow storage permission untuk menyimpan transaksi ke file xls/xlsx", Toast.LENGTH_SHORT).show()
+            } else {
+                val formats = arrayOf("XLS", "XLSX")
+                val builder = AlertDialog.Builder(requireContext())
+                builder.setTitle("Pilih Format File")
+                builder.setItems(formats) { dialog: DialogInterface, which: Int ->
+                    when (which) {
+                        0 -> {
+                            Toast.makeText(appContext, "Menyimpan transaksi ke xls...", Toast.LENGTH_SHORT).show()
+                            exporter.exportToXLS()
+                            Toast.makeText(appContext, "Penyimpanan xls pada folder Documents berhasil...", Toast.LENGTH_SHORT).show()
+                        }
+                        1 -> {
+                            Toast.makeText(appContext, "Menyimpan transaksi ke xlsx...", Toast.LENGTH_SHORT).show()
+                            exporter.exportToXLSX()
+                            Toast.makeText(appContext, "Penyimpanan xlsx pada folder Documents berhasil...", Toast.LENGTH_SHORT).show()
+                        }
+                    }
+                    dialog.dismiss()
+                }
+                builder.create().show()
+            }
+        }
+
+        sendButton.setOnClickListener {
+            if (networkObserver.isConnected.value == false) {
+                Toast.makeText(requireContext(), "Tidak ada koneksi", Toast.LENGTH_SHORT).show()
+            } else {
+                Toast.makeText(appContext, "Mengirimkan transaksi ...", Toast.LENGTH_SHORT).show()
+                //todo
+            }
+        }
+
+    }
+
+    companion object {
+        private const val PERMISSION_REQUEST_CODE = 1001
+    }
+
+    override fun onDestroyView() {
+        super.onDestroyView()
+        _binding = null
+    }
 }
\ No newline at end of file