From 33e2d4e2e2815ffe73de76f0688af58eaffbb63f Mon Sep 17 00:00:00 2001 From: levy Date: Sun, 8 Feb 2026 11:27:27 +0300 Subject: [PATCH 1/2] Set up your development environment for update --- app/build.gradle | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 6827286..21d8d92 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -216,5 +216,12 @@ dependencies { annotationProcessor 'androidx.room:room-compiler:2.6.1' // For Java projects, replace with the correct version ksp 'androidx.room:room-compiler:2.6.1' + // This dependency is downloaded from the Google's Maven repository. + // So, make sure you also include that repository in your project's build.gradle file. + implementation("com.google.android.play:app-update:2.1.0") + + // For Kotlin users also import the Kotlin extensions library for Play In-App Update: + implementation("com.google.android.play:app-update-ktx:2.1.0") + implementation(platform("org.jetbrains.kotlin:kotlin-bom:2.1.21")) } From 4c0270b1a6c0ce10199fe81a069e4edd5e44cae5 Mon Sep 17 00:00:00 2001 From: levy Date: Mon, 9 Feb 2026 12:47:59 +0300 Subject: [PATCH 2/2] show in app update if available --- .../org/cis_india/wsreader/MainActivity.kt | 80 ++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/cis_india/wsreader/MainActivity.kt b/app/src/main/java/org/cis_india/wsreader/MainActivity.kt index ce80162..7bd26d6 100644 --- a/app/src/main/java/org/cis_india/wsreader/MainActivity.kt +++ b/app/src/main/java/org/cis_india/wsreader/MainActivity.kt @@ -17,8 +17,11 @@ package org.cis_india.wsreader import android.os.Bundle +import android.widget.Toast import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.MaterialTheme @@ -35,16 +38,29 @@ import org.cis_india.wsreader.ui.theme.AdjustEdgeToEdge import org.cis_india.wsreader.ui.theme.WikisourceReaderTheme import dagger.hilt.android.AndroidEntryPoint import androidx.navigation.NavController +import com.google.android.play.core.appupdate.AppUpdateManager +import com.google.android.play.core.appupdate.AppUpdateManagerFactory +import com.google.android.play.core.appupdate.AppUpdateOptions +import com.google.android.play.core.install.InstallStateUpdatedListener +import com.google.android.play.core.install.model.AppUpdateType +import com.google.android.play.core.install.model.InstallStatus +import com.google.android.play.core.install.model.UpdateAvailability @AndroidEntryPoint class MainActivity : AppCompatActivity() { - + private lateinit var appUpdateManager: AppUpdateManager private lateinit var networkObserver: NetworkObserver lateinit var settingsViewModel: SettingsViewModel private lateinit var mainViewModel: MainViewModel private lateinit var navController: NavController + private val installStateUpdatedListener = InstallStateUpdatedListener { state -> + if (state.installStatus() == InstallStatus.DOWNLOADED) { + popupSnackbarForCompleteUpdate() + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -59,6 +75,11 @@ class MainActivity : AppCompatActivity() { enableEdgeToEdge() // enable edge to edge for the activity. + appUpdateManager = AppUpdateManagerFactory.create(this) + + appUpdateManager.registerListener(installStateUpdatedListener) + checkUpdates() + setContent { WikisourceReaderTheme(settingsViewModel = settingsViewModel) { AdjustEdgeToEdge( @@ -85,6 +106,63 @@ class MainActivity : AppCompatActivity() { } } + private fun checkUpdates(){ + val appUpdateInfoTask = appUpdateManager.appUpdateInfo + appUpdateInfoTask.addOnSuccessListener { appUpdateInfo -> + if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE + && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) { + + appUpdateManager.startUpdateFlowForResult( + // Pass the intent that is returned by 'getAppUpdateInfo()'. + appUpdateInfo, + // an activity result launcher registered via registerForActivityResult + activityResultLauncher, + // Or pass 'AppUpdateType.FLEXIBLE' to newBuilder() for + // flexible updates. + AppUpdateOptions.newBuilder(AppUpdateType.FLEXIBLE).build()) + } + } + } + + + private val activityResultLauncher = registerForActivityResult( + ActivityResultContracts.StartIntentSenderForResult() + ){ result : ActivityResult -> + + if (result.resultCode != RESULT_OK) { + println("Update flow failed! Result code: " + result.resultCode); + // If the update is canceled or fails, + // you can request to start the update again. + } + + } + + private fun popupSnackbarForCompleteUpdate() { + // Since you are using Compose, you might prefer calling a function in your + // MainViewModel to show a Compose Snackbar, but here is a standard one: + Toast.makeText( + this, + "An update has just been downloaded.", + Toast.LENGTH_LONG + ).show() + + appUpdateManager.completeUpdate() + } + + override fun onResume() { + super.onResume() + appUpdateManager.appUpdateInfo.addOnSuccessListener { info -> + if (info.installStatus() == InstallStatus.DOWNLOADED) { + popupSnackbarForCompleteUpdate() + } + } + } + + override fun onDestroy() { + super.onDestroy() + appUpdateManager.unregisterListener(installStateUpdatedListener) + } + override fun onPause() { super.onPause() }