diff --git a/app/src/main/java/com/ubisam/ubgitea/MainActivity.kt b/app/src/main/java/com/ubisam/ubgitea/MainActivity.kt index 6d9247c..89941ab 100644 --- a/app/src/main/java/com/ubisam/ubgitea/MainActivity.kt +++ b/app/src/main/java/com/ubisam/ubgitea/MainActivity.kt @@ -660,14 +660,14 @@ class MainActivity : ComponentActivity() { } } - // TASK-066: the download page asks for its password itself, so it opens in the browser. + // TASK-070: the address is the APK itself, so the browser it opens in downloads it. private fun openDownloadPage() { try { CustomTabsIntent.Builder() .build() - .launchUrl(this, Uri.parse(AppUpdateLocations.DOWNLOAD_PAGE)) + .launchUrl(this, Uri.parse(AppUpdateLocations.DOWNLOAD)) } catch (_: ActivityNotFoundException) { - Toast.makeText(this, AppUpdateLocations.DOWNLOAD_PAGE, Toast.LENGTH_LONG).show() + Toast.makeText(this, AppUpdateLocations.DOWNLOAD, Toast.LENGTH_LONG).show() } } diff --git a/app/src/main/java/com/ubisam/ubgitea/core/update/AppUpdate.kt b/app/src/main/java/com/ubisam/ubgitea/core/update/AppUpdate.kt index 4cacbb5..1af551f 100644 --- a/app/src/main/java/com/ubisam/ubgitea/core/update/AppUpdate.kt +++ b/app/src/main/java/com/ubisam/ubgitea/core/update/AppUpdate.kt @@ -8,13 +8,15 @@ import okhttp3.Request import java.util.concurrent.TimeUnit /** - * Where new builds of the app are published (TASK-066): a page that hands out the APK behind a - * password, and beside it a plain file naming the newest version. The app only ever reads that - * file; no Gitea token goes there. + * Where new builds of the app are published (TASK-070): the `apk` branch of the app's own + * repository on the team's Gitea holds the APK and, beside it, a file naming the newest version. + * Both are public and read without signing in; the app's Gitea token is not sent with either. */ object AppUpdateLocations { - const val DOWNLOAD_PAGE = "https://choimy0204.github.io/ubgitea/" - const val LATEST_VERSION = DOWNLOAD_PAGE + "version.json" + private const val RELEASES = + "https://gitea.ubisampaju.synology.me/RobotAutomationDevelopment-Dept/Ubisam-MobileGit/raw/branch/apk/" + const val DOWNLOAD = RELEASES + "UBGitea.apk" + const val LATEST_VERSION = RELEASES + "version.json" } /** The newest published build. */ @@ -26,7 +28,7 @@ data class AppRelease( /** * Reads `{"versionCode": 2, "versionName": "0.2.0", "notes": "..."}`. Anything else is null, so - * a page that is broken or not there yet never offers an update. + * a file that is broken or not there yet never offers an update. */ fun parseAppRelease(json: String): AppRelease? = try { val root = JsonParser.parseString(json).asJsonObject @@ -49,7 +51,7 @@ class HttpAppReleaseSource( ) : AppReleaseSource { override suspend fun latest(): AppRelease? = withContext(Dispatchers.IO) { try { - // no-cache: GitHub Pages is cached for minutes, and a check by hand should see a release at once. + // no-cache: a check by hand should see a release at once, whatever sits in between. val request = Request.Builder().url(url).header("Cache-Control", "no-cache").build() client.newCall(request).execute().use { response -> if (!response.isSuccessful) null else parseAppRelease(response.body.string()) diff --git a/app/src/main/res/values/strings_update.xml b/app/src/main/res/values/strings_update.xml index db47c3a..0984284 100644 --- a/app/src/main/res/values/strings_update.xml +++ b/app/src/main/res/values/strings_update.xml @@ -7,9 +7,9 @@ 최신 버전입니다. 새 버전을 확인하지 못했습니다. 네트워크를 확인하세요. 새 버전 %1$s을(를) 받을 수 있습니다. - 다운로드 페이지 열기 + 새 버전 받기 새 버전이 있습니다 - 현재 %1$s → 새 버전 %2$s\n다운로드 페이지에서 비밀번호를 입력해 받은 뒤 설치하세요. + 현재 %1$s → 새 버전 %2$s\n다운로드를 누르면 설치 파일을 받습니다. 받은 파일을 열어 설치하세요. 다운로드 나중에 diff --git a/docs/development-log.md b/docs/development-log.md index d9aaa61..0ab0ac8 100644 --- a/docs/development-log.md +++ b/docs/development-log.md @@ -1516,3 +1516,18 @@ This is the append-only implementation and handoff record shared by Codex and Cl first guesses. During the 90 ms a screen fades out it is drawn from the current view model state, so a screen whose state is cleared on leaving may flash its loading view. - Next owner: the product owner, to look at it on the device. + +## 2026-10-12 — TASK-070: update check and download from the team's Gitea + +- Request: the update notice opened the old password page; the product owner no longer uses that + page and asked for Gitea. +- What changed: `AppUpdateLocations` names `version.json` and `UBGitea.apk` on the `apk` branch of + the team's repository; the wording drops the password and the "download page". `version.json` + (0.2.1, versionCode 3) was added to the `apk` branch to match the APK already there. +- Checks and results: the five required checks pass; lint 0 errors. Both addresses answer 200 + without signing in. +- Caution: no build with this change is published yet. Copies installed so far still read the + old page, so they will not be told about builds published on Gitea; they need one install by + hand. `tools/publish-download.py` and the old page are left alone and unused. +- Next owner: the product owner, to say when a build with the new icon, motion and this change + should be published as 0.2.2. diff --git a/tasks/070-update-from-gitea.md b/tasks/070-update-from-gitea.md new file mode 100644 index 0000000..cb193dd --- /dev/null +++ b/tasks/070-update-from-gitea.md @@ -0,0 +1,65 @@ +# TASK-070: The app's update check and download use the team's Gitea + +Status: implemented; required checks pass; not yet seen on a device +Owner: Claude +Reviewer: human product owner + +## Request + +The update notice in the app opened the old download page, which asks for a password. The product +owner no longer uses that page (2026-10-12) and asked for the app to use the Gitea link instead. + +## Outcome + +- The app reads the newest version from `version.json` on the `apk` branch of + `RobotAutomationDevelopment-Dept/Ubisam-MobileGit`, and "download" opens `UBGitea.apk` on that + branch. Neither asks for a password or a sign-in. +- The wording no longer mentions a password or a download page. + +## Scope + +- Included: the two addresses, the wording, `version.json` on the `apk` branch. +- Excluded: `tools/publish-download.py` and the `choimy0204.github.io/ubgitea/` page. Both are left + as they are and are no longer part of publishing. + +## Writable paths + +- `app/src/main/java/com/ubisam/ubgitea/core/update/AppUpdate.kt` +- `app/src/main/java/com/ubisam/ubgitea/MainActivity.kt` +- `app/src/main/res/values/strings_update.xml` +- `tasks/070-update-from-gitea.md` +- `docs/development-log.md` + +## Acceptance criteria + +- [x] No address of the old page is left in the app. +- [x] `version.json` is on the `apk` branch and names the APK that is there. +- [ ] Seen on a device: the notice appears for a newer build and "download" fetches the APK. + +## Security and privacy + +The two addresses are public and are fetched with a client that carries no Gitea token. The +repository being public was the product owner's choice in TASK-067. + +## Publishing a build from now on + +1. Raise `versionCode` and `versionName` in `app/build.gradle.kts`, then `assembleDebug`. +2. On the `apk` branch, replace `UBGitea.apk` and set `version.json` to the same version. +3. Push the `apk` branch. + +Copies installed before this task still read the old page's `version.json`, so they are never told +about a build published here; they need one install by hand from the Gitea link. + +## Required checks + +```text +./gradlew compileDebugKotlin compileDebugUnitTestKotlin testDebugUnitTest assembleDebug lintDebug +``` + +## Evidence + +See the development log entry for TASK-070. + +## Review findings + +None yet.