diff --git a/app/src/main/java/io/legado/app/base/BaseComposeActivity.kt b/app/src/main/java/io/legado/app/base/BaseComposeActivity.kt index 1ecddb6c7..3629c7c9a 100644 --- a/app/src/main/java/io/legado/app/base/BaseComposeActivity.kt +++ b/app/src/main/java/io/legado/app/base/BaseComposeActivity.kt @@ -11,11 +11,13 @@ import io.legado.app.constant.EventBus import io.legado.app.constant.Theme import io.legado.app.help.config.OldThemeConfig import io.legado.app.ui.theme.AppTheme +import io.legado.app.help.config.AppConfig import io.legado.app.utils.disableAutoFill import io.legado.app.utils.fullScreen import io.legado.app.utils.observeEvent import io.legado.app.utils.setStatusBarColorAuto import io.legado.app.utils.themeColor +import io.legado.app.utils.toggleSystemBar import io.legado.app.utils.windowSize abstract class BaseComposeActivity( @@ -61,6 +63,8 @@ abstract class BaseComposeActivity( true, fullScreen ) + + toggleSystemBar(AppConfig.showStatusBar) } open fun upBackgroundImage() { @@ -75,6 +79,9 @@ abstract class BaseComposeActivity( observeEvent(EventBus.RECREATE) { recreate() } + observeEvent(EventBus.NOTIFY_MAIN) { + setupSystemBar() + } } } diff --git a/app/src/main/java/io/legado/app/ui/config/PrefDelegate.kt b/app/src/main/java/io/legado/app/ui/config/PrefDelegate.kt index 11aa74b26..60e866f2d 100644 --- a/app/src/main/java/io/legado/app/ui/config/PrefDelegate.kt +++ b/app/src/main/java/io/legado/app/ui/config/PrefDelegate.kt @@ -1,7 +1,11 @@ package io.legado.app.ui.config +import android.content.SharedPreferences import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner +import io.legado.app.utils.defaultSharedPreferences import io.legado.app.utils.getPrefBoolean import io.legado.app.utils.getPrefInt import io.legado.app.utils.getPrefLong @@ -14,14 +18,39 @@ import splitties.init.appCtx import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty +interface PrefDelegate : ReadWriteProperty { + fun dispose() +} + fun prefDelegate( key: String, defaultValue: T, + lifecycleOwner: LifecycleOwner? = null, onValueChange: ((T) -> Unit)? = null -): ReadWriteProperty { - return object : ReadWriteProperty { +): PrefDelegate { + return object : PrefDelegate, SharedPreferences.OnSharedPreferenceChangeListener, DefaultLifecycleObserver { private var _value: MutableState = mutableStateOf(readInitialValue()) + init { + if (lifecycleOwner != null) { + lifecycleOwner.lifecycle.addObserver(this) + } else { + appCtx.defaultSharedPreferences.registerOnSharedPreferenceChangeListener(this) + } + } + + override fun onCreate(owner: LifecycleOwner) { + appCtx.defaultSharedPreferences.registerOnSharedPreferenceChangeListener(this) + } + + override fun onDestroy(owner: LifecycleOwner) { + dispose() + } + + override fun dispose() { + appCtx.defaultSharedPreferences.unregisterOnSharedPreferenceChangeListener(this) + } + @Suppress("UNCHECKED_CAST") private fun readInitialValue(): T { return when (defaultValue) { @@ -49,5 +78,15 @@ fun prefDelegate( onValueChange?.invoke(value) } } + + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, changedKey: String?) { + if (changedKey == key) { + val newValue = readInitialValue() + if (_value.value != newValue) { + _value.value = newValue + onValueChange?.invoke(newValue) + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index 8c2a75568..b1ef9a1d9 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -23,6 +23,7 @@ import io.legado.app.service.WebService import io.legado.app.ui.about.CrashLogsDialog import io.legado.app.ui.about.UpdateDialog import io.legado.app.ui.book.read.ReadBookActivity +import io.legado.app.ui.config.mainConfig.MainConfig import io.legado.app.ui.welcome.WelcomeActivity import io.legado.app.ui.widget.dialog.TextDialog import io.legado.app.utils.getPrefBoolean @@ -73,7 +74,7 @@ open class MainActivity : BaseComposeActivity() { override fun Content() { val orientation = resources.configuration.orientation val smallestWidthDp = resources.configuration.smallestScreenWidthDp - val tabletInterface = AppConfig.tabletInterface + val tabletInterface = MainConfig.tabletInterface val useRail = when (tabletInterface) { "always" -> true diff --git a/app/src/main/java/io/legado/app/ui/main/MainScreen.kt b/app/src/main/java/io/legado/app/ui/main/MainScreen.kt index 953b7d53a..3f5a1f363 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainScreen.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainScreen.kt @@ -137,6 +137,7 @@ fun MainScreen( } } ) { + val labelVisibilityMode = MainConfig.labelVisibilityMode destinations.forEachIndexed { index, destination -> val selected = pagerState.currentPage == index WideNavigationRailItem( @@ -150,7 +151,9 @@ fun MainScreen( icon = { NavigationIcon(destination, selected, uiState.upBooksCount) }, - label = { Text(stringResource(destination.labelId)) } + label = if (labelVisibilityMode != "unlabeled") { + { Text(stringResource(destination.labelId)) } + } else null ) } } @@ -169,6 +172,13 @@ fun MainScreen( blurAlpha = GlassDefaults.DefaultBlurAlpha ) ) { + val labelVisibilityMode = MainConfig.labelVisibilityMode + val alwaysShowLabel = when (labelVisibilityMode) { + "labeled" -> true + "selected" -> false + "unlabeled" -> false + else -> false + } destinations.forEachIndexed { index, destination -> val selected = pagerState.currentPage == index NavigationBarItem( @@ -187,8 +197,10 @@ fun MainScreen( blurAlpha = GlassDefaults.ThickBlurAlpha ), ), - label = { Text(stringResource(destination.labelId)) }, - alwaysShowLabel = false + label = if (labelVisibilityMode != "unlabeled") { + { Text(stringResource(destination.labelId)) } + } else null, + alwaysShowLabel = alwaysShowLabel ) } }