Update logic for creating tasks on WearOS

pull/2983/head
Alex Baker 1 year ago
parent e5fc31f307
commit d4aeb34b87

@ -200,14 +200,14 @@ class WearService(
override suspend fun saveTask(request: GrpcProto.SaveTaskRequest): SaveTaskResponse { override suspend fun saveTask(request: GrpcProto.SaveTaskRequest): SaveTaskResponse {
Timber.d("saveTask($request)") Timber.d("saveTask($request)")
if (request.taskId == 0L) { if (request.taskId == 0L) {
taskCreator val filter = defaultFilterProvider.getFilterFromPreference(
.basicQuickAddTask(request.title) settings.data.firstOrNull()?.filter?.takeIf { it.isNotBlank() }
.apply { )
if (request.completed) { val task = taskCreator.basicQuickAddTask(
completionDate = System.currentTimeMillis() title = request.title,
} filter = filter,
} )
.let { taskDao.save(it) } return SaveTaskResponse.newBuilder().setTaskId(task.id).build()
} else { } else {
taskDao.fetch(request.taskId)?.let { task -> taskDao.fetch(request.taskId)?.let { task ->
taskDao.save( taskDao.save(
@ -221,8 +221,8 @@ class WearService(
) )
) )
} }
return SaveTaskResponse.newBuilder().setTaskId(request.taskId).build()
} }
return SaveTaskResponse.newBuilder().build()
} }
private fun getColor(filter: Filter): Int { private fun getColor(filter: Filter): Int {

@ -55,9 +55,8 @@ class TaskCreator @Inject constructor(
private val locationDao: LocationDao, private val locationDao: LocationDao,
private val alarmDao: AlarmDao, private val alarmDao: AlarmDao,
) { ) {
suspend fun basicQuickAddTask(title: String, filter: Filter? = null): Task {
suspend fun basicQuickAddTask(title: String): Task { val task = createWithValues(filter, title.trim { it <= ' ' })
val task = createWithValues(title.trim { it <= ' ' })
taskDao.createNew(task) taskDao.createNew(task)
val gcalCreateEventEnabled = preferences.isDefaultCalendarSet && task.hasDueDate() // $NON-NLS-1$ val gcalCreateEventEnabled = preferences.isDefaultCalendarSet && task.hasDueDate() // $NON-NLS-1$
if (!isNullOrEmpty(task.title) if (!isNullOrEmpty(task.title)

@ -92,7 +92,9 @@ message SaveTaskRequest {
string title = 2; string title = 2;
bool completed = 3; bool completed = 3;
} }
message SaveTaskResponse {} message SaveTaskResponse {
uint64 taskId = 1;
}
service WearService { service WearService {
rpc getTasks(GetTasksRequest) returns (Tasks); rpc getTasks(GetTasksRequest) returns (Tasks);

@ -40,7 +40,25 @@ fun TaskEditScreen(
toggleCompleted: () -> Unit, toggleCompleted: () -> Unit,
save: () -> Unit, save: () -> Unit,
) { ) {
if (uiState.loading) { val keyboardInputRequest: ManagedActivityResultLauncher<Intent, ActivityResult> = rememberLauncherForActivityResult(
contract = ActivityResultContracts.StartActivityForResult()
) { result: ActivityResult ->
if (result.resultCode == RESULT_OK) {
val text =
result
.data
?.let { RemoteInput.getResultsFromIntent(it) }
?.getCharSequence("input")
?: return@rememberLauncherForActivityResult
setTitle(text.toString())
}
}
LaunchedEffect(uiState.taskId) {
if (uiState.taskId == 0L) {
keyboardInputRequest.openKeyboard()
}
}
if (uiState.taskId == 0L) {
Box( Box(
modifier = Modifier.fillMaxRectangle(), modifier = Modifier.fillMaxRectangle(),
contentAlignment = Alignment.Center, contentAlignment = Alignment.Center,
@ -51,19 +69,6 @@ fun TaskEditScreen(
val columnState = rememberResponsiveColumnState( val columnState = rememberResponsiveColumnState(
verticalArrangement = Arrangement.spacedBy(12.dp) verticalArrangement = Arrangement.spacedBy(12.dp)
) )
val keyboardInputRequest: ManagedActivityResultLauncher<Intent, ActivityResult> = rememberLauncherForActivityResult(
contract = ActivityResultContracts.StartActivityForResult()
) { result: ActivityResult ->
if (result.resultCode == RESULT_OK) {
val text =
result
.data
?.let { RemoteInput.getResultsFromIntent(it) }
?.getCharSequence("input")
?: return@rememberLauncherForActivityResult
setTitle(text.toString())
}
}
ScreenScaffold( ScreenScaffold(
scrollState = columnState, scrollState = columnState,
) { ) {
@ -104,11 +109,6 @@ fun TaskEditScreen(
} }
} }
} }
LaunchedEffect(Unit) {
if (uiState.isNew) {
keyboardInputRequest.openKeyboard()
}
}
} }
} }

@ -17,8 +17,7 @@ import org.tasks.extensions.wearDataLayerRegistry
import timber.log.Timber import timber.log.Timber
data class UiState( data class UiState(
val isNew: Boolean, val taskId: Long = 0,
val loading: Boolean = !isNew,
val completed: Boolean = false, val completed: Boolean = false,
val repeating: Boolean = false, val repeating: Boolean = false,
val priority: Int = 0, val priority: Int = 0,
@ -30,7 +29,7 @@ class TaskEditViewModel(
applicationContext: Context, applicationContext: Context,
private val taskId: Long, private val taskId: Long,
) : ViewModel() { ) : ViewModel() {
private val _uiState = MutableStateFlow(UiState(isNew = taskId == 0L)) private val _uiState = MutableStateFlow(UiState())
val uiState = _uiState.asStateFlow() val uiState = _uiState.asStateFlow()
private val registry = applicationContext.wearDataLayerRegistry(viewModelScope) private val registry = applicationContext.wearDataLayerRegistry(viewModelScope)
@ -44,22 +43,35 @@ class TaskEditViewModel(
init { init {
if (taskId > 0) { if (taskId > 0) {
viewModelScope.launch { viewModelScope.launch {
val task = wearService fetchTask(taskId)
.getTask(GrpcProto.GetTaskRequest.newBuilder().setTaskId(taskId).build())
Timber.d("Received $task")
_uiState.update {
it.copy(
loading = false,
completed = task.completed,
title = task.title,
repeating = task.repeating,
priority = task.priority,
)
}
} }
} }
} }
private fun fetchTask(taskId: Long) = viewModelScope.launch {
val task = wearService
.getTask(GrpcProto.GetTaskRequest.newBuilder().setTaskId(taskId).build())
Timber.d("Received $task")
_uiState.update {
it.copy(
taskId = taskId,
completed = task.completed,
title = task.title,
repeating = task.repeating,
priority = task.priority,
)
}
}
fun createTask() = viewModelScope.launch {
val response = wearService.saveTask(
GrpcProto.SaveTaskRequest.newBuilder()
.setTitle(uiState.value.title)
.build()
)
fetchTask(response.taskId)
}
fun save(onComplete: () -> Unit) = viewModelScope.launch { fun save(onComplete: () -> Unit) = viewModelScope.launch {
val state = uiState.value val state = uiState.value
wearService.saveTask( wearService.saveTask(
@ -74,6 +86,9 @@ class TaskEditViewModel(
fun setTitle(title: String) { fun setTitle(title: String) {
_uiState.update { it.copy(title = title) } _uiState.update { it.copy(title = title) }
if (uiState.value.taskId == 0L) {
createTask()
}
} }
fun setCompleted(completed: Boolean) { fun setCompleted(completed: Boolean) {

Loading…
Cancel
Save