diff --git a/.run/wear.run.xml b/.run/wear.run.xml new file mode 100644 index 000000000..042e69bd7 --- /dev/null +++ b/.run/wear.run.xml @@ -0,0 +1,70 @@ + + + + + \ No newline at end of file diff --git a/app/src/googleplay/java/org/tasks/wear/WearPreferences.kt b/app/src/googleplay/java/org/tasks/wear/WearPreferences.kt index e8a31e98f..f30477560 100644 --- a/app/src/googleplay/java/org/tasks/wear/WearPreferences.kt +++ b/app/src/googleplay/java/org/tasks/wear/WearPreferences.kt @@ -10,4 +10,7 @@ class WearPreferences( ): QueryPreferences by preferences { override val showHidden: Boolean get() = settings.showHidden + + override val showCompleted: Boolean + get() = settings.showCompleted } \ No newline at end of file diff --git a/kmp/src/commonMain/composeResources/values/strings.xml b/kmp/src/commonMain/composeResources/values/strings.xml index 88eff118d..ea22763c5 100644 --- a/kmp/src/commonMain/composeResources/values/strings.xml +++ b/kmp/src/commonMain/composeResources/values/strings.xml @@ -29,4 +29,6 @@ Today today Add task + Show unstarted + Show completed \ No newline at end of file diff --git a/wear-datalayer/src/main/proto/grpc.proto b/wear-datalayer/src/main/proto/grpc.proto index 77e067dff..0dfcddd3d 100644 --- a/wear-datalayer/src/main/proto/grpc.proto +++ b/wear-datalayer/src/main/proto/grpc.proto @@ -36,6 +36,7 @@ message Settings { repeated uint64 collapsed = 1; string filter = 2; bool showHidden = 3; + bool showCompleted = 4; } message UpdateSettingsRequest { diff --git a/wear/src/main/java/org/tasks/presentation/MainActivity.kt b/wear/src/main/java/org/tasks/presentation/MainActivity.kt index ccb725fa4..804384611 100644 --- a/wear/src/main/java/org/tasks/presentation/MainActivity.kt +++ b/wear/src/main/java/org/tasks/presentation/MainActivity.kt @@ -98,7 +98,9 @@ class MainActivity : ComponentActivity() { if (viewState.initialized) { SettingsScreen( showHidden = viewState.settings.showHidden, + showCompleted = viewState.settings.showCompleted, toggleShowHidden = { settingsViewModel.setShowHidden(it) }, + toggleShowCompleted = { settingsViewModel.setShowCompleted(it) }, ) } else { // TODO: show spinner diff --git a/wear/src/main/java/org/tasks/presentation/screens/SettingsScreen.kt b/wear/src/main/java/org/tasks/presentation/screens/SettingsScreen.kt index 8a1c006d6..ee451b3dc 100644 --- a/wear/src/main/java/org/tasks/presentation/screens/SettingsScreen.kt +++ b/wear/src/main/java/org/tasks/presentation/screens/SettingsScreen.kt @@ -9,13 +9,18 @@ import com.google.android.horologist.compose.layout.ScreenScaffold import com.google.android.horologist.compose.layout.rememberResponsiveColumnState import com.google.android.horologist.compose.material.ToggleChip import com.google.android.horologist.compose.material.ToggleChipToggleControl +import org.jetbrains.compose.resources.stringResource +import tasks.kmp.generated.resources.Res +import tasks.kmp.generated.resources.show_completed +import tasks.kmp.generated.resources.show_unstarted @OptIn(ExperimentalHorologistApi::class) @Composable fun SettingsScreen( - showHidden: Boolean, + showCompleted: Boolean, toggleShowHidden: (Boolean) -> Unit, + toggleShowCompleted: (Boolean) -> Unit, ) { val columnState = rememberResponsiveColumnState() ScreenScaffold( @@ -29,7 +34,15 @@ fun SettingsScreen( ToggleChip( checked = showHidden, onCheckedChanged = { toggleShowHidden(it) }, - label = "Show unstarted", + label = stringResource(Res.string.show_unstarted), + toggleControl = ToggleChipToggleControl.Switch, + ) + } + item { + ToggleChip( + checked = showCompleted, + onCheckedChanged = { toggleShowCompleted(it) }, + label = stringResource(Res.string.show_completed), toggleControl = ToggleChipToggleControl.Switch, ) } diff --git a/wear/src/main/java/org/tasks/presentation/screens/SettingsViewModel.kt b/wear/src/main/java/org/tasks/presentation/screens/SettingsViewModel.kt index eb3e5177c..7889368ab 100644 --- a/wear/src/main/java/org/tasks/presentation/screens/SettingsViewModel.kt +++ b/wear/src/main/java/org/tasks/presentation/screens/SettingsViewModel.kt @@ -1,11 +1,9 @@ package org.tasks.presentation.screens import android.app.Application -import androidx.datastore.core.DataStore import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope import com.google.android.horologist.annotations.ExperimentalHorologistApi -import com.google.android.horologist.data.ProtoDataStoreHelper.protoDataStore import com.google.android.horologist.data.ProtoDataStoreHelper.protoFlow import com.google.android.horologist.data.TargetNodeId import com.google.android.horologist.datalayer.grpc.GrpcExtensions.grpcClient @@ -17,6 +15,7 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import org.tasks.GrpcProto import org.tasks.GrpcProto.Settings +import org.tasks.SettingsKt import org.tasks.WearServiceGrpcKt import org.tasks.copy import org.tasks.extensions.wearDataLayerRegistry @@ -37,9 +36,6 @@ class SettingsViewModel( ) { WearServiceGrpcKt.WearServiceCoroutineStub(it) } - private val settingsFlow: DataStore by lazy { - registry.protoDataStore(viewModelScope) - } private val _viewState = MutableStateFlow(ViewState()) val viewState = _viewState.asStateFlow() @@ -57,12 +53,24 @@ class SettingsViewModel( .launchIn(viewModelScope) } - fun setShowHidden(showHidden: Boolean) = viewModelScope.launch { + fun setShowHidden(showHidden: Boolean) { + updateSettings { + this.showHidden = showHidden + } + } + + fun setShowCompleted(showCompleted: Boolean) { + updateSettings { + this.showCompleted = showCompleted + } + } + + private fun updateSettings(block: SettingsKt.Dsl.() -> Unit) = viewModelScope.launch { wearService.updateSettings( GrpcProto.UpdateSettingsRequest.newBuilder() .setSettings( _viewState.value.settings.copy { - this.showHidden = showHidden + block() } ) .build()