Skip to content
Snippets Groups Projects
Commit ac9e0f15 authored by Ghazi Akmal Fauzan's avatar Ghazi Akmal Fauzan
Browse files

feat & refactor: network manager service

parent 850d50d4
Branches
Tags
No related merge requests found
......@@ -11,6 +11,9 @@
android:roundIcon="@mipmap/ic_primary_logo_round"
android:supportsRtl="true"
android:theme="@style/Theme.NerbOS">
<service android:name=".service.NetworkManagerService" />
<service
android:name=".service.TokenCheckService"
android:enabled="true"
......@@ -22,10 +25,10 @@
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:exported="true" />
......
......@@ -10,7 +10,7 @@ import com.example.nerbos.fragments.scan.ScanFragment
import com.example.nerbos.fragments.statistic.StatisticFragment
import com.example.nerbos.fragments.transaction.TransactionFragment
import com.example.nerbos.fragments.user.UserFragment
import com.example.nerbos.service.NetworkManager
import com.example.nerbos.service.NetworkManagerService
import com.example.nerbos.service.TokenCheckService
class MainActivity : AppCompatActivity() {
......@@ -30,15 +30,17 @@ class MainActivity : AppCompatActivity() {
private var selectedItemId: Int = R.id.transaction
internal lateinit var binding: ActivityMainBinding
internal lateinit var networkManager: NetworkManager
internal var networkManagerService: NetworkManagerService = NetworkManagerService()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
instance = this
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
setSupportActionBar(binding.toolbar)
networkManager = NetworkManager(this)
// Start the NetworkManagerService to monitor network changes
startService(Intent(this, NetworkManagerService::class.java))
// Start the TokenCheckService to check token validity
val serviceIntent = Intent(this, TokenCheckService::class.java)
......@@ -55,6 +57,11 @@ class MainActivity : AppCompatActivity() {
selectMenuItem(selectedItemId)
}
override fun onDestroy() {
super.onDestroy()
instance = null
}
private fun setupNavigation() {
if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) {
binding.bottomNavigationView?.setOnItemSelectedListener { item ->
......@@ -93,11 +100,6 @@ class MainActivity : AppCompatActivity() {
super.onSaveInstanceState(outState)
}
override fun onDestroy() {
super.onDestroy()
networkManager.unregisterNetworkCallback()
}
fun getCurrentFragmentId(): Int {
return selectedItemId
}
......@@ -109,4 +111,12 @@ class MainActivity : AppCompatActivity() {
fun getTitleFromId(id: Int): Int {
return fragmentTitles[id] ?: R.string.navbar_transaction
}
companion object {
private var instance: MainActivity? = null
fun getInstance(): MainActivity? {
return instance
}
}
}
......@@ -26,7 +26,7 @@ class NoInternetFragment : Fragment() {
binding.closeButton.setOnClickListener {
val mainActivity = requireActivity() as MainActivity
mainActivity.networkManager.handleCloseButtonClick()
mainActivity.networkManagerService.handleCloseButtonClick(mainActivity)
}
}
......
package com.example.nerbos.service
import android.content.Context
import android.content.res.Configuration
import android.net.ConnectivityManager
import android.net.Network
import android.view.View
import android.widget.Toast
import com.example.nerbos.MainActivity
import com.example.nerbos.R
import com.example.nerbos.fragments.network.NoInternetFragment
class NetworkManager(private val context: Context) {
private val connectivityManager: ConnectivityManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
private var isInternetAvailable = false
private val networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
isInternetAvailable = true
handleNetworkChanges()
}
override fun onLost(network: Network) {
isInternetAvailable = false
handleNetworkChanges()
}
}
init {
// Register network callback to monitor network changes
connectivityManager.registerDefaultNetworkCallback(networkCallback)
}
fun unregisterNetworkCallback() {
// Unregister the network callback when the activity is destroyed
connectivityManager.unregisterNetworkCallback(networkCallback)
}
private fun handleNetworkChanges() {
val mainActivity = context as MainActivity
val currentFragmentId = mainActivity.getCurrentFragmentId()
if (!isInternetAvailable) {
// If not connected to the internet, show NoInternetFragment and hide ActionBar and BottomNavigationView
mainActivity.runOnUiThread {
Toast.makeText(context, "No internet connection", Toast.LENGTH_SHORT).show()
showNoInternetFragment(mainActivity)
hideActionBarAndNavBar(mainActivity)
}
} else {
// If internet is available and NoInternetFragment is visible, replace with the appropriate fragment and show ActionBar and BottomNavigationView
if (mainActivity.supportFragmentManager.findFragmentById(R.id.frameLayout) is NoInternetFragment) {
Toast.makeText(context, "Connected to the internet", Toast.LENGTH_SHORT).show()
mainActivity.runOnUiThread {
mainActivity.replaceFragment(mainActivity.getFragmentFromId(currentFragmentId)) // Reinflate the previous fragment
mainActivity.supportActionBar?.title =
context.getString(mainActivity.getTitleFromId(currentFragmentId)) // Reinflate the previous fragment's title
showActionBarAndNavBar(mainActivity)
}
}
}
}
private fun showNoInternetFragment(mainActivity: MainActivity) {
// Show NoInternetFragment
mainActivity.replaceFragment(NoInternetFragment())
}
private fun hideActionBarAndNavBar(mainActivity: MainActivity) {
mainActivity.supportActionBar?.hide()
mainActivity.binding.bottomNavigationView?.visibility = View.GONE
mainActivity.binding.navigationView?.visibility = View.GONE
}
private fun showActionBarAndNavBar(mainActivity: MainActivity) {
mainActivity.supportActionBar?.show()
if (mainActivity.resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) {
mainActivity.binding.bottomNavigationView?.visibility = View.VISIBLE
} else {
mainActivity.binding.navigationView?.visibility = View.VISIBLE
}
}
fun handleCloseButtonClick() {
val mainActivity = context as MainActivity
val currentFragmentId = mainActivity.getCurrentFragmentId()
mainActivity.runOnUiThread {
mainActivity.replaceFragment(mainActivity.getFragmentFromId(currentFragmentId))
mainActivity.supportActionBar?.title = context.getString(mainActivity.getTitleFromId(currentFragmentId))
showActionBarAndNavBar(mainActivity)
}
}
}
\ No newline at end of file
package com.example.nerbos.service
import android.app.Service
import android.content.Context
import android.content.Intent
import android.content.res.Configuration
import android.net.ConnectivityManager
import android.net.Network
import android.os.Binder
import android.os.Handler
import android.os.IBinder
import android.os.Looper
import android.view.View
import android.widget.Toast
import com.example.nerbos.MainActivity
import com.example.nerbos.R
import com.example.nerbos.fragments.network.NoInternetFragment
class NetworkManagerService : Service() {
private lateinit var connectivityManager: ConnectivityManager
private val binder = LocalBinder()
inner class LocalBinder : Binder()
override fun onBind(intent: Intent?): IBinder {
return binder
}
override fun onCreate() {
super.onCreate()
connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
startNetworkMonitoring()
}
private fun startNetworkMonitoring() {
val handler = Handler(Looper.getMainLooper())
handler.post {
connectivityManager.registerDefaultNetworkCallback(object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
handler.post {
showNetworkToast("Connected to the internet")
handleNetworkChanges(true)
}
}
override fun onLost(network: Network) {
handler.post {
showNetworkToast("No internet connection")
handleNetworkChanges(false)
}
}
})
}
}
private fun showNetworkToast(message: String) {
// Use application context for Toast since services don't have UI context
Toast.makeText(applicationContext, message, Toast.LENGTH_SHORT).show()
}
fun handleNetworkChanges(isInternetAvailable: Boolean) {
val mainActivity = MainActivity.getInstance()
if (mainActivity != null) {
val currentFragmentId = mainActivity.getCurrentFragmentId()
val fragmentManager = mainActivity.supportFragmentManager
if (!isInternetAvailable) {
// If not connected to the internet, show NoInternetFragment and hide ActionBar and BottomNavigationView
mainActivity.runOnUiThread {
showNoInternetFragment(mainActivity)
hideActionBarAndNavBar(mainActivity)
}
} else {
// If internet is available and NoInternetFragment is visible, replace with the appropriate fragment and show ActionBar and BottomNavigationView
if (fragmentManager.findFragmentById(R.id.frameLayout) is NoInternetFragment) {
mainActivity.runOnUiThread {
mainActivity.replaceFragment(
mainActivity.getFragmentFromId(currentFragmentId),
) // Reinflate the previous fragment
mainActivity.supportActionBar?.title = applicationContext.getString(mainActivity.getTitleFromId(currentFragmentId)) // Reinflate the previous fragment's title
showActionBarAndNavBar(mainActivity)
}
}
}
}
}
private fun showNoInternetFragment(mainActivity: MainActivity) {
// Show NoInternetFragment
val noInternetFragment = NoInternetFragment()
mainActivity.replaceFragment(noInternetFragment)
}
private fun hideActionBarAndNavBar(mainActivity: MainActivity) {
mainActivity.supportActionBar?.hide()
mainActivity.binding.bottomNavigationView?.visibility = View.GONE
mainActivity.binding.navigationView?.visibility = View.GONE
}
private fun showActionBarAndNavBar(mainActivity: MainActivity) {
mainActivity.supportActionBar?.show()
if (mainActivity.resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) {
mainActivity.binding.bottomNavigationView?.visibility = View.VISIBLE
} else {
mainActivity.binding.navigationView?.visibility = View.VISIBLE
}
}
fun handleCloseButtonClick(mainActivity: MainActivity) {
val currentFragmentId = mainActivity.getCurrentFragmentId()
mainActivity.runOnUiThread {
mainActivity.replaceFragment(
mainActivity.getFragmentFromId(currentFragmentId),
) // Reinflate the previous fragment
mainActivity.supportActionBar?.title = mainActivity.getString(mainActivity.getTitleFromId(currentFragmentId)) // Reinflate the previous fragment's title
}
showActionBarAndNavBar(mainActivity)
}
}
\ No newline at end of file
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment