From 35c67e418acd1969fe9f9f71f378938bcfbb4c74 Mon Sep 17 00:00:00 2001 From: Super12138 <70494801+Super12138@users.noreply.github.com> Date: Sat, 11 Jan 2025 18:23:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E5=BE=85=E5=8A=9E?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E5=92=8C=E6=95=B0=E6=8D=AE=E5=BA=93=E7=9A=84?= =?UTF-8?q?=E7=BB=91=E5=AE=9A&=E6=9B=B4=E6=96=B0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/.gitignore | 3 +- app/build.gradle.kts | 4 + app/src/main/AndroidManifest.xml | 2 +- .../kotlin/cn/super12138/todo/MainActivity.kt | 47 -------- .../todo/logic/database/TodoEntity.kt | 3 +- .../todo/ui/activities/MainActivity.kt | 24 ++++ .../todo/ui/navigation/ToDoNavigation.kt | 29 +++++ .../todo/ui/navigation/ToDoScreen.kt | 6 + .../super12138/todo/ui/pages/main/MainPage.kt | 112 ++++++++++++++++++ .../todo/ui/pages/main/ManagerFragment.kt | 41 +++++++ .../todo/ui/pages/main/ProgressFragment.kt | 67 +++++++++++ .../todo/ui/pages/main/components/TodoCard.kt | 66 +++++++++++ .../todo/ui/viewmodels/MainViewModel.kt | 18 +++ app/src/main/res/values-zh-rCN/strings.xml | 6 + app/src/main/res/values/strings.xml | 4 +- gradle/libs.versions.toml | 2 +- 16 files changed, 381 insertions(+), 53 deletions(-) delete mode 100644 app/src/main/kotlin/cn/super12138/todo/MainActivity.kt create mode 100644 app/src/main/kotlin/cn/super12138/todo/ui/activities/MainActivity.kt create mode 100644 app/src/main/kotlin/cn/super12138/todo/ui/navigation/ToDoNavigation.kt create mode 100644 app/src/main/kotlin/cn/super12138/todo/ui/navigation/ToDoScreen.kt create mode 100644 app/src/main/kotlin/cn/super12138/todo/ui/pages/main/MainPage.kt create mode 100644 app/src/main/kotlin/cn/super12138/todo/ui/pages/main/ManagerFragment.kt create mode 100644 app/src/main/kotlin/cn/super12138/todo/ui/pages/main/ProgressFragment.kt create mode 100644 app/src/main/kotlin/cn/super12138/todo/ui/pages/main/components/TodoCard.kt create mode 100644 app/src/main/kotlin/cn/super12138/todo/ui/viewmodels/MainViewModel.kt create mode 100644 app/src/main/res/values-zh-rCN/strings.xml diff --git a/app/.gitignore b/app/.gitignore index 42afabf..956c004 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ -/build \ No newline at end of file +/build +/release \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 775791a..7bf7045 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -6,6 +6,10 @@ plugins { alias(libs.plugins.aboutlibraries) } +ksp { + arg("room.schemaLocation", "$projectDir/schemas") +} + android { namespace = "cn.super12138.todo" compileSdk = 35 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 06f87b5..92ae6dd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,7 +14,7 @@ android:theme="@style/Theme.ToDo" tools:targetApi="35"> diff --git a/app/src/main/kotlin/cn/super12138/todo/MainActivity.kt b/app/src/main/kotlin/cn/super12138/todo/MainActivity.kt deleted file mode 100644 index 0589e32..0000000 --- a/app/src/main/kotlin/cn/super12138/todo/MainActivity.kt +++ /dev/null @@ -1,47 +0,0 @@ -package cn.super12138.todo - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.activity.enableEdgeToEdge -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview -import cn.super12138.todo.ui.theme.ToDoTheme - -class MainActivity : ComponentActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - enableEdgeToEdge() - setContent { - ToDoTheme { - Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> - Greeting( - name = "Android", - modifier = Modifier.padding(innerPadding) - ) - } - } - } - } -} - -@Composable -fun Greeting(name: String, modifier: Modifier = Modifier) { - Text( - text = "Hello $name!", - modifier = modifier - ) -} - -@Preview(showBackground = true) -@Composable -fun GreetingPreview() { - ToDoTheme { - Greeting("Android") - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/cn/super12138/todo/logic/database/TodoEntity.kt b/app/src/main/kotlin/cn/super12138/todo/logic/database/TodoEntity.kt index b4ffcb0..001f9aa 100644 --- a/app/src/main/kotlin/cn/super12138/todo/logic/database/TodoEntity.kt +++ b/app/src/main/kotlin/cn/super12138/todo/logic/database/TodoEntity.kt @@ -6,9 +6,8 @@ import androidx.room.PrimaryKey @Entity(tableName = "todo") data class TodoEntity( - @ColumnInfo(name = "type") val type: Int, @ColumnInfo(name = "content") val content: String, @ColumnInfo(name = "subject") val subject: String, @ColumnInfo(name = "completed") val isCompleted: Boolean = false, - @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id") val id: Long = 0L, + @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id") val id: Int = 0, ) diff --git a/app/src/main/kotlin/cn/super12138/todo/ui/activities/MainActivity.kt b/app/src/main/kotlin/cn/super12138/todo/ui/activities/MainActivity.kt new file mode 100644 index 0000000..6910948 --- /dev/null +++ b/app/src/main/kotlin/cn/super12138/todo/ui/activities/MainActivity.kt @@ -0,0 +1,24 @@ +package cn.super12138.todo.ui.activities + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import cn.super12138.todo.ui.navigation.ToDoNavigation +import cn.super12138.todo.ui.theme.ToDoTheme + +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() + super.onCreate(savedInstanceState) + setContent { + ToDoTheme { + Surface(color = MaterialTheme.colorScheme.background) { + ToDoNavigation() + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/cn/super12138/todo/ui/navigation/ToDoNavigation.kt b/app/src/main/kotlin/cn/super12138/todo/ui/navigation/ToDoNavigation.kt new file mode 100644 index 0000000..5fe2959 --- /dev/null +++ b/app/src/main/kotlin/cn/super12138/todo/ui/navigation/ToDoNavigation.kt @@ -0,0 +1,29 @@ +package cn.super12138.todo.ui.navigation + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation.NavHostController +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController +import cn.super12138.todo.ui.pages.main.MainPage + +@Composable +fun ToDoNavigation( + navController: NavHostController = rememberNavController(), + startDestination: String = ToDoScreen.Main.name, + modifier: Modifier = Modifier +) { + NavHost( + navController = navController, + startDestination = startDestination, + modifier = modifier + ) { + composable(ToDoScreen.Main.name) { + MainPage( + viewModel = viewModel() + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/cn/super12138/todo/ui/navigation/ToDoScreen.kt b/app/src/main/kotlin/cn/super12138/todo/ui/navigation/ToDoScreen.kt new file mode 100644 index 0000000..6f927ac --- /dev/null +++ b/app/src/main/kotlin/cn/super12138/todo/ui/navigation/ToDoScreen.kt @@ -0,0 +1,6 @@ +package cn.super12138.todo.ui.navigation + +enum class ToDoScreen { + Main, + Settings +} \ No newline at end of file diff --git a/app/src/main/kotlin/cn/super12138/todo/ui/pages/main/MainPage.kt b/app/src/main/kotlin/cn/super12138/todo/ui/pages/main/MainPage.kt new file mode 100644 index 0000000..44946a3 --- /dev/null +++ b/app/src/main/kotlin/cn/super12138/todo/ui/pages/main/MainPage.kt @@ -0,0 +1,112 @@ +package cn.super12138.todo.ui.pages.main + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Add +import androidx.compose.material.icons.outlined.Settings +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import cn.super12138.todo.R +import cn.super12138.todo.logic.database.TodoEntity +import cn.super12138.todo.ui.pages.main.components.TodoCard +import cn.super12138.todo.ui.viewmodels.MainViewModel + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun MainPage(viewModel: MainViewModel, modifier: Modifier = Modifier) { + val toDoList = viewModel.toDos.collectAsState(initial = emptyList()) + val listState = rememberLazyListState() + val isExpanded by remember { + derivedStateOf { + listState.firstVisibleItemIndex == 0 + } + } + + + Scaffold( + topBar = { + TopAppBar( + title = { + Text(stringResource(R.string.app_name)) + }, + actions = { + IconButton( + onClick = {} + ) { + Icon( + imageVector = Icons.Outlined.Settings, + contentDescription = stringResource(R.string.pages_settings) + ) + } + } + ) + }, + floatingActionButton = { + FloatingActionButton( + onClick = { + viewModel.addTodo( + TodoEntity( + content = "测试内容", + subject = "测试学科" + ) + ) + } + ) { + Row( + modifier = Modifier.padding(horizontal = 16.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + imageVector = Icons.Outlined.Add, + contentDescription = stringResource(R.string.action_add_todo) + ) + AnimatedVisibility(isExpanded) { + Text( + text = stringResource(R.string.action_add_todo), + modifier = Modifier.padding(start = 8.dp) + ) + } + } + } + }, + modifier = modifier.fillMaxSize() + ) { innerPadding -> + Column(modifier = Modifier.padding(innerPadding)) { + ProgressFragment( + modifier = Modifier + .weight(2f) + .fillMaxSize() + ) + + ManagerFragment( + state = listState, + list = toDoList.value, + modifier = Modifier + .weight(3f) + .fillMaxSize() + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/cn/super12138/todo/ui/pages/main/ManagerFragment.kt b/app/src/main/kotlin/cn/super12138/todo/ui/pages/main/ManagerFragment.kt new file mode 100644 index 0000000..2764a02 --- /dev/null +++ b/app/src/main/kotlin/cn/super12138/todo/ui/pages/main/ManagerFragment.kt @@ -0,0 +1,41 @@ +package cn.super12138.todo.ui.pages.main + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyListState +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import cn.super12138.todo.logic.database.TodoEntity +import cn.super12138.todo.ui.pages.main.components.TodoCard + +@Composable +fun ManagerFragment( + state: LazyListState, + list: List, + modifier: Modifier = Modifier +) { + LazyColumn( + modifier = modifier, + state = state, + contentPadding = PaddingValues( + start = 10.dp, + end = 10.dp, + ) + ) { + items( + items = list, + key = { it.id } + ) { item -> + TodoCard( + content = item.content, + subject = item.subject, + modifier = Modifier + .padding(vertical = 5.dp) + .animateItem() + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/cn/super12138/todo/ui/pages/main/ProgressFragment.kt b/app/src/main/kotlin/cn/super12138/todo/ui/pages/main/ProgressFragment.kt new file mode 100644 index 0000000..fc280ad --- /dev/null +++ b/app/src/main/kotlin/cn/super12138/todo/ui/pages/main/ProgressFragment.kt @@ -0,0 +1,67 @@ +package cn.super12138.todo.ui.pages.main + +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.size +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ProgressIndicatorDefaults +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp + +@Composable +fun ProgressFragment(modifier: Modifier = Modifier) { + var progress by rememberSaveable { mutableFloatStateOf(0.1f) } + val animatedProgress by animateFloatAsState( + targetValue = progress, + animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec, + label = "To Do Progress" + ) + Box( + modifier = modifier, + contentAlignment = Alignment.Center + ) { + CircularProgressIndicator( + progress = { animatedProgress }, + strokeWidth = 10.dp, + gapSize = 10.dp, + modifier = Modifier.size(170.dp) + ) + Column { + Row(verticalAlignment = Alignment.CenterVertically) { + Text( + text = "0", + style = MaterialTheme.typography.displaySmall.copy( + fontWeight = FontWeight.Bold + ) + ) + Text( + text = "/", + style = MaterialTheme.typography.displayMedium.copy( + fontWeight = FontWeight.Bold + ) + ) + Text( + text = "0", + style = MaterialTheme.typography.displayMedium.copy( + fontWeight = FontWeight.Bold + ) + ) + } + } + /*Slider( + value = progress, + onValueChange = { progress = it } + )*/ + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/cn/super12138/todo/ui/pages/main/components/TodoCard.kt b/app/src/main/kotlin/cn/super12138/todo/ui/pages/main/components/TodoCard.kt new file mode 100644 index 0000000..a620b27 --- /dev/null +++ b/app/src/main/kotlin/cn/super12138/todo/ui/pages/main/components/TodoCard.kt @@ -0,0 +1,66 @@ +package cn.super12138.todo.ui.pages.main.components + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Check +import androidx.compose.material3.ElevatedCard +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp + +@Composable +fun TodoCard( + content: String, + subject: String, + onCardClick: () -> Unit = {}, + onChecked: () -> Unit = {}, + modifier: Modifier = Modifier +) { + ElevatedCard( + modifier = modifier + .fillMaxWidth() + .height(80.dp), + onClick = onCardClick + ) { + Row( + modifier = Modifier + .fillMaxSize() + .padding(start = 15.dp, end = 15.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Column( + modifier = Modifier.weight(1f) + ) { + Text( + text = content, + style = MaterialTheme.typography.titleLarge + ) + Text( + text = subject, + style = MaterialTheme.typography.labelLarge.copy( + fontSize = 11.sp + ) + ) + } + + IconButton(onClick = onChecked) { + Icon( + imageVector = Icons.Outlined.Check, + tint = MaterialTheme.colorScheme.primary, + contentDescription = "" + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/cn/super12138/todo/ui/viewmodels/MainViewModel.kt b/app/src/main/kotlin/cn/super12138/todo/ui/viewmodels/MainViewModel.kt new file mode 100644 index 0000000..dbb3e86 --- /dev/null +++ b/app/src/main/kotlin/cn/super12138/todo/ui/viewmodels/MainViewModel.kt @@ -0,0 +1,18 @@ +package cn.super12138.todo.ui.viewmodels + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import cn.super12138.todo.logic.Repository +import cn.super12138.todo.logic.database.TodoEntity +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.launch + +class MainViewModel : ViewModel() { + val toDos: Flow> = Repository.getAllTodos() + + fun addTodo(toDo: TodoEntity) { + viewModelScope.launch { + Repository.insertTodo(toDo) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml new file mode 100644 index 0000000..36468eb --- /dev/null +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -0,0 +1,6 @@ + + + 待办 + 设置 + 添加待办 + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 58613ed..473e5e5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,5 @@ - ToDo + To Do + Settings + Add todo \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7278d29..22ed39e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -22,7 +22,7 @@ junit = "4.13.2" junitVersion = "1.2.1" espressoCore = "3.6.1" # Plugins -agp = "8.7.3" +agp = "8.8.0" kotlin = "2.1.0" ksp = "2.1.0-1.0.29"