🎯 Główna Idea
AppUpdate upraszcza implementację In-App Updates z Google Play Core Library. Zamiast ręcznie zarządzać AppUpdateManager, wystarczy kilka prostych wywołań.
📝 Podstawowe użycie
// Sprawdź dostępność aktualizacji
ADict.AppUpdate.check { info ->
if (info.isUpdateAvailable) {
println("Dostępna wersja: ${info.availableVersionCode}")
println("Priorytet: ${info.updatePriority}")
if (info.isFlexibleUpdateAllowed) {
ADict.AppUpdate.startFlexibleUpdate(activity)
}
}
}
🔄 Flexible Update
Użytkownik może kontynuować korzystanie z aplikacji podczas pobierania:
// Rozpocznij flexible update
ADict.AppUpdate.startFlexibleUpdate(activity) { result ->
when (result) {
is AppUpdate.UpdateResult.UpdateStarted -> {
showSnackbar("Pobieranie aktualizacji...")
}
is AppUpdate.UpdateResult.UserDeclined -> {
// Użytkownik odmówił
}
is AppUpdate.UpdateResult.Error -> {
showError(result.exception)
}
}
}
// Callback gdy update pobrany
ADict.AppUpdate.onUpdateDownloaded {
showSnackbar("Aktualizacja gotowa. Uruchom ponownie?") {
ADict.AppUpdate.completeUpdate()
}
}
// Sprawdź czy gotowy do instalacji
if (ADict.AppUpdate.isUpdateReadyToInstall()) {
ADict.AppUpdate.completeUpdate()
}
⚡ Immediate Update
Wymusza natychmiastową aktualizację (blokuje UI):
// Immediate update - użytkownik MUSI zaktualizować
ADict.AppUpdate.startImmediateUpdate(activity) { result ->
when (result) {
is AppUpdate.UpdateResult.UpdateStarted -> {
// UI jest zablokowane, update się instaluje
}
is AppUpdate.UpdateResult.Error -> {
// Błąd - może zamknąć aplikację
finish()
}
}
}
🤖 Automatyczne sprawdzanie z polityką
// W onCreate MainActivity
ADict.AppUpdate.checkAndPrompt(
activity = this,
minPriority = 3, // Tylko update'y o priorytecie >= 3
staleDaysForImmediate = 7 // Po 7 dniach wymuś immediate
) { result ->
when (result) {
is AppUpdate.UpdateResult.UpdateStarted -> {
// Update rozpoczęty (flexible lub immediate)
}
is AppUpdate.UpdateResult.NoUpdate -> {
// Brak aktualizacji lub poniżej minPriority
}
is AppUpdate.UpdateResult.Error -> {
Log.e("Update", "Błąd: ${result.exception}")
}
}
}
📊 Obserwowanie postępu
// Flow ze stanem instalacji
lifecycleScope.launch {
ADict.AppUpdate.installState.collect { state ->
when (state) {
is AppUpdate.UpdateInstallState.Pending -> {
showStatus("Oczekiwanie...")
}
is AppUpdate.UpdateInstallState.Downloading -> {
val percent = (state.progress * 100).toInt()
progressBar.progress = percent
showStatus("Pobieranie: $percent%")
}
is AppUpdate.UpdateInstallState.Downloaded -> {
showRestartButton()
}
is AppUpdate.UpdateInstallState.Installing -> {
showStatus("Instalowanie...")
}
is AppUpdate.UpdateInstallState.Installed -> {
hideUpdateUI()
}
is AppUpdate.UpdateInstallState.Failed -> {
showError("Błąd: ${state.errorCode}")
}
}
}
}
🔁 Wznawianie update'u
// W onResume - wznów przerwany update
override fun onResume() {
super.onResume()
ADict.AppUpdate.resumeUpdate(this)
}
// Cleanup w onDestroy
override fun onDestroy() {
super.onDestroy()
ADict.AppUpdate.cleanup()
}