diff --git a/.github/fork-features.yml b/.github/fork-features.yml index df73ee194968..ca9cee818412 100644 --- a/.github/fork-features.yml +++ b/.github/fork-features.yml @@ -1145,7 +1145,8 @@ features: - Linux desktop entries, SnapShot D-Bus names, the GNOME Shell extension, and the KDE and Hyprland capture helpers use styal identities (`build.styal.Styal`, `snap-shot@styal.build`, `styal-*-snap-shot`) so they cannot collide with an upstream T3 Code install. - Mobile production and preview profiles retain styal identity and fork Expo configuration; Android distribution uses installable APKs without store submission, while iOS submits to TestFlight. - Each finished production Android APK is published as a GitHub release tagged `android--`, created without claiming Latest from a stable `v` release, and only when its signing certificate matches the pinned production key; release notes contain installation guidance and APK checksums are attached as `SHA256SUMS`. - - Production Android installs offer the newest GitHub release once per release, and keep it in About styal, only when its runtime version differs from the installed binary's, because over-the-air updates cannot reach that install. + - Production Android installs offer the newest GitHub release once per release, and keep its download directly below Version in About styal, only when its runtime version differs from the installed binary's, because over-the-air updates cannot reach that install. + - Mobile About styal identifies the installed binary by its native version and build number on Android and iOS, retaining non-production variant labels. implementation_paths: - .github/scripts/publish-android-release.sh - .github/workflows/desktop-macos-preview.yml diff --git a/apps/mobile/package.json b/apps/mobile/package.json index d484862290c9..bab37d99a823 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -74,6 +74,7 @@ "diff": "8.0.3", "effect": "catalog:", "expo": "~57.0.18", + "expo-application": "~57.0.3", "expo-asset": "~57.0.15", "expo-audio": "57.0.4", "expo-auth-session": "~57.0.10", diff --git a/apps/mobile/src/features/settings/SettingsAboutRouteScreen.tsx b/apps/mobile/src/features/settings/SettingsAboutRouteScreen.tsx index d5bdae7825b2..4816663d2e6b 100644 --- a/apps/mobile/src/features/settings/SettingsAboutRouteScreen.tsx +++ b/apps/mobile/src/features/settings/SettingsAboutRouteScreen.tsx @@ -1,4 +1,5 @@ import { ScreenScrollView as ScrollView } from "../../components/ScreenScrollView"; +import * as Application from "expo-application"; import Constants from "expo-constants"; import { useCallback, useEffect, useRef, useState } from "react"; import { Alert, Pressable, View } from "react-native"; @@ -45,12 +46,15 @@ function AppSettingsSection() { const hiddenUpdateTapCount = useRef(0); const nativeUpdate = useAvailableNativeAppUpdate(); - const version = Constants.expoConfig?.version ?? "0.0.0"; + const version = Application.nativeApplicationVersion ?? Constants.expoConfig?.version ?? "0.0.0"; + // EAS assigns build numbers remotely; read the installed binary rather than app.config. + const build = Application.nativeBuildVersion; + const versionWithBuild = build ? `${version} (${build})` : version; // Fall back to "production" to match resolveAppVariant in app.config.ts, so a // missing variant never mislabels a production build as development. const variant = (Constants.expoConfig?.extra?.appVariant as string | undefined) ?? "production"; const variantLabel = variant === "production" ? "" : capitalize(variant); - const versionLabel = variantLabel ? `${version} · ${variantLabel}` : version; + const versionLabel = variantLabel ? `${versionWithBuild} · ${variantLabel}` : versionWithBuild; const updateCheckAvailable = isAppUpdateCheckAvailable(); const busy = updateState === "checking" || updateState === "downloading" || updateState === "restarting"; @@ -126,14 +130,6 @@ function AppSettingsSection() { return ( - {nativeUpdate ? ( - void openNativeAppUpdateDownload(nativeUpdate)} - /> - ) : null} void openNativeAppUpdateDownload(nativeUpdate)} + /> + ) : null} ); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08244ed57a3e..456679034b31 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -325,6 +325,9 @@ importers: expo: specifier: ~57.0.18 version: 57.0.22(884ac82636fdf3d369835b6616e46bd5) + expo-application: + specifier: ~57.0.3 + version: 57.0.3(expo@57.0.22) expo-asset: specifier: ~57.0.15 version: 57.0.17(expo@57.0.22)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2)