From c6093ce97c4575a31b15f4d996ba9525508e8797 Mon Sep 17 00:00:00 2001 From: tobias ns <13521090@std.stei.itb.ac.id> Date: Thu, 4 Apr 2024 10:23:08 +0700 Subject: [PATCH] feat: networksense --- app/src/main/AndroidManifest.xml | 1 + .../ConnectivityObserver.kt | 11 ++++++ .../if3210_2024_android_aab/MainActivity.kt | 25 +++++++++++++ .../NetworkConnectivityObserver.kt | 37 +++++++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 app/src/main/java/com/example/if3210_2024_android_aab/ConnectivityObserver.kt create mode 100644 app/src/main/java/com/example/if3210_2024_android_aab/NetworkConnectivityObserver.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6d025f9..b03f2f0 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 0000000..e2eff28 --- /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 ecb252f..6f74a70 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 0000000..bbf0e22 --- /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 -- GitLab