diff --git a/src/main/kotlin/com/looker/droidify/ui/fragments/ExploreFragment.kt b/src/main/kotlin/com/looker/droidify/ui/fragments/ExploreFragment.kt index 0d0d4ccd..98442ef2 100644 --- a/src/main/kotlin/com/looker/droidify/ui/fragments/ExploreFragment.kt +++ b/src/main/kotlin/com/looker/droidify/ui/fragments/ExploreFragment.kt @@ -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)) + } } } } diff --git a/src/main/kotlin/com/looker/droidify/ui/fragments/InstalledFragment.kt b/src/main/kotlin/com/looker/droidify/ui/fragments/InstalledFragment.kt index e8219c91..d1caa78f 100644 --- a/src/main/kotlin/com/looker/droidify/ui/fragments/InstalledFragment.kt +++ b/src/main/kotlin/com/looker/droidify/ui/fragments/InstalledFragment.kt @@ -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)) + } } } } diff --git a/src/main/kotlin/com/looker/droidify/ui/fragments/LatestFragment.kt b/src/main/kotlin/com/looker/droidify/ui/fragments/LatestFragment.kt index f9ca030b..710cc638 100644 --- a/src/main/kotlin/com/looker/droidify/ui/fragments/LatestFragment.kt +++ b/src/main/kotlin/com/looker/droidify/ui/fragments/LatestFragment.kt @@ -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)) + } } } } diff --git a/src/main/kotlin/com/looker/droidify/ui/viewmodels/AppViewModelX.kt b/src/main/kotlin/com/looker/droidify/ui/viewmodels/AppViewModelX.kt index 02e6c741..4116d9d0 100644 --- a/src/main/kotlin/com/looker/droidify/ui/viewmodels/AppViewModelX.kt +++ b/src/main/kotlin/com/looker/droidify/ui/viewmodels/AppViewModelX.kt @@ -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 create(modelClass: Class): T { diff --git a/src/main/kotlin/com/looker/droidify/ui/viewmodels/MainNavFragmentViewModelX.kt b/src/main/kotlin/com/looker/droidify/ui/viewmodels/MainNavFragmentViewModelX.kt index c54a74f8..269f26fe 100644 --- a/src/main/kotlin/com/looker/droidify/ui/viewmodels/MainNavFragmentViewModelX.kt +++ b/src/main/kotlin/com/looker/droidify/ui/viewmodels/MainNavFragmentViewModelX.kt @@ -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(