Optimize SafeDrawing fullscreen; set dialogs to 55% - android

This commit is contained in:
Hasinjato 2026-07-22 09:18:41 +03:00
parent db71756ed1
commit 203c14c457
4 changed files with 56 additions and 16 deletions

View file

@ -8,6 +8,7 @@ import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.Environment import android.os.Environment
import android.util.Base64 import android.util.Base64
import android.view.View
import android.view.WindowManager import android.view.WindowManager
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
@ -16,6 +17,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat import androidx.core.view.WindowInsetsControllerCompat
@ -62,11 +64,27 @@ class MainActivity : ComponentActivity() {
windowInsetsController.systemBarsBehavior = windowInsetsController.systemBarsBehavior =
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
window.decorView.setOnSystemUiVisibilityChangeListener { visibility ->
if (isFullScreen && (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
windowInsetsController.hide(WindowInsetsCompat.Type.statusBars() or WindowInsetsCompat.Type.navigationBars())
}
}
// Empêcher de rétablir la StatusBar quand le clavier s'ouvre
ViewCompat.setOnApplyWindowInsetsListener(window.decorView) { view, insets ->
if (isFullScreen) {
windowInsetsController.hide(WindowInsetsCompat.Type.statusBars() or WindowInsetsCompat.Type.navigationBars())
}
ViewCompat.onApplyWindowInsets(view, insets)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
window.attributes.layoutInDisplayCutoutMode = window.attributes.layoutInDisplayCutoutMode =
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
} }
} else { } else {
window.decorView.setOnSystemUiVisibilityChangeListener(null)
ViewCompat.setOnApplyWindowInsetsListener(window.decorView, null)
windowInsetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_DEFAULT
windowInsetsController.show(WindowInsetsCompat.Type.statusBars() or WindowInsetsCompat.Type.navigationBars()) windowInsetsController.show(WindowInsetsCompat.Type.statusBars() or WindowInsetsCompat.Type.navigationBars())
} }
} }

View file

@ -110,9 +110,18 @@ fun MainScreenWithDrawer(
val isFullScreenEnabled by sharedScreenModel.isFullScreen.collectAsState() val isFullScreenEnabled by sharedScreenModel.isFullScreen.collectAsState()
val fullscreenController = LocalFullscreenController.current val fullscreenController = LocalFullscreenController.current
LaunchedEffect(isFullScreenEnabled) { LaunchedEffect(isFullScreenEnabled, isSearchActive) {
fullscreenController(isFullScreenEnabled) if(isFullScreenEnabled) {
fullscreenController(true)
} }
}
val isImeVisible = WindowInsets.ime.asPaddingValues().calculateBottomPadding() > 0.dp
LaunchedEffect(isImeVisible) {
if (!isImeVisible && isFullScreenEnabled) {
fullscreenController(true)
}
}
val fileContent = sharedScreenModel.fileContent.value ?: "" val fileContent = sharedScreenModel.fileContent.value ?: ""
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
if(fileContent == "") { if(fileContent == "") {
@ -214,6 +223,8 @@ fun MainScreenWithDrawer(
songComp = songComposer, songComp = songComposer,
songRythm = songRhythm songRythm = songRhythm
) )
val platform = getPlatform()
val isAndroid = platform.name.startsWith("Android")
if (showPrintSettings) { if (showPrintSettings) {
PrintSettingsDialog( PrintSettingsDialog(
@ -223,7 +234,8 @@ fun MainScreenWithDrawer(
onConfirm = { settings -> onConfirm = { settings ->
showPrintSettings = false showPrintSettings = false
pdfExportAction(settings) pdfExportAction(settings)
} },
isAndroid
) )
} }
@ -234,13 +246,12 @@ fun MainScreenWithDrawer(
onDismissRequest = { onDismissRequest = {
showSettingsDialog = false showSettingsDialog = false
}, },
expandedDropdown expandedDropdown,
isAndroid
) )
} }
val favoritePaths by sharedScreenModel.playlistItems.collectAsState() val favoritePaths by sharedScreenModel.playlistItems.collectAsState()
BoxWithConstraints(modifier = Modifier.fillMaxSize()) { BoxWithConstraints(modifier = Modifier.fillMaxSize()) {
val platform = getPlatform()
val isAndroid = platform.name.startsWith("Android")
val topAppBarHeight = if (isAndroid) { val topAppBarHeight = if (isAndroid) {
if(maxWidth > maxHeight) { if(maxWidth > maxHeight) {
55.dp 55.dp
@ -248,11 +259,11 @@ fun MainScreenWithDrawer(
if (isFullScreenEnabled) 70.dp else 80.dp if (isFullScreenEnabled) 70.dp else 80.dp
} }
} else { } else {
55.dp 50.dp
} }
val isLandscape = maxWidth > maxHeight
Scaffold( Scaffold(
contentWindowInsets = if (isAndroid && !isFullScreenEnabled) { contentWindowInsets = if (isAndroid && !isFullScreenEnabled && !isLandscape) {
WindowInsets.safeDrawing.union(WindowInsets.displayCutout) WindowInsets.safeDrawing.union(WindowInsets.displayCutout)
} else { } else {
WindowInsets(0, 0, 0, 0) WindowInsets(0, 0, 0, 0)
@ -261,8 +272,8 @@ fun MainScreenWithDrawer(
TopAppBar( TopAppBar(
modifier = Modifier.height(topAppBarHeight) modifier = Modifier.height(topAppBarHeight)
.windowInsetsPadding( .windowInsetsPadding(
if (isAndroid && !isFullScreenEnabled) { if (isAndroid && !isFullScreenEnabled && !isLandscape) {
WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal) WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top)
} else { } else {
WindowInsets(0, 0, 0, 0) WindowInsets(0, 0, 0, 0)
} }

View file

@ -22,6 +22,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import mg.dot.feufaro.pdf.PageOrientation import mg.dot.feufaro.pdf.PageOrientation
import mg.dot.feufaro.pdf.PageSize import mg.dot.feufaro.pdf.PageSize
import mg.dot.feufaro.pdf.PrintSettings import mg.dot.feufaro.pdf.PrintSettings
@ -34,6 +35,7 @@ fun PrintSettingsDialog(
initialSettings: PrintSettings = defaultPrintSettings(), initialSettings: PrintSettings = defaultPrintSettings(),
onDismiss: () -> Unit, onDismiss: () -> Unit,
onConfirm: (PrintSettings) -> Unit, onConfirm: (PrintSettings) -> Unit,
isAndroid: Boolean
) { ) {
// ── État local (copie mutable des paramètres) ───────────────────────────── // ── État local (copie mutable des paramètres) ─────────────────────────────
var pageSize by remember { mutableStateOf(initialSettings.pageSize) } var pageSize by remember { mutableStateOf(initialSettings.pageSize) }
@ -51,11 +53,15 @@ fun PrintSettingsDialog(
var headerH by remember { mutableStateOf(initialSettings.headerH) } var headerH by remember { mutableStateOf(initialSettings.headerH) }
var nbGridOnMeasure by remember { mutableStateOf(initialSettings.nbGridOnMeasure) } var nbGridOnMeasure by remember { mutableStateOf(initialSettings.nbGridOnMeasure) }
Dialog(onDismissRequest = onDismiss) { Dialog(
properties = DialogProperties(
usePlatformDefaultWidth = false
),
onDismissRequest = onDismiss
) {
Surface( Surface(
modifier = Modifier modifier = Modifier
.fillMaxWidth(0.92f) .fillMaxWidth(if(isAndroid) 0.9f else 0.55f),
.fillMaxHeight(0.92f),
shape = RoundedCornerShape(16.dp), shape = RoundedCornerShape(16.dp),
tonalElevation = 8.dp, tonalElevation = 8.dp,
color = MaterialTheme.colorScheme.surface color = MaterialTheme.colorScheme.surface

View file

@ -27,6 +27,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.DialogProperties
import feufaro.composeapp.generated.resources.Emmentaler import feufaro.composeapp.generated.resources.Emmentaler
import feufaro.composeapp.generated.resources.Res import feufaro.composeapp.generated.resources.Res
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@ -44,7 +45,8 @@ import org.koin.compose.koinInject
fun Settings( fun Settings(
sharedScreenModel: SharedScreenModel, sharedScreenModel: SharedScreenModel,
onDismissRequest: () -> Unit, onDismissRequest: () -> Unit,
expandedDropdownN: Boolean expandedDropdownN: Boolean,
isAndroid: Boolean
) { ) {
var isDynamicEnabled by remember { mutableStateOf(Dynamic.isGloballyEnabled) } var isDynamicEnabled by remember { mutableStateOf(Dynamic.isGloballyEnabled) }
var refreshTrigger by remember { mutableStateOf(0) } var refreshTrigger by remember { mutableStateOf(0) }
@ -102,8 +104,11 @@ fun Settings(
} }
AlertDialog( AlertDialog(
properties = DialogProperties(
usePlatformDefaultWidth = false
),
modifier = Modifier modifier = Modifier
.fillMaxSize(), .fillMaxWidth(if(isAndroid) 0.9f else 0.55f),
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
title = { title = {
Text( Text(