diff --git a/app/src/main/java/com/aurora/store/view/ui/updates/UpdatesFragment.kt b/app/src/main/java/com/aurora/store/view/ui/updates/UpdatesFragment.kt index fc888ed34..e9466b741 100644 --- a/app/src/main/java/com/aurora/store/view/ui/updates/UpdatesFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/updates/UpdatesFragment.kt @@ -26,7 +26,7 @@ import android.os.Environment import android.view.View import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.ContextCompat -import androidx.fragment.app.viewModels +import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import com.aurora.Constants @@ -61,7 +61,7 @@ class UpdatesFragment : BaseFragment(R.layout.fragment_updates) { private var _binding: FragmentUpdatesBinding? = null private val binding get() = _binding!! - private val viewModel: UpdatesViewModel by viewModels() + private val viewModel: UpdatesViewModel by activityViewModels() private val startForStorageManagerResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { @@ -71,6 +71,7 @@ class UpdatesFragment : BaseFragment(R.layout.fragment_updates) { toast(R.string.permissions_denied) } } + private val startForPermissions = registerForActivityResult(ActivityResultContracts.RequestPermission()) { perm -> if (perm) viewModel.download(app) else toast(R.string.permissions_denied) @@ -86,6 +87,7 @@ class UpdatesFragment : BaseFragment(R.layout.fragment_updates) { R.id.menu_download_manager -> { findNavController().navigate(R.id.downloadFragment) } + R.id.menu_more -> { findNavController().navigate( MobileNavigationDirections.actionGlobalMoreDialogFragment() @@ -140,11 +142,9 @@ class UpdatesFragment : BaseFragment(R.layout.fragment_updates) { } binding.swipeRefreshLayout.setOnRefreshListener { - viewModel.observe() + viewModel.observe(true) } - updateController(null) - viewLifecycleOwner.lifecycleScope.launch { AuroraApp.flowEvent.busEvent.collect { onEvent(it) } } @@ -158,7 +158,7 @@ class UpdatesFragment : BaseFragment(R.layout.fragment_updates) { private fun onEvent(event: BusEvent) { when (event) { is BusEvent.InstallEvent, is BusEvent.UninstallEvent -> { - viewModel.observe() + viewModel.observe(true) } else -> {} diff --git a/app/src/main/java/com/aurora/store/viewmodel/all/UpdatesViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/all/UpdatesViewModel.kt index 8a440ce15..86ad97359 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/all/UpdatesViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/all/UpdatesViewModel.kt @@ -32,12 +32,14 @@ import com.aurora.store.util.Preferences import com.google.gson.Gson import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext -import java.util.Locale -import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch +import java.util.Locale +import javax.inject.Inject @HiltViewModel @SuppressLint("StaticFieldLeak") // false positive, see https://github.com/google/dagger/issues/3253 @@ -47,28 +49,38 @@ class UpdatesViewModel @Inject constructor( private val downloadWorkerUtil: DownloadWorkerUtil, private val authProvider: AuthProvider ) : ViewModel() { - private val TAG = UpdatesViewModel::class.java.simpleName var updateAllEnqueued: Boolean = false - private val _updates = MutableSharedFlow?>() - val updates = _updates.asSharedFlow() + private val _updates = MutableStateFlow?>(null) + val updates = _updates.asStateFlow() + + val stash: MutableList = mutableListOf() val downloadsList get() = downloadWorkerUtil.downloadsList - fun observe() { + fun observe(forceRefresh: Boolean = false) { viewModelScope.launch(Dispatchers.IO) { + if (stash.isNotEmpty() && !forceRefresh) { + _updates.emit(stash) + } + try { val isExtendedUpdateEnabled = Preferences.getBoolean( context, Preferences.PREFERENCE_UPDATES_EXTENDED ) + val updates = AppUtil.getUpdatableApps( context, authProvider.authData, gson, !isExtendedUpdateEnabled ).sortedBy { it.displayName.lowercase(Locale.getDefault()) } + + stash.clear() + stash.addAll(updates) + _updates.emit(updates) } catch (exception: Exception) { Log.d(TAG, "Failed to get updates", exception)