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{