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