diff --git a/src/main/kotlin/com/looker/droidify/ui/activities/MainActivityX.kt b/src/main/kotlin/com/looker/droidify/ui/activities/MainActivityX.kt index 87ca3b5d..da9c3d09 100644 --- a/src/main/kotlin/com/looker/droidify/ui/activities/MainActivityX.kt +++ b/src/main/kotlin/com/looker/droidify/ui/activities/MainActivityX.kt @@ -218,7 +218,7 @@ class MainActivityX : AppCompatActivity() { private fun updateUpdateNotificationBlocker(activeSource: Source) { val blockerFragment = if (activeSource == Source.UPDATES) { supportFragmentManager.fragments.asSequence().mapNotNull { it as? MainNavFragmentX } - .find { it.source == activeSource } + .find { it.primarySource == activeSource } } else { null } diff --git a/src/main/kotlin/com/looker/droidify/ui/activities/PrefsActivityX.kt b/src/main/kotlin/com/looker/droidify/ui/activities/PrefsActivityX.kt index 219a1cd2..b5cb6c1c 100644 --- a/src/main/kotlin/com/looker/droidify/ui/activities/PrefsActivityX.kt +++ b/src/main/kotlin/com/looker/droidify/ui/activities/PrefsActivityX.kt @@ -171,7 +171,7 @@ class PrefsActivityX : AppCompatActivity() { private fun updateUpdateNotificationBlocker(activeSource: Source) { val blockerFragment = if (activeSource == Source.UPDATES) { supportFragmentManager.fragments.asSequence().mapNotNull { it as? MainNavFragmentX } - .find { it.source == activeSource } + .find { it.primarySource == activeSource } } else { null } 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 f80fd9ab..3db6d9e5 100644 --- a/src/main/kotlin/com/looker/droidify/ui/fragments/ExploreFragment.kt +++ b/src/main/kotlin/com/looker/droidify/ui/fragments/ExploreFragment.kt @@ -23,7 +23,8 @@ class ExploreFragment : MainNavFragmentX() { private lateinit var appsItemAdapter: PagedModelAdapter private var appsFastAdapter: FastAdapter? = null - override val source = Source.AVAILABLE + override val primarySource = Source.AVAILABLE + override val secondarySource = Source.AVAILABLE private var repositories: Map = mapOf() @@ -62,7 +63,7 @@ class ExploreFragment : MainNavFragmentX() { } override fun setupLayout() { - viewModel.productsList.observe(viewLifecycleOwner) { + viewModel.primaryProducts.observe(viewLifecycleOwner) { appsItemAdapter.submitList(it) appsFastAdapter?.notifyDataSetChanged() } 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 f4e93c25..ec4a666e 100644 --- a/src/main/kotlin/com/looker/droidify/ui/fragments/InstalledFragment.kt +++ b/src/main/kotlin/com/looker/droidify/ui/fragments/InstalledFragment.kt @@ -27,7 +27,8 @@ class InstalledFragment : MainNavFragmentX() { private lateinit var updatedItemAdapter: PagedModelAdapter private var updatedFastAdapter: FastAdapter? = null - override val source = Source.INSTALLED + override val primarySource = Source.INSTALLED + override val secondarySource = Source.UPDATES private var repositories: Map = mapOf() @@ -81,11 +82,12 @@ class InstalledFragment : MainNavFragmentX() { } } - viewModel.productsList.observe(viewLifecycleOwner) { - binding.updatedBar.visibility = - if (it.any { item -> item.data_item?.canUpdate == true }) View.VISIBLE else View.GONE - updatedItemAdapter.submitList(it) + viewModel.primaryProducts.observe(viewLifecycleOwner) { installedItemAdapter.submitList(it) } + viewModel.secondaryProducts.observe(viewLifecycleOwner) { + binding.updatedBar.visibility = if (it.isNotEmpty()) View.VISIBLE else View.GONE + updatedItemAdapter.submitList(it) + } } } 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 12b8a653..96895132 100644 --- a/src/main/kotlin/com/looker/droidify/ui/fragments/LatestFragment.kt +++ b/src/main/kotlin/com/looker/droidify/ui/fragments/LatestFragment.kt @@ -28,7 +28,8 @@ class LatestFragment : MainNavFragmentX() { private var newFastAdapter: FastAdapter? = null // TODO replace the source with one that get a certain amount of updated apps - override val source = Source.UPDATED + override val primarySource = Source.UPDATED + override val secondarySource = Source.NEW private var repositories: Map = mapOf() @@ -76,9 +77,11 @@ class LatestFragment : MainNavFragmentX() { } override fun setupLayout() { - viewModel.productsList.observe(requireActivity()) { - newItemAdapter.submitList(it) + viewModel.primaryProducts.observe(viewLifecycleOwner) { updatedItemAdapter.submitList(it) } + viewModel.secondaryProducts.observe(viewLifecycleOwner) { + newItemAdapter.submitList(it) + } } } diff --git a/src/main/kotlin/com/looker/droidify/ui/fragments/MainNavFragmentX.kt b/src/main/kotlin/com/looker/droidify/ui/fragments/MainNavFragmentX.kt index 0e86acfb..95a431d3 100644 --- a/src/main/kotlin/com/looker/droidify/ui/fragments/MainNavFragmentX.kt +++ b/src/main/kotlin/com/looker/droidify/ui/fragments/MainNavFragmentX.kt @@ -1,6 +1,8 @@ package com.looker.droidify.ui.fragments +import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import com.looker.droidify.R import com.looker.droidify.entity.ProductItem import com.looker.droidify.ui.activities.MainActivityX import com.looker.droidify.ui.viewmodels.MainNavFragmentViewModelX @@ -9,9 +11,10 @@ abstract class MainNavFragmentX : BaseNavFragment() { private val mainActivityX: MainActivityX get() = requireActivity() as MainActivityX val viewModel: MainNavFragmentViewModelX by viewModels { - MainNavFragmentViewModelX.Factory(mainActivityX.db, source) + MainNavFragmentViewModelX.Factory(mainActivityX.db, primarySource, secondarySource) } - abstract val source: Source + abstract val primarySource: Source + abstract val secondarySource: Source open fun onBackPressed(): Boolean = false 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 cf7e1de5..d085bb15 100644 --- a/src/main/kotlin/com/looker/droidify/ui/viewmodels/MainNavFragmentViewModelX.kt +++ b/src/main/kotlin/com/looker/droidify/ui/viewmodels/MainNavFragmentViewModelX.kt @@ -14,11 +14,15 @@ import com.looker.droidify.entity.ProductItem import com.looker.droidify.ui.fragments.Request import com.looker.droidify.ui.fragments.Source import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.* +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class MainNavFragmentViewModelX(val db: DatabaseX, source: Source) : ViewModel() { +class MainNavFragmentViewModelX(val db: DatabaseX, primarySource: Source, secondarySource: Source) : + ViewModel() { private val _order = MutableStateFlow(ProductItem.Order.LAST_UPDATE) private val _sections = MutableStateFlow(ProductItem.Section.All) @@ -88,16 +92,29 @@ class MainNavFragmentViewModelX(val db: DatabaseX, source: Source) : ViewModel() .setEnablePlaceholders(false) .build() } - private val request = request(source) - val productsList: LiveData> by lazy { + private val primaryRequest = request(primarySource) + val primaryProducts: LiveData> by lazy { LivePagedListBuilder( db.productDao.queryList( - installed = request.installed, - updates = request.updates, - searchQuery = request.searchQuery, - section = request.section, - order = request.order, - numberOfItems = request.numberOfItems + installed = primaryRequest.installed, + updates = primaryRequest.updates, + searchQuery = primaryRequest.searchQuery, + section = primaryRequest.section, + order = primaryRequest.order, + numberOfItems = primaryRequest.numberOfItems + ), pagedListConfig + ).build() + } + private val secondaryRequest = request(secondarySource) + val secondaryProducts: LiveData> by lazy { + LivePagedListBuilder( + db.productDao.queryList( + installed = secondaryRequest.installed, + updates = secondaryRequest.updates, + searchQuery = secondaryRequest.searchQuery, + section = secondaryRequest.section, + order = secondaryRequest.order, + numberOfItems = secondaryRequest.numberOfItems ), pagedListConfig ).build() } @@ -149,11 +166,16 @@ class MainNavFragmentViewModelX(val db: DatabaseX, source: Source) : ViewModel() } } - class Factory(val db: DatabaseX, val source: Source) : ViewModelProvider.Factory { + class Factory( + val db: DatabaseX, + private val primarySource: Source, + private val secondarySource: Source + ) : + ViewModelProvider.Factory { @Suppress("unchecked_cast") override fun create(modelClass: Class): T { if (modelClass.isAssignableFrom(MainNavFragmentViewModelX::class.java)) { - return MainNavFragmentViewModelX(db, source) as T + return MainNavFragmentViewModelX(db, primarySource, secondarySource) as T } throw IllegalArgumentException("Unknown ViewModel class") }