AppDetails: Show ongoing installation

This commit is contained in:
Rahul Patel
2024-07-12 16:37:02 +05:30
parent e8032b1448
commit f5d5fc1305
5 changed files with 59 additions and 22 deletions

View File

@@ -55,6 +55,11 @@ sealed class InstallerEvent: Event() {
var extra: String? = "" var extra: String? = ""
) : InstallerEvent() ) : InstallerEvent()
data class Installing(
var packageName: String? = "",
var progress: Int = 0
) : InstallerEvent()
data class Cancelled( data class Cancelled(
var packageName: String? = "", var packageName: String? = "",
var extra: String? = "" var extra: String? = ""

View File

@@ -36,7 +36,9 @@ import com.aurora.extensions.isSAndAbove
import com.aurora.extensions.isTAndAbove import com.aurora.extensions.isTAndAbove
import com.aurora.extensions.isUAndAbove import com.aurora.extensions.isUAndAbove
import com.aurora.extensions.runOnUiThread import com.aurora.extensions.runOnUiThread
import com.aurora.store.AuroraApp
import com.aurora.store.R 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.ACTION_INSTALL_STATUS
import com.aurora.store.data.installer.AppInstaller.Companion.EXTRA_DISPLAY_NAME import com.aurora.store.data.installer.AppInstaller.Companion.EXTRA_DISPLAY_NAME
import com.aurora.store.data.installer.AppInstaller.Companion.EXTRA_PACKAGE_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 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) { override fun onFinished(sessionId: Int, success: Boolean) {
enqueuedSessions.find { set -> set.any { it.sessionId == sessionId } } enqueuedSessions.find { set -> set.any { it.sessionId == sessionId } }
@@ -89,9 +105,6 @@ class SessionInstaller @Inject constructor(
enqueuedSessions.firstOrNull()?.let { sessionSet -> enqueuedSessions.firstOrNull()?.let { sessionSet ->
commitInstall(sessionSet.first()) commitInstall(sessionSet.first())
} }
} else {
// Nothing else in queue, unregister callback
packageInstaller.unregisterSessionCallback(this)
} }
} }
} }

View File

@@ -29,5 +29,6 @@ enum class State {
QUEUED, QUEUED,
PROGRESS, PROGRESS,
COMPLETE, COMPLETE,
CANCELED CANCELED,
INSTALLING,
} }

View File

@@ -25,7 +25,6 @@ import android.util.AttributeSet
import android.widget.RelativeLayout import android.widget.RelativeLayout
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.aurora.extensions.getString import com.aurora.extensions.getString
import com.aurora.extensions.runOnUiThread
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.model.State import com.aurora.store.data.model.State
import com.aurora.store.databinding.ViewActionButtonBinding import com.aurora.store.databinding.ViewActionButtonBinding
@@ -101,19 +100,21 @@ class ActionButton : RelativeLayout {
binding.btn.text = getString(text) binding.btn.text = getString(text)
} }
fun setButtonState(enabled: Boolean = true) {
binding.btn.isEnabled = enabled
}
fun updateState(state: State) { fun updateState(state: State) {
val displayChild = when (state) { val displayChild = when (state) {
State.IDLE -> 0
State.PROGRESS -> 1 State.PROGRESS -> 1
State.COMPLETE -> 2 State.COMPLETE -> 2
else -> 0 else -> 0
} }
if (binding.viewFlipper.displayedChild != displayChild) { if (binding.viewFlipper.displayedChild != displayChild) {
runOnUiThread { binding.viewFlipper.displayedChild = displayChild
binding.viewFlipper.displayedChild = displayChild
if (displayChild == 2) updateState(State.IDLE) if (displayChild == 2) updateState(State.IDLE)
}
} }
} }

View File

@@ -55,8 +55,8 @@ import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.data.models.Review import com.aurora.gplayapi.data.models.Review
import com.aurora.gplayapi.data.models.StreamBundle import com.aurora.gplayapi.data.models.StreamBundle
import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.gplayapi.data.models.StreamCluster
import com.aurora.store.AuroraApp
import com.aurora.store.AppStreamStash import com.aurora.store.AppStreamStash
import com.aurora.store.AuroraApp
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.event.BusEvent import com.aurora.store.data.event.BusEvent
import com.aurora.store.data.event.Event 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.data.providers.AuthProvider
import com.aurora.store.databinding.FragmentDetailsBinding import com.aurora.store.databinding.FragmentDetailsBinding
import com.aurora.store.util.CommonUtil import com.aurora.store.util.CommonUtil
import com.aurora.store.util.Log
import com.aurora.store.util.PackageUtil import com.aurora.store.util.PackageUtil
import com.aurora.store.util.PathUtil import com.aurora.store.util.PathUtil
import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences
@@ -166,14 +167,23 @@ class AppDetailsFragment : BaseFragment<FragmentDetailsBinding>() {
} }
is InstallerEvent.Failed -> { is InstallerEvent.Failed -> {
findNavController().navigate( if (app.packageName == event.packageName) {
AppDetailsFragmentDirections.actionAppDetailsFragmentToInstallErrorDialogSheet( findNavController().navigate(
app, AppDetailsFragmentDirections.actionAppDetailsFragmentToInstallErrorDialogSheet(
event.packageName ?: "", app,
event.error ?: "", event.packageName ?: "",
event.extra ?: "" event.error ?: "",
event.extra ?: ""
)
) )
) }
}
is InstallerEvent.Installing -> {
if (event.packageName == app.packageName) {
attachActions()
updateActionState(State.INSTALLING)
}
} }
else -> { else -> {
@@ -507,7 +517,15 @@ class AppDetailsFragment : BaseFragment<FragmentDetailsBinding>() {
} }
private fun updateActionState(state: State) { 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() { private fun openApp() {
@@ -589,9 +607,8 @@ class AppDetailsFragment : BaseFragment<FragmentDetailsBinding>() {
app.isInstalled = PackageUtil.isInstalled(requireContext(), app.packageName) app.isInstalled = PackageUtil.isInstalled(requireContext(), app.packageName)
runOnUiThread { runOnUiThread {
app.isInstalled = PackageUtil.isInstalled(requireContext(), app.packageName)
binding.layoutDetailsInstall.btnDownload.let { btn -> binding.layoutDetailsInstall.btnDownload.let { btn ->
btn.setButtonState(true)
if (app.isInstalled) { if (app.isInstalled) {
isUpdatable = PackageUtil.isUpdatable( isUpdatable = PackageUtil.isUpdatable(
requireContext(), requireContext(),