Update: Flexibel extended card actions (only Install & Launch for now)

This commit is contained in:
machiav3lli 2022-05-13 11:24:12 +02:00
parent 5a648f9804
commit 40c8297322
5 changed files with 47 additions and 24 deletions

View File

@ -34,8 +34,8 @@ fun ProductsVerticalRecycler(
modifier: Modifier = Modifier.fillMaxSize(), modifier: Modifier = Modifier.fillMaxSize(),
onUserClick: (ProductItem) -> Unit = {}, onUserClick: (ProductItem) -> Unit = {},
onFavouriteClick: (ProductItem) -> Unit = {}, onFavouriteClick: (ProductItem) -> Unit = {},
onInstallClick: (ProductItem) -> Unit = {}
getInstalled: (ProductItem) -> Installed? = {null}, getInstalled: (ProductItem) -> Installed? = {null},
onActionClick: (ProductItem) -> Unit = {}
) { ) {
VerticalItemList(list = productsList, modifier = modifier) { VerticalItemList(list = productsList, modifier = modifier) {
it.toItem().let { item -> it.toItem().let { item ->
@ -44,8 +44,8 @@ fun ProductsVerticalRecycler(
repositories[item.repositoryId], repositories[item.repositoryId],
onUserClick, onUserClick,
onFavouriteClick, onFavouriteClick,
onInstallClick
getInstalled.invoke(item), getInstalled.invoke(item),
onActionClick
) )
} }
} }

View File

@ -1,5 +1,6 @@
package com.looker.droidify.ui.compose.components package com.looker.droidify.ui.compose.components
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
@ -27,11 +28,12 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.looker.droidify.R
import com.looker.droidify.database.entity.Installed import com.looker.droidify.database.entity.Installed
import com.looker.droidify.database.entity.Repository import com.looker.droidify.database.entity.Repository
import com.looker.droidify.entity.Action
import com.looker.droidify.entity.ProductItem import com.looker.droidify.entity.ProductItem
import com.looker.droidify.network.CoilDownloader import com.looker.droidify.network.CoilDownloader
import com.looker.droidify.ui.compose.utils.ExpandableCard import com.looker.droidify.ui.compose.utils.ExpandableCard
@ -43,8 +45,8 @@ fun ProductsListItem(
repo: Repository? = null, repo: Repository? = null,
onUserClick: (ProductItem) -> Unit = {}, onUserClick: (ProductItem) -> Unit = {},
onFavouriteClick: (ProductItem) -> Unit = {}, onFavouriteClick: (ProductItem) -> Unit = {},
onInstallClick: (ProductItem) -> Unit = {}
installed: Installed? = null, installed: Installed? = null,
onActionClick: (ProductItem) -> Unit = {}
) { ) {
val product by remember(item) { mutableStateOf(item) } val product by remember(item) { mutableStateOf(item) }
val imageData by remember(product, repo) { val imageData by remember(product, repo) {
@ -67,7 +69,7 @@ fun ProductsListItem(
item = product, item = product,
installed = installed, installed = installed,
onFavourite = onFavouriteClick, onFavourite = onFavouriteClick,
onInstallClicked = onInstallClick onActionClicked = onActionClick
) )
} }
) { ) {
@ -129,7 +131,7 @@ fun ExpandedItemContent(
installed: Installed? = null, installed: Installed? = null,
favourite: Boolean = false, favourite: Boolean = false,
onFavourite: (ProductItem) -> Unit = {}, onFavourite: (ProductItem) -> Unit = {},
onInstallClicked: (ProductItem) -> Unit = {} onActionClicked: (ProductItem) -> Unit = {}
) { ) {
Box(contentAlignment = Alignment.CenterEnd) { Box(contentAlignment = Alignment.CenterEnd) {
Row( Row(
@ -144,18 +146,24 @@ fun ExpandedItemContent(
tint = if (favourite) Color.Red else MaterialTheme.colorScheme.outline tint = if (favourite) Color.Red else MaterialTheme.colorScheme.outline
) )
} }
AnimatedVisibility(visible = installed == null || installed.launcherActivities.isNotEmpty()) {
FilledTonalButton( FilledTonalButton(
colors = buttonColors( colors = buttonColors(
containerColor = MaterialTheme.colorScheme.primaryContainer, containerColor = MaterialTheme.colorScheme.primaryContainer,
contentColor = MaterialTheme.colorScheme.onPrimaryContainer contentColor = MaterialTheme.colorScheme.onPrimaryContainer
), ),
onClick = { onInstallClicked(item) } onClick = { onActionClicked(item) }
) { ) {
val action = when {
installed != null -> Action.LAUNCH
else -> Action.INSTALL
}
Icon( Icon(
painter = painterResource(id = R.drawable.ic_download), painter = painterResource(id = action.iconResId),
contentDescription = "Install" contentDescription = stringResource(id = action.titleResId)
) )
Text(text = "Install") Text(text = stringResource(id = action.titleResId))
}
} }
} }
} }

View File

@ -37,6 +37,7 @@ import com.looker.droidify.ui.compose.components.TopBarAction
import com.looker.droidify.ui.compose.pages.home.components.CategoryChipList import com.looker.droidify.ui.compose.pages.home.components.CategoryChipList
import com.looker.droidify.ui.compose.theme.AppTheme import com.looker.droidify.ui.compose.theme.AppTheme
import com.looker.droidify.utility.isDarkTheme import com.looker.droidify.utility.isDarkTheme
import com.looker.droidify.utility.onLaunchClick
class ExploreFragment : MainNavFragmentX() { class ExploreFragment : MainNavFragmentX() {
@ -133,9 +134,13 @@ class ExploreFragment : MainNavFragmentX() {
mainActivityX.navigateProduct(item.packageName) mainActivityX.navigateProduct(item.packageName)
}, },
onFavouriteClick = {}, onFavouriteClick = {},
onInstallClick = {
mainActivityX.syncConnection.binder?.installApps(listOf(it))
getInstalled = { installedList?.get(it.packageName) }, getInstalled = { installedList?.get(it.packageName) },
onActionClick = { item ->
val installed = installedList?.get(item.packageName)
if (installed != null && installed.launcherActivities.isNotEmpty())
requireContext().onLaunchClick(installed, childFragmentManager)
else
mainActivityX.syncConnection.binder?.installApps(listOf(item))
} }
) )
} }

View File

@ -56,6 +56,7 @@ import com.looker.droidify.ui.compose.components.TopBar
import com.looker.droidify.ui.compose.components.TopBarAction import com.looker.droidify.ui.compose.components.TopBarAction
import com.looker.droidify.ui.compose.theme.AppTheme import com.looker.droidify.ui.compose.theme.AppTheme
import com.looker.droidify.utility.isDarkTheme import com.looker.droidify.utility.isDarkTheme
import com.looker.droidify.utility.onLaunchClick
class InstalledFragment : MainNavFragmentX() { class InstalledFragment : MainNavFragmentX() {
@ -223,9 +224,13 @@ class InstalledFragment : MainNavFragmentX() {
mainActivityX.navigateProduct(item.packageName) mainActivityX.navigateProduct(item.packageName)
}, },
onFavouriteClick = {}, onFavouriteClick = {},
onInstallClick = {
mainActivityX.syncConnection.binder?.installApps(listOf(it))
getInstalled = { installedList?.get(it.packageName) }, getInstalled = { installedList?.get(it.packageName) },
onActionClick = { item ->
val installed = installedList?.get(item.packageName)
if (installed != null && installed.launcherActivities.isNotEmpty())
requireContext().onLaunchClick(installed, childFragmentManager)
else
mainActivityX.syncConnection.binder?.installApps(listOf(item))
} }
) )
} }

View File

@ -48,6 +48,7 @@ import com.looker.droidify.ui.compose.components.TopBar
import com.looker.droidify.ui.compose.components.TopBarAction import com.looker.droidify.ui.compose.components.TopBarAction
import com.looker.droidify.ui.compose.theme.AppTheme import com.looker.droidify.ui.compose.theme.AppTheme
import com.looker.droidify.utility.isDarkTheme import com.looker.droidify.utility.isDarkTheme
import com.looker.droidify.utility.onLaunchClick
class LatestFragment : MainNavFragmentX() { class LatestFragment : MainNavFragmentX() {
@ -161,9 +162,13 @@ class LatestFragment : MainNavFragmentX() {
mainActivityX.navigateProduct(item.packageName) mainActivityX.navigateProduct(item.packageName)
}, },
onFavouriteClick = {}, onFavouriteClick = {},
onInstallClick = {
mainActivityX.syncConnection.binder?.installApps(listOf(it))
getInstalled = { installedList?.get(it.packageName) }, getInstalled = { installedList?.get(it.packageName) },
onActionClick = { item ->
val installed = installedList?.get(item.packageName)
if (installed != null && installed.launcherActivities.isNotEmpty())
requireContext().onLaunchClick(installed, childFragmentManager)
else
mainActivityX.syncConnection.binder?.installApps(listOf(item))
} }
) )
} }