refactor: 重构代码
This commit is contained in:
parent
63665c64a3
commit
28763176cf
5 changed files with 113 additions and 65 deletions
|
|
@ -34,7 +34,7 @@ android {
|
||||||
applicationId = "cn.super12138.todo"
|
applicationId = "cn.super12138.todo"
|
||||||
minSdk = 24
|
minSdk = 24
|
||||||
targetSdk = 36
|
targetSdk = 36
|
||||||
versionCode = 719
|
versionCode = 726
|
||||||
versionName = "2.1.2"
|
versionName = "2.1.2"
|
||||||
|
|
||||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
|
||||||
|
|
@ -102,17 +102,11 @@ fun TodoNavigation(
|
||||||
}
|
}
|
||||||
|
|
||||||
composable(TodoScreen.SettingsAppearance.name) {
|
composable(TodoScreen.SettingsAppearance.name) {
|
||||||
SettingsAppearance(
|
SettingsAppearance(onNavigateUp = { navController.navigateUp() })
|
||||||
viewModel = viewModel,
|
|
||||||
onNavigateUp = { navController.navigateUp() }
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
composable(TodoScreen.SettingsInterface.name) {
|
composable(TodoScreen.SettingsInterface.name) {
|
||||||
SettingsInterface(
|
SettingsInterface(onNavigateUp = { navController.navigateUp() })
|
||||||
viewModel = viewModel,
|
|
||||||
onNavigateUp = { navController.navigateUp() }
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
composable(TodoScreen.SettingsData.name) {
|
composable(TodoScreen.SettingsData.name) {
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,10 @@
|
||||||
package cn.super12138.todo.ui.pages.editor
|
package cn.super12138.todo.ui.pages.editor
|
||||||
|
|
||||||
import android.view.HapticFeedbackConstants
|
|
||||||
import androidx.activity.compose.BackHandler
|
import androidx.activity.compose.BackHandler
|
||||||
import androidx.compose.animation.AnimatedVisibility
|
import androidx.compose.animation.AnimatedVisibility
|
||||||
import androidx.compose.animation.AnimatedVisibilityScope
|
import androidx.compose.animation.AnimatedVisibilityScope
|
||||||
import androidx.compose.animation.ExperimentalSharedTransitionApi
|
import androidx.compose.animation.ExperimentalSharedTransitionApi
|
||||||
import androidx.compose.animation.SharedTransitionScope
|
import androidx.compose.animation.SharedTransitionScope
|
||||||
import androidx.compose.foundation.interaction.MutableInteractionSource
|
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
|
|
@ -16,8 +14,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.imePadding
|
import androidx.compose.foundation.layout.imePadding
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.layout.size
|
import androidx.compose.foundation.layout.size
|
||||||
import androidx.compose.foundation.layout.sizeIn
|
|
||||||
import androidx.compose.foundation.layout.wrapContentWidth
|
|
||||||
import androidx.compose.foundation.rememberScrollState
|
import androidx.compose.foundation.rememberScrollState
|
||||||
import androidx.compose.foundation.verticalScroll
|
import androidx.compose.foundation.verticalScroll
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
|
|
@ -25,11 +21,7 @@ import androidx.compose.material.icons.automirrored.outlined.Undo
|
||||||
import androidx.compose.material.icons.outlined.Delete
|
import androidx.compose.material.icons.outlined.Delete
|
||||||
import androidx.compose.material.icons.outlined.Save
|
import androidx.compose.material.icons.outlined.Save
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.Label
|
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.PlainTooltip
|
|
||||||
import androidx.compose.material3.Slider
|
|
||||||
import androidx.compose.material3.SliderDefaults
|
|
||||||
import androidx.compose.material3.Switch
|
import androidx.compose.material3.Switch
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.material3.TextField
|
import androidx.compose.material3.TextField
|
||||||
|
|
@ -48,16 +40,10 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.platform.LocalView
|
import androidx.compose.ui.platform.LocalView
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.semantics.LiveRegionMode
|
|
||||||
import androidx.compose.ui.semantics.contentDescription
|
|
||||||
import androidx.compose.ui.semantics.liveRegion
|
|
||||||
import androidx.compose.ui.semantics.semantics
|
|
||||||
import androidx.compose.ui.semantics.stateDescription
|
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import cn.super12138.todo.R
|
import cn.super12138.todo.R
|
||||||
import cn.super12138.todo.constants.Constants
|
import cn.super12138.todo.constants.Constants
|
||||||
import cn.super12138.todo.logic.database.TodoEntity
|
import cn.super12138.todo.logic.database.TodoEntity
|
||||||
import cn.super12138.todo.logic.model.Priority
|
|
||||||
import cn.super12138.todo.logic.model.Subjects
|
import cn.super12138.todo.logic.model.Subjects
|
||||||
import cn.super12138.todo.ui.TodoDefaults
|
import cn.super12138.todo.ui.TodoDefaults
|
||||||
import cn.super12138.todo.ui.components.AnimatedExtendedFloatingActionButton
|
import cn.super12138.todo.ui.components.AnimatedExtendedFloatingActionButton
|
||||||
|
|
@ -65,6 +51,8 @@ import cn.super12138.todo.ui.components.ChipItem
|
||||||
import cn.super12138.todo.ui.components.ConfirmDialog
|
import cn.super12138.todo.ui.components.ConfirmDialog
|
||||||
import cn.super12138.todo.ui.components.FilterChipGroup
|
import cn.super12138.todo.ui.components.FilterChipGroup
|
||||||
import cn.super12138.todo.ui.components.LargeTopAppBarScaffold
|
import cn.super12138.todo.ui.components.LargeTopAppBarScaffold
|
||||||
|
import cn.super12138.todo.ui.pages.editor.components.TodoContentTextField
|
||||||
|
import cn.super12138.todo.ui.pages.editor.components.TodoPrioritySlider
|
||||||
import cn.super12138.todo.utils.VibrationUtils
|
import cn.super12138.todo.utils.VibrationUtils
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class, ExperimentalSharedTransitionApi::class)
|
@OptIn(ExperimentalMaterial3Api::class, ExperimentalSharedTransitionApi::class)
|
||||||
|
|
@ -175,16 +163,10 @@ fun TodoEditorPage(
|
||||||
.verticalScroll(rememberScrollState())
|
.verticalScroll(rememberScrollState())
|
||||||
) {
|
) {
|
||||||
with(sharedTransitionScope) {
|
with(sharedTransitionScope) {
|
||||||
TextField(
|
TodoContentTextField(
|
||||||
value = toDoContent,
|
value = toDoContent,
|
||||||
onValueChange = { toDoContent = it },
|
onValueChange = { toDoContent = it },
|
||||||
label = { Text(stringResource(R.string.placeholder_add_todo)) },
|
|
||||||
isError = isErrorContent,
|
isError = isErrorContent,
|
||||||
supportingText = {
|
|
||||||
AnimatedVisibility(isErrorContent) {
|
|
||||||
Text(stringResource(R.string.error_no_content_entered))
|
|
||||||
}
|
|
||||||
},
|
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.sharedBounds(
|
.sharedBounds(
|
||||||
|
|
@ -251,42 +233,9 @@ fun TodoEditorPage(
|
||||||
|
|
||||||
Spacer(Modifier.size(5.dp))
|
Spacer(Modifier.size(5.dp))
|
||||||
|
|
||||||
val priorityName =
|
TodoPrioritySlider(
|
||||||
Priority.entries.map { it.getDisplayName(context) } // 要不要用 remember 呢
|
|
||||||
val interactionSource = remember { MutableInteractionSource() }
|
|
||||||
Slider(
|
|
||||||
modifier = Modifier.semantics {
|
|
||||||
contentDescription =
|
|
||||||
context.getString(R.string.label_priority) + priorityName[Priority.fromFloat(
|
|
||||||
priorityState
|
|
||||||
).ordinal]
|
|
||||||
stateDescription = priorityName[Priority.fromFloat(priorityState).ordinal]
|
|
||||||
liveRegion = LiveRegionMode.Polite
|
|
||||||
},
|
|
||||||
value = priorityState,
|
value = priorityState,
|
||||||
onValueChange = {
|
onValueChange = { priorityState = it },
|
||||||
VibrationUtils.performHapticFeedback(view, HapticFeedbackConstants.LONG_PRESS)
|
|
||||||
priorityState = it
|
|
||||||
},
|
|
||||||
valueRange = -2f..2f,
|
|
||||||
steps = 3,
|
|
||||||
interactionSource = interactionSource,
|
|
||||||
thumb = {
|
|
||||||
Label(
|
|
||||||
label = {
|
|
||||||
PlainTooltip(
|
|
||||||
modifier = Modifier
|
|
||||||
.sizeIn(45.dp, 25.dp)
|
|
||||||
.wrapContentWidth()
|
|
||||||
) {
|
|
||||||
Text(priorityName[Priority.fromFloat(priorityState).ordinal])
|
|
||||||
}
|
|
||||||
},
|
|
||||||
interactionSource = interactionSource
|
|
||||||
) {
|
|
||||||
SliderDefaults.Thumb(interactionSource)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
Spacer(Modifier.size(10.dp))
|
Spacer(Modifier.size(10.dp))
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
package cn.super12138.todo.ui.pages.editor.components
|
||||||
|
|
||||||
|
import androidx.compose.animation.AnimatedVisibility
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.material3.TextField
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import cn.super12138.todo.R
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun TodoContentTextField(
|
||||||
|
value: String,
|
||||||
|
onValueChange: (String) -> Unit,
|
||||||
|
isError: Boolean,
|
||||||
|
modifier: Modifier = Modifier
|
||||||
|
) {
|
||||||
|
TextField(
|
||||||
|
value = value,
|
||||||
|
onValueChange = onValueChange,
|
||||||
|
label = { Text(stringResource(R.string.placeholder_add_todo)) },
|
||||||
|
isError = isError,
|
||||||
|
supportingText = {
|
||||||
|
AnimatedVisibility(isError) {
|
||||||
|
Text(stringResource(R.string.error_no_content_entered))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
modifier = modifier
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
package cn.super12138.todo.ui.pages.editor.components
|
||||||
|
|
||||||
|
import android.view.HapticFeedbackConstants
|
||||||
|
import androidx.compose.foundation.interaction.MutableInteractionSource
|
||||||
|
import androidx.compose.foundation.layout.sizeIn
|
||||||
|
import androidx.compose.foundation.layout.wrapContentWidth
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
|
import androidx.compose.material3.Label
|
||||||
|
import androidx.compose.material3.PlainTooltip
|
||||||
|
import androidx.compose.material3.Slider
|
||||||
|
import androidx.compose.material3.SliderDefaults
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import androidx.compose.ui.platform.LocalView
|
||||||
|
import androidx.compose.ui.semantics.LiveRegionMode
|
||||||
|
import androidx.compose.ui.semantics.contentDescription
|
||||||
|
import androidx.compose.ui.semantics.liveRegion
|
||||||
|
import androidx.compose.ui.semantics.semantics
|
||||||
|
import androidx.compose.ui.semantics.stateDescription
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import cn.super12138.todo.R
|
||||||
|
import cn.super12138.todo.logic.model.Priority
|
||||||
|
import cn.super12138.todo.utils.VibrationUtils
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
|
@Composable
|
||||||
|
fun TodoPrioritySlider(
|
||||||
|
value: Float,
|
||||||
|
onValueChange: (Float) -> Unit,
|
||||||
|
modifier: Modifier = Modifier
|
||||||
|
) {
|
||||||
|
val view = LocalView.current
|
||||||
|
val context = LocalContext.current
|
||||||
|
|
||||||
|
val priorityName = remember { Priority.entries.map { it.getDisplayName(context) } }
|
||||||
|
val interactionSource = remember { MutableInteractionSource() }
|
||||||
|
|
||||||
|
Slider(
|
||||||
|
value = value,
|
||||||
|
onValueChange = {
|
||||||
|
VibrationUtils.performHapticFeedback(view, HapticFeedbackConstants.LONG_PRESS)
|
||||||
|
onValueChange(it)
|
||||||
|
},
|
||||||
|
valueRange = -2f..2f,
|
||||||
|
steps = 3,
|
||||||
|
interactionSource = interactionSource,
|
||||||
|
thumb = {
|
||||||
|
Label(
|
||||||
|
label = {
|
||||||
|
PlainTooltip(
|
||||||
|
modifier = Modifier
|
||||||
|
.sizeIn(45.dp, 25.dp)
|
||||||
|
.wrapContentWidth()
|
||||||
|
) {
|
||||||
|
Text(priorityName[Priority.fromFloat(value).ordinal])
|
||||||
|
}
|
||||||
|
},
|
||||||
|
interactionSource = interactionSource
|
||||||
|
) {
|
||||||
|
SliderDefaults.Thumb(interactionSource)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
modifier = modifier.semantics {
|
||||||
|
contentDescription =
|
||||||
|
context.getString(R.string.label_priority) + priorityName[Priority.fromFloat(
|
||||||
|
value
|
||||||
|
).ordinal]
|
||||||
|
stateDescription = priorityName[Priority.fromFloat(value).ordinal]
|
||||||
|
liveRegion = LiveRegionMode.Polite
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue