mirror of
https://github.com/Aviortheking/Neo-Store.git
synced 2025-04-23 19:32:16 +00:00
Add: Favorite management logic to items
This commit is contained in:
parent
5bc860389a
commit
f022a29990
@ -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))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user