🎯 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()
}