diff --git a/README.md b/README.md index 36ffd34..634192f 100644 --- a/README.md +++ b/README.md @@ -166,6 +166,15 @@ fun updateFailed(e: Throwable) Effective within the `IMMEDIATE` update flow to report a critical update error. Within the immediate update flow this is considered critical and you may want to terminate application. +#### updateDownloadProgress (optional) +```kotlin +fun updateDownloadProgress(bytesLoaded: Long, bytesTotal: Long) +``` +Called in flexible flow to report that update download progress. You may display a progress bar or something. + + - bytesLoaded - number of bytes downloaded + - bytesTotal - total number of bytes to download + #### updateChecking (optional) ```kotlin fun updateChecking() diff --git a/appupdatewrapper/src/main/java/com/motorro/appupdatewrapper/AppUpdateView.kt b/appupdatewrapper/src/main/java/com/motorro/appupdatewrapper/AppUpdateView.kt index d1ec81f..2ccbdf1 100644 --- a/appupdatewrapper/src/main/java/com/motorro/appupdatewrapper/AppUpdateView.kt +++ b/appupdatewrapper/src/main/java/com/motorro/appupdatewrapper/AppUpdateView.kt @@ -55,6 +55,13 @@ interface AppUpdateView { */ fun updateDownloadStarts() = Unit + /** + * Called when update download progress changes + * @param bytesLoaded Bytes loaded + * @param bytesTotal Total bytes to load + */ + fun updateDownloadProgress(bytesLoaded: Long, bytesTotal: Long) = Unit + /** * Reports update is downloaded and ready to be installed * When ready to proceed call [AppUpdateState.userConfirmedUpdate] diff --git a/appupdatewrapper/src/main/java/com/motorro/appupdatewrapper/FlexibleUpdateState.kt b/appupdatewrapper/src/main/java/com/motorro/appupdatewrapper/FlexibleUpdateState.kt index 5953e99..28cff00 100644 --- a/appupdatewrapper/src/main/java/com/motorro/appupdatewrapper/FlexibleUpdateState.kt +++ b/appupdatewrapper/src/main/java/com/motorro/appupdatewrapper/FlexibleUpdateState.kt @@ -295,6 +295,12 @@ internal sealed class FlexibleUpdateState : AppUpdateState(), Tagged { markUserCancelTime() complete() } + DOWNLOADING -> withUpdateView { + updateDownloadProgress( + state.bytesDownloaded(), + state.totalBytesToDownload() + ) + } DOWNLOADED -> installConsent() INSTALLING -> completeUpdate() FAILED -> { diff --git a/appupdatewrapper/src/test/java/com/motorro/appupdatewrapper/FlexibleUpdateStateTest.kt b/appupdatewrapper/src/test/java/com/motorro/appupdatewrapper/FlexibleUpdateStateTest.kt index 167af6b..0efa3e4 100644 --- a/appupdatewrapper/src/test/java/com/motorro/appupdatewrapper/FlexibleUpdateStateTest.kt +++ b/appupdatewrapper/src/test/java/com/motorro/appupdatewrapper/FlexibleUpdateStateTest.kt @@ -24,7 +24,15 @@ import com.google.android.play.core.install.model.ActivityResult import com.google.android.play.core.install.model.AppUpdateType.FLEXIBLE import com.google.android.play.core.install.model.InstallStatus import com.google.android.play.core.install.model.UpdateAvailability -import com.nhaarman.mockitokotlin2.* +import com.nhaarman.mockitokotlin2.any +import com.nhaarman.mockitokotlin2.argumentCaptor +import com.nhaarman.mockitokotlin2.check +import com.nhaarman.mockitokotlin2.doReturn +import com.nhaarman.mockitokotlin2.mock +import com.nhaarman.mockitokotlin2.never +import com.nhaarman.mockitokotlin2.times +import com.nhaarman.mockitokotlin2.verify +import com.nhaarman.mockitokotlin2.whenever import org.junit.Test import org.junit.runner.RunWith import org.robolectric.Shadows.shadowOf @@ -261,6 +269,27 @@ internal class FlexibleUpdateStateTest: BaseAppUpdateStateTest() { shadowOf(getMainLooper()).idle() } + @Test + @LooperMode(LooperMode.Mode.PAUSED) + fun downloadingStateWillUpdateProgress() { + updateManager.setUpdateAvailable(100500) + updateManager.withInfo { + startUpdateFlowForResult(it, FLEXIBLE, activity, 100) + assertTrue(isConfirmationDialogVisible) + userAcceptsUpdate() + downloadStarts() + setTotalBytesToDownload(100) + + val state = FlexibleUpdateState.Downloading().init() + state.onResume() + shadowOf(getMainLooper()).idle() + + setBytesDownloaded(50) + verify(view).updateDownloadProgress(50, 100) + } + shadowOf(getMainLooper()).idle() + } + @Test @LooperMode(LooperMode.Mode.PAUSED) fun downloadingStateWillSetInstallConsentWhenDownloaded() {