From 32091d9de9bf1b20d6b8fbf81025903a740fbc93 Mon Sep 17 00:00:00 2001 From: cyan Date: Thu, 11 Jun 2026 23:16:48 +0200 Subject: [PATCH] feat: randomize icon based on branch (thx :konsti:) (#3328) --- .github/workflows/reusable-build.yml | 1 + scripts/android/app_icon.sh | 20 ++++++- scripts/branch_icon.sh | 88 ++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+), 2 deletions(-) create mode 100755 scripts/branch_icon.sh diff --git a/.github/workflows/reusable-build.yml b/.github/workflows/reusable-build.yml index acc209e4e..5d475c71a 100644 --- a/.github/workflows/reusable-build.yml +++ b/.github/workflows/reusable-build.yml @@ -115,6 +115,7 @@ jobs: run: | pushd scripts/android source ./app_env.sh cakewallet + export GITHUB_HUH=yeah ./app_config.sh popd diff --git a/scripts/android/app_icon.sh b/scripts/android/app_icon.sh index 9d7be355a..c8af25c75 100755 --- a/scripts/android/app_icon.sh +++ b/scripts/android/app_icon.sh @@ -12,6 +12,9 @@ ANDROID_ICON_DEST_PATH=$ANDROID_ICON_DIR/ic_launcher.png ANDROID_ICON_SET="" ANDROID_ICON_SET_DEST_PATH=`pwd`/../../android/app/src/main/res +CAKE_ROOT=`pwd`/../../ +BRANCH_NAME=${BRANCH_NAME:-$(git rev-parse --abbrev-ref HEAD)} + case $APP_ANDROID_TYPE in "monero.com") APP_LOGO=$ASSETS_DIR/images/monero.com_logo.png @@ -27,6 +30,19 @@ esac rm $APP_LOGO_DEST_PATH rm $ANDROID_ICON_DEST_PATH -ln -s $APP_LOGO $APP_LOGO_DEST_PATH -ln -s $ANDROID_ICON $ANDROID_ICON_DEST_PATH +cp -a $APP_LOGO $APP_LOGO_DEST_PATH +cp -a $ANDROID_ICON $ANDROID_ICON_DEST_PATH cp -a $ANDROID_ICON_SET/. $ANDROID_ICON_SET_DEST_PATH/ + +set -x +if [[ $GITHUB_HUH == "yeah" ]]; then + pwd + 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 + git checkout HEAD -- $file &> /dev/null + bash $CAKE_ROOT/scripts/branch_icon.sh ${BRANCH_NAME}-asd $file &> /dev/null + done +fi +set +x + + + diff --git a/scripts/branch_icon.sh b/scripts/branch_icon.sh new file mode 100755 index 000000000..00d72b833 --- /dev/null +++ b/scripts/branch_icon.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env bash + +set -euo pipefail + +INPUT_STRING="${1:?Usage: $0 }" +OUTPUT="${2:?Usage: $0 }" + +if [[ ! -f "$OUTPUT" ]]; then + echo "Error: '$OUTPUT' not found." >&2 + exit 1 +fi + +read -r IMG_W IMG_H < <( + ffprobe -v error \ + -select_streams v:0 \ + -show_entries stream=width,height \ + -of csv=p=0 \ + "$OUTPUT" | tr ',' ' ' +) + +if [[ -z "$IMG_W" || -z "$IMG_H" ]]; then + echo "Error: could not read dimensions from '$OUTPUT'." >&2 + exit 1 +fi + +HASH=$(printf '%s' "$INPUT_STRING" | sha256sum | awk '{print $1}') + +chunk1=$(( 16#${HASH:0:8} )) +chunk2=$(( 16#${HASH:8:8} )) +chunk3=$(( 16#${HASH:16:8} )) +chunk4=$(( 16#${HASH:24:8} )) + +R=$(( chunk1 % 256 )) +G=$(( chunk2 % 256 )) +B=$(( chunk3 % 256 )) + +ROTATION=$(( chunk4 % 360 )) + +R2=$(( (chunk1 / 256) % 256 )) +G2=$(( (chunk2 / 256) % 256 )) +B2=$(( (chunk3 / 256) % 256 )) + +STRLEN=${#INPUT_STRING} +TILE_SIZE=$(( 64 + (STRLEN % 192) )) + +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}" +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}" +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}" + +ROTATION_RAD=$(awk "BEGIN { printf \"%.6f\", ${ROTATION} * 3.14159265358979 / 180 }") + +TMPFILE=$(mktemp "${OUTPUT}.tmp.XXXXXX.png") +trap 'rm -f "$TMPFILE"' EXIT + +ffmpeg -y \ + -f lavfi -i "nullsrc=size=${IMG_W}x${IMG_H}:rate=1" \ + -i "$OUTPUT" \ + -filter_complex " + [0:v]geq= + r='${GEQ_R}': + g='${GEQ_G}': + b='${GEQ_B}': + a=255, + format=rgba[bg]; + + [1:v]format=rgba, + geq= + r='r(X,Y)': + g='g(X,Y)': + b='b(X,Y)': + 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)))', + rotate= + angle=${ROTATION_RAD}: + fillcolor=none: + ow=rotw(${ROTATION_RAD}): + oh=roth(${ROTATION_RAD})[ovr]; + + [bg][ovr]overlay= + x=(W-w)/2: + y=(H-h)/2: + format=auto[out] + " \ + -map "[out]" \ + -frames:v 1 \ + -update 1 \ + "$TMPFILE" + +mv "$TMPFILE" "$OUTPUT" \ No newline at end of file