feat(app,android): a new icon, and a launcher label that fits

The icon follows proton-drive-linux's logo: a violet gradient tile with
a darker lower edge, and a white play mark with a soft shadow, cut into
the blocks a revision is fetched in. The SVG, the window PNG and the
Windows .ico are rendered from one source.

On Android it is an adaptive icon with a monochrome layer for themed
icons, and the notification glyph is the same mark. The app is named
"Proton Stream"; the launcher shows "Stream", since "proton-stream" was
cut to "proton-st…".
This commit is contained in:
nvrl committed 2026-10-03 03:45:50 +02:00
1 parent 0d33799199
commit 2d7d895dda
10 files changed
+113 -23

No files matched your search

+2 -1
View File
@@ -11,7 +11,7 @@
android:name=".ProtonStreamApplication"
android:allowBackup="false"
android:dataExtractionRules="@xml/data_extraction_rules"
android:icon="@drawable/ic_launcher_foreground"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.ProtonStream">
@@ -29,6 +29,7 @@
<activity
android:name=".MainActivity"
android:label="@string/launcher_name"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|uiMode|density|fontScale|locale|layoutDirection|keyboardHidden"
android:exported="true"
android:launchMode="singleTask"
@@ -0,0 +1,20 @@
<!--
The launcher tile: packaging/io.narl.proton-stream.svg's face gradient, on
the full 108dp canvas because the launcher cuts its own shape out of it.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp" android:height="108dp"
android:viewportWidth="108" android:viewportHeight="108">
<path android:pathData="M0,0h108v108h-108z">
<aapt:attr name="android:fillColor">
<gradient android:type="linear"
android:startX="0" android:startY="0"
android:endX="108" android:endY="108">
<item android:offset="0" android:color="#FFA48BFF" />
<item android:offset="0.55" android:color="#FF7552FF" />
<item android:offset="1" android:color="#FF5B36F2" />
</gradient>
</aapt:attr>
</path>
</vector>
@@ -1,6 +1,32 @@
<!--
The play mark from packaging/io.narl.proton-stream.svg, cut into the blocks a
revision is fetched in. The paths are in the SVG's 128-unit space; the group
maps its 104-unit tile onto the 72dp a launcher shows of a 108dp layer.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp" android:height="108dp"
android:viewportWidth="108" android:viewportHeight="108">
<path android:fillColor="#CBA6F7" android:pathData="M24,22h60v64h-60z" />
<path android:fillColor="#1E1E2E" android:pathData="M45,39l26,15 -26,15z" />
<group
android:pivotX="64" android:pivotY="62"
android:scaleX="0.6923" android:scaleY="0.6923"
android:translateX="-10" android:translateY="-8">
<group android:translateY="3">
<clip-path android:pathData="M0,0h63v128h-63zM68.5,0h10v128h-10zM84,0h44v128h-44z" />
<path android:fillColor="#4D2E1596" android:pathData="M50,41.5v41a6,6 0,0 0,9.1 5.1l34.2,-20.5a6,6 0,0 0,0 -10.3L59.1,36.4A6,6 0,0 0,50 41.5z" />
</group>
<group>
<clip-path android:pathData="M0,0h63v128h-63zM68.5,0h10v128h-10zM84,0h44v128h-44z" />
<path android:pathData="M50,41.5v41a6,6 0,0 0,9.1 5.1l34.2,-20.5a6,6 0,0 0,0 -10.3L59.1,36.4A6,6 0,0 0,50 41.5z">
<aapt:attr name="android:fillColor">
<gradient android:type="linear"
android:startX="0" android:startY="36"
android:endX="0" android:endY="88">
<item android:offset="0" android:color="#FFFFFFFF" />
<item android:offset="1" android:color="#FFECE6FF" />
</gradient>
</aapt:attr>
</path>
</group>
</group>
</vector>
@@ -0,0 +1,12 @@
<!-- The foreground's glyph as one flat shape, for themed launcher icons. -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp" android:height="108dp"
android:viewportWidth="108" android:viewportHeight="108">
<group
android:pivotX="64" android:pivotY="62"
android:scaleX="0.6923" android:scaleY="0.6923"
android:translateX="-10" android:translateY="-8">
<clip-path android:pathData="M0,0h63v128h-63zM68.5,0h10v128h-10zM84,0h44v128h-44z" />
<path android:fillColor="#FFFFFFFF" android:pathData="M50,41.5v41a6,6 0,0 0,9.1 5.1l34.2,-20.5a6,6 0,0 0,0 -10.3L59.1,36.4A6,6 0,0 0,50 41.5z" />
</group>
</vector>
@@ -1,13 +1,16 @@
<!--
The status-bar glyph. Android tints small icons to a single colour and drops
everything that is not opaque, so this is the launcher mark reduced to one
white silhouette rather than the two-tone drawable.
everything that is not opaque, so this is the launcher's sliced play mark as
one white silhouette, scaled from the SVG's 128-unit space onto 24dp.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp" android:height="24dp"
android:viewportWidth="24" android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:fillType="evenOdd"
android:pathData="M4,4h16v16h-16zM10,8.5l5.5,3.5 -5.5,3.5z" />
<group
android:pivotX="70" android:pivotY="62"
android:scaleX="0.37" android:scaleY="0.37"
android:translateX="-58" android:translateY="-50">
<clip-path android:pathData="M0,0h63v128h-63zM68.5,0h10v128h-10zM84,0h44v128h-44z" />
<path android:fillColor="#FFFFFFFF" android:pathData="M50,41.5v41a6,6 0,0 0,9.1 5.1l34.2,-20.5a6,6 0,0 0,0 -10.3L59.1,36.4A6,6 0,0 0,50 41.5z" />
</group>
</vector>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_monochrome" />
</adaptive-icon>
+7 -1
View File
@@ -1,3 +1,9 @@
<resources>
<string name="app_name">proton-stream</string>
<!-- Settings, recents, notifications and the share sheet: room for the full name. -->
<string name="app_name">Proton Stream</string>
<!--
Under the launcher icon, where about ten characters fit before the
launcher cuts the label off; "proton-stream" showed as "proton-st…".
-->
<string name="launcher_name">Stream</string>
</resources>