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