Add extended icons

Some layout improvements
Update README
This commit is contained in:
Geoffroy Bonneville
2025-10-01 21:35:25 -04:00
parent 906ad0854d
commit 8e5ac4fedc
8 changed files with 57 additions and 29 deletions

View File

@@ -561,6 +561,18 @@
<option name="screenX" value="720" />
<option name="screenY" value="1600" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="35" />
<option name="brand" value="motorola" />
<option name="codename" value="kansas" />
<option name="id" value="kansas" />
<option name="labId" value="google" />
<option name="manufacturer" value="Motorola" />
<option name="name" value="moto g - 2025" />
<option name="screenDensity" value="280" />
<option name="screenX" value="720" />
<option name="screenY" value="1604" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="google" />

View File

@@ -2,10 +2,19 @@
[![Android CI](https://github.com/wismna/DoNext/actions/workflows/android.yaml/badge.svg)](https://github.com/wismna/DoNext/actions/workflows/android.yaml)
DoNext is an innovative task application.
DoNext is an a task app that aims for simplicity.
You can create and arrange task lists, create, edit and delete tasks...
But the emphasis is not a long list, as the more you have to do, the less you actually do!
Instead, focus only on the first task on the list:
Swipe it to the left: it's done!
Swipe it to the right: "nexted!". It goes to the end of the list and you can work on the next task.
Focus on what's important:
- Tasks are sorted by priority
- Easily see when each task is due, with a warning when it's overdue
- All tasks due today are grouped in a special view
## Technical stack
DoNext is made with:
- Kotlin
- Jetpack Compose for UI
- Hilt for dependency injection
- Room for the Database
- Clean Architecture

View File

@@ -22,7 +22,10 @@ android {
buildTypes {
release {
isMinifyEnabled = false
// Enables code-related app optimization.
isMinifyEnabled = true
// Enables resource shrinking.
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
@@ -48,25 +51,26 @@ android {
dependencies {
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.9.4")
implementation("androidx.activity:activity-compose:1.11.0")
implementation(platform("androidx.compose:compose-bom:2025.09.00"))
implementation(platform("androidx.compose:compose-bom:2025.09.01"))
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-graphics")
implementation("androidx.compose.ui:ui-tooling-preview")
implementation("androidx.compose.material3:material3")
implementation("androidx.navigation:navigation-compose:2.9.4")
implementation("androidx.compose.material:material-icons-extended:1.7.8")
implementation("androidx.navigation:navigation-compose:2.9.5")
implementation("androidx.hilt:hilt-navigation-compose:1.3.0")
implementation("androidx.test.ext:junit-ktx:1.3.0")
implementation("sh.calvin.reorderable:reorderable:3.0.0")
androidTestImplementation(platform("androidx.compose:compose-bom:2025.09.00"))
androidTestImplementation(platform("androidx.compose:compose-bom:2025.09.01"))
androidTestImplementation("androidx.compose.ui:ui-test-junit4")
debugImplementation("androidx.compose.ui:ui-tooling")
debugImplementation("androidx.compose.ui:ui-test-manifest")
val roomVersion = "2.8.0"
val roomVersion = "2.8.1"
implementation("androidx.room:room-runtime:$roomVersion")
ksp("androidx.room:room-compiler:$roomVersion")
val hiltVersion = "2.57.1"
val hiltVersion = "2.57.2"
implementation("com.google.dagger:hilt-android:$hiltVersion")
ksp("com.google.dagger:hilt-android-compiler:$hiltVersion")
}

View File

@@ -145,7 +145,7 @@ fun AppContent(
}
is AppDestination.RecycleBin -> {
TextButton(onClick = { viewModel.emptyRecycleBin() }) {
Text(text = "Empty Recycle Bin", color = MaterialTheme.colorScheme.onPrimary)
Text(text = "Empty Recycle Bin", color = MaterialTheme.colorScheme.onPrimaryContainer)
}
}
else -> null

View File

@@ -20,6 +20,7 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.DragHandle
import androidx.compose.material.icons.filled.Edit
import androidx.compose.material3.Button
import androidx.compose.material3.Card
@@ -70,7 +71,7 @@ fun ManageListsScreen(
)
LazyColumn(
modifier = modifier.fillMaxWidth(),
modifier = modifier.fillMaxWidth().padding(start = 10.dp, end = 10.dp),
verticalArrangement = Arrangement.spacedBy(8.dp),
contentPadding = PaddingValues(vertical = 8.dp),
state = lazyListState
@@ -133,6 +134,7 @@ fun ManageListsScreen(
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Icon(Icons.Default.DragHandle, contentDescription = "Edit")
AnimatedContent(
targetState = isInEditMode,
modifier = Modifier.weight(1f),

View File

@@ -7,10 +7,10 @@ import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.List
import androidx.compose.material.icons.filled.DateRange
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Edit
import androidx.compose.material.icons.filled.EditNote
import androidx.compose.material.icons.filled.LineWeight
import androidx.compose.material.icons.filled.Today
import androidx.compose.material3.Badge
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
@@ -56,7 +56,7 @@ fun MenuScreen(
Text(viewModel.dueTodayTasksCount.toString())
}
},
icon = { Icon(Icons.Default.DateRange, contentDescription = "Due Today") },
icon = { Icon(Icons.Default.Today, contentDescription = "Due Today") },
selected = currentDestination is AppDestination.DueTodayList,
onClick = { onNavigate(AppDestination.DueTodayList.route) },
modifier = Modifier.padding(NavigationDrawerItemDefaults.ItemPadding)
@@ -71,7 +71,7 @@ fun MenuScreen(
overflow = TextOverflow.Ellipsis
)
},
icon = { Icon(Icons.AutoMirrored.Default.List, contentDescription = list.name) },
icon = { Icon(Icons.Default.LineWeight, contentDescription = list.name) },
selected = currentDestination is AppDestination.TaskList &&
currentDestination.taskListId == list.id,
onClick = { onNavigate("taskList/${list.id}") },
@@ -96,7 +96,7 @@ fun MenuScreen(
)
NavigationDrawerItem(
label = { Text("Edit Lists") },
icon = { Icon(Icons.Default.Edit, contentDescription = "Edit Lists") },
icon = { Icon(Icons.Default.EditNote, contentDescription = "Edit Lists") },
selected = currentDestination is AppDestination.ManageLists,
onClick = { onNavigate(AppDestination.ManageLists.route) },
modifier = Modifier.padding(NavigationDrawerItemDefaults.ItemPadding)

View File

@@ -12,11 +12,11 @@ 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.filled.AddCircle
import androidx.compose.material.icons.filled.CheckCircle
import androidx.compose.material.icons.filled.Clear
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.PlayArrow
import androidx.compose.material.icons.filled.DeleteForever
import androidx.compose.material.icons.filled.DeleteOutline
import androidx.compose.material.icons.filled.RestoreFromTrash
import androidx.compose.material.icons.filled.Unpublished
import androidx.compose.material3.Badge
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
@@ -49,6 +49,7 @@ fun TaskItemScreen(
onSwipeLeft: () -> Unit,
onSwipeRight: () -> Unit
) {
// TODO: change this
val dismissState = rememberSwipeToDismissBoxState(
confirmValueChange = {
when (it) {
@@ -183,7 +184,7 @@ fun DismissBackground(dismissState: SwipeToDismissBoxState, isDone: Boolean, isD
) {
Column (horizontalAlignment = Alignment.CenterHorizontally) {
Icon(
if (isDeleted) Icons.Default.Clear else Icons.Default.Delete,
if (isDeleted) Icons.Default.DeleteForever else Icons.Default.DeleteOutline,
tint = Color.LightGray,
contentDescription = "Delete"
)
@@ -196,15 +197,15 @@ fun DismissBackground(dismissState: SwipeToDismissBoxState, isDone: Boolean, isD
Spacer(modifier = Modifier)
Column (horizontalAlignment = Alignment.CenterHorizontally) {
Icon(
if (isDeleted) Icons.Default.AddCircle else
if (isDone) Icons.Default.PlayArrow else Icons.Default.CheckCircle,
if (isDeleted) Icons.Default.RestoreFromTrash else
if (isDone) Icons.Default.Unpublished else Icons.Default.CheckCircle,
tint = Color.LightGray,
contentDescription = "Archive"
)
Text(
color = MaterialTheme.colorScheme.onPrimary,
fontSize = 10.sp,
text = if (isDeleted) "Restore" else if (isDone) "Active" else "Done"
text = if (isDeleted) "Restore" else if (isDone) "Undone" else "Done"
)
}
}

View File

@@ -8,8 +8,8 @@ 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.filled.CalendarMonth
import androidx.compose.material.icons.filled.Clear
import androidx.compose.material.icons.filled.DateRange
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.DatePicker
@@ -127,7 +127,7 @@ fun TaskBottomSheet(
IconButton(
onClick = { showDatePicker = true },
enabled = !viewModel.isDone) {
Icon(Icons.Default.DateRange, contentDescription = "Pick due date")
Icon(Icons.Default.CalendarMonth, contentDescription = "Pick due date")
}
}
},