From 81d979546c8c3f2258e6eefd412cd4ba4c9e3f6a Mon Sep 17 00:00:00 2001 From: zarazaex69 Date: Sat, 11 Apr 2026 20:10:45 +0300 Subject: [PATCH] fix(update): add exception handling and improve version comparison logic --- .../olc/handler/UpdateCheckerManager.kt | 93 +++++++++++-------- 1 file changed, 52 insertions(+), 41 deletions(-) diff --git a/V2rayNG/app/src/main/java/xyz/zarazaex/olc/handler/UpdateCheckerManager.kt b/V2rayNG/app/src/main/java/xyz/zarazaex/olc/handler/UpdateCheckerManager.kt index b4978cb0..e84ee225 100644 --- a/V2rayNG/app/src/main/java/xyz/zarazaex/olc/handler/UpdateCheckerManager.kt +++ b/V2rayNG/app/src/main/java/xyz/zarazaex/olc/handler/UpdateCheckerManager.kt @@ -17,47 +17,55 @@ import java.io.FileOutputStream object UpdateCheckerManager { suspend fun checkForUpdate(includePreRelease: Boolean = false): CheckUpdateResult = withContext(Dispatchers.IO) { - val url = if (includePreRelease) { - AppConfig.APP_API_URL - } else { - AppConfig.APP_API_URL.concatUrl("latest") - } + try { + val url = if (includePreRelease) { + AppConfig.APP_API_URL + } else { + AppConfig.APP_API_URL.concatUrl("latest") + } - var response = HttpUtil.getUrlContent(url, 5000) - if (response.isNullOrEmpty()) { - val httpPort = SettingsManager.getHttpPort() - response = HttpUtil.getUrlContent(url, 5000, httpPort) - ?: throw IllegalStateException("Failed to get response") - } + var response = HttpUtil.getUrlContent(url, 5000) + if (response.isNullOrEmpty()) { + val httpPort = SettingsManager.getHttpPort() + response = HttpUtil.getUrlContent(url, 5000, httpPort) + ?: throw IllegalStateException("Failed to get response") + } - val latestRelease = if (includePreRelease) { - JsonUtil.fromJson(response, Array::class.java) - ?.firstOrNull() - ?: throw IllegalStateException("No pre-release found") - } else { - JsonUtil.fromJson(response, GitHubRelease::class.java) - } - if (latestRelease == null) { - return@withContext CheckUpdateResult(hasUpdate = false) - } + val latestRelease = if (includePreRelease) { + JsonUtil.fromJson(response, Array::class.java) + ?.firstOrNull() + ?: throw IllegalStateException("No pre-release found") + } else { + JsonUtil.fromJson(response, GitHubRelease::class.java) + } + if (latestRelease == null) { + return@withContext CheckUpdateResult(hasUpdate = false) + } - val latestVersion = latestRelease.tagName.removePrefix("v") - Log.i( - AppConfig.TAG, - "Found new version: $latestVersion (current: ${BuildConfig.VERSION_NAME})" - ) - - return@withContext if (compareVersions(latestVersion, BuildConfig.VERSION_NAME) > 0) { - val downloadUrl = getDownloadUrl(latestRelease, Build.SUPPORTED_ABIS[0]) - CheckUpdateResult( - hasUpdate = true, - latestVersion = latestVersion, - releaseNotes = latestRelease.body, - downloadUrl = downloadUrl, - isPreRelease = latestRelease.prerelease + val latestVersion = latestRelease.tagName.removePrefix("v") + Log.i( + AppConfig.TAG, + "Found new version: $latestVersion (current: ${BuildConfig.VERSION_NAME})" ) - } else { - CheckUpdateResult(hasUpdate = false) + + return@withContext if (compareVersions(latestVersion, BuildConfig.VERSION_NAME) > 0) { + val downloadUrl = getDownloadUrl(latestRelease, Build.SUPPORTED_ABIS[0]) + CheckUpdateResult( + hasUpdate = true, + latestVersion = latestVersion, + releaseNotes = latestRelease.body, + downloadUrl = downloadUrl, + isPreRelease = latestRelease.prerelease + ) + } else { + CheckUpdateResult(hasUpdate = false) + } + } catch (e: NumberFormatException) { + Log.e(AppConfig.TAG, "Failed to parse version: ${e.message}") + return@withContext CheckUpdateResult(hasUpdate = false) + } catch (e: Exception) { + Log.e(AppConfig.TAG, "Failed to check for update: ${e.message}") + throw e } } @@ -95,12 +103,15 @@ object UpdateCheckerManager { } private fun compareVersions(version1: String, version2: String): Int { - val v1 = version1.split(".") - val v2 = version2.split(".") + val cleanVersion1 = version1.split("-")[0] + val cleanVersion2 = version2.split("-")[0] + + val v1 = cleanVersion1.split(".") + val v2 = cleanVersion2.split(".") for (i in 0 until maxOf(v1.size, v2.size)) { - val num1 = if (i < v1.size) v1[i].toInt() else 0 - val num2 = if (i < v2.size) v2[i].toInt() else 0 + val num1 = if (i < v1.size) v1[i].toIntOrNull() ?: 0 else 0 + val num2 = if (i < v2.size) v2[i].toIntOrNull() ?: 0 else 0 if (num1 != num2) return num1 - num2 } return 0