From f5d5fc130593436e3c85e9d936551cf9034cbe86 Mon Sep 17 00:00:00 2001 From: Rahul Patel Date: Fri, 12 Jul 2024 16:37:02 +0530 Subject: [PATCH] AppDetails: Show ongoing installation --- .../com/aurora/store/data/event/BusEvent.kt | 5 +++ .../store/data/installer/SessionInstaller.kt | 21 ++++++++-- .../aurora/store/data/model/Enumerations.kt | 3 +- .../custom/layouts/button/ActionButton.kt | 13 ++++--- .../view/ui/details/AppDetailsFragment.kt | 39 +++++++++++++------ 5 files changed, 59 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/aurora/store/data/event/BusEvent.kt b/app/src/main/java/com/aurora/store/data/event/BusEvent.kt index d512f4211..13e79485f 100644 --- a/app/src/main/java/com/aurora/store/data/event/BusEvent.kt +++ b/app/src/main/java/com/aurora/store/data/event/BusEvent.kt @@ -55,6 +55,11 @@ sealed class InstallerEvent: Event() { var extra: String? = "" ) : InstallerEvent() + data class Installing( + var packageName: String? = "", + var progress: Int = 0 + ) : InstallerEvent() + data class Cancelled( var packageName: String? = "", var extra: String? = "" diff --git a/app/src/main/java/com/aurora/store/data/installer/SessionInstaller.kt b/app/src/main/java/com/aurora/store/data/installer/SessionInstaller.kt index 26f2ec344..d95976f15 100644 --- a/app/src/main/java/com/aurora/store/data/installer/SessionInstaller.kt +++ b/app/src/main/java/com/aurora/store/data/installer/SessionInstaller.kt @@ -36,7 +36,9 @@ import com.aurora.extensions.isSAndAbove import com.aurora.extensions.isTAndAbove import com.aurora.extensions.isUAndAbove import com.aurora.extensions.runOnUiThread +import com.aurora.store.AuroraApp import com.aurora.store.R +import com.aurora.store.data.event.InstallerEvent import com.aurora.store.data.installer.AppInstaller.Companion.ACTION_INSTALL_STATUS import com.aurora.store.data.installer.AppInstaller.Companion.EXTRA_DISPLAY_NAME import com.aurora.store.data.installer.AppInstaller.Companion.EXTRA_PACKAGE_NAME @@ -70,7 +72,21 @@ class SessionInstaller @Inject constructor( override fun onActiveChanged(sessionId: Int, active: Boolean) {} - override fun onProgressChanged(sessionId: Int, progress: Float) {} + override fun onProgressChanged(sessionId: Int, progress: Float) { + val packageName = enqueuedSessions + .find { set -> set.any { it.sessionId == sessionId } } + ?.first() + ?.packageName + + if (packageName != null && progress > 0.0) { + AuroraApp.flowEvent.emitEvent( + InstallerEvent.Installing( + packageName = packageName, + progress = (progress * 100).toInt() + ) + ) + } + } override fun onFinished(sessionId: Int, success: Boolean) { enqueuedSessions.find { set -> set.any { it.sessionId == sessionId } } @@ -89,9 +105,6 @@ class SessionInstaller @Inject constructor( enqueuedSessions.firstOrNull()?.let { sessionSet -> commitInstall(sessionSet.first()) } - } else { - // Nothing else in queue, unregister callback - packageInstaller.unregisterSessionCallback(this) } } } diff --git a/app/src/main/java/com/aurora/store/data/model/Enumerations.kt b/app/src/main/java/com/aurora/store/data/model/Enumerations.kt index 0c12e432b..9cb35a6c4 100644 --- a/app/src/main/java/com/aurora/store/data/model/Enumerations.kt +++ b/app/src/main/java/com/aurora/store/data/model/Enumerations.kt @@ -29,5 +29,6 @@ enum class State { QUEUED, PROGRESS, COMPLETE, - CANCELED + CANCELED, + INSTALLING, } diff --git a/app/src/main/java/com/aurora/store/view/custom/layouts/button/ActionButton.kt b/app/src/main/java/com/aurora/store/view/custom/layouts/button/ActionButton.kt index f00394091..b9263fd41 100644 --- a/app/src/main/java/com/aurora/store/view/custom/layouts/button/ActionButton.kt +++ b/app/src/main/java/com/aurora/store/view/custom/layouts/button/ActionButton.kt @@ -25,7 +25,6 @@ import android.util.AttributeSet import android.widget.RelativeLayout import androidx.core.content.ContextCompat import com.aurora.extensions.getString -import com.aurora.extensions.runOnUiThread import com.aurora.store.R import com.aurora.store.data.model.State import com.aurora.store.databinding.ViewActionButtonBinding @@ -101,19 +100,21 @@ class ActionButton : RelativeLayout { binding.btn.text = getString(text) } + fun setButtonState(enabled: Boolean = true) { + binding.btn.isEnabled = enabled + } + fun updateState(state: State) { val displayChild = when (state) { - State.IDLE -> 0 State.PROGRESS -> 1 State.COMPLETE -> 2 else -> 0 } if (binding.viewFlipper.displayedChild != displayChild) { - runOnUiThread { - binding.viewFlipper.displayedChild = displayChild - if (displayChild == 2) updateState(State.IDLE) - } + binding.viewFlipper.displayedChild = displayChild + + if (displayChild == 2) updateState(State.IDLE) } } diff --git a/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt b/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt index 53eccf6bb..1d3b2cc3f 100644 --- a/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt @@ -55,8 +55,8 @@ import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.Review import com.aurora.gplayapi.data.models.StreamBundle import com.aurora.gplayapi.data.models.StreamCluster -import com.aurora.store.AuroraApp import com.aurora.store.AppStreamStash +import com.aurora.store.AuroraApp import com.aurora.store.R import com.aurora.store.data.event.BusEvent import com.aurora.store.data.event.Event @@ -69,6 +69,7 @@ import com.aurora.store.data.model.ViewState.Loading.getDataAs import com.aurora.store.data.providers.AuthProvider import com.aurora.store.databinding.FragmentDetailsBinding import com.aurora.store.util.CommonUtil +import com.aurora.store.util.Log import com.aurora.store.util.PackageUtil import com.aurora.store.util.PathUtil import com.aurora.store.util.Preferences @@ -166,14 +167,23 @@ class AppDetailsFragment : BaseFragment() { } is InstallerEvent.Failed -> { - findNavController().navigate( - AppDetailsFragmentDirections.actionAppDetailsFragmentToInstallErrorDialogSheet( - app, - event.packageName ?: "", - event.error ?: "", - event.extra ?: "" + if (app.packageName == event.packageName) { + findNavController().navigate( + AppDetailsFragmentDirections.actionAppDetailsFragmentToInstallErrorDialogSheet( + app, + event.packageName ?: "", + event.error ?: "", + event.extra ?: "" + ) ) - ) + } + } + + is InstallerEvent.Installing -> { + if (event.packageName == app.packageName) { + attachActions() + updateActionState(State.INSTALLING) + } } else -> { @@ -507,7 +517,15 @@ class AppDetailsFragment : BaseFragment() { } private fun updateActionState(state: State) { - binding.layoutDetailsInstall.btnDownload.updateState(state) + runOnUiThread { + binding.layoutDetailsInstall.btnDownload.apply { + updateState(state) + if (state == State.INSTALLING) { + setButtonState(false) + setText(R.string.action_installing) + } + } + } } private fun openApp() { @@ -589,9 +607,8 @@ class AppDetailsFragment : BaseFragment() { app.isInstalled = PackageUtil.isInstalled(requireContext(), app.packageName) runOnUiThread { - app.isInstalled = PackageUtil.isInstalled(requireContext(), app.packageName) - binding.layoutDetailsInstall.btnDownload.let { btn -> + btn.setButtonState(true) if (app.isInstalled) { isUpdatable = PackageUtil.isUpdatable( requireContext(),