diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 0f6f5a9..68623b2 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -3,6 +3,8 @@
+
+
+
+
+
+
diff --git a/android/app/src/main/java/com/devlab/app/MainActivity.kt b/android/app/src/main/java/com/devlab/app/MainActivity.kt
index 492b47e..3353d9b 100644
--- a/android/app/src/main/java/com/devlab/app/MainActivity.kt
+++ b/android/app/src/main/java/com/devlab/app/MainActivity.kt
@@ -1,6 +1,11 @@
package com.devlab.app
+import android.app.AlertDialog
import android.os.Bundle
+import androidx.lifecycle.lifecycleScope
+import com.devlab.app.util.AppUpdater
+import com.devlab.app.util.UpdateChecker
+import kotlinx.coroutines.launch
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
@@ -40,12 +45,43 @@ class MainActivity : ComponentActivity() {
installSplashScreen()
super.onCreate(savedInstanceState)
enableEdgeToEdge()
+ checkForUpdates()
setContent {
ServerManagerTheme {
AppRoot()
}
}
}
+
+ private fun checkForUpdates() {
+ val versionName = try {
+ packageManager.getPackageInfo(packageName, 0).versionName ?: "1.0.0"
+ } catch (_: Exception) { "1.0.0" }
+ lifecycleScope.launch {
+ val updateInfo = UpdateChecker(versionName).check()
+ if (updateInfo.hasUpdate) {
+ if (updateInfo.forceUpdate) {
+ AlertDialog.Builder(this@MainActivity)
+ .setTitle("Update Required")
+ .setMessage("A new version (${updateInfo.version}) is required to continue.\n\n${updateInfo.releaseNotes}")
+ .setCancelable(false)
+ .setPositiveButton("Update Now") { _, _ ->
+ AppUpdater(this@MainActivity).downloadAndInstall(updateInfo.apkUrl)
+ }
+ .show()
+ } else {
+ AlertDialog.Builder(this@MainActivity)
+ .setTitle("Update Available")
+ .setMessage("Version ${updateInfo.version} is now available.\n\n${updateInfo.releaseNotes}")
+ .setPositiveButton("Update Now") { _, _ ->
+ AppUpdater(this@MainActivity).downloadAndInstall(updateInfo.apkUrl)
+ }
+ .setNegativeButton("Later", null)
+ .show()
+ }
+ }
+ }
+ }
}
@Composable
diff --git a/android/app/src/main/java/com/devlab/app/data/api/ApiService.kt b/android/app/src/main/java/com/devlab/app/data/api/ApiService.kt
index 2a96e41..0857638 100644
--- a/android/app/src/main/java/com/devlab/app/data/api/ApiService.kt
+++ b/android/app/src/main/java/com/devlab/app/data/api/ApiService.kt
@@ -46,4 +46,7 @@ interface ApiService {
@GET("api/refresh-metrics")
suspend fun refreshMetrics(): ApiResponse