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 7e11965a4e..f0f7648b9b 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,16 +3,19 @@ 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 +import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.windowInsetsBottomHeight import androidx.compose.foundation.rememberScrollState 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 @@ -58,7 +61,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 +104,7 @@ fun AboutScreen(onBackClick: () -> Unit) { versionText = versionText, appIdText = appIdText ) + Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.navigationBars)) } } 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 d086e281d1..004102a174 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,7 +6,11 @@ import android.os.Bundle import androidx.activity.viewModels import androidx.annotation.StringRes import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items @@ -16,7 +20,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.LaunchedEffect @@ -128,7 +131,7 @@ fun AppPickerScreen( } Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = title, @@ -185,7 +188,8 @@ fun AppPickerScreen( modifier = Modifier .fillMaxSize() .padding(innerPadding) - .verticalScrollbar(listState) + .verticalScrollbar(listState), + contentPadding = PaddingValues(bottom = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding()) ) { 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 1466c28c99..03c89d08cd 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,15 @@ 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.navigationBars import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.windowInsetsBottomHeight 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 @@ -198,7 +200,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 +237,7 @@ fun BackupScreen( subtitle = webDavSummary, onClick = { showWebDavDialog = true } ) + Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.navigationBars)) } } 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 43f1f8e3ec..5468f2beb1 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,14 +3,17 @@ 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.navigationBars import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.windowInsetsBottomHeight import androidx.compose.foundation.rememberScrollState 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 @@ -63,7 +66,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), @@ -90,6 +93,7 @@ fun CheckUpdateScreen( onClick = { viewModel.checkForUpdates() } ) VersionInfoBlock(versionText = versionText) + Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.navigationBars)) } } 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 dbf1694821..d9430b43c2 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 @@ -7,10 +7,14 @@ import androidx.activity.viewModels import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Column +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.fillMaxSize 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.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed @@ -21,7 +25,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 @@ -136,7 +139,7 @@ fun LogcatScreen( val listState = rememberLazyListState() Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = stringResource(R.string.title_logcat), @@ -206,7 +209,8 @@ fun LogcatScreen( state = listState, modifier = Modifier .fillMaxSize() - .verticalScrollbar(listState) + .verticalScrollbar(listState), + contentPadding = PaddingValues(bottom = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding()) ) { 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 ce88845557..bdc0de1807 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 1a16c2a768..14277064c2 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 @@ -6,10 +6,14 @@ import androidx.annotation.StringRes import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn @@ -20,7 +24,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 @@ -137,7 +140,7 @@ fun PerAppProxyScreen( } Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = stringResource(R.string.per_app_proxy_settings), @@ -264,7 +267,8 @@ fun PerAppProxyScreen( state = listState, modifier = Modifier .fillMaxSize() - .verticalScrollbar(listState) + .verticalScrollbar(listState), + contentPadding = PaddingValues(bottom = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding()) ) { 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 45d7e2ba30..e04cd76344 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,18 +6,20 @@ 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 import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.windowInsetsBottomHeight import androidx.compose.foundation.rememberScrollState 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.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable @@ -176,7 +178,7 @@ fun RoutingEditScreen( } Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = stringResource(R.string.routing_settings_rule_title), @@ -294,6 +296,7 @@ fun RoutingEditScreen( editable = true ) Spacer(modifier = Modifier.height(36.dp)) + Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.navigationBars)) } 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 a27604013a..3db4ee351b 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 @@ -6,11 +6,15 @@ import androidx.activity.viewModels import androidx.annotation.StringRes import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.fillMaxSize 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 @@ -22,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.Switch import androidx.compose.material3.SwitchDefaults import androidx.compose.material3.Text @@ -216,7 +219,7 @@ fun RoutingSettingScreen( } Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = stringResource(R.string.routing_settings_title), @@ -260,7 +263,8 @@ fun RoutingSettingScreen( modifier = Modifier .fillMaxSize() .padding(innerPadding) - .verticalScrollbar(lazyListState) + .verticalScrollbar(lazyListState), + contentPadding = PaddingValues(bottom = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding()) ) { 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 785a058e46..84c0ad435f 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,17 +4,20 @@ 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 +import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.windowInsetsBottomHeight import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll 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 @@ -448,7 +451,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 +484,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() + Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.navigationBars)) + } } 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 20247f6a0f..f28f34cea3 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 b968d7bcc8..3da223203c 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,14 +6,18 @@ 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 import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.windowInsetsBottomHeight import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.input.TextFieldLineLimits @@ -25,7 +29,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 @@ -310,7 +313,7 @@ fun ServerCustomConfigScreen( } Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = EConfigType.CUSTOM.toString(), @@ -478,6 +481,7 @@ fun ServerCustomConfigScreen( .horizontalScrollbar(scrollState = horizontalScroll) ) } + Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.navigationBars)) } } 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 9b4dd1d59d..17f74c92c1 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,16 +2,19 @@ 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 +import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.windowInsetsBottomHeight import androidx.compose.foundation.rememberScrollState 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 @@ -237,7 +240,7 @@ fun ServerGroupScreen( val supportsObservatory = BalancerStrategyType.from(selectedType).supportsObservatory Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = EConfigType.POLICYGROUP.toString(), @@ -297,6 +300,7 @@ fun ServerGroupScreen( editable = true ) } + Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.navigationBars)) } } } 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 1a10deaa25..fbb99ac7ac 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 04b120a5be..310504bf09 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 @@ -4,14 +4,16 @@ 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.navigationBars import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.windowInsetsBottomHeight 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.getValue import androidx.compose.runtime.mutableStateOf @@ -175,7 +177,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), @@ -656,6 +658,7 @@ fun SettingsScreen( } Spacer(modifier = Modifier.height(24.dp)) + Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.navigationBars)) } } } 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 cc11e6baa5..68972b60e7 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 @@ -5,10 +5,14 @@ import android.os.Bundle import android.text.TextUtils import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn @@ -19,7 +23,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 @@ -127,7 +130,7 @@ fun TaskerScreen( ) { val listState = rememberLazyListState() Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = "", @@ -154,7 +157,8 @@ fun TaskerScreen( state = listState, modifier = Modifier .fillMaxSize() - .verticalScrollbar(listState) + .verticalScrollbar(listState), + contentPadding = PaddingValues(bottom = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding()) ) { 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 977b754fea..6bf88f107b 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,16 +3,19 @@ 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 +import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.windowInsetsBottomHeight import androidx.compose.foundation.rememberScrollState 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 @@ -163,7 +166,7 @@ fun SubEditScreen( } Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = stringResource(R.string.title_sub_setting), @@ -237,6 +240,7 @@ fun SubEditScreen( onValueChange = { nextProfile = it }, editable = true ) + Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.navigationBars)) } } 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 82d9065d6b..59603ac122 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 @@ -6,11 +6,15 @@ import android.os.Bundle import androidx.activity.viewModels import androidx.annotation.StringRes import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.fillMaxSize 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.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed @@ -20,7 +24,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 @@ -127,7 +130,7 @@ fun SubSettingScreen( } Scaffold( - contentWindowInsets = ScaffoldDefaults.contentWindowInsets, + contentWindowInsets = WindowInsets(0), topBar = { AppTopBar( title = stringResource(R.string.title_sub_setting), @@ -149,7 +152,8 @@ fun SubSettingScreen( modifier = Modifier .fillMaxSize() .padding(innerPadding) - .verticalScrollbar(lazyListState) + .verticalScrollbar(lazyListState), + contentPadding = PaddingValues(bottom = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding()) ) { 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 32d80b6bd9..81d0434143 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 @@ -8,11 +8,15 @@ import androidx.activity.viewModels import androidx.annotation.StringRes import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.fillMaxSize 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.wrapContentSize @@ -25,7 +29,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 @@ -271,7 +274,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 +314,8 @@ fun UserAssetScreen( modifier = Modifier .fillMaxSize() .padding(innerPadding) - .verticalScrollbar(listState) + .verticalScrollbar(listState), + contentPadding = PaddingValues(bottom = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding()) ) { 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 3bba102122..8a7f758c98 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,15 @@ 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.navigationBars import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.windowInsetsBottomHeight 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 @@ -142,7 +145,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 +185,7 @@ fun UserAssetUrlScreen( value = url, onValueChange = { url = it } ) + Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.navigationBars)) } }