diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/HomeActivity.kt b/app/src/main/java/sh/sar/basedbank/ui/home/HomeActivity.kt
index bdfd2dc..24d0c92 100644
--- a/app/src/main/java/sh/sar/basedbank/ui/home/HomeActivity.kt
+++ b/app/src/main/java/sh/sar/basedbank/ui/home/HomeActivity.kt
@@ -14,8 +14,10 @@ import android.widget.Toast
import sh.sar.basedbank.ui.home.NavCustomization
import androidx.appcompat.app.AlertDialog
import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import androidx.activity.OnBackPressedCallback
import androidx.activity.viewModels
import androidx.appcompat.app.ActionBarDrawerToggle
+import androidx.core.view.GravityCompat
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
@@ -72,6 +74,10 @@ class HomeActivity : AppCompatActivity() {
private lateinit var toggle: ActionBarDrawerToggle
private var suppressBottomNavCallback = false
+ private var backPressedOnce = false
+ private val backPressHandler = Handler(Looper.getMainLooper())
+ private val resetBackPress = Runnable { backPressedOnce = false }
+
private val autolockHandler = Handler(Looper.getMainLooper())
private var warningDialog: AlertDialog? = null
private var countdownTimer: CountDownTimer? = null
@@ -211,6 +217,42 @@ class HomeActivity : AppCompatActivity() {
binding.navigationView.setCheckedItem(R.id.nav_dashboard)
}
+ onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
+ override fun handleOnBackPressed() {
+ // Close drawer if open (drawer-nav mode)
+ if (binding.drawerLayout.isDrawerOpen(GravityCompat.START)) {
+ binding.drawerLayout.closeDrawers()
+ return
+ }
+ // Pop fragment back stack if there's anything on it (e.g. showWithBackStack)
+ if (supportFragmentManager.backStackEntryCount > 0) {
+ supportFragmentManager.popBackStack()
+ return
+ }
+ // In bottom nav mode, pressing back navigates up the hierarchy
+ val isBottomNav = getSharedPreferences("prefs", MODE_PRIVATE).getBoolean("bottom_nav", false)
+ if (isBottomNav && binding.bottomNavigation.selectedItemId != R.id.nav_dashboard) {
+ val currentFrag = supportFragmentManager.findFragmentById(R.id.contentFrame)
+ // Sub-page reached via More (e.g. Settings, Activities) — go back to More
+ if (binding.bottomNavigation.selectedItemId == R.id.nav_more && currentFrag !is MoreFragment) {
+ show(MoreFragment())
+ return
+ }
+ binding.bottomNavigation.selectedItemId = R.id.nav_dashboard
+ return
+ }
+ // At top level — require double-tap to exit
+ if (backPressedOnce) {
+ backPressHandler.removeCallbacks(resetBackPress)
+ finish()
+ } else {
+ backPressedOnce = true
+ Toast.makeText(this@HomeActivity, R.string.press_back_to_exit, Toast.LENGTH_SHORT).show()
+ backPressHandler.postDelayed(resetBackPress, 2000)
+ }
+ }
+ })
+
// Keep all MIB sessions alive every 25 seconds while the app is in the foreground
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 27154d1..1b0f212 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -89,6 +89,7 @@
Open navigation
Close navigation
Work in progress
+ Press back again to exit
Pending Finances