🎉 发布 3.0.0 版本

This commit is contained in:
Super12138 2026-02-09 20:48:59 +08:00
parent 8059fd15a0
commit 48a70d12c6
65 changed files with 263 additions and 197 deletions

View file

@ -1,5 +1,5 @@
name: 问题反馈 / Bug Report name: 问题反馈 / Bug Report
description: 发现并反馈问题以帮助改进待办 / Create a report to help us improve To Do description: 发现并反馈问题以帮助改进 VerveDo / Create a report to help us improve VerveDo
title: "[Bug] " title: "[Bug] "
labels: [ "bug" ] labels: [ "bug" ]
body: body:
@ -8,7 +8,7 @@ body:
attributes: attributes:
label: 检查列表 / Checklist label: 检查列表 / Checklist
options: options:
- label: 我正在使用待办的最新版本 / I am using the latest version of To Do - label: 我正在使用 VerveDo 的最新版本 / I am using the latest version of VerveDo
required: true required: true
- label: 确认没有之前相似或重复的问题(若重复会直接关闭) / Confirm that there are no similar or duplicate issues previously raised (if duplicate, the issue will be closed directly) - label: 确认没有之前相似或重复的问题(若重复会直接关闭) / Confirm that there are no similar or duplicate issues previously raised (if duplicate, the issue will be closed directly)
required: true required: true
@ -16,8 +16,8 @@ body:
- type: dropdown - type: dropdown
id: version-variant id: version-variant
attributes: attributes:
label: 待办版本类型 / To Do Variant label: VerveDo 版本类型 / VerveDo Variant
description: 请选择当前待办的版本类型 / Select the version of To Do variant you're currently using description: 请选择当前 VerveDo 的版本类型 / Select the version of VerveDo variant you're currently using
options: options:
- 最新 ReleaseF-Droid版 / Latest release (F-Droid) - 最新 ReleaseF-Droid版 / Latest release (F-Droid)
- 最新 CI 版 / Latest CI - 最新 CI 版 / Latest CI
@ -27,8 +27,8 @@ body:
- type: input - type: input
id: version-code id: version-code
attributes: attributes:
label: 待办版本 label: VerveDo 版本
description: 请输入你正在使用的待办版本,你可以在设置中找到 / Enter the version of To Do you're using. You can find this in the settings description: 请输入你正在使用的 VerveDo 版本,你可以在设置中找到 / Enter the version of VerveDo you're using. You can find this in the settings
placeholder: 例如2.0.2(561) / e.g. 2.0.2(561) placeholder: 例如2.0.2(561) / e.g. 2.0.2(561)
validations: validations:
required: true required: true

View file

@ -1,5 +1,5 @@
name: 功能请求 / Feature request name: 功能请求 / Feature request
description: 待办提出一个新功能 / Suggest an idea for To Do description: VerveDo 提出一个新功能 / Suggest an idea for VerveDo
title: "[Feature] " title: "[Feature] "
labels: [ "enhancement" ] labels: [ "enhancement" ]
body: body:

View file

@ -43,7 +43,7 @@ jobs:
run: chmod +x gradlew run: chmod +x gradlew
- name: Write sign info - name: Write sign info
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main' && github.repository == 'Super12138/ToDo' if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main' && github.repository == 'Super12138/VerveDo'
run: | run: |
if [ ! -z "${{ secrets.SIGNING_KEY }}" ]; then if [ ! -z "${{ secrets.SIGNING_KEY }}" ]; then
echo releaseStorePassword='${{ secrets.KEY_STORE_PASSWORD }}' >> gradle.properties echo releaseStorePassword='${{ secrets.KEY_STORE_PASSWORD }}' >> gradle.properties
@ -61,7 +61,7 @@ jobs:
run: ./gradlew assembleRelease run: ./gradlew assembleRelease
- name: Upload APK - name: Upload APK
if: success() && github.event_name != 'pull_request' && github.repository == 'Super12138/ToDo' if: success() && github.event_name != 'pull_request' && github.repository == 'Super12138/VerveDo'
uses: actions/upload-artifact@v6.0.0 uses: actions/upload-artifact@v6.0.0
with: with:
name: Release name: Release

View file

@ -1,4 +1,4 @@
name: Todo Script Build name: VerveDo Script Build
on: on:
push: push:
@ -37,5 +37,5 @@ jobs:
- name: Upload artifact - name: Upload artifact
uses: actions/upload-artifact@v6.0.0 uses: actions/upload-artifact@v6.0.0
with: with:
name: Todo Script name: VerveDo Script
path: ./script/updateVersionCode.js path: ./script/updateVersionCode.js

View file

@ -1,24 +1,28 @@
![应用界面一览](https://s2.loli.net/2025/02/17/l7soMcfm6HJRg8t.png) ![应用界面一览](https://s2.loli.net/2026/02/09/EJS1HLOAvKyaRsl.png)
# 待办 # VerveDo
一个简单的、遵循 Material 3 Expressive 的待办应用,使用 Jetpack Compose 编写 一个简单的、遵循 Material 3 Expressive 的待办应用,使用 Jetpack Compose 编写
**简体中文** | [English](https://github.com/Super12138/ToDo/blob/main/README_EN.md) **简体中文** | [English](https://github.com/Super12138/VerveDo/blob/main/README_EN.md)
[![Android CI](https://github.com/Super12138/ToDo/actions/workflows/android_ci.yml/badge.svg)](https://github.com/Super12138/ToDo/actions/workflows/android_ci.yml) [![Android CI](https://github.com/Super12138/VerveDo/actions/workflows/android_ci.yml/badge.svg)](https://github.com/Super12138/VerveDo/actions/workflows/android_ci.yml)
![GitHub Release 最新版本](https://img.shields.io/github/v/release/Super12138/ToDo?style=flat-square) ![GitHub Release 最新版本](https://img.shields.io/github/v/release/Super12138/VerveDo?style=flat-square)
![GitHub Release 总下载数](https://img.shields.io/github/downloads/Super12138/ToDo/total?style=flat-square) ![GitHub Release 总下载数](https://img.shields.io/github/downloads/Super12138/VerveDo/total?style=flat-square)
# 📦 版本支持 # 📦 版本支持
支持 `Android 7.0 (Nougat)``Android 16.0 (Baklava)` 支持 `Android 7.0 (Nougat)``Android 16.0 (Baklava)`
# 📃 许可证
[GPL-3.0-only](https://github.com/Super12138/VerveDo/blob/main/LICENSE)
# ✨ 功能 # ✨ 功能
- [x] Jetpack Compose - [x] Jetpack Compose
- [x] 最新的 Material 3 Expressive 设计 - [x] Material 3 **Expressive** 设计
- [x] 任务分类 - [x] 任务分类
@ -26,7 +30,9 @@
- [x] 数据备份 - [x] 数据备份
- [ ] 时间划分功能(正在施工中) - [x] 时间划分功能
- ...
# ⬇️ 下载 # ⬇️ 下载
@ -35,7 +41,7 @@
> >
> 待办不会自动更新,建议[订阅 GitHub Release 发行通知](https://docs.github.com/zh/account-and-profile/managing-subscriptions-and-notifications-on-github/setting-up-notifications/configuring-notifications#configuring-your-watch-settings-for-an-individual-repository)或者[安装 F-Droid](https://f-droid.org/) 检查更新 > 待办不会自动更新,建议[订阅 GitHub Release 发行通知](https://docs.github.com/zh/account-and-profile/managing-subscriptions-and-notifications-on-github/setting-up-notifications/configuring-notifications#configuring-your-watch-settings-for-an-individual-repository)或者[安装 F-Droid](https://f-droid.org/) 检查更新
[前往 GitHub Release](https://github.com/Super12138/ToDo/releases/) [前往 GitHub Release](https://github.com/Super12138/VerveDo/releases/)
或者[从 F-Droid 上下载](https://f-droid.org/packages/cn.super12138.todo) 或者[从 F-Droid 上下载](https://f-droid.org/packages/cn.super12138.todo)
@ -43,12 +49,8 @@
# 📸 截图 # 📸 截图
| ![主界面(浅色)](https://s2.loli.net/2025/02/17/mDz9jFIHW23YPUK.png) | ![主界面(深色)](https://s2.loli.net/2025/02/17/7ZLoHRifKka93c1.png) | | ![概览界面(浅色)](https://s2.loli.net/2026/02/09/nhuMmF8L7Oqk4dp.png) | ![概览界面(深色)](https://s2.loli.net/2026/02/09/Oari6zwC14gLPNl.png) |
| -------------------------------------------------------------- | ---------------------------------------------------------------- | | ----------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| 主界面(浅色) | 主界面(深色) | | 概览界面(浅色) | 概览界面(深色) |
| ![添加待办](https://s2.loli.net/2025/08/01/NWOQGRtVUpDmXIA.png) | ![正在完成待办的效果](https://s2.loli.net/2025/02/17/UFna9tvRkAphrIS.png) | | ![待办列表](https://s2.loli.net/2026/02/09/LbqGhyJXjke2gZ3.png) | ![添加待办](https://s2.loli.net/2026/02/09/Da3h29rxFMmJQiV.png) |
| 添加待办 | 正在完成待办的效果 | | 待办列表 | 添加待办 |
# 📃 许可证
[GPL-3.0-only](https://github.com/Super12138/ToDo/blob/main/LICENSE)

View file

@ -1,41 +1,55 @@
![Preview of the app UI](https://s2.loli.net/2025/02/17/SIeA9KaGFZkl4BX.png) ![Preview of the app UI](https://s2.loli.net/2026/02/09/zUrZdykbWN68lYM.png)
# To Do
A simple to-do app that follows Material Design 3, using Jetpack Compose
[简体中文](https://github.com/Super12138/ToDo/blob/main/README.md) | **English** # VerveDo
[![Android CI](https://github.com/Super12138/ToDo/actions/workflows/android_ci.yml/badge.svg)](https://github.com/Super12138/ToDo/actions/workflows/android_ci.yml) A simple to-do app that follows Material 3 Expressive, using Jetpack Compose.
![GitHub latest release](https://img.shields.io/github/v/release/Super12138/ToDo?style=flat-square)
![GitHub all releases download](https://img.shields.io/github/downloads/Super12138/ToDo/total?style=flat-square) [简体中文](https://github.com/Super12138/VerveDo/blob/main/README.md) | **English**
[![Android CI](https://github.com/Super12138/VerveDo/actions/workflows/android_ci.yml/badge.svg)](https://github.com/Super12138/VerveDo/actions/workflows/android_ci.yml)
![GitHub latest release](https://img.shields.io/github/v/release/Super12138/VerveDo?style=flat-square)
![GitHub all releases download](https://img.shields.io/github/downloads/Super12138/VerveDo/total?style=flat-square)
# 📦 Supported Versions # 📦 Supported Versions
From `Android 7.0 (Nougat)` to `Android 16.0 (Baklava)` From `Android 7.0 (Nougat)` to `Android 16.0 (Baklava)`
# 📃 License
[GPL-3.0-only](https://github.com/Super12138/VerveDo/blob/main/LICENSE)
# ✨ Features # ✨ Features
- Jetpack Compose
- Customizable theming system based on Material Design 3 - [x] Jetpack Compose
- Custom categories
- Task priority - [x] Material 3 **Expressive** Design
- [x] Task Categorization
- [x] Task Priority
- [x] Data Backup
- [x] Time Segmentation
- ... - ...
# ⬇️ Download # ⬇️ Download
> [!IMPORTANT] > [!IMPORTANT]
> The two download channels below are the official and secure sources for To Do. To protect your privacy, only download the app from these links. > The two download channels below are the official and secure sources for VerveDo. To protect your privacy, only download the app from these links.
> >
> To Do can't update automatically. It is recommended to [subscribe to GitHub Release notifications](https://docs.github.com/en/account-and-profile/managing-subscriptions-and-notifications-on-github/setting-up-notifications/configuring-notifications#configuring-your-watch-settings-for-an-individual-repository) or [install F-Droid](https://f-droid.org/) to check for updates. > VerveDo can't update automatically. It is recommended to [subscribe to GitHub Release notifications](https://docs.github.com/en/account-and-profile/managing-subscriptions-and-notifications-on-github/setting-up-notifications/configuring-notifications#configuring-your-watch-settings-for-an-individual-repository) or [install F-Droid](https://f-droid.org/) to check for updates.
[From Github Release](https://github.com/Super12138/ToDo/releases/) [From Github Release](https://github.com/Super12138/VerveDo/releases/)
Or get it from F-Droid Or get it from [F-Droid](https://f-droid.org/packages/cn.super12138.todo)
[<img src="./art/get-it-on-fdroid.png" height="100" />](https://f-droid.org/packages/cn.super12138.todo) [<img src="./art/get-it-on-fdroid.png" height="100" />](https://f-droid.org/packages/cn.super12138.todo)
# 📸 Screenshots # 📸 Screenshots
| ![Main page (Light)](https://s2.loli.net/2025/02/17/WB3sP8uckvYJCIi.png) | ![Main page (Dark)](https://s2.loli.net/2025/02/17/ty3ZwjbOkBgFLsf.png) |
| --- | --- |
| Main page (Light) | Main page (Dark) |
| ![Add task page](https://s2.loli.net/2025/08/01/JD1y2iqmkRNTezg.png) | ![The effect of completing a task](https://s2.loli.net/2025/02/17/9FRKx72DqVBtnfX.png) |
| Add task page | The effect of completing a task |
# 📃 License | ![Overview page (Light)](https://s2.loli.net/2026/02/09/p7L3vcZ4KnOHdol.png) | ![Overview page (Dark)](https://s2.loli.net/2026/02/09/gU9x3lpYvJXLfDs.png) |
[GPL-3.0-only](https://github.com/Super12138/ToDo/blob/main/LICENSE) | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| Overview page (Light) | Overview page (Dark) |
| ![Task list](https://s2.loli.net/2026/02/09/klB2e4XRYI98zdG.png) | ![Add new task](https://s2.loli.net/2026/02/09/KXEGDWc1lfSRyCP.png) |
| Task list | Add new task |

View file

@ -38,8 +38,8 @@ android {
applicationId = "cn.super12138.todo" applicationId = "cn.super12138.todo"
minSdk = 24 minSdk = 24
targetSdk = 36 targetSdk = 36
versionCode = 997 versionCode = 998
versionName = "2.3.3" versionName = "3.0.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

View file

@ -10,7 +10,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
object TodoDefaults { object VerveDoDefaults {
/** /**
* 屏幕左右两边预留边距防止内容全部贴边显示过丑 * 屏幕左右两边预留边距防止内容全部贴边显示过丑
*/ */

View file

@ -27,7 +27,7 @@ import cn.super12138.todo.constants.Constants
import cn.super12138.todo.logic.datastore.DataStoreManager import cn.super12138.todo.logic.datastore.DataStoreManager
import cn.super12138.todo.logic.model.DarkMode import cn.super12138.todo.logic.model.DarkMode
import cn.super12138.todo.logic.model.PaletteStyle import cn.super12138.todo.logic.model.PaletteStyle
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
import cn.super12138.todo.ui.components.Konfetti import cn.super12138.todo.ui.components.Konfetti
import cn.super12138.todo.ui.navigation.VerveDoDestinations import cn.super12138.todo.ui.navigation.VerveDoDestinations
import cn.super12138.todo.ui.navigation.TopNavigation import cn.super12138.todo.ui.navigation.TopNavigation
@ -106,7 +106,7 @@ class MainActivity : ComponentActivity() {
dynamicColor = dynamicColor dynamicColor = dynamicColor
) { ) {
Surface( Surface(
color = TodoDefaults.Colors.Background, color = VerveDoDefaults.Colors.Background,
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize()
) { ) {
val view = LocalView.current val view = LocalView.current
@ -140,7 +140,7 @@ class MainActivity : ComponentActivity() {
) )
} }
}, },
containerColor = TodoDefaults.Colors.Background, containerColor = VerveDoDefaults.Colors.Background,
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize()
) { ) {
TopNavigation( TopNavigation(

View file

@ -17,7 +17,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
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.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
enum class EmptyTipType { enum class EmptyTipType {
Search, Search,
@ -36,7 +36,7 @@ fun EmptyTip(
Box( Box(
contentAlignment = Alignment.Center, contentAlignment = Alignment.Center,
modifier = modifier modifier = modifier
.padding(TodoDefaults.screenHorizontalPadding) .padding(VerveDoDefaults.screenHorizontalPadding)
.size(size) .size(size)
.clip(CircleShape) .clip(CircleShape)
.background(containerColor) .background(containerColor)

View file

@ -25,7 +25,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import cn.super12138.todo.R import cn.super12138.todo.R
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
import cn.super12138.todo.utils.VibrationUtils import cn.super12138.todo.utils.VibrationUtils
/** /**
@ -130,7 +130,7 @@ fun TopAppBarScaffold(
navigationIcon = navigationIcon, navigationIcon = navigationIcon,
actions = actions, actions = actions,
colors = TopAppBarDefaults.topAppBarColors( colors = TopAppBarDefaults.topAppBarColors(
containerColor = TodoDefaults.Colors.Background, containerColor = VerveDoDefaults.Colors.Background,
) )
) )
}, },
@ -151,8 +151,8 @@ fun TopAppBarScaffold(
floatingActionButton: @Composable () -> Unit = {}, floatingActionButton: @Composable () -> Unit = {},
floatingActionButtonPosition: FabPosition = FabPosition.End, floatingActionButtonPosition: FabPosition = FabPosition.End,
contentWindowInsets: WindowInsets = ScaffoldDefaults.contentWindowInsets, contentWindowInsets: WindowInsets = ScaffoldDefaults.contentWindowInsets,
containerColor: Color = TodoDefaults.Colors.Background, containerColor: Color = VerveDoDefaults.Colors.Background,
screenShape: Shape = TodoDefaults.ScreenContainerShape, screenShape: Shape = VerveDoDefaults.ScreenContainerShape,
content: @Composable () -> Unit content: @Composable () -> Unit
) = Scaffold( ) = Scaffold(
modifier = modifier, modifier = modifier,
@ -166,7 +166,7 @@ fun TopAppBarScaffold(
Surface( Surface(
modifier = Modifier modifier = Modifier
.padding(paddingValues = innerPadding) .padding(paddingValues = innerPadding)
.padding(horizontal = TodoDefaults.screenHorizontalPadding), .padding(horizontal = VerveDoDefaults.screenHorizontalPadding),
color = containerColor, color = containerColor,
shape = screenShape, shape = screenShape,
content = content content = content

View file

@ -5,7 +5,7 @@ import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
@OptIn(ExperimentalMaterial3ExpressiveApi::class) @OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable @Composable
@ -14,9 +14,9 @@ fun RoundedScreenContainer(
content: @Composable () -> Unit, content: @Composable () -> Unit,
) { ) {
Surface( Surface(
modifier = modifier.padding(horizontal = TodoDefaults.screenHorizontalPadding), modifier = modifier.padding(horizontal = VerveDoDefaults.screenHorizontalPadding),
color = TodoDefaults.Colors.Background, color = VerveDoDefaults.Colors.Background,
shape = TodoDefaults.ScreenContainerShape, shape = VerveDoDefaults.ScreenContainerShape,
content = content content = content
) )
} }

View file

@ -36,7 +36,7 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.text.withStyle import androidx.compose.ui.text.withStyle
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.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
import cn.super12138.todo.ui.activities.CrashActivity.Companion.BEGINNING_CRASH import cn.super12138.todo.ui.activities.CrashActivity.Companion.BEGINNING_CRASH
import cn.super12138.todo.ui.activities.CrashActivity.Companion.BRAND_PREFIX import cn.super12138.todo.ui.activities.CrashActivity.Companion.BRAND_PREFIX
import cn.super12138.todo.ui.activities.CrashActivity.Companion.CRASH_TIME_PREFIX import cn.super12138.todo.ui.activities.CrashActivity.Companion.CRASH_TIME_PREFIX
@ -113,7 +113,7 @@ fun CrashPage(
Column( Column(
modifier = Modifier modifier = Modifier
.padding(innerPadding) .padding(innerPadding)
.padding(horizontal = TodoDefaults.screenHorizontalPadding) .padding(horizontal = VerveDoDefaults.screenHorizontalPadding)
.fillMaxSize() .fillMaxSize()
.verticalScroll(scrollState) .verticalScroll(scrollState)
) { ) {

View file

@ -34,7 +34,7 @@ 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.datastore.DataStoreManager import cn.super12138.todo.logic.datastore.DataStoreManager
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
import cn.super12138.todo.ui.components.ChipItem 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.TodoFloatingActionButton import cn.super12138.todo.ui.components.TodoFloatingActionButton
@ -184,7 +184,7 @@ fun SharedTransitionScope.TaskEditorPage(
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize()
) { ) {
item(key = 0) { item(key = 0) {
Spacer(modifier = Modifier.size(TodoDefaults.screenVerticalPadding)) Spacer(modifier = Modifier.size(VerveDoDefaults.screenVerticalPadding))
} }
item(key = 1) { item(key = 1) {
@ -262,7 +262,7 @@ fun SharedTransitionScope.TaskEditorPage(
} }
item(key = 5) { item(key = 5) {
Spacer(modifier = Modifier.size(TodoDefaults.screenVerticalPadding)) Spacer(modifier = Modifier.size(VerveDoDefaults.screenVerticalPadding))
} }
} }
} }

View file

@ -77,7 +77,17 @@ class EditorState(val initialTodo: TodoEntity? = null) {
object Saver : androidx.compose.runtime.saveable.Saver<EditorState, Any> { object Saver : androidx.compose.runtime.saveable.Saver<EditorState, Any> {
override fun SaverScope.save(value: EditorState): Any { override fun SaverScope.save(value: EditorState): Any {
return listOf( return listOf(
value.initialTodo, // 避免错误java.lang.RuntimeException: Parcel: unable to marshal value TodoEntity(...)
value.initialTodo?.let {
listOf(
it.content,
it.category,
it.isCompleted,
it.priority,
it.dueDate,
it.id
)
},
value.toDoContent, value.toDoContent,
value.isErrorContent, value.isErrorContent,
value.selectedCategoryIndex, value.selectedCategoryIndex,
@ -93,7 +103,17 @@ class EditorState(val initialTodo: TodoEntity? = null) {
override fun restore(value: Any): EditorState { override fun restore(value: Any): EditorState {
val list = value as List<*> val list = value as List<*>
val initialTodo = list[0] as? TodoEntity? val initialTodoList = list[0] as? List<*>
val initialTodo = initialTodoList?.let {
TodoEntity(
content = it[0] as String,
category = it[1] as String,
isCompleted = it[2] as Boolean,
priority = it[3] as Float,
dueDate = it[4] as Long?,
id = it[5] as Int
)
}
return EditorState(initialTodo).apply { return EditorState(initialTodo).apply {
toDoContent = list[1] as String toDoContent = list[1] as String
isErrorContent = list[2] as Boolean isErrorContent = list[2] as Boolean

View file

@ -16,6 +16,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
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.logic.database.TodoEntity
import cn.super12138.todo.ui.components.TopAppBarScaffold import cn.super12138.todo.ui.components.TopAppBarScaffold
import cn.super12138.todo.ui.pages.overview.components.ListCard import cn.super12138.todo.ui.pages.overview.components.ListCard
import cn.super12138.todo.ui.pages.overview.components.ProgressCard import cn.super12138.todo.ui.pages.overview.components.ProgressCard
@ -33,15 +34,14 @@ fun OverviewPage(
val totalTasks by remember { derivedStateOf { toDos.size } } val totalTasks by remember { derivedStateOf { toDos.size } }
val completedTasks by remember { derivedStateOf { toDos.count { it.isCompleted } } } val completedTasks by remember { derivedStateOf { toDos.count { it.isCompleted } } }
val todayMillis = SystemUtils.getToday() val todayMillis = SystemUtils.getTodayEightAM()
val dayMillis = 24L * 60 * 60 * 1000 val dayMillis = 24L * 60 * 60 * 1000
val todayEnd = todayMillis + dayMillis
val todayTodo by remember { val todayTodo by remember {
derivedStateOf { derivedStateOf {
toDos.filter { todo -> toDos.filter { todo ->
val due = todo.dueDate ?: return@filter false val due = todo.dueDate ?: return@filter false
due in todayMillis until todayEnd due == todayMillis
} }
} }
} }
@ -49,10 +49,16 @@ fun OverviewPage(
val nextWeekTodo by remember { val nextWeekTodo by remember {
derivedStateOf { derivedStateOf {
val weekFromToday = todayMillis + 7 * dayMillis val weekFromToday = todayMillis + 7 * dayMillis
toDos.filter { todo -> toDos
val due = todo.dueDate ?: return@filter false .filter { todo ->
due in todayMillis until weekFromToday val due = todo.dueDate ?: return@filter false
} due in todayMillis..weekFromToday && !todo.isCompleted
}
.sortedWith(
comparator = compareBy<TodoEntity> { it.dueDate }
.thenBy { it.category }
.thenByDescending { it.priority }
)
} }
} }

View file

@ -32,7 +32,7 @@ import androidx.compose.ui.unit.dp
import cn.super12138.todo.R import cn.super12138.todo.R
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.Priority
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
import cn.super12138.todo.ui.components.EmptyTip import cn.super12138.todo.ui.components.EmptyTip
import cn.super12138.todo.ui.components.EmptyTipType import cn.super12138.todo.ui.components.EmptyTipType
import cn.super12138.todo.ui.theme.fadeScale import cn.super12138.todo.ui.theme.fadeScale
@ -44,18 +44,18 @@ fun ListCard(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
title: String, title: String,
list: List<TodoEntity>, list: List<TodoEntity>,
containerColor: Color = TodoDefaults.Colors.Container, containerColor: Color = VerveDoDefaults.Colors.Container,
emptyTipContainerColor: Color = MaterialTheme.colorScheme.secondaryContainer emptyTipContainerColor: Color = MaterialTheme.colorScheme.secondaryContainer
) { ) {
Card( Card(
modifier = modifier.height(TodoDefaults.overviewCardHeight * 2), modifier = modifier.height(VerveDoDefaults.overviewCardHeight * 2),
colors = CardDefaults.cardColors(containerColor = containerColor), colors = CardDefaults.cardColors(containerColor = containerColor),
shape = TodoDefaults.defaultShape shape = VerveDoDefaults.defaultShape
) { ) {
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(TodoDefaults.screenHorizontalPadding), .padding(VerveDoDefaults.screenHorizontalPadding),
horizontalAlignment = Alignment.Start, horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.spacedBy(8.dp) verticalArrangement = Arrangement.spacedBy(8.dp)
) { ) {
@ -123,7 +123,7 @@ fun UpcomingTaskItem(
modifier = modifier modifier = modifier
.fillMaxWidth() .fillMaxWidth()
.wrapContentHeight() .wrapContentHeight()
.padding(vertical = TodoDefaults.settingsItemVerticalPadding / 4), .padding(vertical = VerveDoDefaults.settingsItemVerticalPadding / 4),
horizontalAlignment = Alignment.Start horizontalAlignment = Alignment.Start
) { ) {
Row( Row(
@ -145,7 +145,7 @@ fun UpcomingTaskItem(
color = MaterialTheme.colorScheme.onSurfaceVariant, color = MaterialTheme.colorScheme.onSurfaceVariant,
fontWeight = FontWeight.Bold fontWeight = FontWeight.Bold
), ),
modifier = Modifier.padding(start = TodoDefaults.screenVerticalPadding) modifier = Modifier.padding(start = VerveDoDefaults.screenVerticalPadding)
) )
} }
@ -167,7 +167,7 @@ fun UpcomingTaskItem(
Text( Text(
text = stringResource(priority.nameRes), text = stringResource(priority.nameRes),
style = MaterialTheme.typography.labelMedium.copy(priority.containerColor()), style = MaterialTheme.typography.labelMedium.copy(priority.containerColor()),
modifier = Modifier.padding(start = TodoDefaults.screenVerticalPadding) modifier = Modifier.padding(start = VerveDoDefaults.screenVerticalPadding)
) )
} }
} }

View file

@ -31,7 +31,7 @@ import androidx.compose.ui.res.stringResource
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 cn.super12138.todo.R import cn.super12138.todo.R
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
import cn.super12138.todo.ui.components.EmptyTip import cn.super12138.todo.ui.components.EmptyTip
import cn.super12138.todo.ui.components.EmptyTipType import cn.super12138.todo.ui.components.EmptyTipType
import cn.super12138.todo.ui.theme.fadeScale import cn.super12138.todo.ui.theme.fadeScale
@ -43,20 +43,20 @@ fun ProgressCard(
title: String, title: String,
total: Int, total: Int,
completed: Int, completed: Int,
containerColor: Color = TodoDefaults.Colors.Container, containerColor: Color = VerveDoDefaults.Colors.Container,
emptyTipContainerColor: Color = MaterialTheme.colorScheme.secondaryContainer emptyTipContainerColor: Color = MaterialTheme.colorScheme.secondaryContainer
) { ) {
val progress = if (total == 0) 0f else completed / total.toFloat() val progress = if (total == 0) 0f else completed / total.toFloat()
Card( Card(
modifier = modifier.height(TodoDefaults.overviewCardHeight * 2), modifier = modifier.height(VerveDoDefaults.overviewCardHeight * 2),
colors = CardDefaults.cardColors(containerColor = containerColor), colors = CardDefaults.cardColors(containerColor = containerColor),
shape = TodoDefaults.defaultShape shape = VerveDoDefaults.defaultShape
) { ) {
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(TodoDefaults.screenHorizontalPadding), .padding(VerveDoDefaults.screenHorizontalPadding),
horizontalAlignment = Alignment.Start, horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.spacedBy(8.dp) verticalArrangement = Arrangement.spacedBy(8.dp)
) { ) {
@ -112,7 +112,7 @@ fun ProgressCard(
stroke = thickStroke, stroke = thickStroke,
trackStroke = thickStroke, trackStroke = thickStroke,
modifier = Modifier modifier = Modifier
.padding(TodoDefaults.screenHorizontalPadding) .padding(VerveDoDefaults.screenHorizontalPadding)
.size(90.dp) .size(90.dp)
) )

View file

@ -31,7 +31,7 @@ import androidx.compose.ui.graphics.ColorProducer
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
import cn.super12138.todo.ui.theme.shapeByInteraction import cn.super12138.todo.ui.theme.shapeByInteraction
@OptIn(ExperimentalMaterial3ExpressiveApi::class) @OptIn(ExperimentalMaterial3ExpressiveApi::class)
@ -41,17 +41,17 @@ fun RoundedCornerCardLarge(
@DrawableRes iconRes: Int, @DrawableRes iconRes: Int,
title: String, title: String,
count: Int, count: Int,
containerColor: Color = TodoDefaults.Colors.Container, containerColor: Color = VerveDoDefaults.Colors.Container,
shapes: ButtonShapes = TodoDefaults.shapes(), shapes: ButtonShapes = VerveDoDefaults.shapes(),
onClick: () -> Unit = {} onClick: () -> Unit = {}
) { ) {
val interactionSource = remember { MutableInteractionSource() } val interactionSource = remember { MutableInteractionSource() }
val pressed by interactionSource.collectIsPressedAsState() val pressed by interactionSource.collectIsPressedAsState()
val animatedShape = shapeByInteraction(shapes, pressed, TodoDefaults.shapesDefaultAnimationSpec) val animatedShape = shapeByInteraction(shapes, pressed, VerveDoDefaults.shapesDefaultAnimationSpec)
val cardColors = CardDefaults.cardColors(containerColor = containerColor) val cardColors = CardDefaults.cardColors(containerColor = containerColor)
Card( Card(
modifier = modifier.height(TodoDefaults.overviewCardHeight), modifier = modifier.height(VerveDoDefaults.overviewCardHeight),
colors = cardColors, colors = cardColors,
shape = animatedShape shape = animatedShape
) { ) {
@ -63,7 +63,7 @@ fun RoundedCornerCardLarge(
onClick = onClick, onClick = onClick,
interactionSource = interactionSource interactionSource = interactionSource
) )
.padding(TodoDefaults.screenHorizontalPadding), .padding(VerveDoDefaults.screenHorizontalPadding),
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(16.dp) horizontalArrangement = Arrangement.spacedBy(16.dp)
) { ) {

View file

@ -112,7 +112,7 @@ fun SettingsData(
title = stringResource(R.string.pref_backup), title = stringResource(R.string.pref_backup),
description = stringResource(R.string.pref_backup_desc), description = stringResource(R.string.pref_backup_desc),
onClick = { onClick = {
backupLauncher.launch("Todo-backup-${SystemUtils.getTime()}.zip") backupLauncher.launch("VerveDo-backup-${SystemUtils.getTime()}.zip")
} }
) )
} }

View file

@ -27,7 +27,7 @@ import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
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 cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
import cn.super12138.todo.utils.drawFadedEdge import cn.super12138.todo.utils.drawFadedEdge
@Composable @Composable
@ -37,12 +37,12 @@ fun RowSettingsItem(
title: String, title: String,
description: String? = null, description: String? = null,
trailingContent: (@Composable () -> Unit)? = null, trailingContent: (@Composable () -> Unit)? = null,
background: Color = TodoDefaults.Colors.Container, background: Color = VerveDoDefaults.Colors.Container,
horizontalArrangement: Arrangement.Horizontal = Arrangement.Start, horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
verticalAlignment: Alignment.Vertical = Alignment.Top, verticalAlignment: Alignment.Vertical = Alignment.Top,
scrollState: ScrollState = rememberScrollState(), scrollState: ScrollState = rememberScrollState(),
fadedEdgeWidth: Dp, fadedEdgeWidth: Dp,
maskColor: Color = TodoDefaults.Colors.Container, maskColor: Color = VerveDoDefaults.Colors.Container,
content: @Composable RowScope.() -> Unit content: @Composable RowScope.() -> Unit
) { ) {
MoreContentSettingsItem( MoreContentSettingsItem(
@ -88,11 +88,11 @@ fun LazyRowSettingsItem(
title: String, title: String,
description: String? = null, description: String? = null,
trailingContent: (@Composable () -> Unit)? = null, trailingContent: (@Composable () -> Unit)? = null,
background: Color = TodoDefaults.Colors.Container, background: Color = VerveDoDefaults.Colors.Container,
horizontalArrangement: Arrangement.Horizontal = Arrangement.Start, horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
verticalAlignment: Alignment.Vertical = Alignment.Top, verticalAlignment: Alignment.Vertical = Alignment.Top,
fadedEdgeWidth: Dp, fadedEdgeWidth: Dp,
maskColor: Color = TodoDefaults.Colors.Container, maskColor: Color = VerveDoDefaults.Colors.Container,
content: LazyListScope.() -> Unit content: LazyListScope.() -> Unit
) { ) {
MoreContentSettingsItem( MoreContentSettingsItem(
@ -137,8 +137,8 @@ fun MoreContentSettingsItem(
title: String, title: String,
description: String? = null, description: String? = null,
trailingContent: (@Composable () -> Unit)? = null, trailingContent: (@Composable () -> Unit)? = null,
background: Color = TodoDefaults.Colors.Container, background: Color = VerveDoDefaults.Colors.Container,
shape: CornerBasedShape = TodoDefaults.defaultShape, shape: CornerBasedShape = VerveDoDefaults.defaultShape,
content: @Composable () -> Unit content: @Composable () -> Unit
) { ) {
Column( Column(
@ -148,8 +148,8 @@ fun MoreContentSettingsItem(
.clip(shape) .clip(shape)
.background(background) .background(background)
.padding( .padding(
horizontal = TodoDefaults.settingsItemHorizontalPadding, horizontal = VerveDoDefaults.settingsItemHorizontalPadding,
vertical = TodoDefaults.settingsItemVerticalPadding vertical = VerveDoDefaults.settingsItemVerticalPadding
) )
) { ) {
Row { Row {

View file

@ -9,7 +9,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
@Composable @Composable
fun SettingsCategory( fun SettingsCategory(
@ -21,10 +21,10 @@ fun SettingsCategory(
modifier = modifier modifier = modifier
.fillMaxWidth() .fillMaxWidth()
.padding( .padding(
top = if (first) 0.dp else TodoDefaults.screenVerticalPadding, top = if (first) 0.dp else VerveDoDefaults.screenVerticalPadding,
start = TodoDefaults.screenHorizontalPadding / 2, start = VerveDoDefaults.screenHorizontalPadding / 2,
end = TodoDefaults.screenHorizontalPadding / 2, end = VerveDoDefaults.screenHorizontalPadding / 2,
bottom = TodoDefaults.screenVerticalPadding bottom = VerveDoDefaults.screenVerticalPadding
) )
) { ) {
Text( Text(

View file

@ -9,7 +9,7 @@ import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
@Composable @Composable
fun SettingsContainer( fun SettingsContainer(
@ -18,18 +18,18 @@ fun SettingsContainer(
content: LazyListScope.() -> Unit, content: LazyListScope.() -> Unit,
) { ) {
LazyColumn( LazyColumn(
verticalArrangement = Arrangement.spacedBy(TodoDefaults.settingsItemPadding), verticalArrangement = Arrangement.spacedBy(VerveDoDefaults.settingsItemPadding),
state = state, state = state,
modifier = modifier modifier = modifier
) { ) {
item { item {
Spacer(modifier = Modifier.size(TodoDefaults.screenVerticalPadding)) Spacer(modifier = Modifier.size(VerveDoDefaults.screenVerticalPadding))
} }
content() content()
item { item {
Spacer(modifier = Modifier.size(TodoDefaults.screenVerticalPadding)) Spacer(modifier = Modifier.size(VerveDoDefaults.screenVerticalPadding))
} }
} }
} }

View file

@ -25,7 +25,7 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.LocalView import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.semantics.Role import androidx.compose.ui.semantics.Role
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
import cn.super12138.todo.ui.components.BasicDialog import cn.super12138.todo.ui.components.BasicDialog
import cn.super12138.todo.ui.theme.shapeByInteraction import cn.super12138.todo.ui.theme.shapeByInteraction
import cn.super12138.todo.utils.VibrationUtils import cn.super12138.todo.utils.VibrationUtils
@ -86,9 +86,9 @@ fun RadioItem(
.height(56.dp) .height(56.dp)
.clip( .clip(
shapeByInteraction( shapeByInteraction(
shapes = TodoDefaults.shapes(), shapes = VerveDoDefaults.shapes(),
pressed = pressed, pressed = pressed,
animationSpec = TodoDefaults.shapesDefaultAnimationSpec animationSpec = VerveDoDefaults.shapesDefaultAnimationSpec
) )
) )
// .background(MaterialTheme.colorScheme.surfaceContainerHighest) // .background(MaterialTheme.colorScheme.surfaceContainerHighest)
@ -101,7 +101,7 @@ fun RadioItem(
}, },
role = Role.RadioButton role = Role.RadioButton
) )
.padding(horizontal = TodoDefaults.screenHorizontalPadding), .padding(horizontal = VerveDoDefaults.screenHorizontalPadding),
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
RadioButton( RadioButton(

View file

@ -28,7 +28,7 @@ import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
import cn.super12138.todo.ui.theme.shapeByInteraction import cn.super12138.todo.ui.theme.shapeByInteraction
import cn.super12138.todo.utils.VibrationUtils import cn.super12138.todo.utils.VibrationUtils
@ -61,8 +61,8 @@ fun SettingsItem(
title: String, title: String,
description: String? = null, description: String? = null,
trailingContent: (@Composable () -> Unit)? = null, trailingContent: (@Composable () -> Unit)? = null,
background: Color = TodoDefaults.Colors.Container, background: Color = VerveDoDefaults.Colors.Container,
shapes: ButtonShapes = TodoDefaults.shapes(), shapes: ButtonShapes = VerveDoDefaults.shapes(),
enableClick: Boolean = true, enableClick: Boolean = true,
onClick: () -> Unit = {} onClick: () -> Unit = {}
) = SettingsItem( ) = SettingsItem(
@ -82,7 +82,7 @@ fun SettingsItem(
painter = leadingIcon, painter = leadingIcon,
contentDescription = null, contentDescription = null,
tint = MaterialTheme.colorScheme.onSurface, tint = MaterialTheme.colorScheme.onSurface,
modifier = Modifier.padding(end = TodoDefaults.settingsItemHorizontalPadding) modifier = Modifier.padding(end = VerveDoDefaults.settingsItemHorizontalPadding)
) )
// } // }
} }
@ -125,8 +125,8 @@ fun SettingsItem(
title: String, title: String,
description: String? = null, description: String? = null,
trailingContent: (@Composable () -> Unit)? = null, trailingContent: (@Composable () -> Unit)? = null,
background: Color = TodoDefaults.Colors.Container, background: Color = VerveDoDefaults.Colors.Container,
shapes: ButtonShapes = TodoDefaults.shapes(), shapes: ButtonShapes = VerveDoDefaults.shapes(),
enableClick: Boolean = true, enableClick: Boolean = true,
onClick: () -> Unit = {} onClick: () -> Unit = {}
) = SettingsItem( ) = SettingsItem(
@ -136,7 +136,7 @@ fun SettingsItem(
imageVector = it, imageVector = it,
contentDescription = null, contentDescription = null,
tint = MaterialTheme.colorScheme.onSurface, tint = MaterialTheme.colorScheme.onSurface,
modifier = Modifier.padding(end = TodoDefaults.settingsItemHorizontalPadding), modifier = Modifier.padding(end = VerveDoDefaults.settingsItemHorizontalPadding),
) )
} }
}, },
@ -159,8 +159,8 @@ fun SettingsItem(
title: String, title: String,
description: String? = null, description: String? = null,
trailingContent: (@Composable () -> Unit)? = null, trailingContent: (@Composable () -> Unit)? = null,
background: Color = TodoDefaults.Colors.Container, background: Color = VerveDoDefaults.Colors.Container,
shapes: ButtonShapes = TodoDefaults.shapes(), shapes: ButtonShapes = VerveDoDefaults.shapes(),
enableClick: Boolean = true, enableClick: Boolean = true,
onClick: () -> Unit = {}, onClick: () -> Unit = {},
) = SettingsItem( ) = SettingsItem(
@ -204,8 +204,8 @@ fun SettingsItem(
headlineContent: (@Composable () -> Unit)? = null, headlineContent: (@Composable () -> Unit)? = null,
supportingContent: (@Composable () -> Unit)? = null, supportingContent: (@Composable () -> Unit)? = null,
trailingContent: (@Composable () -> Unit)? = null, trailingContent: (@Composable () -> Unit)? = null,
background: Color = TodoDefaults.Colors.Container, background: Color = VerveDoDefaults.Colors.Container,
shapes: ButtonShapes = TodoDefaults.shapes(), shapes: ButtonShapes = VerveDoDefaults.shapes(),
interactionSource: MutableInteractionSource? = null, interactionSource: MutableInteractionSource? = null,
enableClick: Boolean = true, enableClick: Boolean = true,
onClick: () -> Unit = {}, onClick: () -> Unit = {},
@ -213,7 +213,7 @@ fun SettingsItem(
val view = LocalView.current val view = LocalView.current
val userInteractionSource = interactionSource ?: remember { MutableInteractionSource() } val userInteractionSource = interactionSource ?: remember { MutableInteractionSource() }
val pressed by userInteractionSource.collectIsPressedAsState() val pressed by userInteractionSource.collectIsPressedAsState()
val animatedShape = shapeByInteraction(shapes, pressed, TodoDefaults.shapesDefaultAnimationSpec) val animatedShape = shapeByInteraction(shapes, pressed, VerveDoDefaults.shapesDefaultAnimationSpec)
Row( Row(
modifier = modifier modifier = modifier
@ -230,8 +230,8 @@ fun SettingsItem(
) )
.background(background) .background(background)
.padding( .padding(
horizontal = TodoDefaults.settingsItemHorizontalPadding, horizontal = VerveDoDefaults.settingsItemHorizontalPadding,
vertical = TodoDefaults.settingsItemVerticalPadding vertical = VerveDoDefaults.settingsItemVerticalPadding
), ),
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {

View file

@ -17,7 +17,7 @@ import androidx.compose.ui.semantics.clearAndSetSemantics
import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.contentDescription
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.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
@Composable @Composable
fun SettingsPlainBox( fun SettingsPlainBox(
@ -30,8 +30,8 @@ fun SettingsPlainBox(
.fillMaxWidth() .fillMaxWidth()
.wrapContentHeight() .wrapContentHeight()
.padding( .padding(
vertical = TodoDefaults.settingsItemVerticalPadding, vertical = VerveDoDefaults.settingsItemVerticalPadding,
horizontal = TodoDefaults.settingsItemHorizontalPadding / 2 horizontal = VerveDoDefaults.settingsItemHorizontalPadding / 2
), ),
) { ) {
Icon( Icon(

View file

@ -9,7 +9,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.LocalView import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
import cn.super12138.todo.utils.VibrationUtils import cn.super12138.todo.utils.VibrationUtils
@OptIn(ExperimentalMaterial3ExpressiveApi::class) @OptIn(ExperimentalMaterial3ExpressiveApi::class)
@ -30,7 +30,7 @@ fun SwitchSettingsItem(
Switch( Switch(
checked = checked, checked = checked,
onCheckedChange = null, onCheckedChange = null,
modifier = Modifier.padding(start = TodoDefaults.settingsItemHorizontalPadding / 2) modifier = Modifier.padding(start = VerveDoDefaults.settingsItemHorizontalPadding / 2)
) )
}, },
onClick = { onCheckedChange(!checked) }, onClick = { onCheckedChange(!checked) },
@ -60,7 +60,7 @@ fun SwitchSettingsItem(
VibrationUtils.performHapticFeedback(view) VibrationUtils.performHapticFeedback(view)
onCheckedChange(it) onCheckedChange(it)
}, },
modifier = Modifier.padding(start = TodoDefaults.settingsItemHorizontalPadding / 2) modifier = Modifier.padding(start = VerveDoDefaults.settingsItemHorizontalPadding / 2)
) )
}, },
onClick = { onCheckedChange(!checked) }, onClick = { onCheckedChange(!checked) },

View file

@ -28,7 +28,7 @@ import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.semantics.Role import androidx.compose.ui.semantics.Role
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
import cn.super12138.todo.ui.theme.shapeByInteraction import cn.super12138.todo.ui.theme.shapeByInteraction
import cn.super12138.todo.utils.VibrationUtils import cn.super12138.todo.utils.VibrationUtils
@ -42,13 +42,13 @@ fun DarkModeItem(
containerColor: Color, containerColor: Color,
selected: Boolean, selected: Boolean,
onSelect: () -> Unit, onSelect: () -> Unit,
shapes: ButtonShapes = TodoDefaults.shapes() shapes: ButtonShapes = VerveDoDefaults.shapes()
) { ) {
val view = LocalView.current val view = LocalView.current
val interactionSource = remember { MutableInteractionSource() } val interactionSource = remember { MutableInteractionSource() }
val pressed by interactionSource.collectIsPressedAsState() val pressed by interactionSource.collectIsPressedAsState()
val animatedShape = shapeByInteraction(shapes, pressed, TodoDefaults.shapesDefaultAnimationSpec) val animatedShape = shapeByInteraction(shapes, pressed, VerveDoDefaults.shapesDefaultAnimationSpec)
val borderWidth by animateDpAsState(if (selected) 3.dp else (-1).dp) val borderWidth by animateDpAsState(if (selected) 3.dp else (-1).dp)
Column( Column(

View file

@ -14,7 +14,7 @@ import androidx.compose.ui.res.stringResource
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.logic.model.DarkMode import cn.super12138.todo.logic.model.DarkMode
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
import cn.super12138.todo.ui.pages.settings.components.LazyRowSettingsItem import cn.super12138.todo.ui.pages.settings.components.LazyRowSettingsItem
@OptIn(ExperimentalMaterial3ExpressiveApi::class) @OptIn(ExperimentalMaterial3ExpressiveApi::class)
@ -32,7 +32,7 @@ fun DarkModePicker(
title = stringResource(R.string.pref_dark_mode), title = stringResource(R.string.pref_dark_mode),
description = stringResource(R.string.pref_dark_mode_desc), description = stringResource(R.string.pref_dark_mode_desc),
horizontalArrangement = Arrangement.spacedBy(5.dp), horizontalArrangement = Arrangement.spacedBy(5.dp),
fadedEdgeWidth = TodoDefaults.fadedEdgeWidth, fadedEdgeWidth = VerveDoDefaults.fadedEdgeWidth,
modifier = modifier modifier = modifier
) { ) {
items(items = darkModeList, key = { it.id }) { items(items = darkModeList, key = { it.id }) {

View file

@ -35,7 +35,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.util.fastForEach import androidx.compose.ui.util.fastForEach
import cn.super12138.todo.logic.model.ContrastLevel import cn.super12138.todo.logic.model.ContrastLevel
import cn.super12138.todo.logic.model.PaletteStyle import cn.super12138.todo.logic.model.PaletteStyle
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
import cn.super12138.todo.ui.theme.dynamicColorScheme import cn.super12138.todo.ui.theme.dynamicColorScheme
import cn.super12138.todo.ui.theme.shapeByInteraction import cn.super12138.todo.ui.theme.shapeByInteraction
import cn.super12138.todo.utils.VibrationUtils import cn.super12138.todo.utils.VibrationUtils
@ -50,12 +50,12 @@ fun PaletteItem(
contrastLevel: ContrastLevel, contrastLevel: ContrastLevel,
selected: Boolean, selected: Boolean,
onSelect: () -> Unit, onSelect: () -> Unit,
shapes: ButtonShapes = TodoDefaults.shapes() shapes: ButtonShapes = VerveDoDefaults.shapes()
) { ) {
val view = LocalView.current val view = LocalView.current
val interactionSource = remember { MutableInteractionSource() } val interactionSource = remember { MutableInteractionSource() }
val pressed by interactionSource.collectIsPressedAsState() val pressed by interactionSource.collectIsPressedAsState()
val animatedShape = shapeByInteraction(shapes, pressed, TodoDefaults.shapesDefaultAnimationSpec) val animatedShape = shapeByInteraction(shapes, pressed, VerveDoDefaults.shapesDefaultAnimationSpec)
Column( Column(
modifier = modifier modifier = modifier

View file

@ -15,7 +15,7 @@ import cn.super12138.todo.R
import cn.super12138.todo.logic.model.ContrastLevel import cn.super12138.todo.logic.model.ContrastLevel
import cn.super12138.todo.logic.model.DarkMode import cn.super12138.todo.logic.model.DarkMode
import cn.super12138.todo.logic.model.PaletteStyle import cn.super12138.todo.logic.model.PaletteStyle
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
import cn.super12138.todo.ui.pages.settings.components.LazyRowSettingsItem import cn.super12138.todo.ui.pages.settings.components.LazyRowSettingsItem
@OptIn(ExperimentalMaterial3ExpressiveApi::class) @OptIn(ExperimentalMaterial3ExpressiveApi::class)
@ -34,7 +34,7 @@ fun PalettePicker(
title = stringResource(R.string.pref_palette_style), title = stringResource(R.string.pref_palette_style),
description = stringResource(R.string.pref_palette_style_desc), description = stringResource(R.string.pref_palette_style_desc),
horizontalArrangement = Arrangement.spacedBy(5.dp), horizontalArrangement = Arrangement.spacedBy(5.dp),
fadedEdgeWidth = TodoDefaults.fadedEdgeWidth, fadedEdgeWidth = VerveDoDefaults.fadedEdgeWidth,
modifier = modifier modifier = modifier
) { ) {
items(items = paletteOptions, key = { it.id }) { items(items = paletteOptions, key = { it.id }) {

View file

@ -42,7 +42,7 @@ 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.Priority
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
import cn.super12138.todo.ui.components.ConfirmDialog import cn.super12138.todo.ui.components.ConfirmDialog
import cn.super12138.todo.ui.components.EmptyTip import cn.super12138.todo.ui.components.EmptyTip
import cn.super12138.todo.ui.components.EmptyTipType import cn.super12138.todo.ui.components.EmptyTipType
@ -168,11 +168,11 @@ fun SharedTransitionScope.TasksPage(
} else { } else {
LazyColumn( LazyColumn(
state = viewModel.toDoListState, state = viewModel.toDoListState,
verticalArrangement = Arrangement.spacedBy(TodoDefaults.settingsItemPadding), verticalArrangement = Arrangement.spacedBy(VerveDoDefaults.settingsItemPadding),
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize()
) { ) {
item { item {
Spacer(modifier = Modifier.size(TodoDefaults.screenVerticalPadding)) Spacer(modifier = Modifier.size(VerveDoDefaults.screenVerticalPadding))
} }
items( items(
@ -214,7 +214,7 @@ fun SharedTransitionScope.TasksPage(
} }
item { item {
Spacer(modifier = Modifier.size(TodoDefaults.screenVerticalPadding)) Spacer(modifier = Modifier.size(VerveDoDefaults.screenVerticalPadding))
} }
} }
} }

View file

@ -48,7 +48,7 @@ import androidx.compose.ui.text.style.TextOverflow
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.logic.model.Priority import cn.super12138.todo.logic.model.Priority
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
import cn.super12138.todo.ui.theme.shapeByInteraction import cn.super12138.todo.ui.theme.shapeByInteraction
import cn.super12138.todo.utils.VibrationUtils import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.utils.containerColor import cn.super12138.todo.utils.containerColor
@ -71,11 +71,11 @@ fun TodoCard(
onCardClick: () -> Unit = {}, onCardClick: () -> Unit = {},
onCardLongClick: () -> Unit = {}, onCardLongClick: () -> Unit = {},
onChecked: () -> Unit = {}, onChecked: () -> Unit = {},
shapes: ButtonShapes = TodoDefaults.shapes(), shapes: ButtonShapes = VerveDoDefaults.shapes(),
) { ) {
val view = LocalView.current val view = LocalView.current
val context = LocalContext.current val context = LocalContext.current
val cardColors = CardDefaults.cardColors(containerColor = TodoDefaults.Colors.Container) val cardColors = CardDefaults.cardColors(containerColor = VerveDoDefaults.Colors.Container)
val animatedContainerColor by animateColorAsState(targetValue = if (selected) MaterialTheme.colorScheme.secondaryContainer else if (completed) cardColors.disabledContainerColor else cardColors.containerColor) val animatedContainerColor by animateColorAsState(targetValue = if (selected) MaterialTheme.colorScheme.secondaryContainer else if (completed) cardColors.disabledContainerColor else cardColors.containerColor)
val interactionSource = remember { MutableInteractionSource() } val interactionSource = remember { MutableInteractionSource() }
@ -83,7 +83,7 @@ fun TodoCard(
val animatedShape = shapeByInteraction( val animatedShape = shapeByInteraction(
shapes = shapes, shapes = shapes,
pressed = if (selected) true else pressed, pressed = if (selected) true else pressed,
animationSpec = TodoDefaults.shapesDefaultAnimationSpec animationSpec = VerveDoDefaults.shapesDefaultAnimationSpec
) )
val enterTransition = fadeIn(MaterialTheme.motionScheme.fastSpatialSpec()) + expandHorizontally( val enterTransition = fadeIn(MaterialTheme.motionScheme.fastSpatialSpec()) + expandHorizontally(
@ -97,7 +97,7 @@ fun TodoCard(
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
modifier = modifier modifier = modifier
.fillMaxWidth() .fillMaxWidth()
.height(TodoDefaults.toDoCardHeight) .height(VerveDoDefaults.toDoCardHeight)
.clip(animatedShape) .clip(animatedShape)
.combinedClickable( .combinedClickable(
interactionSource = interactionSource, interactionSource = interactionSource,
@ -112,7 +112,7 @@ fun TodoCard(
.drawBehind { .drawBehind {
drawRect(animatedContainerColor) drawRect(animatedContainerColor)
} }
.padding(start = TodoDefaults.screenHorizontalPadding) .padding(start = VerveDoDefaults.screenHorizontalPadding)
) { ) {
AnimatedVisibility( AnimatedVisibility(
visible = selected, visible = selected,
@ -159,14 +159,14 @@ fun TodoCard(
Column( Column(
horizontalAlignment = Alignment.End, horizontalAlignment = Alignment.End,
modifier = Modifier.padding( modifier = Modifier.padding(
start = TodoDefaults.screenVerticalPadding, start = VerveDoDefaults.screenVerticalPadding,
end = TodoDefaults.screenHorizontalPadding end = VerveDoDefaults.screenHorizontalPadding
) )
) { ) {
Text( Text(
text = dueDate.toLocalDateString(), text = dueDate.toLocalDateString(),
style = MaterialTheme.typography.labelLarge.copy( style = MaterialTheme.typography.labelLarge.copy(
color = MaterialTheme.colorScheme.onSurface, color = if (completed) cardColors.disabledContentColor else MaterialTheme.colorScheme.onSurface,
fontWeight = FontWeight.Bold fontWeight = FontWeight.Bold
) )
) )
@ -174,7 +174,7 @@ fun TodoCard(
Text( Text(
text = dueDate.toRelativeTimeString(context), text = dueDate.toRelativeTimeString(context),
style = MaterialTheme.typography.labelSmall.copy( style = MaterialTheme.typography.labelSmall.copy(
color = MaterialTheme.colorScheme.onSurfaceVariant color = if (completed) cardColors.disabledContentColor else MaterialTheme.colorScheme.onSurfaceVariant
) )
) )
} }
@ -211,7 +211,7 @@ fun TodoCard(
contentAlignment = Alignment.Center, contentAlignment = Alignment.Center,
modifier = Modifier modifier = Modifier
.fillMaxHeight() .fillMaxHeight()
.background(TodoDefaults.Colors.Green) .background(VerveDoDefaults.Colors.Green)
.clickable { .clickable {
VibrationUtils.performHapticFeedback(view) VibrationUtils.performHapticFeedback(view)
onChecked() onChecked()
@ -221,7 +221,7 @@ fun TodoCard(
painter = painterResource(R.drawable.ic_check), painter = painterResource(R.drawable.ic_check),
tint = Color.White, tint = Color.White,
contentDescription = null, contentDescription = null,
modifier = Modifier.padding(TodoDefaults.screenHorizontalPadding) modifier = Modifier.padding(VerveDoDefaults.screenHorizontalPadding)
) )
} }
} }

View file

@ -34,7 +34,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import cn.super12138.todo.R import cn.super12138.todo.R
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.VerveDoDefaults
import cn.super12138.todo.ui.theme.fadeScale import cn.super12138.todo.ui.theme.fadeScale
import cn.super12138.todo.utils.VibrationUtils import cn.super12138.todo.utils.VibrationUtils
@ -72,7 +72,7 @@ fun TodoTopAppBar(
targetValue = if (selectedMode) { targetValue = if (selectedMode) {
MaterialTheme.colorScheme.surfaceContainerHighest MaterialTheme.colorScheme.surfaceContainerHighest
} else { } else {
TodoDefaults.Colors.Background VerveDoDefaults.Colors.Background
} }
) )

View file

@ -87,6 +87,7 @@ class MainViewModel : ViewModel() {
SortingMethod.DueDate -> list.sortedWith( SortingMethod.DueDate -> list.sortedWith(
comparator = compareBy<TodoEntity> { it.isCompleted } comparator = compareBy<TodoEntity> { it.isCompleted }
.thenBy { it.category }
.thenBy { it.dueDate } .thenBy { it.dueDate }
.thenByDescending { it.priority } .thenByDescending { it.priority }
) )

View file

@ -45,10 +45,10 @@ object SystemUtils {
/** /**
* 获取当天的时间戳 * 获取当天的时间戳
*/ */
fun getToday(): Long = Calendar.getInstance().apply { fun getTodayEightAM(): Long = Calendar.getInstance().apply {
// 将时间设置为当天的开始00:00:00.000 // 将时间设置为当天的开始00:00:00.000
// 兼容API24 // 兼容API24
set(Calendar.HOUR_OF_DAY, 0) set(Calendar.HOUR_OF_DAY, 8)
set(Calendar.MINUTE, 0) set(Calendar.MINUTE, 0)
set(Calendar.SECOND, 0) set(Calendar.SECOND, 0)
set(Calendar.MILLISECOND, 0) set(Calendar.MILLISECOND, 0)

View file

@ -15,7 +15,6 @@ import androidx.compose.ui.unit.Dp
import cn.super12138.todo.R import cn.super12138.todo.R
import cn.super12138.todo.logic.model.Priority import cn.super12138.todo.logic.model.Priority
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Date import java.util.Date
import java.util.Locale import java.util.Locale
import kotlin.time.Duration.Companion.days import kotlin.time.Duration.Companion.days
@ -25,8 +24,8 @@ import kotlin.time.Duration.Companion.milliseconds
@Stable @Stable
fun Priority.containerColor(): Color = fun Priority.containerColor(): Color =
when (this) { when (this) {
Priority.NotUrgent -> MaterialTheme.colorScheme.surfaceContainerHighest Priority.NotUrgent -> MaterialTheme.colorScheme.onSurfaceVariant
Priority.NotImportant -> MaterialTheme.colorScheme.surfaceContainerHighest Priority.NotImportant -> MaterialTheme.colorScheme.onSurfaceVariant
Priority.Default -> MaterialTheme.colorScheme.secondary Priority.Default -> MaterialTheme.colorScheme.secondary
Priority.Important -> MaterialTheme.colorScheme.tertiary Priority.Important -> MaterialTheme.colorScheme.tertiary
Priority.Urgent -> MaterialTheme.colorScheme.error Priority.Urgent -> MaterialTheme.colorScheme.error
@ -100,14 +99,7 @@ fun Long?.toLocalDateString(): String {
*/ */
fun Long?.toRelativeTimeString(context: Context): String { fun Long?.toRelativeTimeString(context: Context): String {
if (this == null) return "" if (this == null) return ""
val today = Calendar.getInstance().apply { val today = SystemUtils.getTodayEightAM()
// 将时间设置为当天的开始00:00:00.000
// 兼容API24
set(Calendar.HOUR_OF_DAY, 0)
set(Calendar.MINUTE, 0)
set(Calendar.SECOND, 0)
set(Calendar.MILLISECOND, 0)
}.timeInMillis
val diff = (this - today).milliseconds val diff = (this - today).milliseconds
return diff.toComponents { days, _, _, _, _ -> return diff.toComponents { days, _, _, _, _ ->
@ -129,6 +121,27 @@ fun Long?.toRelativeTimeString(context: Context): String {
) )
days.days >= 365.days -> context.getString(R.string.time_in_years, (days / 365).toInt()) days.days >= 365.days -> context.getString(R.string.time_in_years, (days / 365).toInt())
days.days == (-1).days -> context.getString(R.string.time_yesterday)
days.days < (-1).days && days.days > (-7).days -> context.getString(
R.string.time_days_ago,
-days.toInt()
)
days.days in (-7).days..<(-30).days -> context.getString(
R.string.time_weeks_ago,
-(days / 7).toInt()
)
days.days in (-30).days..<(-365).days -> context.getString(
R.string.time_months_ago,
-(days / 30).toInt()
)
days.days <= (-365).days -> context.getString(
R.string.time_years_ago,
-(days / 365).toInt()
)
else -> context.getString(R.string.time_today) else -> context.getString(R.string.time_today)
} }
} }

View file

@ -124,6 +124,11 @@
<string name="time_in_weeks">%d 周后</string> <string name="time_in_weeks">%d 周后</string>
<string name="time_in_months">%d 个月后</string> <string name="time_in_months">%d 个月后</string>
<string name="time_in_years">%d 年后</string> <string name="time_in_years">%d 年后</string>
<string name="time_yesterday">昨天</string>
<string name="time_days_ago">%d 天前</string>
<string name="time_weeks_ago">%d 周前</string>
<string name="time_months_ago">%d 个月前</string>
<string name="time_years_ago">%d 年前</string>
<string name="label_due_date">截止日期(可选)</string> <string name="label_due_date">截止日期(可选)</string>
<string name="title_all_task">总任务</string> <string name="title_all_task">总任务</string>
<string name="title_completed_task">已完成</string> <string name="title_completed_task">已完成</string>

View file

@ -73,7 +73,7 @@
<string name="pref_view_on_github_desc">View source code, submit bug reports, and improvement suggestions</string> <string name="pref_view_on_github_desc">View source code, submit bug reports, and improvement suggestions</string>
<string name="tip_discard_changes">After exiting edit mode, you will not be able to retrieve the data you have modified. Are you sure you want to exit editing?</string> <string name="tip_discard_changes">After exiting edit mode, you will not be able to retrieve the data you have modified. Are you sure you want to exit editing?</string>
<string name="sorting_sequential">Sequential</string> <string name="sorting_sequential">Sequential</string>
<string name="sorting_category">category</string> <string name="sorting_category">Category</string>
<string name="sorting_priority">Priority</string> <string name="sorting_priority">Priority</string>
<string name="sorting_completion">Completion</string> <string name="sorting_completion">Completion</string>
<string name="sorting_alphabetical_ascending">Alphabetical (Ascending)</string> <string name="sorting_alphabetical_ascending">Alphabetical (Ascending)</string>
@ -126,6 +126,11 @@
<string name="time_in_weeks">in %d w</string> <string name="time_in_weeks">in %d w</string>
<string name="time_in_months">in %d mo</string> <string name="time_in_months">in %d mo</string>
<string name="time_in_years">in %d y</string> <string name="time_in_years">in %d y</string>
<string name="time_yesterday">Yesterday</string>
<string name="time_days_ago">%d d ago</string>
<string name="time_weeks_ago">%d w ago</string>
<string name="time_months_ago">%d mo ago</string>
<string name="time_years_ago">%d y ago</string>
<string name="label_due_date">Due Date (Optional)</string> <string name="label_due_date">Due Date (Optional)</string>
<string name="title_all_task">All</string> <string name="title_all_task">All</string>
<string name="title_completed_task">Completed</string> <string name="title_completed_task">Completed</string>

View file

@ -1 +1 @@
A simple to-do app that follows Material Design 3. You can use it to keep track of your daily school homeworks or as a memo for everyday life. You can set priorities to each task and sort them, helping you stay organized and in control of your life. VerveDo is a concise to-do app that follows Material 3 Expressive. You can use it to keep track of your daily school homeworks or as a memo for everyday life. You can set priorities to each task and sort them, helping you stay organized and in control of your life.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

After

Width:  |  Height:  |  Size: 255 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

After

Width:  |  Height:  |  Size: 317 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 244 KiB

After

Width:  |  Height:  |  Size: 610 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 616 KiB

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 317 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

View file

@ -1 +1 @@
A simple to-do app that follows Material Design 3. A concise to-do app that follows Material 3 Expressive.

View file

@ -1 +1 @@
To Do VerveDo

View file

@ -1 +1 @@
一个简单的、遵循 Material Design 3 的待办应用。你可以用它来记每日要完成的学校作业,抑或当作日常生活的备忘录。你可以为每项任务设置优先级,并为它们排序,让你的生活有条不紊。 VerveDo 是一个简约的、遵循 Material 3 Expressive 的待办应用。你可以用它来记每日要完成的学校作业,抑或当作日常生活的备忘录。你可以为每项任务设置优先级,并为它们排序,让你的生活有条不紊。

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 161 KiB

After

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 241 KiB

After

Width:  |  Height:  |  Size: 599 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 585 KiB

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

After

Width:  |  Height:  |  Size: 167 KiB

View file

@ -1 +1 @@
一个简单的、遵循 Material Design 3 的待办应用。 一个简约的、遵循 Material 3 Expressive 的待办应用。

View file

@ -1 +1 @@
待办 VerveDo

View file

@ -1,5 +1,5 @@
{ {
"name": "todo_script", "name": "vervedo_script",
"version": "1.0.0", "version": "1.0.0",
"description": "自动在 build.gradle.kts 写入版本号", "description": "自动在 build.gradle.kts 写入版本号",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",

View file

@ -20,5 +20,5 @@ dependencyResolutionManagement {
} }
} }
rootProject.name = "ToDo" rootProject.name = "VerveDo"
include(":app") include(":app")