diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6d025f9641bbdd71553c9b1d5ed1e2a4763df44e..b03f2f06c4c1e118ff4c7ea234191c7e1c38a18d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -2,6 +2,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools">
 
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.INTERNET"/>
diff --git a/app/src/main/java/com/example/if3210_2024_android_aab/ConnectivityObserver.kt b/app/src/main/java/com/example/if3210_2024_android_aab/ConnectivityObserver.kt
new file mode 100644
index 0000000000000000000000000000000000000000..e2eff28c706cd51502b2afa441ef43b9a1f71516
--- /dev/null
+++ b/app/src/main/java/com/example/if3210_2024_android_aab/ConnectivityObserver.kt
@@ -0,0 +1,11 @@
+package com.example.if3210_2024_android_aab
+
+import kotlinx.coroutines.flow.Flow
+
+interface ConnectivityObserver {
+    fun observe(): Flow<Status>
+
+    enum class Status {
+        Available, Unavailable, Lost
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/if3210_2024_android_aab/MainActivity.kt b/app/src/main/java/com/example/if3210_2024_android_aab/MainActivity.kt
index ecb252f72ef1adcbcc9e045446032eef2c3ef275..6f74a70dfafd196360d330eef5b23548e80b8bf7 100644
--- a/app/src/main/java/com/example/if3210_2024_android_aab/MainActivity.kt
+++ b/app/src/main/java/com/example/if3210_2024_android_aab/MainActivity.kt
@@ -10,8 +10,11 @@ import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.google.android.material.floatingactionbutton.FloatingActionButton
 import androidx.activity.ComponentActivity
+import androidx.appcompat.app.AlertDialog
 import androidx.fragment.app.Fragment
 import com.google.android.material.bottomnavigation.BottomNavigationView
+import kotlinx.coroutines.MainScope
+import kotlinx.coroutines.launch
 
 class MainActivity : AppCompatActivity() {
 //    val transactionList = ArrayList<Transaction>()
@@ -21,7 +24,9 @@ class MainActivity : AppCompatActivity() {
 //        TransactionViewModelFactory((application as TransactionApplication).repository)
 //    }
 
+    private lateinit var connectivityObserver: ConnectivityObserver
     private lateinit var bottomNavigationView: BottomNavigationView
+    private val scope = MainScope()
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         if (SharedPreference.getEmail(this).isNullOrBlank() || SharedPreference.getToken(this).isNullOrBlank()) {
@@ -29,6 +34,18 @@ class MainActivity : AppCompatActivity() {
             startActivity(intent)
         }
 
+        connectivityObserver = NetworkConnectivityObserver(applicationContext)
+
+        scope.launch {
+            connectivityObserver.observe().collect { status ->
+                if (status == ConnectivityObserver.Status.Available) {
+                    showAlertDialog("Network Available", "You are now connected to the network")
+                } else {
+                    showAlertDialog("Network Unavailable", "You are now disconnected from the network")
+                }
+            }
+        }
+
 //        mRecyclerView.setHasFixedSize(true)
 //        mRecyclerView.layoutManager = LinearLayoutManager(this)
 //
@@ -87,6 +104,14 @@ class MainActivity : AppCompatActivity() {
         replaceFragment(TransactionFragment())
     }
 
+    private fun showAlertDialog(title: String, message: String) {
+        AlertDialog.Builder(this)
+            .setTitle(title)
+            .setMessage(message)
+            .setPositiveButton("OK", null)
+            .show()
+    }
+
 //    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
 //        super.onActivityResult(requestCode, resultCode, data)
 //
diff --git a/app/src/main/java/com/example/if3210_2024_android_aab/NetworkConnectivityObserver.kt b/app/src/main/java/com/example/if3210_2024_android_aab/NetworkConnectivityObserver.kt
new file mode 100644
index 0000000000000000000000000000000000000000..bbf0e22c575509e7962980409e2db6923d0bf0eb
--- /dev/null
+++ b/app/src/main/java/com/example/if3210_2024_android_aab/NetworkConnectivityObserver.kt
@@ -0,0 +1,37 @@
+package com.example.if3210_2024_android_aab
+
+import android.content.Context
+import android.net.ConnectivityManager
+import android.net.Network
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.launch
+
+class NetworkConnectivityObserver (
+    private val context : Context
+) : ConnectivityObserver {
+    private val connectivityManager =
+        context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+    override fun observe(): Flow<ConnectivityObserver.Status> {
+        return callbackFlow {
+            val callback = object : ConnectivityManager.NetworkCallback() {
+                override fun onAvailable(network: Network) {
+                    super.onAvailable(network)
+                    launch { send(ConnectivityObserver.Status.Available) }
+                }
+
+                override fun onLost(network: Network) {
+                    super.onLost(network)
+                    launch { send(ConnectivityObserver.Status.Lost) }
+                }
+            }
+
+            connectivityManager.registerDefaultNetworkCallback(callback)
+            awaitClose {
+                connectivityManager.unregisterNetworkCallback(callback)
+            }
+        }.distinctUntilChanged()
+    }
+}
\ No newline at end of file