mirror of https://github.com/tasks/tasks
Check if app installed on phone
parent
f36e900627
commit
c13cf982b7
@ -1,4 +1,108 @@
|
|||||||
package org.tasks.presentation
|
package org.tasks.presentation
|
||||||
|
|
||||||
class MainActivityViewModel {
|
import android.app.Application
|
||||||
|
import android.util.Log
|
||||||
|
import androidx.lifecycle.AndroidViewModel
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
|
import com.google.android.horologist.annotations.ExperimentalHorologistApi
|
||||||
|
import com.google.android.horologist.data.WearDataLayerRegistry
|
||||||
|
import com.google.android.horologist.data.apphelper.AppInstallationStatus
|
||||||
|
import com.google.android.horologist.data.apphelper.AppInstallationStatusNodeType
|
||||||
|
import com.google.android.horologist.datalayer.watch.WearDataLayerAppHelper
|
||||||
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
import kotlinx.coroutines.flow.asStateFlow
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import org.tasks.extensions.wearDataLayerRegistry
|
||||||
|
|
||||||
|
@OptIn(ExperimentalHorologistApi::class)
|
||||||
|
class MainActivityViewModel(
|
||||||
|
application: Application,
|
||||||
|
) : AndroidViewModel(application) {
|
||||||
|
fun installOnNode(nodeId: String?) = viewModelScope.launch {
|
||||||
|
if (nodeId == null) {
|
||||||
|
Log.d("MainActivityViewModel", "Missing nodeId")
|
||||||
|
} else {
|
||||||
|
helper.installOnNode(nodeId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val _uiState =
|
||||||
|
MutableStateFlow<NodesActionScreenState>(NodesActionScreenState.Idle)
|
||||||
|
val uiState = _uiState.asStateFlow()
|
||||||
|
private val registry: WearDataLayerRegistry by lazy {
|
||||||
|
application.wearDataLayerRegistry(viewModelScope)
|
||||||
|
}
|
||||||
|
private val helper: WearDataLayerAppHelper by lazy {
|
||||||
|
WearDataLayerAppHelper(
|
||||||
|
context = application,
|
||||||
|
registry = registry,
|
||||||
|
scope = viewModelScope,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
_uiState.value = NodesActionScreenState.Loading
|
||||||
|
|
||||||
|
loadNodes()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun loadNodes() = viewModelScope.launch {
|
||||||
|
if (!helper.isAvailable()) {
|
||||||
|
_uiState.value = NodesActionScreenState.ApiNotAvailable
|
||||||
|
} else {
|
||||||
|
_uiState.value = NodesActionScreenState.Loaded(
|
||||||
|
nodeList = helper.connectedNodes().map { node ->
|
||||||
|
val type = when (node.appInstallationStatus) {
|
||||||
|
is AppInstallationStatus.Installed -> {
|
||||||
|
val status =
|
||||||
|
node.appInstallationStatus as AppInstallationStatus.Installed
|
||||||
|
when (status.nodeType) {
|
||||||
|
AppInstallationStatusNodeType.WATCH -> NodeTypeUiModel.WATCH
|
||||||
|
AppInstallationStatusNodeType.PHONE -> NodeTypeUiModel.PHONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AppInstallationStatus.NotInstalled -> NodeTypeUiModel.UNKNOWN
|
||||||
|
}
|
||||||
|
|
||||||
|
NodeUiModel(
|
||||||
|
id = node.id,
|
||||||
|
name = node.displayName,
|
||||||
|
appInstalled = node.appInstallationStatus is AppInstallationStatus.Installed,
|
||||||
|
type = type,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
).also {
|
||||||
|
Log.d("MainActivityViewModel", "Loaded: $it")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data class NodeUiModel(
|
||||||
|
val id: String,
|
||||||
|
val name: String,
|
||||||
|
val appInstalled: Boolean,
|
||||||
|
val type: NodeTypeUiModel,
|
||||||
|
)
|
||||||
|
|
||||||
|
enum class NodeTypeUiModel {
|
||||||
|
WATCH,
|
||||||
|
PHONE,
|
||||||
|
UNKNOWN,
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class Errors {
|
||||||
|
APP_NOT_INSTALLED,
|
||||||
|
UNKNOWN
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class NodesActionScreenState {
|
||||||
|
data object Idle : NodesActionScreenState()
|
||||||
|
|
||||||
|
data object Loading : NodesActionScreenState()
|
||||||
|
|
||||||
|
data class Loaded(val nodeList: List<NodeUiModel>) : NodesActionScreenState()
|
||||||
|
|
||||||
|
data object ApiNotAvailable : NodesActionScreenState()
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue