diff --git a/app/src/main/java/com/example/bandung_bondowoso/MainActivity.kt b/app/src/main/java/com/example/bandung_bondowoso/MainActivity.kt
index 81b3533b54b05886f18347e2ce36cbdfbed3c823..5b736c89b456ff83d1eca42461b7ba6968ad0924 100644
--- a/app/src/main/java/com/example/bandung_bondowoso/MainActivity.kt
+++ b/app/src/main/java/com/example/bandung_bondowoso/MainActivity.kt
@@ -9,6 +9,7 @@ import android.view.View
 import android.view.ViewGroup
 import androidx.appcompat.app.AppCompatActivity
 import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.lifecycleScope
 import androidx.localbroadcastmanager.content.LocalBroadcastManager
 import androidx.navigation.NavController
 import androidx.navigation.findNavController
@@ -23,6 +24,7 @@ import com.example.bandung_bondowoso.util.ConnectionStateMonitor
 import com.example.bandung_bondowoso.viewmodel.AuthViewModel
 import com.example.bandung_bondowoso.viewmodel.transaction.RandomizeTransactionViewModel
 import com.google.android.material.bottomnavigation.BottomNavigationView
+import kotlinx.coroutines.launch
 
 class MainActivity : AppCompatActivity(), ConnectionChangeListener {
 
@@ -40,6 +42,8 @@ class MainActivity : AppCompatActivity(), ConnectionChangeListener {
 
     private lateinit var randomizeTransactionViewModel: RandomizeTransactionViewModel
 
+    private lateinit var connectionStateMonitor: ConnectionStateMonitor
+
     override fun onCreate(savedInstanceState: Bundle?) {
         Log.d("MainActivity", "onCreate")
         super.onCreate(savedInstanceState)
@@ -98,7 +102,7 @@ class MainActivity : AppCompatActivity(), ConnectionChangeListener {
         }
 
         /* Connection State Related Configuration */
-        val connectionStateMonitor = ConnectionStateMonitor(this)
+        connectionStateMonitor = ConnectionStateMonitor(this)
         connectionStateMonitor.enable(this)
     }
 
@@ -134,25 +138,44 @@ class MainActivity : AppCompatActivity(), ConnectionChangeListener {
         Log.d("MainActivity", "onDestroy")
         LocalBroadcastManager.getInstance(this).unregisterReceiver(jwtExpiredReceiver)
         LocalBroadcastManager.getInstance(this).unregisterReceiver(jwtValidReceiver)
+
+        connectionStateMonitor.disable(this)
     }
 
     override fun onConnectionChanged(isConnected: Boolean) {
-        Log.d("MainActivity", "onNetworkChanged: $isConnected")
         if (isConnected) {
-            Log.d("MainActivity", "onNetworkChanged: connected")
-        } else {
-            Log.d("MainActivity", "onNetworkChanged: disconnected")
-            val dialog = Dialog(this)
-            dialog.setContentView(R.layout.dialog_no_network)
-            dialog.window?.setLayout(
-                ViewGroup.LayoutParams.WRAP_CONTENT,
-                ViewGroup.LayoutParams.WRAP_CONTENT)
-            dialog.window?.setBackgroundDrawableResource(R.drawable.bg_custom_dialog)
-            val okayButton = dialog.findViewById<View>(R.id.dialog_btn_okay)
-            okayButton.setOnClickListener {
-                dialog.dismiss()
+            stopService(Intent(this, JwtCheckerService::class.java))
+            startService(Intent(this, JwtCheckerService::class.java))
+        }
+
+        runOnUiThread {
+            Log.d("MainActivity", "onNetworkChanged: $isConnected")
+            if (isConnected) {
+                Log.d("MainActivity", "onNetworkChanged: connected")
+                if (binding.loading.visibility == View.GONE) {
+                    binding.loading.visibility = View.VISIBLE
+                    binding.container.visibility = View.GONE
+                }
+
+            } else {
+                if (binding.loading.visibility == View.VISIBLE) {
+                    binding.loading.visibility = View.GONE
+                    binding.container.visibility = View.VISIBLE
+                }
+
+                Log.d("MainActivity", "onNetworkChanged: disconnected")
+                val dialog = Dialog(this)
+                dialog.setContentView(R.layout.dialog_no_network)
+                dialog.window?.setLayout(
+                    ViewGroup.LayoutParams.WRAP_CONTENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT)
+                dialog.window?.setBackgroundDrawableResource(R.drawable.bg_custom_dialog)
+                val okayButton = dialog.findViewById<View>(R.id.dialog_btn_okay)
+                okayButton.setOnClickListener {
+                    dialog.dismiss()
+                }
+                dialog.show()
             }
-            dialog.show()
         }
     }
 
diff --git a/app/src/main/java/com/example/bandung_bondowoso/repository/UserRepository.kt b/app/src/main/java/com/example/bandung_bondowoso/repository/UserRepository.kt
index 60cccdcb56ca260742d9b27fd74034a5f0396b43..a18bd92ae978b8b53cf3cffc59fa1114d755c15e 100644
--- a/app/src/main/java/com/example/bandung_bondowoso/repository/UserRepository.kt
+++ b/app/src/main/java/com/example/bandung_bondowoso/repository/UserRepository.kt
@@ -12,6 +12,7 @@ import com.example.bandung_bondowoso.util.CryptoManager
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.withContext
+import javax.crypto.BadPaddingException
 
 class UserRepository(
     private val authService: AuthService,
@@ -83,13 +84,23 @@ class UserRepository(
     }
 
     suspend fun getToken() = withContext(defaultDispatcher) {
-        val encryptedToken = sharedPreferences.getString(Config.TOKEN_KEY, null)
-        if (encryptedToken != null) {
-            val bytes = CryptoManager().decryptFromBase64(encryptedToken)
-            val token = String(bytes)
-            token
-        } else {
+        try {
+            val encryptedToken = sharedPreferences.getString(Config.TOKEN_KEY, null)
+            if (encryptedToken != null) {
+                val bytes = CryptoManager().decryptFromBase64(encryptedToken)
+                val token = String(bytes)
+                token
+            } else {
+                null
+            }
+        } catch (e: BadPaddingException) {
+            // delete token from shared preferences
+            sharedPreferences.edit().remove(Config.TOKEN_KEY).apply()
+
+            // delete email from shared preferences
+            sharedPreferences.edit().remove(Config.EMAIL_KEY).apply()
             null
         }
+
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/example/bandung_bondowoso/service/JwtCheckerService.kt b/app/src/main/java/com/example/bandung_bondowoso/service/JwtCheckerService.kt
index cc3f4abe9ebb0cea1d1ff6e4f2a079969d1fb16d..e0377c990ead2ecf09aac47bc0816d6e3ddd6344 100644
--- a/app/src/main/java/com/example/bandung_bondowoso/service/JwtCheckerService.kt
+++ b/app/src/main/java/com/example/bandung_bondowoso/service/JwtCheckerService.kt
@@ -74,7 +74,8 @@ class JwtCheckerService : Service(), ConnectionChangeListener, JwtExpiredListene
                     }
                 }
 
-                delay(10000)
+                stopSelf()
+                break
             }
         }
 
diff --git a/app/src/main/java/com/example/bandung_bondowoso/util/ConnectionStateMonitor.kt b/app/src/main/java/com/example/bandung_bondowoso/util/ConnectionStateMonitor.kt
index e982ddf5943b652c23b171972869594266e77c71..67306f1ad79dce753e806ff8f9ec3f0628962d23 100644
--- a/app/src/main/java/com/example/bandung_bondowoso/util/ConnectionStateMonitor.kt
+++ b/app/src/main/java/com/example/bandung_bondowoso/util/ConnectionStateMonitor.kt
@@ -3,6 +3,7 @@ package com.example.bandung_bondowoso.util
 import android.content.Context
 import android.net.ConnectivityManager
 import android.net.ConnectivityManager.NetworkCallback
+import android.net.LinkProperties
 import android.net.Network
 import android.net.NetworkCapabilities
 import android.net.NetworkRequest
@@ -10,44 +11,71 @@ import android.util.Log
 import com.example.bandung_bondowoso.broadcast.connection.ConnectionChangeListener
 
 
-class ConnectionStateMonitor(private  val connectionChangeListener: ConnectionChangeListener) : NetworkCallback() {
-    private final val networkRequest: NetworkRequest = NetworkRequest.Builder()
-            .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
-            .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
-            .build()
+class ConnectionStateMonitor(private  val connectionChangeListener: ConnectionChangeListener) {
+//    private final val networkRequest: NetworkRequest = NetworkRequest.Builder()
+//            .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
+//            .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+//            .build()
 
     fun enable(context: Context) {
-        val connectivityMangaer = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+        val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
 
-        connectivityMangaer.registerNetworkCallback(networkRequest, this)
-        val network = connectivityMangaer.activeNetwork
+//        connectivityManager.registerNetworkCallback(networkRequest, this)
+        val network = connectivityManager.activeNetwork
 
         if (network != null) {
             connectionChangeListener.onConnectionChanged(true)
         } else {
             connectionChangeListener.onConnectionChanged(false)
         }
-    }
-
-    fun disable(context: Context) {
-        val connectivityMangaer = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
 
-        connectivityMangaer.unregisterNetworkCallback(this)
+        Log.d("ConnectionStateMonitor", "enable")
+        connectivityManager.registerDefaultNetworkCallback(object :
+            ConnectivityManager.NetworkCallback() {
+            override fun onAvailable(network : Network) {
+                Log.e("ConnectionStateMonitor", "The default network is now: $network")
+                connectionChangeListener.onConnectionChanged(true)
+            }
+            override fun onLost(network : Network) {
+                Log.e("ConnectionStateMonitor", "The application no longer has a default network. " +
+                        "The last default network was " + network)
+                connectionChangeListener.onConnectionChanged(false)
+            }
+            override fun onCapabilitiesChanged(network : Network,
+                                               networkCapabilities : NetworkCapabilities) {
+                Log.e("ConnectionStateMonitor",
+                    "The default network changed capabilities: $networkCapabilities"
+                )
+            }
+            override fun onLinkPropertiesChanged(network : Network,
+                                                 linkProperties : LinkProperties
+            ) {
+                Log.e("ConnectionStateMonitor",
+                    "The default network changed link properties: $linkProperties"
+                )
+            }
+        })
     }
 
-    final override fun onAvailable(network: Network) {
-        super.onAvailable(network)
+    fun disable(context: Context) {
+        val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
 
-        // Handle network availability
-        Log.d("ConnectionStateMonitor", "onAvailable")
-        connectionChangeListener.onConnectionChanged(true)
+//        connectivityManager.unregisterNetworkCallback(this)
     }
 
-    final override fun onLost(network: Network) {
-        super.onLost(network)
-
-        // Handle network lost
-        Log.d("ConnectionStateMonitor", "onLost")
-        connectionChangeListener.onConnectionChanged(false)
-    }
+//    final override fun onAvailable(network: Network) {
+//        super.onAvailable(network)
+//
+//        // Handle network availability
+//        Log.d("ConnectionStateMonitor", "onAvailable")
+//        connectionChangeListener.onConnectionChanged(true)
+//    }
+//
+//    final override fun onLost(network: Network) {
+//        super.onLost(network)
+//
+//        // Handle network lost
+//        Log.d("ConnectionStateMonitor", "onLost")
+//        connectionChangeListener.onConnectionChanged(false)
+//    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/scan/ScanHomeFragment.kt b/app/src/main/java/com/example/bandung_bondowoso/view/scan/ScanHomeFragment.kt
index 24563dd0aa04c687b18977404ac5ab56c6022d00..bc8b0d6bb1a422d61b3eb72094e7415870400581 100644
--- a/app/src/main/java/com/example/bandung_bondowoso/view/scan/ScanHomeFragment.kt
+++ b/app/src/main/java/com/example/bandung_bondowoso/view/scan/ScanHomeFragment.kt
@@ -67,26 +67,28 @@ class ScanHomeFragment: Fragment(), ConnectionChangeListener {
         pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
     }
     override fun onConnectionChanged(isConnected: Boolean) {
-        activity?.runOnUiThread(Runnable {
-            if (!isConnected) {
-                // change fragment to no network fragment
-                Log.d("DashboardFragment", binding.scanChildFragment.toString())
-                childFragmentManager.beginTransaction()
-                    .replace(binding.scanChildFragment.id, NoNetworkFragment())
-                    .commit()
-                binding.scanFragment.visibility = View.GONE
-                binding.scanChildFragment.visibility = View.VISIBLE
-            } else {
-                // remove no network fragment
-                Log.d("DashboardFragment", "Connected")
-                val fragment = childFragmentManager.findFragmentById(binding.scanChildFragment.id)
-                if (fragment is NoNetworkFragment) {
-                    childFragmentManager.beginTransaction().remove(fragment).commit()
+        if (_binding != null) {
+            activity?.runOnUiThread(Runnable {
+                if (!isConnected) {
+                    // change fragment to no network fragment
+                    Log.d("DashboardFragment", binding.scanChildFragment.toString())
+                    childFragmentManager.beginTransaction()
+                        .replace(binding.scanChildFragment.id, NoNetworkFragment())
+                        .commit()
+                    binding.scanFragment.visibility = View.GONE
+                    binding.scanChildFragment.visibility = View.VISIBLE
+                } else {
+                    // remove no network fragment
+                    Log.d("DashboardFragment", "Connected")
+                    val fragment = childFragmentManager.findFragmentById(binding.scanChildFragment.id)
+                    if (fragment is NoNetworkFragment) {
+                        childFragmentManager.beginTransaction().remove(fragment).commit()
+                    }
+                    binding.scanFragment.visibility = View.VISIBLE
+                    binding.scanChildFragment.visibility = View.GONE
                 }
-                binding.scanFragment.visibility = View.VISIBLE
-                binding.scanChildFragment.visibility = View.GONE
-            }
-        })
+            })
+        }
     }
 
     private fun uriToFile(imageUri: Uri, context: Context) : File{