From 85469dae4b298861202157f0e65b8cfbb3d27d15 Mon Sep 17 00:00:00 2001 From: Codex Date: Sun, 5 Jul 2026 16:45:40 +0000 Subject: [PATCH] Support Gitea release update source --- app/build.gradle.kts | 4 +- .../neatstudio/tmuxandroid/UpdateManager.java | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0870e47..0d7db5a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -5,13 +5,13 @@ plugins { } val repoSlug = providers.gradleProperty("repoSlug") - .orElse("neatstudio/tmux-android") + .orElse("neatstudio/tmux-browser-android") val defaultServerUrl = providers.gradleProperty("defaultServerUrl") .orElse("http://100.89.0.116:3000") val defaultUpdateUrl = providers.gradleProperty("defaultUpdateUrl") .orElse("https://github.com/${repoSlug.get()}/releases/latest/download/latest.json") val defaultGiteaUpdateUrl = providers.gradleProperty("defaultGiteaUpdateUrl") - .orElse("https://gitea.neatcn.com/tmux/tmux-browser-android/releases/latest/download/latest.json") + .orElse("https://gitea.neatcn.com/api/v1/repos/tmux/tmux-browser-android/releases/latest") val signingProps = Properties() val signingFile = rootProject.file("signing.properties") diff --git a/app/src/main/java/com/neatstudio/tmuxandroid/UpdateManager.java b/app/src/main/java/com/neatstudio/tmuxandroid/UpdateManager.java index f128ecd..71737df 100644 --- a/app/src/main/java/com/neatstudio/tmuxandroid/UpdateManager.java +++ b/app/src/main/java/com/neatstudio/tmuxandroid/UpdateManager.java @@ -10,6 +10,7 @@ import android.os.Build; import android.provider.Settings; import android.widget.Toast; +import org.json.JSONArray; import org.json.JSONObject; import java.io.BufferedInputStream; @@ -103,6 +104,9 @@ final class UpdateManager { private ReleaseInfo fetchReleaseInfo(String manifestUrl) throws Exception { String json = readText(manifestUrl); JSONObject root = new JSONObject(json); + if (root.has("assets") && root.has("tag_name")) { + return fetchReleaseInfoFromReleaseApi(root); + } return new ReleaseInfo( root.getInt("versionCode"), root.optString("versionName", ""), @@ -112,6 +116,40 @@ final class UpdateManager { ); } + private ReleaseInfo fetchReleaseInfoFromReleaseApi(JSONObject release) throws Exception { + JSONArray assets = release.getJSONArray("assets"); + String manifestUrl = findAssetUrl(assets, "latest.json"); + String apkUrl = findAssetUrl(assets, "tmux-android.apk"); + if (manifestUrl.isEmpty()) { + throw new IllegalStateException("Release has no latest.json"); + } + ReleaseInfo info = fetchReleaseInfo(manifestUrl); + if (apkUrl.isEmpty()) { + return info; + } + return new ReleaseInfo( + info.versionCode, + info.versionName, + apkUrl, + info.sha256, + release.optString("html_url", info.releasePageUrl) + ); + } + + private String findAssetUrl(JSONArray assets, String name) { + for (int index = 0; index < assets.length(); index++) { + JSONObject asset = assets.optJSONObject(index); + if (asset == null || !name.equals(asset.optString("name"))) { + continue; + } + String url = asset.optString("browser_download_url", ""); + if (!url.isEmpty()) { + return url; + } + } + return ""; + } + private String readText(String url) throws Exception { HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); connection.setConnectTimeout(12000);