diff --git a/app/src/main/java/com/huanchengfly/tieba/post/DataStore.kt b/app/src/main/java/com/huanchengfly/tieba/post/DataStore.kt index 99410629..4f8a68c4 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/DataStore.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/DataStore.kt @@ -3,8 +3,13 @@ package com.huanchengfly.tieba.post import android.annotation.SuppressLint import android.content.Context import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.MutableState import androidx.compose.runtime.State import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.platform.LocalContext import androidx.datastore.core.DataMigration import androidx.datastore.core.DataStore import androidx.datastore.preferences.SharedPreferencesMigration @@ -48,6 +53,25 @@ private val dataStoreInstance by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) val Context.dataStore: DataStore by dataStoreInstance +@Composable +fun rememberPreferenceAsMutableState( + key: Preferences.Key, + defaultValue: T +): MutableState { + val dataStore = LocalContext.current.dataStore + val state = remember { mutableStateOf(defaultValue) } + + LaunchedEffect(Unit) { + dataStore.data.map { it[key] ?: defaultValue }.collect { state.value = it } + } + + LaunchedEffect(state.value) { + dataStore.edit { it[key] = state.value } + } + + return state +} + @SuppressLint("FlowOperatorInvokedInComposition") @Composable fun DataStore.collectPreferenceAsState( diff --git a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/reply/ReplyPage.kt b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/reply/ReplyPage.kt index 77d57a6f..20e60b59 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/reply/ReplyPage.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/reply/ReplyPage.kt @@ -101,6 +101,7 @@ import com.huanchengfly.tieba.post.utils.Emoticon import com.huanchengfly.tieba.post.utils.EmoticonManager import com.huanchengfly.tieba.post.utils.PickMediasRequest import com.huanchengfly.tieba.post.utils.StringUtil +import com.huanchengfly.tieba.post.utils.appPreferences import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.spec.DestinationStyle @@ -308,11 +309,19 @@ fun ReplyPage( .collect { value = it } } val imeAnimationEnd by remember { derivedStateOf { imeCurrentHeight == imeAnimationTargetHeight } } - val imeVisibleHeight by produceState(initialValue = 0, imeAnimationTargetInset, density) { + val imeVisibleHeight by produceState( + initialValue = remember { context.appPreferences.imeHeight }, + imeAnimationTargetInset, + density + ) { snapshotFlow { imeAnimationTargetInset.getBottom(density) } .filter { it > 0 } .distinctUntilChanged() - .collect { value = it } + .collect { + Log.i("ReplyPage", "imeVisibleHeight: $it") + context.appPreferences.imeHeight = it + value = it + } } val textMeasurer = rememberTextMeasurer() diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/AppPreferencesUtils.kt b/app/src/main/java/com/huanchengfly/tieba/post/utils/AppPreferencesUtils.kt index 84894f6a..b64ae424 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/utils/AppPreferencesUtils.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/AppPreferencesUtils.kt @@ -118,6 +118,8 @@ open class AppPreferencesUtils private constructor(ctx: Context) { defaultValue = "0" ) + var imeHeight by DataStoreDelegates.int(defaultValue = 800) + var listItemsBackgroundIntermixed by DataStoreDelegates.boolean(defaultValue = true) var listSingle by DataStoreDelegates.boolean(defaultValue = false)