Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 56 additions & 3 deletions app/src/main/java/me/bmax/apatch/ui/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import android.os.Handler
import android.os.Looper
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.compose.BackHandler
import androidx.activity.ComponentActivity
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import androidx.compose.animation.AnimatedContentTransitionScope
Expand Down Expand Up @@ -176,7 +178,9 @@ import me.bmax.apatch.util.ui.isRealTimeBlurAvailable
import me.bmax.apatch.util.ui.showToast

class MainActivity : AppCompatActivity() {

companion object {
val pendingBarReset = mutableStateOf(false)
}
private var isLoading = true
private var installUri: Uri? = null
private var installUris: ArrayList<Uri>? = null
Expand Down Expand Up @@ -322,6 +326,12 @@ class MainActivity : AppCompatActivity() {
override fun onResume() {
super.onResume()
showBiometricPromptIfNeeded()
val prefs = APApplication.sharedPreferences
val navMode = prefs.getString("nav_mode", "floating") ?: "floating"
val floatingAutoHide = prefs.getBoolean("floating_auto_hide", true)
if (navMode == "floating" && floatingAutoHide) {
MainActivity.pendingBarReset.value = true
}
}

private fun showBiometricPromptIfNeeded() {
Expand Down Expand Up @@ -683,7 +693,15 @@ class MainActivity : AppCompatActivity() {
isBottomBarVisible = true
autoHideKey++
}


// 新增:重置导航栏 + 滚动状态的组合方法
fun resetBottomBarFully() {
resetBottomBarAutoHide()
isScrollingDown.value = false
scrollOffset.value = 0f
previousScrollOffset.value = 0f
}

// Remember the last valid navbar selection (persists across navbar hide/show)
val lastValidNavbarSelection = remember { mutableStateOf(0) }

Expand All @@ -695,7 +713,11 @@ class MainActivity : AppCompatActivity() {
// plus 3s auto-hide after last interaction.
val isFloatingMode = navMode == "floating"

LaunchedEffect(isFloatingMode, autoHideKey, floatingAutoHide) {
LaunchedEffect(isFloatingMode, autoHideKey, floatingAutoHide, MainActivity.pendingBarReset.value) {
if (MainActivity.pendingBarReset.value && isFloatingMode && floatingAutoHide) {
resetBottomBarFully()
MainActivity.pendingBarReset.value = false
}
if (isFloatingMode && floatingAutoHide && isBottomBarVisible) {
delay(3000L)
isBottomBarVisible = false
Expand All @@ -715,6 +737,19 @@ class MainActivity : AppCompatActivity() {
true
}

// 从二级页面返回一级 tab 时,强制显示导航栏并重置滚动方向
val previousRoute = remember { mutableStateOf<String?>(null) }
LaunchedEffect(currentRoute, isFloatingMode) {
if (isFloatingMode) {
val isCurrentTab = currentRoute in bottomBarRoutes
val wasPreviousTab = previousRoute.value in bottomBarRoutes
if (isCurrentTab && !wasPreviousTab && previousRoute.value != null) {
resetBottomBarFully()
}
previousRoute.value = currentRoute
}
}

// 使用 BoxWithConstraints 检测屏幕宽度
BoxWithConstraints(modifier = Modifier.fillMaxSize()) {
val useNavigationRail = when (navMode) {
Expand Down Expand Up @@ -806,6 +841,24 @@ class MainActivity : AppCompatActivity() {

if (!useNavigationRail) {
if (isFloatingMode) {
// ========== 悬浮导航栏返回键处理(始终存活)==========
val currentRouteForBack = navController.currentBackStackEntry?.destination?.route
val homeRoute = bottomBarRoutes.first()
val activityForBack = LocalContext.current as ComponentActivity

BackHandler(enabled = currentRouteForBack in bottomBarRoutes) {
if (currentRouteForBack != null && currentRouteForBack != homeRoute) {
// 完整重置滚动相关状态,确保导航栏立即显示
resetBottomBarFully()
// 原子操作:清空返回栈并跳转主页
navController.navigate(homeRoute) {
popUpTo(NavGraphs.root.route) { inclusive = true }
launchSingleTop = true
}
} else {
activityForBack.moveTaskToBack(false)
}
}
AnimatedVisibility(
visible = showBottomBar,
modifier = Modifier.align(Alignment.BottomCenter),
Expand Down
Loading