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 installedList by viewModel.installed.observeAsState(null)
val searchQuery by viewModel.searchQuery.observeAsState("")
val favorites by mainActivityX.db.extrasDao.favoritesLive.observeAsState(emptyArray())
AppTheme(
darkTheme = when (Preferences[Preferences.Key.Theme]) {
@ -120,24 +121,29 @@ class ExploreFragment : MainNavFragmentX() {
)
}
ProductsVerticalRecycler(
products,
repositories,
Modifier
productsList = products,
repositories = repositories,
favorites = favorites,
modifier = Modifier
.fillMaxWidth()
.weight(1f),
onUserClick = { item ->
mainActivityX.navigateProduct(item.packageName)
},
onFavouriteClick = {},
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))
}
)
onFavouriteClick = { item ->
viewModel.setFavorite(
item.packageName,
!favorites.contains(item.packageName)
)
},
getInstalled = { installedList?.get(it.packageName) }
) { 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.foundation.background
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.rounded.Settings
import androidx.compose.material.icons.rounded.Sync
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.material3.ButtonDefaults
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.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
@ -68,6 +87,7 @@ class InstalledFragment : MainNavFragmentX() {
val secondaryList by viewModel.secondaryProducts.observeAsState(null)
val installedList by viewModel.installed.observeAsState(null)
val searchQuery by viewModel.searchQuery.observeAsState("")
val favorites by mainActivityX.db.extrasDao.favoritesLive.observeAsState(emptyArray())
AppTheme(
darkTheme = when (Preferences[Preferences.Key.Theme]) {
@ -194,24 +214,30 @@ class InstalledFragment : MainNavFragmentX() {
}
)
}
ProductsVerticalRecycler(primaryList?.sortedBy(Product::label),
repositories,
ProductsVerticalRecycler(
productsList = primaryList?.sortedBy(Product::label),
repositories = repositories,
favorites = favorites,
modifier = Modifier
.fillMaxWidth()
.weight(1f),
onUserClick = { item ->
mainActivityX.navigateProduct(item.packageName)
},
onFavouriteClick = {},
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))
}
)
onFavouriteClick = { item ->
viewModel.setFavorite(
item.packageName,
!favorites.contains(item.packageName)
)
},
getInstalled = { installedList?.get(it.packageName) }
) { 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 androidx.compose.foundation.background
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.rounded.Settings
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.getValue
import androidx.compose.runtime.livedata.observeAsState
@ -66,6 +77,7 @@ class LatestFragment : MainNavFragmentX() {
val secondaryList by viewModel.secondaryProducts.observeAsState(null)
val installedList by viewModel.installed.observeAsState(null)
val searchQuery by viewModel.searchQuery.observeAsState("")
val favorites by mainActivityX.db.extrasDao.favoritesLive.observeAsState(emptyArray())
AppTheme(
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
.fillMaxWidth()
.weight(1f),
onUserClick = { item ->
mainActivityX.navigateProduct(item.packageName)
},
onFavouriteClick = {},
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))
}
)
onFavouriteClick = { item ->
viewModel.setFavorite(
item.packageName,
!favorites.contains(item.packageName)
)
},
getInstalled = { installedList?.get(it.packageName) }
) { 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 {
@Suppress("unchecked_cast")
override fun <T : ViewModel> create(modelClass: Class<T>): T {

View File

@ -7,6 +7,7 @@ import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.looker.droidify.content.Preferences
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.Product
import com.looker.droidify.database.entity.Repository
@ -127,6 +128,25 @@ class MainNavFragmentViewModelX(
}
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(