Set Loading State for Entities

This commit is contained in:
Diego Valenzuela 2023-04-29 11:06:32 -07:00
parent 8b32f9bffd
commit 6b33cd727a
2 changed files with 64 additions and 55 deletions

View file

@ -24,74 +24,81 @@ import io.homeassistant.companion.android.common.data.integration.IntegrationRep
import io.homeassistant.companion.android.common.data.integration.friendlyName
import io.homeassistant.companion.android.common.data.integration.friendlyState
import io.homeassistant.companion.android.common.data.integration.getIcon
import io.homeassistant.companion.android.common.data.integration.isExecuting
import io.homeassistant.companion.android.common.data.integration.onPressed
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.launch
@RequiresApi(Build.VERSION_CODES.O)
class EntityGridVehicleScreen(
carContext: CarContext,
val integrationRepository: IntegrationRepository,
val title: String,
val entitiesFlow: Flow<List<Entity<*>>>
carContext: CarContext,
val integrationRepository: IntegrationRepository,
val title: String,
val entitiesFlow: Flow<List<Entity<*>>>,
) : Screen(carContext) {
companion object {
private const val TAG = "EntityGridVehicleScreen"
}
companion object {
private const val TAG = "EntityGridVehicleScreen"
}
var loading = true
var entities: List<Entity<*>> = listOf()
var loading = true
var entities: List<Entity<*>> = listOf()
init {
lifecycleScope.launch {
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
entitiesFlow.collect {
loading = false
entities = it
invalidate()
}
}
init {
lifecycleScope.launch {
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
entitiesFlow.collect {
loading = false
entities = it
invalidate()
}
}
}
}
override fun onGetTemplate(): Template {
val listBuilder = ItemList.Builder()
entities.forEach { entity ->
val icon = entity.getIcon(carContext) ?: CommunityMaterial.Icon.cmd_cloud_question
listBuilder.addItem(
GridItem.Builder()
.setLoading(false)
.setTitle(entity.friendlyName)
.setText(entity.friendlyState(carContext))
.setImage(
CarIcon.Builder(
IconicsDrawable(carContext, icon).apply {
sizeDp = 64
}.toAndroidIconCompat()
)
.setTint(CarColor.DEFAULT)
.build()
)
.setOnClickListener {
Log.i(TAG, "${entity.entityId} clicked")
lifecycleScope.launch {
entity.onPressed(integrationRepository)
}
}
.build()
override fun onGetTemplate(): Template {
val listBuilder = ItemList.Builder()
entities.forEach { entity ->
val icon = entity.getIcon(carContext) ?: CommunityMaterial.Icon.cmd_cloud_question
val gridItem =
GridItem.Builder()
.setLoading(false)
.setTitle(entity.friendlyName)
.setText(entity.friendlyState(carContext))
if (entity.isExecuting()) {
gridItem.setLoading(entity.isExecuting())
} else {
gridItem
.setOnClickListener {
Log.i(TAG, "${entity.entityId} clicked")
lifecycleScope.launch {
entity.onPressed(integrationRepository)
}
}
.setImage(
CarIcon.Builder(
IconicsDrawable(carContext, icon).apply {
sizeDp = 64
}.toAndroidIconCompat()
)
}
return GridTemplate.Builder().apply {
setTitle(title)
setHeaderAction(Action.BACK)
if (loading) {
setLoading(true)
} else {
setLoading(false)
setSingleList(listBuilder.build())
}
}.build()
.setTint(CarColor.DEFAULT)
.build()
)
}
listBuilder.addItem(gridItem.build())
}
return GridTemplate.Builder().apply {
setTitle(title)
setHeaderAction(Action.BACK)
if (loading) {
setLoading(true)
} else {
setLoading(false)
setSingleList(listBuilder.build())
}
}.build()
}
}

View file

@ -642,3 +642,5 @@ fun <T> Entity<T>.friendlyState(context: Context): String {
}
return friendlyState
}
fun <T> Entity<T>.isExecuting()= state.endsWith("ing")