diff --git a/app/src/main/java/itb/bos/bondoman/LogoutActivity.kt b/app/src/main/java/itb/bos/bondoman/LogoutActivity.kt index 208ef3189f1daba9ef483ba8a32b1507221f94e7..84da8015655c6db482fe876b43f4010b354ae935 100644 --- a/app/src/main/java/itb/bos/bondoman/LogoutActivity.kt +++ b/app/src/main/java/itb/bos/bondoman/LogoutActivity.kt @@ -6,6 +6,7 @@ import android.widget.Button import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModelProvider import itb.bos.bondoman.helper.EmailHelper.Companion.sendTransactionsByEmail +import itb.bos.bondoman.retrofit.data.Transaction import itb.bos.bondoman.viewModel.AuthViewModel class LogoutActivity : AppCompatActivity() { @@ -26,7 +27,12 @@ class LogoutActivity : AppCompatActivity() { val sendEmailButton = findViewById<Button>(R.id.send_email_btn) sendEmailButton.setOnClickListener { - sendTransactionsByEmail() + val transactionList = listOf( + Transaction("1", "Item 1", 10.0, "2024-03-14", "Pemasukan", "Location 1"), + Transaction("2", "Item 2", 20.0, "2024-03-15", "Pengeluaran", "Location 2"), + Transaction("3", "Item 3", 30.0, "2024-03-16", "Pemasukan", "Location 3") + ) + sendTransactionsByEmail(this, transactionList, "xlsx") } } } diff --git a/app/src/main/java/itb/bos/bondoman/MainActivity.kt b/app/src/main/java/itb/bos/bondoman/MainActivity.kt index 9c5114910a20008041ba81c0c614c2fd92dbe6ba..5391cc4be84a8ee91a16dec87e6de758072e636a 100644 --- a/app/src/main/java/itb/bos/bondoman/MainActivity.kt +++ b/app/src/main/java/itb/bos/bondoman/MainActivity.kt @@ -1,5 +1,6 @@ package itb.bos.bondoman +import android.content.IntentFilter import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.navigation.ui.AppBarConfiguration @@ -11,6 +12,7 @@ import androidx.navigation.findNavController import androidx.navigation.ui.setupWithNavController import com.google.android.material.bottomnavigation.BottomNavigationView import itb.bos.bondoman.databinding.ActivityMainBinding +import itb.bos.bondoman.receivers.TokenExpiryBroadcastReceiver import itb.bos.bondoman.ui.settings.SettingsFragment import itb.bos.bondoman.ui.statistic.StatisticFragment import itb.bos.bondoman.ui.qr.QrFragment @@ -19,13 +21,15 @@ import itb.bos.bondoman.ui.transaction.TransactionFragment class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding + private val tokenExpiryReceiver = TokenExpiryBroadcastReceiver() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - + // Register the broadcast receiver + registerReceiver(tokenExpiryReceiver, IntentFilter("itb.bos.bondoman.ACTION_TOKEN_EXPIRED")) openFragment(TransactionFragment()) @@ -38,6 +42,37 @@ class MainActivity : AppCompatActivity() { true } } + + override fun onResume() { + super.onResume() + // Register the broadcast receiver + registerReceiver(tokenExpiryReceiver, IntentFilter("itb.bos.bondoman.ACTION_TOKEN_EXPIRED")) + } + + override fun onPause() { + super.onPause() + // Unregister the broadcast receiver + unregisterReceiver(tokenExpiryReceiver) + } + + override fun onStop() { + super.onStop() + unregisterReceiver(tokenExpiryReceiver) + } + + + override fun onRestart() { + super.onRestart() + registerReceiver(tokenExpiryReceiver, IntentFilter("itb.bos.bondoman.ACTION_TOKEN_EXPIRED")) + + } + + override fun onDestroy() { + super.onDestroy() + // Unregister the broadcast receiver + unregisterReceiver(tokenExpiryReceiver) + } + private fun openFragment(fragment: Fragment){ val fragmentManager = supportFragmentManager val fragmentTransaction = fragmentManager.beginTransaction() diff --git a/app/src/main/java/itb/bos/bondoman/receivers/TokenExpiryBroadcastReceiver.kt b/app/src/main/java/itb/bos/bondoman/receivers/TokenExpiryBroadcastReceiver.kt index 2e0f6c5c80fb7438d2221eeac313ab0611b7894a..ba4f3c2fcba4ce2a01cc8140f40a33dd0dbdb429 100644 --- a/app/src/main/java/itb/bos/bondoman/receivers/TokenExpiryBroadcastReceiver.kt +++ b/app/src/main/java/itb/bos/bondoman/receivers/TokenExpiryBroadcastReceiver.kt @@ -1,5 +1,6 @@ package itb.bos.bondoman.receivers +import android.app.AlertDialog import android.content.BroadcastReceiver import android.content.Context import android.content.Intent @@ -15,9 +16,23 @@ class TokenExpiryBroadcastReceiver : BroadcastReceiver() { Log.d("TokenExpiredBroadcast", "Received token expired broadcast. Logging out...") // You can implement logout logic here, for example: tokenHelper.removeToken() - it.startActivity(Intent(it, LoginActivity::class.java).apply { - addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK) - }) + + // Build an AlertDialog to show a popup + val alertDialogBuilder = AlertDialog.Builder(it) + alertDialogBuilder.apply { + setTitle("Session Expired") + setMessage("Your session has expired. Please login again.") + setPositiveButton("OK") { _, _ -> + // Start LoginActivity + val loginIntent = Intent(it, LoginActivity::class.java).apply { + addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK) + } + it.startActivity(loginIntent) + } + setCancelable(false) + create().show() + } } } } + diff --git a/app/src/main/java/itb/bos/bondoman/retrofit/data/TransactionData.kt b/app/src/main/java/itb/bos/bondoman/retrofit/data/TransactionData.kt index ac40e0b720b0c425621b18721f887f131acb4902..dc7de3aeb1fa5c306bea457ef61b82c6635a5c50 100644 --- a/app/src/main/java/itb/bos/bondoman/retrofit/data/TransactionData.kt +++ b/app/src/main/java/itb/bos/bondoman/retrofit/data/TransactionData.kt @@ -1,13 +1,11 @@ package itb.bos.bondoman.retrofit.data -import java.util.Date - // Dummy Transaction data class Transaction( val id: String, val name: String, val amount: Double, - val date: Date, + val date: String, val category: String, val location: String ) \ No newline at end of file diff --git a/app/src/main/java/itb/bos/bondoman/services/JWTService.kt b/app/src/main/java/itb/bos/bondoman/services/JWTService.kt index d70fb75923e95bd8944fadda9d32e7934a462528..38f4411e2f357c7f44046095d42e2b04eae618df 100644 --- a/app/src/main/java/itb/bos/bondoman/services/JWTService.kt +++ b/app/src/main/java/itb/bos/bondoman/services/JWTService.kt @@ -11,6 +11,7 @@ import itb.bos.bondoman.helper.TokenHelper import itb.bos.bondoman.helper.checkExpireToken import itb.bos.bondoman.receivers.TokenExpiryBroadcastReceiver import kotlinx.coroutines.* +import retrofit2.HttpException import java.util.concurrent.TimeUnit class JWTService : Service() { @@ -54,15 +55,15 @@ class JWTService : Service() { val token = tokenHelper.getToken() if (token != null) { - // Call the checkExpireToken function with the token + + // Check current and expire time val expireTime = checkExpireToken(token) + val currentTime = System.currentTimeMillis() / 1000 // Convert to seconds // If the token is retrieved successfully, log the expiry time - Log.d("TokenExpirationCheck", "Expiry time is: $expireTime") + Log.d("TokenExpirationCheck", "Expiry time is: $expireTime while current time is: $currentTime") - // Check if the current time has passed the expiry time - val currentTime = System.currentTimeMillis() / 1000 // Convert to seconds - if (currentTime > expireTime) { + if (expireTime <= currentTime) { // Token has expired, send broadcast to notify the application to logout Log.d("TokenExpirationCheck", "Token has expired, sending broadcast...") val intent = Intent(ACTION_TOKEN_EXPIRED) @@ -75,11 +76,18 @@ class JWTService : Service() { } } catch (e: Exception) { // Handle any exceptions - Log.e("TokenExpirationCheck", "Error checking token expiry: ${e.message}") + if (e is HttpException && e.code() == 401) { + Log.d("TokenExpirationCheck", "HTTP 401 Error: Token has expired, sending broadcast...") + val intent = Intent(ACTION_TOKEN_EXPIRED) + sendBroadcast(intent) + } else { + Log.e("TokenExpirationCheck", "Error checking token expiry: ${e.message}") + } } } + companion object { const val ACTION_TOKEN_EXPIRED = "itb.bos.bondoman.ACTION_TOKEN_EXPIRED" }