2022-06-30 06:02:26 -07:00
|
|
|
package co.electriccoin.zcash.ui.integration.test.screen.update.viewmodel
|
2022-05-16 04:40:50 -07:00
|
|
|
|
|
|
|
import android.app.Activity
|
|
|
|
import android.content.Context
|
|
|
|
import androidx.activity.ComponentActivity
|
2022-06-21 04:49:09 -07:00
|
|
|
import co.electriccoin.zcash.spackle.getPackageInfoCompat
|
|
|
|
import co.electriccoin.zcash.spackle.versionCodeCompat
|
2022-07-13 00:16:05 -07:00
|
|
|
import co.electriccoin.zcash.ui.fixture.UpdateInfoFixture
|
2022-05-16 04:40:50 -07:00
|
|
|
import co.electriccoin.zcash.ui.screen.update.AppUpdateChecker
|
|
|
|
import co.electriccoin.zcash.ui.screen.update.model.UpdateInfo
|
|
|
|
import co.electriccoin.zcash.ui.screen.update.model.UpdateState
|
|
|
|
import com.google.android.play.core.appupdate.AppUpdateInfo
|
|
|
|
import com.google.android.play.core.appupdate.testing.FakeAppUpdateManager
|
|
|
|
import com.google.android.play.core.install.model.AppUpdateType
|
|
|
|
import kotlinx.coroutines.channels.ProducerScope
|
|
|
|
import kotlinx.coroutines.channels.awaitClose
|
2022-11-14 12:56:06 -08:00
|
|
|
import kotlinx.coroutines.delay
|
2022-05-16 04:40:50 -07:00
|
|
|
import kotlinx.coroutines.flow.Flow
|
|
|
|
import kotlinx.coroutines.flow.callbackFlow
|
|
|
|
import kotlinx.coroutines.flow.flow
|
2022-11-14 12:56:06 -08:00
|
|
|
import kotlin.time.Duration.Companion.milliseconds
|
2022-05-16 04:40:50 -07:00
|
|
|
|
|
|
|
class AppUpdateCheckerMock private constructor() : AppUpdateChecker {
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
private const val DEFAULT_STALENESS_DAYS = 3
|
|
|
|
|
|
|
|
fun new() = AppUpdateCheckerMock()
|
|
|
|
|
|
|
|
// used mostly for tests
|
|
|
|
val resultUpdateInfo = UpdateInfoFixture.new(
|
|
|
|
appUpdateInfo = null,
|
|
|
|
state = UpdateState.Prepared,
|
|
|
|
priority = AppUpdateChecker.Priority.HIGH,
|
|
|
|
force = true
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
override val stalenessDays = DEFAULT_STALENESS_DAYS
|
|
|
|
|
|
|
|
override fun newCheckForUpdateAvailabilityFlow(
|
|
|
|
context: Context
|
|
|
|
): Flow<UpdateInfo> = callbackFlow {
|
|
|
|
val fakeAppUpdateManager = FakeAppUpdateManager(context.applicationContext).also {
|
|
|
|
it.setClientVersionStalenessDays(stalenessDays)
|
|
|
|
it.setUpdateAvailable(
|
2022-06-21 04:49:09 -07:00
|
|
|
context.packageManager.getPackageInfoCompat(context.packageName, 0L).versionCodeCompat.toInt(),
|
2022-05-16 04:40:50 -07:00
|
|
|
AppUpdateType.IMMEDIATE
|
|
|
|
)
|
|
|
|
it.setUpdatePriority(resultUpdateInfo.priority.priorityUpperBorder())
|
|
|
|
}
|
|
|
|
|
|
|
|
val appUpdateInfoTask = fakeAppUpdateManager.appUpdateInfo
|
|
|
|
|
2022-11-14 12:56:06 -08:00
|
|
|
// to simulate a real-world situation
|
|
|
|
delay(100.milliseconds)
|
|
|
|
|
2022-05-16 04:40:50 -07:00
|
|
|
appUpdateInfoTask.addOnCompleteListener { infoTask ->
|
|
|
|
emitResult(this, infoTask.result)
|
|
|
|
}
|
|
|
|
|
|
|
|
awaitClose {
|
|
|
|
// No resources to release
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun emitResult(producerScope: ProducerScope<UpdateInfo>, info: AppUpdateInfo) {
|
|
|
|
producerScope.trySend(
|
|
|
|
UpdateInfoFixture.new(
|
|
|
|
getPriority(info.updatePriority()),
|
|
|
|
isHighPriority(info.updatePriority()),
|
|
|
|
info,
|
|
|
|
resultUpdateInfo.state
|
|
|
|
)
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun newStartUpdateFlow(
|
|
|
|
activity: ComponentActivity,
|
|
|
|
appUpdateInfo: AppUpdateInfo
|
|
|
|
): Flow<Int> = flow {
|
2022-11-14 12:56:06 -08:00
|
|
|
// to simulate a real-world situation
|
|
|
|
delay(100.milliseconds)
|
2022-05-16 04:40:50 -07:00
|
|
|
emit(Activity.RESULT_OK)
|
|
|
|
}
|
|
|
|
}
|