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 f3140911..87ca3b5d 100644 --- a/src/main/kotlin/com/looker/droidify/ui/activities/MainActivityX.kt +++ b/src/main/kotlin/com/looker/droidify/ui/activities/MainActivityX.kt @@ -7,6 +7,7 @@ import android.view.* import android.view.inputmethod.InputMethodManager import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment @@ -72,15 +73,16 @@ class MainActivityX : AppCompatActivity() { currentTheme = Preferences[Preferences.Key.Theme].getResId(resources.configuration) setTheme(currentTheme) super.onCreate(savedInstanceState) - binding = ActivityMainXBinding.inflate(layoutInflater) + + setContentView(binding.root) binding.lifecycleOwner = this toolbar = binding.toolbar if (savedInstanceState == null && (intent.flags and Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) { handleIntent(intent) } - setContentView(binding.root) + WindowCompat.setDecorFitsSystemWindows(window, false) } override fun onStart() { @@ -90,7 +92,7 @@ class MainActivityX : AppCompatActivity() { toolbar.menu.setGroupDividerEnabled(true) } toolbar.isFocusableInTouchMode = true - binding.collapsingToolbar.title = getString(R.string.application_name) + toolbar.title = getString(R.string.application_name) val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragment_content) as NavHostFragment diff --git a/src/main/kotlin/com/looker/droidify/ui/fragments/BaseNavFragment.kt b/src/main/kotlin/com/looker/droidify/ui/fragments/BaseNavFragment.kt index f0edab8e..f79aa6f3 100644 --- a/src/main/kotlin/com/looker/droidify/ui/fragments/BaseNavFragment.kt +++ b/src/main/kotlin/com/looker/droidify/ui/fragments/BaseNavFragment.kt @@ -3,14 +3,17 @@ package com.looker.droidify.ui.fragments import android.os.Bundle import android.view.View import androidx.fragment.app.Fragment +import androidx.lifecycle.lifecycleScope abstract class BaseNavFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - setupAdapters() - setupLayout() + lifecycleScope.launchWhenCreated { + setupAdapters() + setupLayout() + } } - abstract fun setupAdapters() - abstract fun setupLayout() + abstract suspend fun setupAdapters() + abstract suspend fun setupLayout() } \ No newline at end of file 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 13c88525..5b64fc3b 100644 --- a/src/main/kotlin/com/looker/droidify/ui/fragments/ExploreFragment.kt +++ b/src/main/kotlin/com/looker/droidify/ui/fragments/ExploreFragment.kt @@ -15,6 +15,7 @@ import com.mikepenz.fastadapter.FastAdapter import com.mikepenz.fastadapter.paged.PagedModelAdapter import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.flow.collectLatest // TODO create categories layouts that hold the apps in horizontal layout class ExploreFragment : MainNavFragmentX() { @@ -44,11 +45,11 @@ class ExploreFragment : MainNavFragmentX() { .observeOn(Schedulers.io()) .flatMapSingle { list -> RxUtils.querySingle { list.mapNotNull { it.trueData } } } .map { list -> list.asSequence().map { Pair(it.id, it) }.toMap() } - .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(AndroidSchedulers.mainThread()) .subscribe { repositories = it } } - override fun setupAdapters() { + override suspend fun setupAdapters() { appsItemAdapter = PagedModelAdapter(PRODUCT_ASYNC_DIFFER_CONFIG) { it.data_item?.let { item -> VAppItem(item, repositories[it.repository_id]) } } @@ -61,8 +62,8 @@ class ExploreFragment : MainNavFragmentX() { } } - override fun setupLayout() { - viewModel.productsList.observe(requireActivity()) { + override suspend fun setupLayout() { + viewModel.productsList.collectLatest { 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 b5d8187a..c0a9ef93 100644 --- a/src/main/kotlin/com/looker/droidify/ui/fragments/InstalledFragment.kt +++ b/src/main/kotlin/com/looker/droidify/ui/fragments/InstalledFragment.kt @@ -17,6 +17,7 @@ import com.mikepenz.fastadapter.FastAdapter import com.mikepenz.fastadapter.paged.PagedModelAdapter import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.flow.collectLatest class InstalledFragment : MainNavFragmentX() { @@ -52,7 +53,7 @@ class InstalledFragment : MainNavFragmentX() { .subscribe { repositories = it } } - override fun setupAdapters() { + override suspend fun setupAdapters() { installedItemAdapter = PagedModelAdapter(PRODUCT_ASYNC_DIFFER_CONFIG) { it.data_item?.let { item -> VAppItem(item, repositories[it.repository_id]) } } @@ -74,14 +75,14 @@ class InstalledFragment : MainNavFragmentX() { } } - override fun setupLayout() { + override suspend fun setupLayout() { binding.buttonUpdated.setOnClickListener { binding.updatedRecycler.apply { visibility = if (visibility == View.VISIBLE) View.GONE else View.VISIBLE } } - viewModel.productsList.observe(requireActivity()) { + viewModel.productsList.collectLatest { binding.updatedBar.visibility = if (it.any { item -> item.data_item?.canUpdate == true }) 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..f1516a93 100644 --- a/src/main/kotlin/com/looker/droidify/ui/fragments/LatestFragment.kt +++ b/src/main/kotlin/com/looker/droidify/ui/fragments/LatestFragment.kt @@ -17,6 +17,7 @@ import com.mikepenz.fastadapter.FastAdapter import com.mikepenz.fastadapter.paged.PagedModelAdapter import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.flow.collectLatest class LatestFragment : MainNavFragmentX() { @@ -53,7 +54,7 @@ class LatestFragment : MainNavFragmentX() { .subscribe { repositories = it } } - override fun setupAdapters() { + override suspend fun setupAdapters() { updatedItemAdapter = PagedModelAdapter(PRODUCT_ASYNC_DIFFER_CONFIG) { it.data_item?.let { item -> VAppItem(item, repositories[it.repository_id]) } } @@ -75,8 +76,8 @@ class LatestFragment : MainNavFragmentX() { } } - override fun setupLayout() { - viewModel.productsList.observe(requireActivity()) { + override suspend fun setupLayout() { + viewModel.productsList.collectLatest { newItemAdapter.submitList(it) updatedItemAdapter.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 8bf3406e..0e86acfb 100644 --- a/src/main/kotlin/com/looker/droidify/ui/fragments/MainNavFragmentX.kt +++ b/src/main/kotlin/com/looker/droidify/ui/fragments/MainNavFragmentX.kt @@ -6,7 +6,7 @@ import com.looker.droidify.ui.activities.MainActivityX import com.looker.droidify.ui.viewmodels.MainNavFragmentViewModelX abstract class MainNavFragmentX : BaseNavFragment() { - val mainActivityX: MainActivityX + private val mainActivityX: MainActivityX get() = requireActivity() as MainActivityX val viewModel: MainNavFragmentViewModelX by viewModels { MainNavFragmentViewModelX.Factory(mainActivityX.db, source) diff --git a/src/main/kotlin/com/looker/droidify/ui/fragments/PrefsRepositoriesFragment.kt b/src/main/kotlin/com/looker/droidify/ui/fragments/PrefsRepositoriesFragment.kt index 6a3b6d7d..77dc0f4a 100644 --- a/src/main/kotlin/com/looker/droidify/ui/fragments/PrefsRepositoriesFragment.kt +++ b/src/main/kotlin/com/looker/droidify/ui/fragments/PrefsRepositoriesFragment.kt @@ -40,7 +40,7 @@ class PrefsRepositoriesFragment : BaseNavFragment() { return binding.root } - override fun setupAdapters() { + override suspend fun setupAdapters() { syncConnection.bind(requireContext()) reposFastAdapter = FastAdapter.with(reposItemAdapter) @@ -52,7 +52,7 @@ class PrefsRepositoriesFragment : BaseNavFragment() { } } - override fun setupLayout() { + override suspend fun setupLayout() { viewModel.productsList.observe(requireActivity()) { reposItemAdapter.set( it.mapNotNull { dbRepo -> 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 498c3d92..6c397c62 100644 --- a/src/main/kotlin/com/looker/droidify/ui/viewmodels/MainNavFragmentViewModelX.kt +++ b/src/main/kotlin/com/looker/droidify/ui/viewmodels/MainNavFragmentViewModelX.kt @@ -1,8 +1,8 @@ package com.looker.droidify.ui.viewmodels -import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.asFlow import androidx.lifecycle.viewModelScope import androidx.paging.DataSource import androidx.paging.LivePagedListBuilder @@ -14,10 +14,7 @@ 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.MutableStateFlow -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -92,7 +89,7 @@ class MainNavFragmentViewModelX(val db: DatabaseX, source: Source) : ViewModel() .build() } val request = request(source) - val productsList: LiveData> by lazy { + val productsList: Flow> by lazy { LivePagedListBuilder( db.productDao.queryList( installed = request.installed, @@ -102,7 +99,7 @@ class MainNavFragmentViewModelX(val db: DatabaseX, source: Source) : ViewModel() order = request.order, numberOfItems = request.numberOfItems ), pagedListConfig - ).build() + ).build().asFlow() } fun fillList(source: Source) {