Add: Favorite management logic to items

This commit is contained in:
machiav3lli 2022-06-23 01:11:31 +02:00
parent 5bc860389a
commit f022a29990
5 changed files with 128 additions and 41 deletions

View File

@ -69,6 +69,7 @@ class ExploreFragment : MainNavFragmentX() {
val categories by viewModel.categories.observeAsState(emptyList()) val categories by viewModel.categories.observeAsState(emptyList())
val installedList by viewModel.installed.observeAsState(null) val installedList by viewModel.installed.observeAsState(null)
val searchQuery by viewModel.searchQuery.observeAsState("") val searchQuery by viewModel.searchQuery.observeAsState("")
val favorites by mainActivityX.db.extrasDao.favoritesLive.observeAsState(emptyArray())
AppTheme( AppTheme(
darkTheme = when (Preferences[Preferences.Key.Theme]) { darkTheme = when (Preferences[Preferences.Key.Theme]) {
@ -120,24 +121,29 @@ class ExploreFragment : MainNavFragmentX() {
) )
} }
ProductsVerticalRecycler( ProductsVerticalRecycler(
products, productsList = products,
repositories, repositories = repositories,
Modifier favorites = favorites,
modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.weight(1f), .weight(1f),
onUserClick = { item -> onUserClick = { item ->
mainActivityX.navigateProduct(item.packageName) mainActivityX.navigateProduct(item.packageName)
}, },
onFavouriteClick = {}, onFavouriteClick = { item ->
getInstalled = { installedList?.get(it.packageName) }, viewModel.setFavorite(
onActionClick = { item -> item.packageName,
val installed = installedList?.get(item.packageName) !favorites.contains(item.packageName)
if (installed != null && installed.launcherActivities.isNotEmpty()) )
requireContext().onLaunchClick(installed, childFragmentManager) },
else getInstalled = { installedList?.get(it.packageName) }
mainActivityX.syncConnection.binder?.installApps(listOf(item)) ) { 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

@ -8,13 +8,32 @@ import android.view.ViewGroup
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Settings import androidx.compose.material.icons.rounded.Settings
import androidx.compose.material.icons.rounded.Sync import androidx.compose.material.icons.rounded.Sync
import androidx.compose.material3.* import androidx.compose.material3.ButtonDefaults
import androidx.compose.runtime.* import androidx.compose.material3.ElevatedButton
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SuggestionChip
import androidx.compose.material3.SuggestionChipDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ComposeView
@ -68,6 +87,7 @@ class InstalledFragment : MainNavFragmentX() {
val secondaryList by viewModel.secondaryProducts.observeAsState(null) val secondaryList by viewModel.secondaryProducts.observeAsState(null)
val installedList by viewModel.installed.observeAsState(null) val installedList by viewModel.installed.observeAsState(null)
val searchQuery by viewModel.searchQuery.observeAsState("") val searchQuery by viewModel.searchQuery.observeAsState("")
val favorites by mainActivityX.db.extrasDao.favoritesLive.observeAsState(emptyArray())
AppTheme( AppTheme(
darkTheme = when (Preferences[Preferences.Key.Theme]) { darkTheme = when (Preferences[Preferences.Key.Theme]) {
@ -194,24 +214,30 @@ class InstalledFragment : MainNavFragmentX() {
} }
) )
} }
ProductsVerticalRecycler(primaryList?.sortedBy(Product::label), ProductsVerticalRecycler(
repositories, productsList = primaryList?.sortedBy(Product::label),
repositories = repositories,
favorites = favorites,
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.weight(1f), .weight(1f),
onUserClick = { item -> onUserClick = { item ->
mainActivityX.navigateProduct(item.packageName) mainActivityX.navigateProduct(item.packageName)
}, },
onFavouriteClick = {}, onFavouriteClick = { item ->
getInstalled = { installedList?.get(it.packageName) }, viewModel.setFavorite(
onActionClick = { item -> item.packageName,
val installed = installedList?.get(item.packageName) !favorites.contains(item.packageName)
if (installed != null && installed.launcherActivities.isNotEmpty()) )
requireContext().onLaunchClick(installed, childFragmentManager) },
else getInstalled = { installedList?.get(it.packageName) }
mainActivityX.syncConnection.binder?.installApps(listOf(item)) ) { 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

@ -7,11 +7,22 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Settings import androidx.compose.material.icons.rounded.Settings
import androidx.compose.material.icons.rounded.Sync import androidx.compose.material.icons.rounded.Sync
import androidx.compose.material3.* import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SuggestionChip
import androidx.compose.material3.SuggestionChipDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.livedata.observeAsState
@ -66,6 +77,7 @@ class LatestFragment : MainNavFragmentX() {
val secondaryList by viewModel.secondaryProducts.observeAsState(null) val secondaryList by viewModel.secondaryProducts.observeAsState(null)
val installedList by viewModel.installed.observeAsState(null) val installedList by viewModel.installed.observeAsState(null)
val searchQuery by viewModel.searchQuery.observeAsState("") val searchQuery by viewModel.searchQuery.observeAsState("")
val favorites by mainActivityX.db.extrasDao.favoritesLive.observeAsState(emptyArray())
AppTheme( AppTheme(
darkTheme = when (Preferences[Preferences.Key.Theme]) { darkTheme = when (Preferences[Preferences.Key.Theme]) {
@ -137,23 +149,30 @@ class LatestFragment : MainNavFragmentX() {
} }
) )
} }
ProductsVerticalRecycler(primaryList, repositories, ProductsVerticalRecycler(
productsList = primaryList,
repositories = repositories,
favorites = favorites,
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.weight(1f), .weight(1f),
onUserClick = { item -> onUserClick = { item ->
mainActivityX.navigateProduct(item.packageName) mainActivityX.navigateProduct(item.packageName)
}, },
onFavouriteClick = {}, onFavouriteClick = { item ->
getInstalled = { installedList?.get(it.packageName) }, viewModel.setFavorite(
onActionClick = { item -> item.packageName,
val installed = installedList?.get(item.packageName) !favorites.contains(item.packageName)
if (installed != null && installed.launcherActivities.isNotEmpty()) )
requireContext().onLaunchClick(installed, childFragmentManager) },
else getInstalled = { installedList?.get(it.packageName) }
mainActivityX.syncConnection.binder?.installApps(listOf(item)) ) { 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

@ -139,6 +139,22 @@ class AppViewModelX(val db: DatabaseX, val packageName: String) : ViewModel() {
} }
} }
fun setFavorite(packageName: String, setBoolean: Boolean) {
viewModelScope.launch {
saveFavorite(packageName, setBoolean)
}
}
private suspend fun saveFavorite(packageName: String, setBoolean: Boolean) {
withContext(Dispatchers.IO) {
val oldValue = db.extrasDao[packageName]
if (oldValue != null) db.extrasDao
.insertReplace(oldValue.copy(favorite = setBoolean))
else db.extrasDao
.insertReplace(Extras(packageName, favorite = setBoolean))
}
}
class Factory(val db: DatabaseX, val packageName: String) : ViewModelProvider.Factory { class Factory(val db: DatabaseX, val packageName: String) : ViewModelProvider.Factory {
@Suppress("unchecked_cast") @Suppress("unchecked_cast")
override fun <T : ViewModel> create(modelClass: Class<T>): T { override fun <T : ViewModel> create(modelClass: Class<T>): T {

View File

@ -7,6 +7,7 @@ import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.looker.droidify.content.Preferences import com.looker.droidify.content.Preferences
import com.looker.droidify.database.DatabaseX import com.looker.droidify.database.DatabaseX
import com.looker.droidify.database.entity.Extras
import com.looker.droidify.database.entity.Installed import com.looker.droidify.database.entity.Installed
import com.looker.droidify.database.entity.Product import com.looker.droidify.database.entity.Product
import com.looker.droidify.database.entity.Repository import com.looker.droidify.database.entity.Repository
@ -127,6 +128,25 @@ class MainNavFragmentViewModelX(
} }
installed.postValue(it.associateBy { it.packageName }) installed.postValue(it.associateBy { it.packageName })
} }
/*if (secondaryRequest.updates) secondaryProducts.addSource(db.extrasDao.allLive) {
secondaryProducts.value = secondaryProducts.value.filter { secondaryProducts.it.packageName) }
}*/
}
fun setFavorite(packageName: String, setBoolean: Boolean) {
viewModelScope.launch {
saveFavorite(packageName, setBoolean)
}
}
private suspend fun saveFavorite(packageName: String, setBoolean: Boolean) {
withContext(Dispatchers.IO) {
val oldValue = db.extrasDao[packageName]
if (oldValue != null) db.extrasDao
.insertReplace(oldValue.copy(favorite = setBoolean))
else db.extrasDao
.insertReplace(Extras(packageName, favorite = setBoolean))
}
} }
class Factory( class Factory(