diff --git a/AGENTS.md b/AGENTS.md index 98f02eb..cddd355 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -50,6 +50,13 @@ Ground truth for saved drills: use a `google_apis` (non-Play) emulator image so - Every uploaded artifact needs a fresh, higher `versionCode` — a failed upload does *not* consume its code. - Play rejects artifacts that declare the BILLING permission without a packaged Billing Library ≥ 6.0.1 (react-native-purchases satisfies this). +### OTA updates (EAS Update) + +- All content is JS (drills in `data/vaultDrills.ts`, mascots/themes in components), so monthly drops ship over the air without a store release: `npx eas-cli update --branch production --message "..."` (needs `npx eas-cli login`; project `@haritabh1992/badminton-court-simulator`). +- `expo.runtimeVersion` in app.json is a manually pinned string (bare workflow — version policies are unsupported by `eas update`). **Bump it in any release that changes native code** (Expo SDK upgrade, new native module/dep); leave it alone for JS-only releases so one publish reaches every store build sharing that runtime. +- Clients download the update in the background on launch and apply it on the **next** launch (`EXPO_UPDATES_CHECK_ON_LAUNCH=ALWAYS`, `LAUNCH_WAIT_MS=0`). +- The update channel is baked into builds via `updates.requestHeaders` in app.json (channel `production` → EAS branch `production`). + ### Production-day checklist (deliberately deferred until first prod rollout) - Play listing **App name → `Featherwork: Badminton Drills`**, plus descriptions and `store-assets/` screenshots/feature graphic/promo video (kept out of the listing until production on purpose). diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7f7659e..5ffb7b4 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,11 +1,11 @@ - + @@ -14,9 +14,12 @@ - + + + + diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 3429f20..9723ca2 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -3,4 +3,5 @@ contain false light + 1.0.0 \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index fcd587f..de509ed 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -6,7 +6,7 @@ buildscript { minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '24') compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '35') targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '35') - kotlinVersion = findProperty('android.kotlinVersion') ?: '1.9.25' + kotlinVersion = findProperty('android.kotlinVersion') ?: '2.0.21' ndkVersion = "28.0.13004108" } diff --git a/app.json b/app.json index 785d5eb..ce62fcb 100644 --- a/app.json +++ b/app.json @@ -2,6 +2,7 @@ "expo": { "name": "Featherwork", "slug": "badminton-court-simulator", + "owner": "haritabh1992", "version": "2.8.1", "scheme": "badminton-court-simulator", "orientation": "portrait", @@ -15,6 +16,13 @@ "assetBundlePatterns": [ "**/*" ], + "runtimeVersion": "1.0.0", + "updates": { + "url": "https://u.expo.dev/3107f01f-e992-46de-8474-423ef400912f", + "requestHeaders": { + "expo-channel-name": "production" + } + }, "android": { "softwareKeyboardLayoutMode": "pan", "adaptiveIcon": { @@ -46,6 +54,11 @@ }, "web": { "favicon": "./assets/logo.png" + }, + "extra": { + "eas": { + "projectId": "3107f01f-e992-46de-8474-423ef400912f" + } } } -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index e106f35..208b23a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "expo-status-bar": "~2.2.3", "expo-store-review": "~8.1.5", "expo-system-ui": "~5.0.11", + "expo-updates": "~0.28.18", "react": "19.0.0", "react-dom": "19.0.0", "react-native": "^0.79.6", @@ -7260,6 +7261,12 @@ "react-native": "*" } }, + "node_modules/expo-eas-client": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/expo-eas-client/-/expo-eas-client-0.14.4.tgz", + "integrity": "sha512-TSL1BbBFIuXchJmPgbPnB7cGpOOuSGJcQ/L7gij/+zPjExwvKm5ckA5dlSulwoFhH8zQt4vb7bfISPSAWQVWBw==", + "license": "MIT" + }, "node_modules/expo-file-system": { "version": "18.1.11", "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-18.1.11.tgz", @@ -7317,6 +7324,12 @@ "expo": "*" } }, + "node_modules/expo-json-utils": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/expo-json-utils/-/expo-json-utils-0.15.0.tgz", + "integrity": "sha512-duRT6oGl80IDzH2LD2yEFWNwGIC2WkozsB6HF3cDYNoNNdUvFk6uN3YiwsTsqVM/D0z6LEAQ01/SlYvN+Fw0JQ==", + "license": "MIT" + }, "node_modules/expo-keep-awake": { "version": "14.1.4", "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-14.1.4.tgz", @@ -7353,6 +7366,19 @@ "react-native": "*" } }, + "node_modules/expo-manifests": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/expo-manifests/-/expo-manifests-0.16.6.tgz", + "integrity": "sha512-1A+do6/mLUWF9xd3uCrlXr9QFDbjbfqAYmUy8UDLOjof1lMrOhyeC4Yi6WexA/A8dhZEpIxSMCKfn7G4aHAh4w==", + "license": "MIT", + "dependencies": { + "@expo/config": "~11.0.12", + "expo-json-utils": "~0.15.0" + }, + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-modules-autolinking": { "version": "2.1.15", "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-2.1.15.tgz", @@ -7484,6 +7510,12 @@ "react-native": "*" } }, + "node_modules/expo-structured-headers": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/expo-structured-headers/-/expo-structured-headers-4.1.0.tgz", + "integrity": "sha512-2X+aUNzC/qaw7/WyUhrVHNDB0uQ5rE12XA2H/rJXaAiYQSuOeU90ladaN0IJYV9I2XlhYrjXLktLXWbO7zgbag==", + "license": "MIT" + }, "node_modules/expo-system-ui": { "version": "5.0.11", "resolved": "https://registry.npmjs.org/expo-system-ui/-/expo-system-ui-5.0.11.tgz", @@ -7504,6 +7536,49 @@ } } }, + "node_modules/expo-updates": { + "version": "0.28.18", + "resolved": "https://registry.npmjs.org/expo-updates/-/expo-updates-0.28.18.tgz", + "integrity": "sha512-qbxRF8w/xPNiEWmZHDxK4XJ0ns4A9VpQg66jNeAEc8mrX9f7TG3TyLyLtydAP0F4aTNrBcSxah8K5VA90vcPig==", + "license": "MIT", + "dependencies": { + "@expo/code-signing-certificates": "^0.0.6", + "@expo/config": "~11.0.13", + "@expo/config-plugins": "~10.1.2", + "@expo/spawn-async": "^1.7.2", + "arg": "4.1.0", + "chalk": "^4.1.2", + "expo-eas-client": "~0.14.4", + "expo-manifests": "~0.16.6", + "expo-structured-headers": "~4.1.0", + "expo-updates-interface": "~1.1.0", + "glob": "^10.4.2", + "ignore": "^5.3.1", + "resolve-from": "^5.0.0" + }, + "bin": { + "expo-updates": "bin/cli.js" + }, + "peerDependencies": { + "expo": "*", + "react": "*" + } + }, + "node_modules/expo-updates-interface": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expo-updates-interface/-/expo-updates-interface-1.1.0.tgz", + "integrity": "sha512-DeB+fRe0hUDPZhpJ4X4bFMAItatFBUPjw/TVSbJsaf3Exeami+2qbbJhWkcTMoYHOB73nOIcaYcWXYJnCJXO0w==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-updates/node_modules/arg": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", + "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", + "license": "MIT" + }, "node_modules/exponential-backoff": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", diff --git a/package.json b/package.json index a5a4dca..91cdc98 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "expo-status-bar": "~2.2.3", "expo-store-review": "~8.1.5", "expo-system-ui": "~5.0.11", + "expo-updates": "~0.28.18", "react": "19.0.0", "react-dom": "19.0.0", "react-native": "^0.79.6",