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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions