Skip to content

Fix Play Console warnings (R8 13%, edge-to-edge), complete translations, refresh store screenshots - #9

Merged
zero2005x merged 5 commits into
mainfrom
fix/i18n-store-screenshots
Sep 28, 2026
Merged

zero2005x merged 5 commits into
mainfrom
fix/i18n-store-screenshots

Conversation

@zero2005x

@zero2005x zero2005x commented Sep 28, 2026 •

Copy link
Copy Markdown
Owner

Play Console issues (version 9 / 1.5.0)

Issue Cause Fix
DEX optimization / obfuscation / shrinking at 13% (below 25%) proguard-rules.pro kept androidx.compose.**, com.m365bleapp.**, Tink, security-crypto and coroutines whole Keep only the classes reached by name: JNI M365Native native methods, JNA, and Tink protobuf fields. glass-hud drops the same Compose keep.
Deprecated LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES at b.r.a Disassembly shows it's androidx.activity's EdgeToEdgeApi28, called from enableEdgeToEdge() (always compiled in with minSdk 28) Handle edge-to-edge ourselves: setDecorFitsSystemWindows(false), ALWAYS on API 30+, and contrast enforcement off
Edge-to-edge may not display for all users Same helper Same fix. Insets were already handled by Compose Scaffold

Measured by running R8 (minifyReleaseWithR8) in the WSL build:

DEX Classes Renamed Writes SHORT_EDGES
app, before (current AAB) 22.5 MB 22,549 4% yes (b.r.a)
app, after 2.5 MB 3,058 91% no
glass-hud, after 1.3 MB 1,705 95% no

I installed a test-signed, minified release APK on an API 34 emulator and went through every screen. The native library loaded and init() ran, EncryptedSharedPreferences (Tink) was created, and Demo Ride worked, all with no crash. The promo video below was recorded on that build.

Promo video / GIF

  • doc/play-store/promo/promo_1920x1080.mp4: a 26-second landscape promo video. Play only accepts YouTube links, so upload it to YouTube first.
  • doc/play-store/promo/demo.gif: shown in the READMEs.

Summary

Refreshes the Play Store screenshots from the current build and fixes the localization problems found while taking them.

  • Translations completed (i18n). Every non-English locale was missing 58–72 of the 203 translatable strings (settings hub, glasses display fields, pairing warnings, model override, diagnostics, lock/light feedback), so those screens fell back to English. All 10 locales now cover the full set, with matching placeholders.
  • UI fixes found through the screenshots:
    • Arabic RTL: Arabic rendered left-to-right because the manifest didn't declare android:supportsRtl.
    • Motor lock row: in Russian and Ukrainian, the unlock button was squeezed into a circle with its label broken letter by letter.
    • Demo ride switch: the Settings switch never recomposed, so it stayed off after the demo started.
  • Build fix: -PskipRustBuild. copyRustJniLibs ignored the flag. Without a Rust toolchain it deleted src/main/jniLibs and then failed.
  • Store screenshots: 5 screens × 11 locales in doc/play-store/<Play Console language code>/, 1080×1920 (9:16). They were captured on an emulator in Demo Ride mode, with a clean demo-mode status bar.
  • scripts/capture_store_screenshots.py: regenerates the screenshots. It finds UI elements by their localized string resources, so it fails loudly if a label changes.
  • READMEs (EN / 繁中 / 简中):
    • The screenshot section now shows real images instead of text placeholders.
    • Min SDK is Android 9 (API 28), not 10; the badge is updated too.
    • Gradle version is 9.6.1.
    • The clone URL is the real repo instead of your-repo.
    • Architecture tree updated (HomeScreen, SettingsScreen, protocol/, cxr/, …).
    • Rust setup now reflects that Gradle runs cargo-ndk itself.
    • Features added: Demo Ride, glasses display settings, model override.
    • A broken emoji is fixed.

Screenshots (en-US)

Dashboard Details Glasses Display Settings

Arabic (now RTL) and Russian (lock buttons fixed):

ar ru

Test plan

  • ./gradlew :app:assembleDebug -PskipRustBuild builds successfully; copyRustJniLibs is skipped and verifyRustJniLibs only warns.
  • Locale check: 0 missing keys and 0 placeholder mismatches in all 10 locales.
  • ./gradlew :app:testDebugUnitTest -PskipRustBuild: 318 tests, 0 failures.
  • All 11 locales were driven on an emulator (API 34), and each screen was checked by eye: Arabic is mirrored, and the ru/uk lock buttons show their full labels.
  • python scripts/capture_store_screenshots.py --serial emulator-5556 en ran end to end and produced the en-US set.

Notes

  • In Demo Ride, the Details banner still says "Live — connected to the scooter now." It would be better labelled as simulated, but that's a separate copy change and isn't included here.
  • The screenshot script chooses "Xiaomi M365" as the model override. Demo data carries no model name, and for an unknown model the Details screen hides every capability-gated section.
  • Release build via WSL (with Rust): R8 succeeds for app and glass-hud, and the test-signed APK runs on the emulator.
  • Before uploading: bump versionCode (currently 9) and sign with the official key to produce the AAB.
  • Upload the doc/play-store/* sets in Play Console. The store's "What's New in v1.1" text is also out of date and needs a manual edit.

🤖 Generated with Claude Code

zero2005x and others added 5 commits September 28, 2026 14:54
Every non-English locale was missing 58-72 of the 203 translatable strings
(settings hub, glasses display fields, pairing warnings, model override,
diagnostics, lock/light feedback), so those screens fell back to English.
All locales now cover the full English set with matching placeholders.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Declare android:supportsRtl so Arabic is mirrored; it rendered LTR.
- Motor control row: give the label the remaining width and keep button
  text on one line. In Russian/Ukrainian the unlock button was squeezed
  into a circle with its label broken per letter.
- Settings demo-ride switch read a plain property and never recomposed,
  so it stayed off after the demo started. Observe connectionState, which
  startDemo()/stopDemo() both move.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
copyRustJniLibs ignored the flag, so with no Rust toolchain it deleted
src/main/jniLibs and then failed on the first missing ABI. Skip it when
the flag is set, as buildRustJni already does; verifyRustJniLibs keeps
its lenient-debug / strict-release behaviour.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Drives a debug build on an emulator with adb + uiautomator, using Demo
Ride so no scooter is needed, and writes doc/play-store/<locale>/*.png for
all 11 languages. Elements are found by their localized string resources,
so a renamed label fails loudly rather than producing a wrong screenshot.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- doc/play-store/: 5 screens x 11 locales at 1080x1920, captured from
  the current build in Demo Ride.
- README (EN / zh-TW / zh-CN): real screenshots instead of the text
  placeholder table; min SDK is Android 9 (API 28), not 10; Gradle 9.6.1;
  real clone URL; architecture tree matches the current sources; Rust
  setup reflects that Gradle runs cargo-ndk itself and documents
  -PskipRustBuild; list Demo Ride, glasses display settings and model
  override; fix a broken emoji.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@zero2005x
zero2005x merged commit b6b9cce into main Sep 28, 2026
3 checks passed
@zero2005x zero2005x changed the title Complete translations, fix RTL/long-locale layout, refresh Play Store screenshots Fix Play Console warnings (R8 13%, edge-to-edge), complete translations, refresh store screenshots Sep 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant