Skip to content

InstallStateUpdateListener не срабатывает, если установочный файл был скачен ранее #1

@veygard

Description

@veygard

Версия rustore-bom = “2025.02.01”.
AppUpdateType.FLEXIBLE

В README.MD указано, что установкy обновления(completeUpdate) нужно делать после того как скачали обновление (т.е. когда от InstallStateUpdateListener получаем InstallStatus.DOWNLOADED)

При непрерывном сценарии все работает хорошо:
InstallStatus: Pending->DOWNLOADING->DOWNLOADED -> вызвали completeUpdate()
Логи:

2025-06-24 14:06:30.048 29826-29826 testing_update       usap64                               D  startUpdateFlow addOnSuccessListener: -1 (false)
2025-06-24 14:06:30.048 29826-29826 testing_update       usap64                               D  Activity.RESULT_OK -> {
2025-06-24 14:06:30.160 29826-29826 testing_update       usap64                               D  Update pending...
2025-06-24 14:06:30.194 29826-29826 testing_update       usap64                               D  Download progress: 0/54463185 bytes
2025-06-24 14:06:32.313 29826-29826 testing_update       usap64                               D  Download progress: 933582/54463185 bytes
2025-06-24 14:06:33.328 29826-29826 testing_update       usap64                               D  Download progress: 7897088/54463185 bytes
2025-06-24 14:06:34.336 29826-29826 testing_update       usap64                               D  Download progress: 16039738/54463185 bytes
2025-06-24 14:06:35.322 29826-29826 testing_update       usap64                               D  Download progress: 24002542/54463185 bytes
2025-06-24 14:06:36.341 29826-29826 testing_update       usap64                               D  Download progress: 32276372/54463185 bytes
2025-06-24 14:06:37.329 29826-29826 testing_update       usap64                               D  Download progress: 40320934/54463185 bytes
2025-06-24 14:06:38.317 29826-29826 testing_update       usap64                               D  Download progress: 48365460/54463185 bytes
2025-06-24 14:06:39.156 29826-29826 testing_update       usap64                               D  InstallStatus.DOWNLOADED
2025-06-24 14:06:39.156 29826-29826 testing_update       usap64                               D  completeUpdate started

Но, если приложение закрыли при скачивании обновления, и открыли приложение заново, когда установочный файл уже скачен, то после клика по “Обновить” в диалоге, срабатывает только add у startUpdateFlow (с Activity.RESULT_OK), а InstallStateUpdateListener нет.
Логи:

2025-06-24 14:13:16.485  5389-5389  testing_update       usap64                               D  startUpdateFlow addOnSuccessListener: -1 (false)
2025-06-24 14:13:16.485  5389-5389  testing_update       usap64                               D  Activity.RESULT_OK -> {

Так как InstallStateUpdateListener и InstallStatus.DOWNLOADED не срабатывает, то нет понимания когда вызывать completeUpdate()

Ожидаемое поведение, когда установочный файл был уже скачен ранее:
InstallStateUpdateListener присылает сразу “InstallStatus.DOWNLOADED”.

Код для startUpdateFlow:

    private fun startUpdateFlow(appUpdateInfo: AppUpdateInfo, appUpdateType: Int) {

        try {

            ruStoreAppUpdateManager?.registerListener(createInstallListener())

            val appUpdateOptions = AppUpdateOptions.Builder()

                .appUpdateType(appUpdateType)

                .build()

            Log.d(TAG,"startUpdateFlow appUpdateType: $appUpdateType ")

            ruStoreAppUpdateManager?.startUpdateFlow(

                appUpdateInfo,

                appUpdateOptions,

            )?.addOnSuccessListener { resultCode ->

                Log.d(

                    TAG,

                    "startUpdateFlow addOnSuccessListener: $resultCode (${resultCode == Activity.RESULT_CANCELED})"

                )

                when (resultCode) {

                    Activity.RESULT_CANCELED -> {

                        updateListener?.onUpdateCancelled()

                    }

                    Activity.RESULT_OK -> {

                        Log.d(TAG, "Activity.RESULT_OK -> {")

/** Когда апк уже скачен и приложение снова открыли, то получаем RESULT_OK  , а InstallStateUpdateListener молчит */

                    }

                }

            }?.addOnFailureListener { error ->

                updateListener?.onUpdateFailed(error)

                Log.e(TAG, "Failed to start flexible update flow", error)

            }

        } catch (e: IntentSender.SendIntentException) {

            updateListener?.onUpdateFailed(e)

            Log.e(TAG, "Failed to start flexible update", e)

        }

    }

    private fun createInstallListener() = object : InstallStateUpdateListener {

        override fun onStateUpdated(state: InstallState) {

            installStateUpdateListenerInvoked = true

            when (state.installStatus) {

                InstallStatus.DOWNLOADING -> {

                    val bytesDownloaded = state.bytesDownloaded

                    val totalBytes = state.totalBytesToDownload

                    updateListener?.onDownloadProgress(bytesDownloaded, totalBytes)

                    Log.d(TAG, "Download progress: $bytesDownloaded/$totalBytes bytes")

                }

                InstallStatus.DOWNLOADED -> {

                    Log.d(TAG, "InstallStatus.DOWNLOADED")

                    updateListener?.onDownloadComplete()

                    completeUpdate(updateType)

                }

                InstallStatus.INSTALLING -> {

                    updateListener?.onStartInstalling()

                    Log.d(TAG, "Installing update...")

                }

                InstallStatus.FAILED -> {

                    updateListener?.onUpdateFailed(Exception("Installation failed"))

                    Log.e(TAG, "Update installation failed")

                }

                InstallStatus.UNKNOWN -> {

                    updateListener?.onUpdateCancelled()

                    Log.d(TAG, "Update cancelled by user")

                }

                InstallStatus.PENDING -> {

                    Log.d(TAG, "Update pending...")

                }

                else -> {

                    Log.d(TAG, "Unknown install status: ${state.installStatus}")

                }

            }

        }

    }

насколько я понимаю, я сам вызвать текущий статус InstallStateUpdateListener не могу, есть только onStateUpdated метод:

public fun interface InstallStateUpdateListener {    
  public abstract fun onStateUpdated(state: ru.rustore.sdk.appupdate.model.InstallState): kotlin.Unit
} 

И у RuStoreAppUpdateManager также нет метода получения метода для статуса скачивания:

public interface RuStoreAppUpdateManager {
    
    public abstract fun completeUpdate(appUpdateOptions: ru.rustore.sdk.appupdate.model.AppUpdateOptions): ru.rustore.sdk.core.tasks.Task<kotlin.Unit>
    
        public abstract fun getAppUpdateInfo(): ru.rustore.sdk.core.tasks.Task<ru.rustore.sdk.appupdate.model.AppUpdateInfo>
    
        public abstract fun registerListener(listener: ru.rustore.sdk.appupdate.listener.InstallStateUpdateListener): kotlin.Unit
    
        public abstract fun startUpdateFlow(appUpdateInfo: ru.rustore.sdk.appupdate.model.AppUpdateInfo, appUpdateOptions: ru.rustore.sdk.appupdate.model.AppUpdateOptions): ru.rustore.sdk.core.tasks.Task<kotlin.Int>
    
        public abstract fun unregisterListener(listener: ru.rustore.sdk.appupdate.listener.InstallStateUpdateListener): kotlin.Unit
    }
}

Т.е. если InstallStateUpdateListener не срабатывает, то я не могу узнать что апк обновления уже скачено.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions