From 96d4c03e672d1d64a992fc0ed21d93b6038b9a83 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 17 Jul 2026 18:40:52 +0000 Subject: [PATCH] feat(android-llmservice): add shard-J launcher icon Wire the new adaptive launcher-icon set (from the shared workspace logo: the shard-J on #111111) into the LLM Service app. Adds the mipmap-* PNGs, the adaptive-icon descriptor + ic_launcher_background colour, and sets android:icon/android:roundIcon in the manifest (the app previously shipped no icon). Documents it as requirement R1.7 and REUSE-annotates the PNGs as MIT OR Apache-2.0 (the XMLs carry inline SPDX). Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01EqBKwPNJSfaSnTVgw87CPT --- REUSE.toml | 8 ++++++++ .../app/src/main/AndroidManifest.xml | 2 ++ .../main/res/mipmap-anydpi-v26/ic_launcher.xml | 10 ++++++++++ .../app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 747 bytes .../res/mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 1322 bytes .../app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 568 bytes .../res/mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 909 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 914 bytes .../res/mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 1681 bytes .../src/main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1305 bytes .../res/mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 2481 bytes .../src/main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1671 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 4031 bytes .../main/res/values/ic_launcher_background.xml | 9 +++++++++ android-llmservice/requirements.md | 1 + 15 files changed, 30 insertions(+) create mode 100644 android-llmservice/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 android-llmservice/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android-llmservice/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 android-llmservice/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android-llmservice/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 android-llmservice/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android-llmservice/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 android-llmservice/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android-llmservice/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 android-llmservice/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android-llmservice/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 android-llmservice/app/src/main/res/values/ic_launcher_background.xml diff --git a/REUSE.toml b/REUSE.toml index 20bb98b44..c63e19ddc 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -97,6 +97,14 @@ path = [ SPDX-FileCopyrightText = "2026 Bernard Ladenthin " SPDX-License-Identifier = "MIT OR Apache-2.0" +# Android launcher-icon PNGs (binary, cannot carry inline SPDX). Generated from the +# shard-J of the java-llama.cpp logo; same MIT OR Apache-2.0 as the branding assets +# above (the adaptive-icon + colour XMLs carry their SPDX headers inline). +[[annotations]] +path = "android-llmservice/app/src/main/res/mipmap-*/ic_launcher*.png" +SPDX-FileCopyrightText = "2026 Bernard Ladenthin " +SPDX-License-Identifier = "MIT OR Apache-2.0" + # Test image (binary, cannot carry inline SPDX) [[annotations]] path = "llama/src/test/resources/images/test-image.jpg" diff --git a/android-llmservice/app/src/main/AndroidManifest.xml b/android-llmservice/app/src/main/AndroidManifest.xml index b2c2d40b2..f5a0dddd8 100644 --- a/android-llmservice/app/src/main/AndroidManifest.xml +++ b/android-llmservice/app/src/main/AndroidManifest.xml @@ -26,6 +26,8 @@ SPDX-License-Identifier: MIT + + + + + diff --git a/android-llmservice/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android-llmservice/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d0f770e2e8a7d51f31cce330c84dfd3edca54486 GIT binary patch literal 747 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 OYYd*QelF{r5}E+6!i%o} literal 0 HcmV?d00001 diff --git a/android-llmservice/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/android-llmservice/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..f0ac1f30ab453af829bf3c543b5f72347bbc0885 GIT binary patch literal 1681 zcmd5-=~vQO7)AySBNZae)DlhQoLtgYB#a?3wUV0Bz^wR{+G38mgBBv_oUpWPnzDki z#WSA96&p2kCn=BGaY+*<6;x6&Tq4BFhZ8JTMDZ(v?rV5Qm_JTPhc+7UOV{1#3B z{(XI_C5M#Vi17oE4({;vmN4UWT$m9FnuhsL=+4qx0ot$mDOBs3!cdlu->0RjFG2fw zW~Hi8W)abq-9J%q)`s|T^m>uD?^{#ha2Kr7K(`diiX-%>x;q#Z=a#CSbIHKQ#G6+b ze|eS^hpdFYcFqm!)-?$RbaV;T)=bl3)fhvS6WJl#Z(==sYM+ACn3XuTRc3y46s3Nd zLeGoVMGV7gvbz;Smrv2sXe+^4W7as4TiB)~dC&K`19;IX_{4EjZ^OAe&og|*2+!U* zSx;3*7qk9RqZ?4ZB$1`&Jp%cKKuwT|c)9Rb^aRv&icW1ZPBf_DOwq#$avy*$RVUOf zM89CP9hHBCBra(yFO8ld!(-R1W`3XaGv&!ICEki-;qY7{-?bRK)5|WuYUFd)a1`0r6hokP2A?1#yriYDyLWXgtdy z-)fp}ky&yWKqpVHRBYOU!j`M5*un1AZdhshgKL2^hoFe4UPobzV2a-6RiH63MMRx+ z61L3tH`ET+>}Lr7jIU)Y4doi+$Q?De(eIb9u%P^-s??@s=f=&E_D|-omha3pLrTfX zG9sax?ZYGs{5qCZubg-&DF1LDqCQ9`8|Y=c{Q^cjTt1j@H7Pjj0qUG}sfy9HqNFZ( zBb#ezvE?1!Js}X!hwU*y9DLQbbr|MiIRHxhHw=R09;|dBs^I<-Re+9+w#ba){{sNn zdeUfgL8P2ZBHKJP%EOtA$OAU8x88gWE}fA{M0c{)%hU{-D(64IXy8 zcwmkQ6k)0u^9BsXI5J#B66+5^wI!$6Ww*Zf2s9)(0(nlPdRN9>2kwF%FcD3 zCqL}u;WlzXK8{=LfYW;dpdqBy$qTSbZjWA&`gK|{sFArM(Izhrsm{}&AsiBH9wo&; z-aBb=B5sYUXD3g1nUMljg&{?rTTuHJ^U>`n8c`nqrjB5rs0?=hvXZb_0BlaS=%1LA zl~)--RWZus`{N}KbA838_2cO`;6-<@;)gs4_ItE}`{6B30w4>#odj;9m7_)G4qMJ{ zKUd4}{Zqh?`ZFR4isA0Y&3m<)sROW*x5mAI1V@?$O<#bXy(H17dD6kE(!Pl3^6~L6 z@FLMnpEhxE?|e@8R{4n)e1qsZE72#XnY1}HcLD3XqD^7Xx~ub1Lm zcjj=(^U{oy@!$2@+Vyj4w#Tw%q?d^0{rhF}CVpP~HJSN&GdcaA7&-j+@t?)xUs93s zTDees!Ts{*50BkDePPv2W2P%xq^s9Eo#qHQob zHb@y7Z>xzf3T589$7h=rbMD7Bql^N14lNcAt#$fSu8Q$zt>@;;{=eh*+>@#`E)7~; zj9Pcs)RYw6%c)Re3YnO){PwF?*_{lbN_SswtN8cTkSV0IWbr3HV*w@4hDWSbX$m@j zZ1nbLn^b4LXS%tZBY^eeqFd))_-dr?ZRi8?e*3+i-@y>7pu1r0b$da^RS(P^8+76p z#J4hNR<5g8Vp?J%d)msDLqKea^@VFv9KjqDCO!Y9uH?W~Eq=dcFLx8~5x=^9KxGdq zf9`W>5Lxn--&jCQ<#~LVG)QegP3V~t9nA&5rHYtTRMyt7F%wuOps;ZD6?<+L4-X^e z$o&rcxfq2O{QKF!!0BPRtP^FL()lahlxfPz zYUV^P##2xBHX5`tq%Qgw*~^f+pwR$GCj6Y|)?jqOVFrx6_JHZ{hIjLf#P-<7NZk9N z{j(rbLFU@s;D6S(oY%{)|35xw@z0$FpAVWp-2eMN-#=O2mczStKb^ZfUbtWN-@lhC zfBv8DKDd8zV?jiC{Nx{>L#yIS3sh?z=lx3GyKY{HQ8W*0AKRg?yQ+d-*7t{1~o?p$^fB87CiNLz+XD?s7w|-%xfxkK9B(Xg!C7am}*{n-nu<)~% z6vyWh!3Dl=t^-}Yyqn?by80as^Vjz?cyix6!qvles3s4n?5|Xw!n4;(4qIQ#>s@$m zEWhB^TeB0dA$4)4A#Z~IPcf7QsWK6mX8iXF&`o{! zWwT@E$8s&T(Yrt0hutIS1K-^6qs4~nxAshVc~R)9HsATxW+!tRZmiF2zIk!Vyl~#T z4lb6P8HL0zT(Jn9DeL<#25IQ z2soXKX{dM@9DSxY>n)qpiybo>_w4!bDce9)A@0W&xnO1Oe?J%fyD1^Ae3~n#*oQS^ zPpz0&W%a|$)6=q2@@*w`xgH5!v7eoqSHhnc&sG2LN6|(p>HcfyJ+{kjX5Q-=J^AF4 mKjn-S{f`(xnTiaQmS&d>Z~nG3MUWAJqKb6Mw<&;$UQxGj4C literal 0 HcmV?d00001 diff --git a/android-llmservice/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android-llmservice/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..9c651d94051c04ccc1b801f38062ee5f83f1cc5a GIT binary patch literal 2481 zcmds(|3A}fAIFD@QTAa)b=+*i$hY#PCO12q$yCNcH#+3&l-(yKl6+a3*rL0(@@)=7 ziF+kNIaF?Hm}8?tH%G_OCez5brZ3BIU!D6r?#KN%oF6`q>v3K0=li-|uj}#tT#xr9 ze~R}eo$Wd>7;KXdnG^tnsgb^Z+8e-1#Ef?j42DScArXR7%jU*KoNq?9WJ!iRi$%r` zU67^5kp5Q8F7=nOXgBp*v{&bD)IFy~oO+)=OPqD2B-Urg{TDZz1LPMrB)<5xl=)5J zZL7Q09rNz6`8FMxNw_BLDqJ6pF#Fbklx5C>`9Nyd(CX#{IGLf%{?i4PA7wFQuTnoI z=Hb1BJn_=p!h&?R@*JZ#G_&;|<9`(zC3W>X3l+$fx4(II1v5KTF2{N3(}vrgc05}d zwL6dR#>wuqA|Ikz8BOcsJ^7y6>)Wy)>Ji@MAP;{wpBV2^j0#0thohVqC*=0OX@)~2 zN=ruM`&Ey%%vKY8KEap53{RxWVoi4(y=*M#PM#W?;^8o-n^q-5Z(e)6?ID|PIK7|g zS9ns-v^oP7lb*i1Gl7u+h-<4J2{EUdhoa7kA=jTJw8s1=;mWnBvv5w}ss#`v?Gw{P z4FS=o6q_eJ+Vl4kg3F-Lxm|AQCfPs6)e1}yX0vnUkU(|sV7<6*&yS||*h?#wZj9cY zqLanm>u35L@ylyb6=B@asV5^R#7H+wR$UCe_439tJvR$h-OCUAvSL0HQ#w>d+?&eP z_gCv9lqG68x|2m3zRAnQg4POo9I$XtP%5Ch_nPXB8*LiHKho^Q*=>!B!!Nw@9eoL6x>yyVd&(c{$55iPV~N7Sl|_!K+?SJWq+4mi8S| z)DRn+ui}-@mO8ue#@B6}>|S}PwfX0%wK)#eMMw1R!5bH$%=$}p`jN*J zf+$zaU^SJV`dQ?=`PAG+oGq4gxdot-BE%SqRzBngW66U|nykrJD|sy)GRw5EJ@+X86_upuC(wa6~^-kh4X#~)e> zt#heZaHRt^rReu>S6q)$u=T2pb>-y3#SRbnT)%Vo1O@TN5nuKRXtE2A8)zDzU#h5> z?3RqJe1Uo$qT9hW(0jLor{$+tQ?*?Y_Sk>9tcUS)mL)^fzd@uT2hR%k{mkpqxl;Ve zs?9DCDep0*T{aPqaen}j4817FguwI>ZRzU+?UeT1oaJF6q!m0Pdfq4%Y*cvCBJn7hgFN0{7OQ9MsUn(o8`S*L#@1g;fax=XCH2`1h0Pm7NJI8y{%#P< z%KoS1cUk3Vy&Ji6DKh5pfKjv7cY>5h__ZBt#{Rnr#=;t1d6j11^Y*DTGtA7#SJc6? zc9KQMVe~p@hff(3j4$||l~{RDO|nM#5}XWQ?u5TM+2(k5Km}cy?)%lXLDaca2Dwe2 zq2YL_XyIeZrdb^3;|U|p)bi4!u9y^Yid%>f(HJ9R-n)W|uH6|*M*8Y^QO=cb|928~ zzF>qO<&ORD6xF5oOM+IdewQBC^l7{pN`Lc7bjpD6&VQ5ctx7M(Xsxf&pywSib_Q_yn{n3JaZ-2 z1p{_|7cwsonWm>2EDbmWZOs9_L2%rkzft&KCse(zVZ9nQ?ytb*fmRIW<3%CW6C)Y_ E0S0y`!2kdN literal 0 HcmV?d00001 diff --git a/android-llmservice/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android-llmservice/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..e8013b0c9d621a6b240a6fc4c4b600d336acf93d GIT binary patch literal 1671 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 + + + #111111 + diff --git a/android-llmservice/requirements.md b/android-llmservice/requirements.md index 32638ef6e..b84514825 100644 --- a/android-llmservice/requirements.md +++ b/android-llmservice/requirements.md @@ -38,6 +38,7 @@ by hand only (no automated test); `build` = enforced at build/resource-compile t | R1.4 | Native ABIs shipped: **`arm64-v8a`** (phones) and **`x86_64`** (emulators / x86 Android). | `app/build.gradle.kts` | build | | R1.5 | Depends on `net.ladenthin:llama-android` (AAR) + `net.ladenthin:llama-kotlin` (façade), version selectable via `-PjllamaVersion`. | `app/build.gradle.kts` | build | | R1.6 | It is a standalone plain-Gradle/AGP build (NOT a Maven reactor module) and is **not** published to Maven Central. | repo layout | manual | +| R1.7 | The launcher icon is the **shard-`J`** of the java-llama.cpp logo (orange `#F65E00` on `#111111`), shipped as an **adaptive icon** (foreground + `@color/ic_launcher_background`) for API 26+ plus legacy `mipmap-*/ic_launcher.png` for older devices; wired via `android:icon`/`android:roundIcon`. Sourced from the shared `workspace` logo set. | `AndroidManifest.xml`; `res/mipmap-anydpi-v26/ic_launcher.xml`; `res/mipmap-*/ic_launcher*.png`; `res/values/ic_launcher_background.xml` | manual | ## R2 — Privacy & network posture