Update WearOS edit screen

* Set complete from edit screen
* Edit existing tasks
pull/2983/head
Alex Baker 1 year ago
parent f0e9eb453c
commit 96392cb618

@ -203,6 +203,9 @@ class WearService(
taskCreator taskCreator
.basicQuickAddTask(request.title) .basicQuickAddTask(request.title)
.apply { .apply {
if (request.completed) {
completionDate = System.currentTimeMillis()
}
} }
.let { taskDao.save(it) } .let { taskDao.save(it) }
} else { } else {
@ -210,6 +213,11 @@ class WearService(
taskDao.save( taskDao.save(
task.copy( task.copy(
title = request.title, title = request.title,
completionDate = when {
!request.completed -> 0
task.isCompleted -> task.completionDate
else -> System.currentTimeMillis()
},
) )
) )
} }

@ -90,6 +90,7 @@ message GetTaskResponse {
message SaveTaskRequest { message SaveTaskRequest {
uint64 taskId = 1; uint64 taskId = 1;
string title = 2; string title = 2;
bool completed = 3;
} }
message SaveTaskResponse {} message SaveTaskResponse {}

@ -191,6 +191,7 @@ class MainActivity : ComponentActivity() {
TaskEditScreen( TaskEditScreen(
uiState = uiState, uiState = uiState,
setTitle = { viewModel.setTitle(it) }, setTitle = { viewModel.setTitle(it) },
toggleCompleted = { viewModel.setCompleted(!uiState.completed) },
save = { viewModel.save { navController.popBackStack() } }, save = { viewModel.save { navController.popBackStack() } },
) )
} }

@ -4,6 +4,7 @@ import android.app.Activity.RESULT_OK
import android.app.RemoteInput import android.app.RemoteInput
import android.content.Intent import android.content.Intent
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
import androidx.activity.compose.ManagedActivityResultLauncher
import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResult
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
@ -36,6 +37,7 @@ import org.tasks.presentation.components.Checkbox
fun TaskEditScreen( fun TaskEditScreen(
uiState: UiState, uiState: UiState,
setTitle: (String) -> Unit, setTitle: (String) -> Unit,
toggleCompleted: () -> Unit,
save: () -> Unit, save: () -> Unit,
) { ) {
if (uiState.loading) { if (uiState.loading) {
@ -49,7 +51,7 @@ fun TaskEditScreen(
val columnState = rememberResponsiveColumnState( val columnState = rememberResponsiveColumnState(
verticalArrangement = Arrangement.spacedBy(12.dp) verticalArrangement = Arrangement.spacedBy(12.dp)
) )
val keyboardInputRequest = rememberLauncherForActivityResult( val keyboardInputRequest: ManagedActivityResultLauncher<Intent, ActivityResult> = rememberLauncherForActivityResult(
contract = ActivityResultContracts.StartActivityForResult() contract = ActivityResultContracts.StartActivityForResult()
) { result: ActivityResult -> ) { result: ActivityResult ->
if (result.resultCode == RESULT_OK) { if (result.resultCode == RESULT_OK) {
@ -79,7 +81,7 @@ fun TaskEditScreen(
completed = uiState.completed, completed = uiState.completed,
repeating = uiState.repeating, repeating = uiState.repeating,
priority = uiState.priority, priority = uiState.priority,
toggleComplete = {}, toggleComplete = toggleCompleted,
) )
}, },
content = { content = {
@ -88,7 +90,7 @@ fun TaskEditScreen(
modifier = Modifier.padding(vertical = 4.dp), modifier = Modifier.padding(vertical = 4.dp),
) )
}, },
onClick = {}, onClick = { keyboardInputRequest.openKeyboard() },
) )
} }
item { item {
@ -104,20 +106,24 @@ fun TaskEditScreen(
} }
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
if (uiState.isNew) { if (uiState.isNew) {
val intent: Intent = RemoteInputIntentHelper.createActionRemoteInputIntent() keyboardInputRequest.openKeyboard()
val remoteInputs: List<RemoteInput> = listOf(
RemoteInput
.Builder("input")
.setLabel("Enter title")
.setAllowFreeFormInput(true)
.wearableExtender {
setInputActionType(EditorInfo.IME_ACTION_DONE)
}
.build()
)
RemoteInputIntentHelper.putRemoteInputsExtra(intent, remoteInputs)
keyboardInputRequest.launch(intent)
} }
} }
} }
} }
private fun ManagedActivityResultLauncher<Intent, ActivityResult>.openKeyboard() {
val intent: Intent = RemoteInputIntentHelper.createActionRemoteInputIntent()
val remoteInputs: List<RemoteInput> = listOf(
RemoteInput
.Builder("input")
.setLabel("Enter title")
.setAllowFreeFormInput(true)
.wearableExtender {
setInputActionType(EditorInfo.IME_ACTION_DONE)
}
.build()
)
RemoteInputIntentHelper.putRemoteInputsExtra(intent, remoteInputs)
launch(intent)
}

@ -56,7 +56,6 @@ class TaskEditViewModel(
priority = task.priority, priority = task.priority,
) )
} }
} }
} }
} }
@ -66,6 +65,8 @@ class TaskEditViewModel(
wearService.saveTask( wearService.saveTask(
GrpcProto.SaveTaskRequest.newBuilder() GrpcProto.SaveTaskRequest.newBuilder()
.setTitle(state.title) .setTitle(state.title)
.setTaskId(taskId)
.setCompleted(state.completed)
.build() .build()
) )
onComplete() onComplete()
@ -74,6 +75,10 @@ class TaskEditViewModel(
fun setTitle(title: String) { fun setTitle(title: String) {
_uiState.update { it.copy(title = title) } _uiState.update { it.copy(title = title) }
} }
fun setCompleted(completed: Boolean) {
_uiState.update { it.copy(completed = completed) }
}
} }
class TaskEditViewModelFactory( class TaskEditViewModelFactory(

Loading…
Cancel
Save