Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: in app updates #47

Merged
merged 1 commit into from
Jun 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.jobik.shkiper.screens.advancedSettings

import android.app.Activity
import android.content.Context
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.heightIn
Expand All @@ -17,11 +16,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.google.android.play.core.appupdate.AppUpdateManagerFactory
import com.google.android.play.core.appupdate.AppUpdateOptions
import com.google.android.play.core.install.model.AppUpdateType
import com.google.android.play.core.install.model.UpdateAvailability
import com.jobik.shkiper.R
import com.jobik.shkiper.services.inAppUpdates.InAppUpdate
import com.jobik.shkiper.ui.components.buttons.CustomSwitch
import com.jobik.shkiper.ui.components.cards.SettingsItem
import com.jobik.shkiper.ui.components.cards.SettingsItemColors
Expand Down Expand Up @@ -55,29 +51,7 @@ private fun CheckUpdates() {
LaunchedEffect(checkUpdate.value) {
if (checkUpdate.value) {
if (context.isInstalledFromPlayStore()) {
val appUpdateManager = AppUpdateManagerFactory.create(context)

val appUpdateInfoTask = appUpdateManager.appUpdateInfo

appUpdateInfoTask.addOnSuccessListener { appUpdateInfo ->
println(appUpdateInfo)
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE) {
appUpdateManager.startUpdateFlow(
appUpdateInfo,
context as Activity,
AppUpdateOptions.defaultOptions(AppUpdateType.FLEXIBLE)
)
} else {
scope.launch {
SnackbarHostUtil.snackbarHostState.showSnackbar(
SnackbarVisualsCustom(
message = context.getString(R.string.latest_version_installed),
icon = Icons.Outlined.CheckCircle
)
)
}
}
}
InAppUpdate(context = context, scope = scope).checkUpdate()
} else {
scope.launch {
SnackbarHostUtil.snackbarHostState.showSnackbar(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ import android.app.Activity
import android.content.Context
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.IntentSenderRequest
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.CheckCircle
import androidx.compose.material3.SnackbarDuration
import com.google.android.play.core.appupdate.AppUpdateInfo
import com.google.android.play.core.appupdate.AppUpdateManager
import com.google.android.play.core.appupdate.AppUpdateManagerFactory
import com.google.android.play.core.appupdate.AppUpdateOptions
Expand All @@ -18,6 +21,7 @@ import com.jobik.shkiper.R
import com.jobik.shkiper.SharedPreferencesKeys
import com.jobik.shkiper.util.SnackbarHostUtil
import com.jobik.shkiper.util.SnackbarVisualsCustom
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
Expand Down Expand Up @@ -103,4 +107,71 @@ class InAppUpdatesService(val activity: Activity) {
val isUpdatedChecked: Boolean
get() = _isUpdatedChecked
}
}
}

class InAppUpdate(val context: Context, val scope: CoroutineScope) {
private val appUpdateManager = AppUpdateManagerFactory.create(context)
val appUpdateInfoTask = appUpdateManager.appUpdateInfo

private val listener = InstallStateUpdatedListener { state ->
if (state.installStatus() == InstallStatus.DOWNLOADED) {
scope.launch {
// After the update is downloaded, show a notification
// and request user confirmation to restart the app.
showUpdateSnackbar { unregisterUpdateStatusListener() }
}
}
}

private fun unregisterUpdateStatusListener() {
appUpdateManager.unregisterListener(listener)
}

private fun registerUpdateStatusListener() {
appUpdateManager.registerListener(listener)
}

fun checkUpdate() {
appUpdateInfoTask.addOnSuccessListener { appUpdateInfo ->
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE) {
startUpdate(appUpdateInfo)
registerUpdateStatusListener()
} else {
showLatestUpdateInstalledSnackbar()
}
}
}

private fun startUpdate(appUpdateInfo: AppUpdateInfo) {
appUpdateManager.startUpdateFlow(
appUpdateInfo,
context as Activity,
AppUpdateOptions.defaultOptions(AppUpdateType.FLEXIBLE)
)
}

private fun showLatestUpdateInstalledSnackbar() {
scope.launch {
SnackbarHostUtil.snackbarHostState.showSnackbar(
SnackbarVisualsCustom(
message = context.getString(R.string.latest_version_installed),
icon = Icons.Outlined.CheckCircle
)
)
}
}

private suspend fun showUpdateSnackbar(doAfter: () -> Unit) {
SnackbarHostUtil.snackbarHostState.showSnackbar(
SnackbarVisualsCustom(
message = context.getString(R.string.UpdateDownloaded),
actionLabel = context.getString(R.string.Restart),
duration = SnackbarDuration.Indefinite,
action = {
appUpdateManager.completeUpdate()
doAfter()
}
)
)
}
}