feat: randomize icon based on branch (thx :konsti:) (#3328)

cyan committed Jun 11, 2026 at 23:16 UTC 32091d9de9bf1b20d6b8fbf81025903a740fbc93
3 files changed +107 -2
.github/workflows/reusable-build.yml
+1
@@ -115,6 +115,7 @@ jobs:
115 run: |
116 pushd scripts/android
117 source ./app_env.sh cakewallet
118 + export GITHUB_HUH=yeah
119 ./app_config.sh
120 popd
121
scripts/android/app_icon.sh
+18 -2
@@ -12,6 +12,9 @@ ANDROID_ICON_DEST_PATH=$ANDROID_ICON_DIR/ic_launcher.png
12 ANDROID_ICON_SET=""
13 ANDROID_ICON_SET_DEST_PATH=`pwd`/../../android/app/src/main/res
14
15 +CAKE_ROOT=`pwd`/../../
16 +BRANCH_NAME=${BRANCH_NAME:-$(git rev-parse --abbrev-ref HEAD)}
17 +
18 case $APP_ANDROID_TYPE in
19 "monero.com")
20 APP_LOGO=$ASSETS_DIR/images/monero.com_logo.png
@@ -27,6 +30,19 @@ esac
30
31 rm $APP_LOGO_DEST_PATH
32 rm $ANDROID_ICON_DEST_PATH
30 -ln -s $APP_LOGO $APP_LOGO_DEST_PATH
31 -ln -s $ANDROID_ICON $ANDROID_ICON_DEST_PATH
33 +cp -a $APP_LOGO $APP_LOGO_DEST_PATH
34 +cp -a $ANDROID_ICON $ANDROID_ICON_DEST_PATH
35 cp -a $ANDROID_ICON_SET/. $ANDROID_ICON_SET_DEST_PATH/
36 +
37 +set -x
38 +if [[ $GITHUB_HUH == "yeah" ]]; then
39 + pwd
40 + for file in $(find $CAKE_ROOT/android/app/src/main/res -name "*.png") $APP_LOGO $CAKEWALLET_PATH $ASSETS_DIR/images/cakewallet_logo.png $ASSETS_DIR/images/cakewallet_icon_*.png $(find $CAKEWALLET_ICON_SET_PATH -name "*.png"); do
41 + git checkout HEAD -- $file &> /dev/null
42 + bash $CAKE_ROOT/scripts/branch_icon.sh ${BRANCH_NAME}-asd $file &> /dev/null
43 + done
44 +fi
45 +set +x
46 +
47 +
48 +
scripts/branch_icon.sh new
+88
@@ -0,0 +1,88 @@
1 +#!/usr/bin/env bash
2 +
3 +set -euo pipefail
4 +
5 +INPUT_STRING="${1:?Usage: $0 <seed_string> <result.png>}"
6 +OUTPUT="${2:?Usage: $0 <seed_string> <result.png>}"
7 +
8 +if [[ ! -f "$OUTPUT" ]]; then
9 + echo "Error: '$OUTPUT' not found." >&2
10 + exit 1
11 +fi
12 +
13 +read -r IMG_W IMG_H < <(
14 + ffprobe -v error \
15 + -select_streams v:0 \
16 + -show_entries stream=width,height \
17 + -of csv=p=0 \
18 + "$OUTPUT" | tr ',' ' '
19 +)
20 +
21 +if [[ -z "$IMG_W" || -z "$IMG_H" ]]; then
22 + echo "Error: could not read dimensions from '$OUTPUT'." >&2
23 + exit 1
24 +fi
25 +
26 +HASH=$(printf '%s' "$INPUT_STRING" | sha256sum | awk '{print $1}')
27 +
28 +chunk1=$(( 16#${HASH:0:8} ))
29 +chunk2=$(( 16#${HASH:8:8} ))
30 +chunk3=$(( 16#${HASH:16:8} ))
31 +chunk4=$(( 16#${HASH:24:8} ))
32 +
33 +R=$(( chunk1 % 256 ))
34 +G=$(( chunk2 % 256 ))
35 +B=$(( chunk3 % 256 ))
36 +
37 +ROTATION=$(( chunk4 % 360 ))
38 +
39 +R2=$(( (chunk1 / 256) % 256 ))
40 +G2=$(( (chunk2 / 256) % 256 ))
41 +B2=$(( (chunk3 / 256) % 256 ))
42 +
43 +STRLEN=${#INPUT_STRING}
44 +TILE_SIZE=$(( 64 + (STRLEN % 192) ))
45 +
46 +GEQ_R="between(mod((X+Y),${TILE_SIZE}),0,$(( TILE_SIZE / 2 )))*${R} + between(mod((X+Y),${TILE_SIZE}),$(( TILE_SIZE / 2 + 1 )),${TILE_SIZE})*${R2}"
47 +GEQ_G="between(mod((X+Y),${TILE_SIZE}),0,$(( TILE_SIZE / 2 )))*${G} + between(mod((X+Y),${TILE_SIZE}),$(( TILE_SIZE / 2 + 1 )),${TILE_SIZE})*${G2}"
48 +GEQ_B="between(mod((X+Y),${TILE_SIZE}),0,$(( TILE_SIZE / 2 )))*${B} + between(mod((X+Y),${TILE_SIZE}),$(( TILE_SIZE / 2 + 1 )),${TILE_SIZE})*${B2}"
49 +
50 +ROTATION_RAD=$(awk "BEGIN { printf \"%.6f\", ${ROTATION} * 3.14159265358979 / 180 }")
51 +
52 +TMPFILE=$(mktemp "${OUTPUT}.tmp.XXXXXX.png")
53 +trap 'rm -f "$TMPFILE"' EXIT
54 +
55 +ffmpeg -y \
56 + -f lavfi -i "nullsrc=size=${IMG_W}x${IMG_H}:rate=1" \
57 + -i "$OUTPUT" \
58 + -filter_complex "
59 + [0:v]geq=
60 + r='${GEQ_R}':
61 + g='${GEQ_G}':
62 + b='${GEQ_B}':
63 + a=255,
64 + format=rgba[bg];
65 +
66 + [1:v]format=rgba,
67 + geq=
68 + r='r(X,Y)':
69 + g='g(X,Y)':
70 + b='b(X,Y)':
71 + a='if(gte(r(X,Y)+g(X,Y)+b(X,Y),720),0,if(lte(r(X,Y)+g(X,Y)+b(X,Y),15)*gte(alpha(X,Y),250),0,alpha(X,Y)))',
72 + rotate=
73 + angle=${ROTATION_RAD}:
74 + fillcolor=none:
75 + ow=rotw(${ROTATION_RAD}):
76 + oh=roth(${ROTATION_RAD})[ovr];
77 +
78 + [bg][ovr]overlay=
79 + x=(W-w)/2:
80 + y=(H-h)/2:
81 + format=auto[out]
82 + " \
83 + -map "[out]" \
84 + -frames:v 1 \
85 + -update 1 \
86 + "$TMPFILE"
87 +
88 +mv "$TMPFILE" "$OUTPUT"
\ No newline at end of file