mirror of https://github.com/tasks/tasks
Toggle hidden tasks from Android Wear
parent
7c23d48117
commit
751c8aabc1
@ -0,0 +1,13 @@
|
||||
package org.tasks.wear
|
||||
|
||||
import org.tasks.GrpcProto.Settings
|
||||
import org.tasks.preferences.Preferences
|
||||
import org.tasks.preferences.QueryPreferences
|
||||
|
||||
class WearPreferences(
|
||||
preferences: Preferences,
|
||||
private val settings: Settings,
|
||||
): QueryPreferences by preferences {
|
||||
override val showHidden: Boolean
|
||||
get() = settings.showHidden
|
||||
}
|
||||
@ -0,0 +1,38 @@
|
||||
package org.tasks.presentation.screens
|
||||
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import com.google.android.horologist.annotations.ExperimentalHorologistApi
|
||||
import com.google.android.horologist.compose.layout.ScalingLazyColumn
|
||||
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
|
||||
|
||||
@OptIn(ExperimentalHorologistApi::class)
|
||||
@Composable
|
||||
fun SettingsScreen(
|
||||
|
||||
showHidden: Boolean,
|
||||
toggleShowHidden: (Boolean) -> Unit,
|
||||
) {
|
||||
val columnState = rememberResponsiveColumnState()
|
||||
ScreenScaffold(
|
||||
scrollState = columnState,
|
||||
) {
|
||||
ScalingLazyColumn(
|
||||
modifier = Modifier.fillMaxSize(),
|
||||
columnState = columnState,
|
||||
) {
|
||||
item {
|
||||
ToggleChip(
|
||||
checked = showHidden,
|
||||
onCheckedChanged = { toggleShowHidden(it) },
|
||||
label = "Show unstarted",
|
||||
toggleControl = ToggleChipToggleControl.Switch,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,71 @@
|
||||
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
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.flow.update
|
||||
import kotlinx.coroutines.launch
|
||||
import org.tasks.GrpcProto
|
||||
import org.tasks.GrpcProto.Settings
|
||||
import org.tasks.WearServiceGrpcKt
|
||||
import org.tasks.copy
|
||||
import org.tasks.extensions.wearDataLayerRegistry
|
||||
|
||||
data class ViewState(
|
||||
val initialized: Boolean = false,
|
||||
val settings: Settings = Settings.getDefaultInstance(),
|
||||
)
|
||||
|
||||
@OptIn(ExperimentalHorologistApi::class)
|
||||
class SettingsViewModel(
|
||||
application: Application,
|
||||
) : AndroidViewModel(application) {
|
||||
private val registry = application.wearDataLayerRegistry(viewModelScope)
|
||||
private val wearService: WearServiceGrpcKt.WearServiceCoroutineStub = registry.grpcClient(
|
||||
nodeId = TargetNodeId.PairedPhone,
|
||||
coroutineScope = viewModelScope,
|
||||
) {
|
||||
WearServiceGrpcKt.WearServiceCoroutineStub(it)
|
||||
}
|
||||
private val settingsFlow: DataStore<Settings> by lazy {
|
||||
registry.protoDataStore(viewModelScope)
|
||||
}
|
||||
private val _viewState = MutableStateFlow(ViewState())
|
||||
val viewState = _viewState.asStateFlow()
|
||||
|
||||
init {
|
||||
registry
|
||||
.protoFlow<Settings>(TargetNodeId.PairedPhone)
|
||||
.onEach { newSettings ->
|
||||
_viewState.update {
|
||||
it.copy(
|
||||
initialized = true,
|
||||
settings = newSettings,
|
||||
)
|
||||
}
|
||||
}
|
||||
.launchIn(viewModelScope)
|
||||
}
|
||||
|
||||
fun setShowHidden(showHidden: Boolean) = viewModelScope.launch {
|
||||
wearService.updateSettings(
|
||||
GrpcProto.UpdateSettingsRequest.newBuilder()
|
||||
.setSettings(
|
||||
_viewState.value.settings.copy {
|
||||
this.showHidden = showHidden
|
||||
}
|
||||
)
|
||||
.build()
|
||||
)
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue