From 96392cb618142252cfef984f70fa1acecb79ae6b Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sat, 2 Nov 2024 00:51:08 -0500 Subject: [PATCH] Update WearOS edit screen * Set complete from edit screen * Edit existing tasks --- .../java/org/tasks/wear/WearService.kt | 8 ++++ wear-datalayer/src/main/proto/grpc.proto | 1 + .../org/tasks/presentation/MainActivity.kt | 1 + .../presentation/screens/TaskEditScreen.kt | 40 +++++++++++-------- .../presentation/screens/TaskEditViewModel.kt | 7 +++- 5 files changed, 39 insertions(+), 18 deletions(-) diff --git a/app/src/googleplay/java/org/tasks/wear/WearService.kt b/app/src/googleplay/java/org/tasks/wear/WearService.kt index d744781a8..4b5f6bd81 100644 --- a/app/src/googleplay/java/org/tasks/wear/WearService.kt +++ b/app/src/googleplay/java/org/tasks/wear/WearService.kt @@ -203,6 +203,9 @@ class WearService( taskCreator .basicQuickAddTask(request.title) .apply { + if (request.completed) { + completionDate = System.currentTimeMillis() + } } .let { taskDao.save(it) } } else { @@ -210,6 +213,11 @@ class WearService( taskDao.save( task.copy( title = request.title, + completionDate = when { + !request.completed -> 0 + task.isCompleted -> task.completionDate + else -> System.currentTimeMillis() + }, ) ) } diff --git a/wear-datalayer/src/main/proto/grpc.proto b/wear-datalayer/src/main/proto/grpc.proto index 43d33a4a5..c72146ae7 100644 --- a/wear-datalayer/src/main/proto/grpc.proto +++ b/wear-datalayer/src/main/proto/grpc.proto @@ -90,6 +90,7 @@ message GetTaskResponse { message SaveTaskRequest { uint64 taskId = 1; string title = 2; + bool completed = 3; } message SaveTaskResponse {} diff --git a/wear/src/main/java/org/tasks/presentation/MainActivity.kt b/wear/src/main/java/org/tasks/presentation/MainActivity.kt index 702fd3651..175b2555f 100644 --- a/wear/src/main/java/org/tasks/presentation/MainActivity.kt +++ b/wear/src/main/java/org/tasks/presentation/MainActivity.kt @@ -191,6 +191,7 @@ class MainActivity : ComponentActivity() { TaskEditScreen( uiState = uiState, setTitle = { viewModel.setTitle(it) }, + toggleCompleted = { viewModel.setCompleted(!uiState.completed) }, save = { viewModel.save { navController.popBackStack() } }, ) } diff --git a/wear/src/main/java/org/tasks/presentation/screens/TaskEditScreen.kt b/wear/src/main/java/org/tasks/presentation/screens/TaskEditScreen.kt index e00c0a628..e2b65ca81 100644 --- a/wear/src/main/java/org/tasks/presentation/screens/TaskEditScreen.kt +++ b/wear/src/main/java/org/tasks/presentation/screens/TaskEditScreen.kt @@ -4,6 +4,7 @@ import android.app.Activity.RESULT_OK import android.app.RemoteInput import android.content.Intent import android.view.inputmethod.EditorInfo +import androidx.activity.compose.ManagedActivityResultLauncher import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.ActivityResult import androidx.activity.result.contract.ActivityResultContracts @@ -36,6 +37,7 @@ import org.tasks.presentation.components.Checkbox fun TaskEditScreen( uiState: UiState, setTitle: (String) -> Unit, + toggleCompleted: () -> Unit, save: () -> Unit, ) { if (uiState.loading) { @@ -49,7 +51,7 @@ fun TaskEditScreen( val columnState = rememberResponsiveColumnState( verticalArrangement = Arrangement.spacedBy(12.dp) ) - val keyboardInputRequest = rememberLauncherForActivityResult( + val keyboardInputRequest: ManagedActivityResultLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.StartActivityForResult() ) { result: ActivityResult -> if (result.resultCode == RESULT_OK) { @@ -79,7 +81,7 @@ fun TaskEditScreen( completed = uiState.completed, repeating = uiState.repeating, priority = uiState.priority, - toggleComplete = {}, + toggleComplete = toggleCompleted, ) }, content = { @@ -88,7 +90,7 @@ fun TaskEditScreen( modifier = Modifier.padding(vertical = 4.dp), ) }, - onClick = {}, + onClick = { keyboardInputRequest.openKeyboard() }, ) } item { @@ -104,20 +106,24 @@ fun TaskEditScreen( } LaunchedEffect(Unit) { if (uiState.isNew) { - val intent: Intent = RemoteInputIntentHelper.createActionRemoteInputIntent() - val remoteInputs: List = listOf( - RemoteInput - .Builder("input") - .setLabel("Enter title") - .setAllowFreeFormInput(true) - .wearableExtender { - setInputActionType(EditorInfo.IME_ACTION_DONE) - } - .build() - ) - RemoteInputIntentHelper.putRemoteInputsExtra(intent, remoteInputs) - keyboardInputRequest.launch(intent) + keyboardInputRequest.openKeyboard() } } } -} \ No newline at end of file +} + +private fun ManagedActivityResultLauncher.openKeyboard() { + val intent: Intent = RemoteInputIntentHelper.createActionRemoteInputIntent() + val remoteInputs: List = listOf( + RemoteInput + .Builder("input") + .setLabel("Enter title") + .setAllowFreeFormInput(true) + .wearableExtender { + setInputActionType(EditorInfo.IME_ACTION_DONE) + } + .build() + ) + RemoteInputIntentHelper.putRemoteInputsExtra(intent, remoteInputs) + launch(intent) +} diff --git a/wear/src/main/java/org/tasks/presentation/screens/TaskEditViewModel.kt b/wear/src/main/java/org/tasks/presentation/screens/TaskEditViewModel.kt index e247d02af..38fd169dd 100644 --- a/wear/src/main/java/org/tasks/presentation/screens/TaskEditViewModel.kt +++ b/wear/src/main/java/org/tasks/presentation/screens/TaskEditViewModel.kt @@ -56,7 +56,6 @@ class TaskEditViewModel( priority = task.priority, ) } - } } } @@ -66,6 +65,8 @@ class TaskEditViewModel( wearService.saveTask( GrpcProto.SaveTaskRequest.newBuilder() .setTitle(state.title) + .setTaskId(taskId) + .setCompleted(state.completed) .build() ) onComplete() @@ -74,6 +75,10 @@ class TaskEditViewModel( fun setTitle(title: String) { _uiState.update { it.copy(title = title) } } + + fun setCompleted(completed: Boolean) { + _uiState.update { it.copy(completed = completed) } + } } class TaskEditViewModelFactory(