Swap app icon to the v3 design (record button + transcript mic)
- new icon source in icon/ (make_icon_v3.py + masters): near-black gradient tile, red record button with white bezel, mic capsule as a transcript card with red lines and a cursor - Android: adaptive icon uses the 512px master as the full-bleed background layer (launcher masks crop it to shape) with a transparent foreground; old vector foreground and launcher color removed - desktop: hicolor PNGs replaced at 32-512 px (48 regenerated from the master), old SVG removed; install.sh picks them up unchanged - APK installed on the Fairphone; aapt2 confirms the adaptive icon
@@ -182,7 +182,7 @@ install.sh install / uninstall into a local prefix
|
||||
bin/meetrec GUI launcher (installed into ~/.local/bin)
|
||||
bin/meetrec-cli CLI launcher (installed into ~/.local/bin)
|
||||
share/applications/meetrec.desktop XDG desktop entry
|
||||
share/icons/hicolor/ app icon (SVG + PNG fallbacks)
|
||||
share/icons/hicolor/ app icon (PNGs; source: icon/make_icon_v3.py)
|
||||
android/ native Android app (Kotlin + whisper.cpp JNI)
|
||||
```
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 70 B |
@@ -1,31 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="108"
|
||||
android:viewportHeight="108">
|
||||
<!-- MeetRec glyph: mic + waveform (voice becoming transcript). -->
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M45.6,24.6h16.8a8.4,8.4 0 0 1 8.4,8.4v8.4a8.4,8.4 0 0 1 -8.4,8.4h-16.8a8.4,8.4 0 0 1 -8.4,-8.4v-8.4a8.4,8.4 0 0 1 8.4,-8.4z" />
|
||||
<path
|
||||
android:strokeColor="#FFFFFF"
|
||||
android:strokeWidth="5.4"
|
||||
android:strokeLineCap="round"
|
||||
android:pathData="M37.2,42.6 v4.8 a16.8,16.8 0 0 0 33.6,0 v-4.8" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M34.8,71.4h4.8a2.4,2.4 0 0 1 2.4,2.4v3.6a2.4,2.4 0 0 1 -2.4,2.4h-4.8a2.4,2.4 0 0 1 -2.4,-2.4v-3.6a2.4,2.4 0 0 1 2.4,-2.4z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M43.2,68.4h4.8a2.4,2.4 0 0 1 2.4,2.4v9.6a2.4,2.4 0 0 1 -2.4,2.4h-4.8a2.4,2.4 0 0 1 -2.4,-2.4v-9.6a2.4,2.4 0 0 1 2.4,-2.4z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M51.6,70.8h4.8a2.4,2.4 0 0 1 2.4,2.4v4.8a2.4,2.4 0 0 1 -2.4,2.4h-4.8a2.4,2.4 0 0 1 -2.4,-2.4v-4.8a2.4,2.4 0 0 1 2.4,-2.4z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M59.9,68.4h4.8a2.4,2.4 0 0 1 2.4,2.4v9.6a2.4,2.4 0 0 1 -2.4,2.4h-4.8a2.4,2.4 0 0 1 -2.4,-2.4v-9.6a2.4,2.4 0 0 1 2.4,-2.4z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M68.4,71.4h4.8a2.4,2.4 0 0 1 2.4,2.4v3.6a2.4,2.4 0 0 1 -2.4,2.4h-4.8a2.4,2.4 0 0 1 -2.4,-2.4v-3.6a2.4,2.4 0 0 1 2.4,-2.4z" />
|
||||
</vector>
|
||||
@@ -1,5 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/launcher_bg" />
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||
<!-- meetrec icon v3 (see icon/make_icon_v3.py): near-black gradient
|
||||
tile with a red record button; used full-bleed as the background
|
||||
layer so the launcher mask crops it to shape. -->
|
||||
<background android:drawable="@drawable/ic_launcher_bg" />
|
||||
<foreground android:drawable="@drawable/ic_launcher_fg" />
|
||||
</adaptive-icon>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/launcher_bg" />
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||
<background android:drawable="@drawable/ic_launcher_bg" />
|
||||
<foreground android:drawable="@drawable/ic_launcher_fg" />
|
||||
</adaptive-icon>
|
||||
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="launcher_bg">#C0392B</color>
|
||||
</resources>
|
||||
@@ -0,0 +1,65 @@
|
||||
#!/usr/bin/env python3
|
||||
"""MeetRec icon v3 — mic/transcript glyph inside a big record button.
|
||||
Gradient tile + soft shadow + large red record circle; the mic whose
|
||||
capsule is a transcript card sits inside the button.
|
||||
"""
|
||||
import numpy as np
|
||||
from PIL import Image, ImageDraw, ImageFilter
|
||||
|
||||
S = 512
|
||||
RADIUS = 116
|
||||
|
||||
def vgrad(c_top, c_bot):
|
||||
"""Vertical gradient as an RGB ndarray (S, S, 3)."""
|
||||
c_top = np.array(c_top, dtype=float)
|
||||
c_bot = np.array(c_bot, dtype=float)
|
||||
t = (np.arange(S)[:, None, None] / (S - 1))
|
||||
arr = c_top[None, None, :] * (1 - t) + c_bot[None, None, :] * t
|
||||
return np.repeat(arr, S, axis=1).astype(np.uint8)
|
||||
|
||||
# --- Near-black tile background (subtle depth) ---
|
||||
bg = vgrad((0x18, 0x18, 0x18), (0x00, 0x00, 0x00))
|
||||
img = Image.fromarray(np.dstack([bg, np.full((S, S), 255, np.uint8)]), "RGBA")
|
||||
|
||||
# --- Rounded-square mask (app tile) ---
|
||||
mask = Image.new("L", (S, S), 0)
|
||||
ImageDraw.Draw(mask).rounded_rectangle([0, 0, S - 1, S - 1], radius=RADIUS, fill=255)
|
||||
out = Image.new("RGBA", (S, S), (0, 0, 0, 0))
|
||||
out.paste(img, (0, 0), mask)
|
||||
|
||||
# --- Big record button (red vertical gradient circle) ---
|
||||
CX, CY, R = 256, 256, 176
|
||||
red = vgrad((0xFF, 0x8A, 0x8A), (0xDD, 0x2B, 0x3A))
|
||||
red_img = Image.fromarray(np.dstack([red, np.full((S, S), 255, np.uint8)]), "RGBA")
|
||||
circ = Image.new("L", (S, S), 0)
|
||||
ImageDraw.Draw(circ).ellipse([CX - R, CY - R, CX + R, CY + R], fill=255)
|
||||
out.paste(red_img, (0, 0), circ)
|
||||
|
||||
d = ImageDraw.Draw(out)
|
||||
WHITE = (255, 255, 255, 255)
|
||||
REDINK = (0xD9, 0x26, 0x37, 255) # red "text" on the white card
|
||||
|
||||
# --- Button bezel ring ---
|
||||
d.ellipse([CX - R - 14, CY - R - 14, CX + R + 14, CY + R + 14],
|
||||
outline=(255, 255, 255, 190), width=6)
|
||||
|
||||
# --- Mic/transcript glyph (v2 design, centered in the button) ---
|
||||
# Capsule = transcript card
|
||||
d.rounded_rectangle([192, 117, 320, 277], radius=30, fill=WHITE)
|
||||
# Text lines + typing cursor
|
||||
d.rounded_rectangle([214, 149, 298, 161], radius=6, fill=REDINK)
|
||||
d.rounded_rectangle([214, 181, 298, 193], radius=6, fill=REDINK)
|
||||
d.rounded_rectangle([214, 213, 274, 225], radius=6, fill=REDINK)
|
||||
d.rounded_rectangle([214, 245, 254, 257], radius=6, fill=REDINK)
|
||||
d.rounded_rectangle([266, 242, 273, 260], radius=3, fill=REDINK)
|
||||
# Cradle, stem, base
|
||||
d.arc([178, 155, 334, 335], start=0, end=180, fill=WHITE, width=18)
|
||||
d.line([256, 333, 256, 369], fill=WHITE, width=18)
|
||||
d.rounded_rectangle([212, 365, 300, 387], radius=11, fill=WHITE)
|
||||
|
||||
# --- Export sizes ---
|
||||
master = out.resize((1024, 1024), Image.LANCZOS)
|
||||
for sz in [1024, 512, 256, 128, 64, 32]:
|
||||
master.resize((sz, sz), Image.LANCZOS).save(f"meetrec-icon-v3-{sz}.png")
|
||||
|
||||
print("done")
|
||||
|
After Width: | Height: | Size: 140 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 5.4 KiB |
@@ -1,26 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="128" height="128" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg">
|
||||
<title>MeetRec</title>
|
||||
<defs>
|
||||
<linearGradient id="bg" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0" stop-color="#e74c3c"/>
|
||||
<stop offset="1" stop-color="#922b21"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<rect x="4" y="4" width="120" height="120" rx="28" fill="url(#bg)"/>
|
||||
|
||||
<!-- microphone: capsule + cradle -->
|
||||
<rect x="50" y="18" width="28" height="42" rx="14" fill="#ffffff"/>
|
||||
<path d="M 36 48 v 8 a 28 28 0 0 0 56 0 v -8"
|
||||
fill="none" stroke="#ffffff" stroke-width="9" stroke-linecap="round"/>
|
||||
|
||||
<!-- waveform: voice becoming transcript -->
|
||||
<g fill="#ffffff">
|
||||
<rect x="32" y="96" width="8" height="14" rx="4"/>
|
||||
<rect x="46" y="91" width="8" height="24" rx="4"/>
|
||||
<rect x="60" y="95" width="8" height="16" rx="4"/>
|
||||
<rect x="74" y="91" width="8" height="24" rx="4"/>
|
||||
<rect x="88" y="96" width="8" height="14" rx="4"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1009 B |