diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/AboutActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/AboutActivity.kt index 7e11965a..41db47ea 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/AboutActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/AboutActivity.kt @@ -3,6 +3,8 @@ package com.v2ray.ang.ui import android.os.Bundle import android.webkit.WebView import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.heightIn @@ -12,7 +14,6 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material3.AlertDialog import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable @@ -32,6 +33,7 @@ import com.v2ray.ang.R import com.v2ray.ang.core.CoreNativeManager import com.v2ray.ang.ui.base.BaseComponentActivity import com.v2ray.ang.ui.compose.AppTopBar +import com.v2ray.ang.ui.compose.NavigationBarsSpacer import com.v2ray.ang.ui.compose.SettingsMenuItem import com.v2ray.ang.ui.compose.VersionInfoBlock import com.v2ray.ang.util.Utils @@ -58,7 +60,7 @@ fun AboutScreen(onBackClick: () -> Unit) { val appIdText = BuildConfig.APPLICATION_ID Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = stringResource(R.string.title_about), @@ -101,6 +103,7 @@ fun AboutScreen(onBackClick: () -> Unit) { versionText = versionText, appIdText = appIdText ) + NavigationBarsSpacer() } } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/apppicker/AppPickerActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/apppicker/AppPickerActivity.kt index 46a35776..ed3cb96b 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/apppicker/AppPickerActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/apppicker/AppPickerActivity.kt @@ -6,6 +6,7 @@ import android.os.Bundle import androidx.activity.viewModels import androidx.annotation.StringRes import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn @@ -16,7 +17,7 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -35,6 +36,7 @@ import com.v2ray.ang.ui.compose.AppDropdownMenuItems import com.v2ray.ang.ui.compose.AppListItem import com.v2ray.ang.ui.compose.AppTopBar import com.v2ray.ang.ui.compose.ItemDivider +import com.v2ray.ang.ui.compose.NavigationBarsBottomPadding import com.v2ray.ang.ui.compose.verticalScrollbar private enum class AppPickerMenuAction(@StringRes val labelRes: Int) { @@ -127,7 +129,7 @@ fun AppPickerScreen( } Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = title, @@ -184,7 +186,8 @@ fun AppPickerScreen( modifier = Modifier .fillMaxSize() .padding(innerPadding) - .verticalScrollbar(listState) + .verticalScrollbar(listState), + contentPadding = NavigationBarsBottomPadding() ) { items(items = apps, key = { it.packageName }) { app -> val checked = selectedPackages.contains(app.packageName) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/backup/BackupActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/backup/BackupActivity.kt index 1466c28c..eb09f69c 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/backup/BackupActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/backup/BackupActivity.kt @@ -7,13 +7,13 @@ import androidx.activity.viewModels import androidx.annotation.StringRes import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue @@ -39,6 +39,7 @@ import com.v2ray.ang.handler.SettingsManager import com.v2ray.ang.ui.base.HelperBaseComponentActivity import com.v2ray.ang.ui.compose.AppTopBar import com.v2ray.ang.ui.compose.InputDialog +import com.v2ray.ang.ui.compose.NavigationBarsSpacer import com.v2ray.ang.ui.compose.InputField import com.v2ray.ang.ui.compose.SelectListDialog import com.v2ray.ang.ui.compose.SettingsMenuItem @@ -198,7 +199,7 @@ fun BackupScreen( val webDavSummary = currentWebDavConfig?.baseUrl Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = stringResource(R.string.title_configuration_backup_restore), @@ -235,6 +236,7 @@ fun BackupScreen( subtitle = webDavSummary, onClick = { showWebDavDialog = true } ) + NavigationBarsSpacer() } } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/checkupdate/CheckUpdateActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/checkupdate/CheckUpdateActivity.kt index 4fb53934..8c94ed55 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/checkupdate/CheckUpdateActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/checkupdate/CheckUpdateActivity.kt @@ -3,6 +3,8 @@ package com.v2ray.ang.ui.checkupdate import android.os.Bundle import androidx.activity.viewModels import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -11,7 +13,6 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material3.AlertDialog import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable @@ -26,6 +27,7 @@ import com.v2ray.ang.R import com.v2ray.ang.core.CoreNativeManager import com.v2ray.ang.ui.base.BaseComponentActivity import com.v2ray.ang.ui.compose.AppTopBar +import com.v2ray.ang.ui.compose.NavigationBarsSpacer import com.v2ray.ang.ui.compose.SettingsMenuItem import com.v2ray.ang.ui.compose.SettingsSwitchItem import com.v2ray.ang.ui.compose.VersionInfoBlock @@ -65,7 +67,7 @@ fun CheckUpdateScreen( val versionText = "v${BuildConfig.VERSION_NAME} ($libVersion)" Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = stringResource(R.string.update_check_for_update), @@ -92,6 +94,7 @@ fun CheckUpdateScreen( onClick = { viewModel.checkForUpdates() } ) VersionInfoBlock(versionText = versionText) + NavigationBarsSpacer() } } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/compose/Components.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/compose/Components.kt index bf876f49..c5a7e940 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/compose/Components.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/compose/Components.kt @@ -8,12 +8,17 @@ import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.windowInsetsBottomHeight import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.selection.TextSelectionColors import androidx.compose.material3.Checkbox @@ -225,6 +230,17 @@ fun AppDivider(modifier: Modifier = Modifier) { HorizontalDivider(modifier = modifier.fillMaxWidth(), thickness = 1.dp, color = color) } +@Composable +fun NavigationBarsSpacer(modifier: Modifier = Modifier) { + Spacer(modifier = modifier.windowInsetsBottomHeight(WindowInsets.navigationBars)) +} + +@Composable +fun NavigationBarsBottomPadding(): PaddingValues { + val bottom = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + return PaddingValues(bottom = bottom) +} + @Composable fun VersionInfoBlock( versionText: String, diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/logcat/LogcatActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/logcat/LogcatActivity.kt index 32e971ed..79fe83d4 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/logcat/LogcatActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/logcat/LogcatActivity.kt @@ -8,6 +8,7 @@ import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -21,7 +22,6 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -43,6 +43,7 @@ import com.v2ray.ang.extension.toastError import com.v2ray.ang.ui.base.BaseComponentActivity import com.v2ray.ang.ui.compose.AppTopBar import com.v2ray.ang.ui.compose.ItemDivider +import com.v2ray.ang.ui.compose.NavigationBarsBottomPadding import com.v2ray.ang.ui.compose.verticalScrollbar import com.v2ray.ang.util.LogUtil import com.v2ray.ang.util.Utils @@ -139,7 +140,7 @@ fun LogcatScreen( val listState = rememberLazyListState() Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = stringResource(R.string.title_logcat), @@ -209,7 +210,8 @@ fun LogcatScreen( state = listState, modifier = Modifier .fillMaxSize() - .verticalScrollbar(listState) + .verticalScrollbar(listState), + contentPadding = NavigationBarsBottomPadding() ) { itemsIndexed(items = logs, key = { index, _ -> index }) { _, log -> LogcatItem(log = log, onLongClick = { Utils.setClipboard(context, log) }) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainBottomBar.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainBottomBar.kt index ce888455..bdc0de18 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainBottomBar.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainBottomBar.kt @@ -1,5 +1,6 @@ package com.v2ray.ang.ui.main +import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -17,7 +18,6 @@ import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -40,26 +40,23 @@ fun MainBottomBar( onAction: (MainAction) -> Unit ) { Box(modifier = Modifier.fillMaxWidth()) { - Column(modifier = Modifier.fillMaxWidth()) { + Column( + modifier = Modifier + .fillMaxWidth() + .background(MaterialTheme.colorScheme.surface) + .clickable(onClick = { onAction(MainAction.TestCurrentServer) }) + .windowInsetsPadding(WindowInsets.navigationBars) + ) { AppDivider() - Surface( + Row( modifier = Modifier .fillMaxWidth() - .windowInsetsPadding(WindowInsets.navigationBars) .height(64.dp) - .clickable(onClick = { onAction(MainAction.TestCurrentServer) }), - color = MaterialTheme.colorScheme.surface, - tonalElevation = 0.dp + .padding(horizontal = 16.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween ) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - Text(text = displayText, style = MaterialTheme.typography.bodyMedium) - } + Text(text = displayText, style = MaterialTheme.typography.bodyMedium) } } FloatingActionButton( diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/perappproxy/PerAppProxyActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/perappproxy/PerAppProxyActivity.kt index abacfdec..a575bfd4 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/perappproxy/PerAppProxyActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/perappproxy/PerAppProxyActivity.kt @@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -20,7 +21,6 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults import androidx.compose.material3.Surface import androidx.compose.material3.Switch import androidx.compose.material3.SwitchDefaults @@ -49,6 +49,8 @@ import com.v2ray.ang.ui.compose.AppDropdownMenuItems import com.v2ray.ang.ui.compose.AppListItem import com.v2ray.ang.ui.compose.AppTopBar import com.v2ray.ang.ui.compose.ItemDivider +import com.v2ray.ang.ui.compose.colorFabActive +import com.v2ray.ang.ui.compose.NavigationBarsBottomPadding import com.v2ray.ang.ui.compose.verticalScrollbar import com.v2ray.ang.util.Utils @@ -136,7 +138,7 @@ fun PerAppProxyScreen( } Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = stringResource(R.string.per_app_proxy_settings), @@ -263,7 +265,8 @@ fun PerAppProxyScreen( state = listState, modifier = Modifier .fillMaxSize() - .verticalScrollbar(listState) + .verticalScrollbar(listState), + contentPadding = NavigationBarsBottomPadding() ) { items(items = apps, key = { it.packageName }) { app -> val checked = blacklist.contains(app.packageName) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/routing/RoutingEditActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/routing/RoutingEditActivity.kt index fc03292b..9d428a4a 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/routing/RoutingEditActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/routing/RoutingEditActivity.kt @@ -6,6 +6,7 @@ import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height @@ -18,7 +19,6 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable @@ -46,6 +46,7 @@ import com.v2ray.ang.ui.compose.AppTopBar import com.v2ray.ang.ui.compose.DeleteConfirmDialog import com.v2ray.ang.ui.compose.FormDropdownField import com.v2ray.ang.ui.compose.FormTextField +import com.v2ray.ang.ui.compose.NavigationBarsSpacer import com.v2ray.ang.ui.compose.SettingsSwitchItem import com.v2ray.ang.ui.compose.verticalScrollbar import kotlinx.coroutines.Dispatchers @@ -178,7 +179,7 @@ fun RoutingEditScreen( } Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = stringResource(R.string.routing_settings_rule_title), @@ -302,6 +303,7 @@ fun RoutingEditScreen( editable = true ) Spacer(modifier = Modifier.height(36.dp)) + NavigationBarsSpacer() } if (showDeleteConfirm) { diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/routing/RoutingSettingActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/routing/RoutingSettingActivity.kt index bf80a4b6..825bd27e 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/routing/RoutingSettingActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/routing/RoutingSettingActivity.kt @@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -22,7 +23,6 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults import androidx.compose.material3.Switch import androidx.compose.material3.SwitchDefaults import androidx.compose.material3.Text @@ -58,6 +58,8 @@ import com.v2ray.ang.ui.compose.ReorderableListItem import com.v2ray.ang.ui.compose.SelectListDialog import com.v2ray.ang.ui.compose.SettingsListItem import com.v2ray.ang.ui.compose.colorConfigType +import com.v2ray.ang.ui.compose.colorFabActive +import com.v2ray.ang.ui.compose.NavigationBarsBottomPadding import com.v2ray.ang.ui.compose.verticalScrollbar import com.v2ray.ang.util.JsonUtil import com.v2ray.ang.util.LogUtil @@ -215,7 +217,7 @@ fun RoutingSettingScreen( } Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = stringResource(R.string.routing_settings_title), @@ -259,7 +261,8 @@ fun RoutingSettingScreen( modifier = Modifier .fillMaxSize() .padding(innerPadding) - .verticalScrollbar(lazyListState) + .verticalScrollbar(lazyListState), + contentPadding = NavigationBarsBottomPadding() ) { item(key = "domain_strategy") { SettingsListItem( diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/BaseServerActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/BaseServerActivity.kt index 785a058e..2228de46 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/BaseServerActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/BaseServerActivity.kt @@ -4,6 +4,8 @@ import android.os.Bundle import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.imePadding @@ -14,7 +16,6 @@ import androidx.compose.material3.Button import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -44,6 +45,7 @@ import com.v2ray.ang.ui.compose.AppTopBar import com.v2ray.ang.ui.compose.DeleteConfirmDialog import com.v2ray.ang.ui.compose.FormDropdownField import com.v2ray.ang.ui.compose.FormTextField +import com.v2ray.ang.ui.compose.NavigationBarsSpacer import com.v2ray.ang.ui.compose.SettingsSwitchItem import com.v2ray.ang.ui.compose.verticalScrollbar import com.v2ray.ang.util.JsonUtil @@ -448,7 +450,7 @@ abstract class BaseServerActivity : BaseComponentActivity() { var showDeleteDialog by rememberSaveable { mutableStateOf(false) } val scrollState = rememberScrollState() Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = title, @@ -481,9 +483,11 @@ abstract class BaseServerActivity : BaseComponentActivity() { .verticalScroll(scrollState) .verticalScrollbar(scrollState) .padding(bottom = 36.dp), - verticalArrangement = Arrangement.spacedBy(8.dp), - content = content - ) + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + content() + NavigationBarsSpacer() + } } if (showDeleteDialog) { DeleteConfirmDialog( diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerActivity.kt index 20247f6a..f28f34ce 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerActivity.kt @@ -3,9 +3,12 @@ package com.v2ray.ang.ui.server import android.os.Bundle import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.rememberLazyListState @@ -13,7 +16,6 @@ import androidx.compose.material3.Button import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -339,7 +341,7 @@ fun ServerScreen( ) Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = configType.toString(), @@ -367,7 +369,7 @@ fun ServerScreen( .consumeWindowInsets(innerPadding) .imePadding() .verticalScrollbar(listState), - contentPadding = PaddingValues(bottom = 36.dp), + contentPadding = PaddingValues(bottom = 36.dp + WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding()), verticalArrangement = Arrangement.spacedBy(8.dp) ) { item { FormTextField(stringResource(R.string.server_lab_remarks), remarks, { remarks = it }) } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerCustomConfigActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerCustomConfigActivity.kt index b968d7bc..ad7448c1 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerCustomConfigActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerCustomConfigActivity.kt @@ -6,6 +6,8 @@ import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize @@ -25,7 +27,6 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider @@ -66,6 +67,7 @@ import com.v2ray.ang.ui.base.BaseComponentActivity import com.v2ray.ang.ui.compose.AppTopBar import com.v2ray.ang.ui.compose.DeleteConfirmDialog import com.v2ray.ang.ui.compose.FormTextField +import com.v2ray.ang.ui.compose.NavigationBarsSpacer import com.v2ray.ang.ui.compose.horizontalScrollbar import com.v2ray.ang.ui.compose.verticalScrollbar import com.v2ray.ang.util.LogUtil @@ -310,7 +312,7 @@ fun ServerCustomConfigScreen( } Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = EConfigType.CUSTOM.toString(), @@ -478,6 +480,7 @@ fun ServerCustomConfigScreen( .horizontalScrollbar(scrollState = horizontalScroll) ) } + NavigationBarsSpacer() } } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerGroupActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerGroupActivity.kt index 9b4dd1d5..2edd2752 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerGroupActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerGroupActivity.kt @@ -2,6 +2,8 @@ package com.v2ray.ang.ui.server import android.os.Bundle import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.imePadding @@ -11,7 +13,6 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -39,6 +40,7 @@ import com.v2ray.ang.ui.compose.AppTopBar import com.v2ray.ang.ui.compose.DeleteConfirmDialog import com.v2ray.ang.ui.compose.FormDropdownField import com.v2ray.ang.ui.compose.FormTextField +import com.v2ray.ang.ui.compose.NavigationBarsSpacer import com.v2ray.ang.ui.compose.SettingsSwitchItem class ServerGroupActivity : BaseComponentActivity() { @@ -237,7 +239,7 @@ fun ServerGroupScreen( val supportsObservatory = BalancerStrategyType.from(selectedType).supportsObservatory Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = EConfigType.POLICYGROUP.toString(), @@ -297,6 +299,7 @@ fun ServerGroupScreen( editable = true ) } + NavigationBarsSpacer() } } } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerProxyChainActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerProxyChainActivity.kt index 1a10deaa..fbb99ac7 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerProxyChainActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/server/ServerProxyChainActivity.kt @@ -4,10 +4,13 @@ import android.os.Bundle import androidx.compose.animation.core.animateDpAsState import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding @@ -20,7 +23,6 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -220,7 +222,7 @@ fun ProxyChainScreen( } Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = EConfigType.PROXYCHAIN.toString(), @@ -263,7 +265,7 @@ fun ProxyChainScreen( top = 8.dp, start = 16.dp, end = 16.dp, - bottom = 36.dp + bottom = 36.dp + WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() ) ) { item(key = "remarks_field") { diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/settings/SettingsActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/settings/SettingsActivity.kt index b9f84dc3..d044521e 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/settings/SettingsActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/settings/SettingsActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import androidx.activity.viewModels import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -12,7 +13,6 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -37,6 +37,7 @@ import com.v2ray.ang.root.RootManager import com.v2ray.ang.ui.base.BaseComponentActivity import com.v2ray.ang.ui.compose.AppTopBar import com.v2ray.ang.ui.compose.CollapsiblePreferenceGroupHeader +import com.v2ray.ang.ui.compose.NavigationBarsSpacer import com.v2ray.ang.ui.compose.SettingsEditItem import com.v2ray.ang.ui.compose.SettingsListItem import com.v2ray.ang.ui.compose.SettingsMenuItem @@ -186,7 +187,7 @@ fun SettingsScreen( val modeValues = stringArrayResource(R.array.mode_value).toList() Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = stringResource(R.string.title_settings), @@ -677,6 +678,7 @@ fun SettingsScreen( } Spacer(modifier = Modifier.height(24.dp)) + NavigationBarsSpacer() } } } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/shortcut/TaskerActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/shortcut/TaskerActivity.kt index cc11e6ba..d9a4f941 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/shortcut/TaskerActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/shortcut/TaskerActivity.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -19,7 +20,6 @@ import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.RadioButton import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState @@ -35,6 +35,7 @@ import com.v2ray.ang.handler.MmkvManager import com.v2ray.ang.ui.base.BaseComponentActivity import com.v2ray.ang.ui.compose.AppTopBar import com.v2ray.ang.ui.compose.SettingsSwitchItem +import com.v2ray.ang.ui.compose.NavigationBarsBottomPadding import com.v2ray.ang.ui.compose.verticalScrollbar import com.v2ray.ang.util.LogUtil @@ -127,7 +128,7 @@ fun TaskerScreen( ) { val listState = rememberLazyListState() Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = "", @@ -154,7 +155,8 @@ fun TaskerScreen( state = listState, modifier = Modifier .fillMaxSize() - .verticalScrollbar(listState) + .verticalScrollbar(listState), + contentPadding = NavigationBarsBottomPadding() ) { itemsIndexed(items) { index, remarks -> Row( diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/subscription/SubEditActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/subscription/SubEditActivity.kt index 545fb3c7..a82a6d63 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/subscription/SubEditActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/subscription/SubEditActivity.kt @@ -3,6 +3,8 @@ package com.v2ray.ang.ui.subscription import android.os.Bundle import android.text.TextUtils import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.imePadding @@ -12,7 +14,6 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -40,6 +41,7 @@ import com.v2ray.ang.ui.compose.AppTopBar import com.v2ray.ang.ui.compose.DeleteConfirmDialog import com.v2ray.ang.ui.compose.FormDropdownField import com.v2ray.ang.ui.compose.FormTextField +import com.v2ray.ang.ui.compose.NavigationBarsSpacer import com.v2ray.ang.ui.compose.SettingsSwitchItem import com.v2ray.ang.ui.compose.verticalScrollbar import com.v2ray.ang.util.Utils @@ -163,7 +165,7 @@ fun SubEditScreen( } Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = stringResource(R.string.title_sub_setting), @@ -239,6 +241,7 @@ fun SubEditScreen( editable = true, supportingText = stringResource(R.string.sub_setting_exit_proxy_tip) ) + NavigationBarsSpacer() } } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/subscription/SubSettingActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/subscription/SubSettingActivity.kt index bf2ab80a..b3f9851d 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/subscription/SubSettingActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/subscription/SubSettingActivity.kt @@ -8,6 +8,7 @@ import androidx.annotation.StringRes import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -20,7 +21,6 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults import androidx.compose.material3.Switch import androidx.compose.material3.SwitchDefaults import androidx.compose.material3.Text @@ -51,6 +51,8 @@ import com.v2ray.ang.ui.compose.QRCodeDialog import com.v2ray.ang.ui.compose.ReorderableListItem import com.v2ray.ang.ui.compose.SelectListDialog import com.v2ray.ang.ui.compose.SettingsSwitchItem +import com.v2ray.ang.ui.compose.colorFabActive +import com.v2ray.ang.ui.compose.NavigationBarsBottomPadding import com.v2ray.ang.ui.compose.verticalScrollbar import com.v2ray.ang.util.QRCodeDecoder import com.v2ray.ang.util.Utils @@ -126,7 +128,7 @@ fun SubSettingScreen( } Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = stringResource(R.string.title_sub_setting), @@ -148,7 +150,8 @@ fun SubSettingScreen( modifier = Modifier .fillMaxSize() .padding(innerPadding) - .verticalScrollbar(lazyListState) + .verticalScrollbar(lazyListState), + contentPadding = NavigationBarsBottomPadding() ) { itemsIndexed( items = subscriptions, diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/userasset/UserAssetActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/userasset/UserAssetActivity.kt index 32d80b6b..a4c31a74 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/userasset/UserAssetActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/userasset/UserAssetActivity.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -25,7 +26,6 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState @@ -58,6 +58,7 @@ import com.v2ray.ang.ui.compose.AppTopBar import com.v2ray.ang.ui.compose.DeleteConfirmDialog import com.v2ray.ang.ui.compose.ItemDivider import com.v2ray.ang.ui.compose.SettingsListItem +import com.v2ray.ang.ui.compose.NavigationBarsBottomPadding import com.v2ray.ang.ui.compose.verticalScrollbar import com.v2ray.ang.util.LogUtil import com.v2ray.ang.util.Utils @@ -271,7 +272,7 @@ fun UserAssetScreen( val listState = rememberLazyListState() Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = stringResource(R.string.title_user_asset_setting), @@ -311,7 +312,8 @@ fun UserAssetScreen( modifier = Modifier .fillMaxSize() .padding(innerPadding) - .verticalScrollbar(listState) + .verticalScrollbar(listState), + contentPadding = NavigationBarsBottomPadding() ) { item(key = "geo_source_$trigger") { SettingsListItem( diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/userasset/UserAssetUrlActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/userasset/UserAssetUrlActivity.kt index 3bba1021..fc2447e2 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/userasset/UserAssetUrlActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/userasset/UserAssetUrlActivity.kt @@ -3,12 +3,13 @@ package com.v2ray.ang.ui.userasset import android.os.Bundle import android.text.TextUtils import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScaffoldDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -28,6 +29,7 @@ import com.v2ray.ang.ui.base.BaseComponentActivity import com.v2ray.ang.ui.compose.AppTopBar import com.v2ray.ang.ui.compose.DeleteConfirmDialog import com.v2ray.ang.ui.compose.FormTextField +import com.v2ray.ang.ui.compose.NavigationBarsSpacer import com.v2ray.ang.util.LogUtil import com.v2ray.ang.util.Utils import java.io.File @@ -142,7 +144,7 @@ fun UserAssetUrlScreen( var showDeleteConfirm by remember { mutableStateOf(false) } Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = stringResource(R.string.title_user_asset_add_url), @@ -182,6 +184,7 @@ fun UserAssetUrlScreen( value = url, onValueChange = { url = it } ) + NavigationBarsSpacer() } }