From 348367dcc6e1ac8b11baf94a31c47f33d46313cd Mon Sep 17 00:00:00 2001 From: Ivan Malison Date: Thu, 27 Aug 2026 12:40:53 -0700 Subject: [PATCH] Fix Android adaptive launcher icon (#4332) Co-authored-by: Yash Singh --- apps/mobile/app.config.ts | 9 ++++++--- apps/mobile/assets/android-icon-foreground.png | Bin 0 -> 3457 bytes apps/mobile/assets/android-icon-foreground.svg | 8 ++++++++ assets/README.md | 14 ++++++++++++++ 4 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 apps/mobile/assets/android-icon-foreground.png create mode 100644 apps/mobile/assets/android-icon-foreground.svg diff --git a/apps/mobile/app.config.ts b/apps/mobile/app.config.ts index 9a51725478e14d4a56fd1d3841731cc879b0c562..0dc8dca96881075e4169e621dbe8366e9bf8b082 100644 --- a/apps/mobile/app.config.ts +++ b/apps/mobile/app.config.ts @@ -15,6 +15,9 @@ const personalTeamBundleIdentifier = repoEnv.T3CODE_IOS_PERSONAL_TEAM_BUNDLE_ID? const IOS_BUNDLE_IDENTIFIER_PATTERN = /^[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)+$/; const fromRepoRoot = (relativePath: string) => `../../${relativePath}`; +// Universal exports already contain their own rounded-square silhouette. Using one as an adaptive +// foreground makes Android draw an icon shape inside the launcher's mask. +const androidAdaptiveForeground = "./assets/android-icon-foreground.png"; if ( isIosPersonalTeamBuild && @@ -30,7 +33,7 @@ const DEVELOPMENT_ASSETS = { appIcon: fromRepoRoot(BRAND_ASSET_PATHS.developmentIosIconPng), iosIcon: fromRepoRoot(BRAND_ASSET_PATHS.developmentIconComposerProject), splashIcon: fromRepoRoot(BRAND_ASSET_PATHS.developmentIosIconPng), - androidAdaptiveForeground: fromRepoRoot(BRAND_ASSET_PATHS.developmentUniversalIconPng), + androidAdaptiveForeground, androidAdaptiveBackgroundColor: "#00639B", androidMonochromeIcon: "./assets/android-icon-mark.png", androidNotificationIcon: "./assets/android-notification-icon.png", @@ -41,7 +44,7 @@ const PREVIEW_ASSETS = { appIcon: fromRepoRoot(BRAND_ASSET_PATHS.nightlyIosIconPng), iosIcon: fromRepoRoot(BRAND_ASSET_PATHS.nightlyIconComposerProject), splashIcon: fromRepoRoot(BRAND_ASSET_PATHS.nightlyIosIconPng), - androidAdaptiveForeground: fromRepoRoot(BRAND_ASSET_PATHS.nightlyLinuxIconPng), + androidAdaptiveForeground, androidAdaptiveBackgroundColor: "#111533", androidMonochromeIcon: "./assets/android-icon-mark.png", androidNotificationIcon: "./assets/android-notification-icon.png", @@ -52,7 +55,7 @@ const RELEASE_ASSETS = { appIcon: fromRepoRoot(BRAND_ASSET_PATHS.productionIosIconPng), iosIcon: fromRepoRoot(BRAND_ASSET_PATHS.productionIconComposerProject), splashIcon: fromRepoRoot(BRAND_ASSET_PATHS.productionIosIconPng), - androidAdaptiveForeground: "./assets/android-icon-mark.png", + androidAdaptiveForeground, androidAdaptiveBackgroundColor: "#000000", androidMonochromeIcon: "./assets/android-icon-mark.png", androidNotificationIcon: "./assets/android-notification-icon.png", diff --git a/apps/mobile/assets/android-icon-foreground.png b/apps/mobile/assets/android-icon-foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4f4374c7ebcf18bae99e5c8b58ce499fbf488615 GIT binary patch literal 3457 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 Z538u!>jmzGqp>S}>VXjd3SY*h{{hBawy*#I literal 0 HcmV?d00001 diff --git a/apps/mobile/assets/android-icon-foreground.svg b/apps/mobile/assets/android-icon-foreground.svg new file mode 100644 index 0000000000000000000000000000000000000000..8d974992ab2c96ea7f969483a8baf8d099b53cce --- /dev/null +++ b/apps/mobile/assets/android-icon-foreground.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/assets/README.md b/assets/README.md index 8c53266bfe7fb46744189b625f504e901e4594b3..c1a16dde24b2302aa64e6391b00480d429dd4aeb 100644 --- a/assets/README.md +++ b/assets/README.md @@ -48,3 +48,17 @@ Verify every result is 1024×1024 and has the classic macOS safe area: an 824×8 ``` Do not edit the generated PNG or ICO files directly. + +## Android adaptive foreground + +`apps/mobile/assets/android-icon-foreground.svg` is the source of truth for the foreground used by +the normal Android adaptive launcher icon. Export its paired PNG after changing it: + +```sh +rsvg-convert -w 432 -h 432 \ + -o apps/mobile/assets/android-icon-foreground.png \ + apps/mobile/assets/android-icon-foreground.svg +``` + +The foreground must remain transparent and keep the T3 mark inside Android's adaptive-icon safe +zone. `android-icon-mark.png` remains a flat silhouette for Android's monochrome themed icon. -- 2.54.0