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