From 32091d9de9bf1b20d6b8fbf81025903a740fbc93 Mon Sep 17 00:00:00 2001 From: cyan Date: Thu, 11 Jun 2026 23:16:48 +0200 Subject: [PATCH 1/3] 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 From ff2a9958087c412ebbf236a1936edfd900bd13b1 Mon Sep 17 00:00:00 2001 From: Omar Date: Thu, 11 Jun 2026 23:48:04 +0200 Subject: [PATCH 2/3] Remove path from error message --- cw_monero/lib/api/transaction_history.dart | 23 +++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/cw_monero/lib/api/transaction_history.dart b/cw_monero/lib/api/transaction_history.dart index fd6004140..877f0a910 100644 --- a/cw_monero/lib/api/transaction_history.dart +++ b/cw_monero/lib/api/transaction_history.dart @@ -17,6 +17,19 @@ import 'package:monero/src/generated_bindings_monero.g.dart' as monero_gen; import 'package:mutex/mutex.dart'; +String _formatTransactionError(String error) { + final message = error.replaceAll( + RegExp( + r'(?:[A-Za-z]:)?[\\/][^\s:]*\.(?:c|cc|cpp|cxx|h|hpp|hxx):\d+:(?:[A-Za-z0-9_]+:)?\s*', + ), + '', + ); + if (message.contains("RPC error")) { + return "Invalid node response, please try again or switch node\n\ntrace: $message"; + } + return message; +} + Map> txKeys = {}; String getTxKey(String txId) { txKeys[currentWallet!.ffiAddress()] ??= {}; @@ -184,11 +197,7 @@ Future createTransactionSync( })(); if (error != null) { - String message = error; - if (message.contains("RPC error")) { - message = "Invalid node response, please try again or switch node\n\ntrace: $message"; - } - throw CreationTransactionException(message: message); + throw CreationTransactionException(message: _formatTransactionError(error)); } final rAmt = pendingTx.amount(); @@ -237,7 +246,7 @@ Future createTransactionMultDest( final Wallet2PendingTransaction tx = MoneroPendingTransaction(txptr); if (tx.status() != 0) { - throw CreationTransactionException(message: tx.errorString()); + throw CreationTransactionException(message: _formatTransactionError(tx.errorString())); } return PendingTransactionDescription( @@ -282,7 +291,7 @@ Future commitTransaction({required Wallet2PendingTransaction tx, requir } if (error != null && error != "no tx keys found for this txid") { - throw CreationTransactionException(message: error); + throw CreationTransactionException(message: _formatTransactionError(error)); } unawaited(() async { storeSync(force: true); From d64199e15a0d4d1c740ed65c500d0649613a0888 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BSN=20=E2=88=9E/21M?= Date: Fri, 12 Jun 2026 00:20:09 +0200 Subject: [PATCH 3/3] 26-06-09_Update Translation_de_DE (#3319) * 26-03-14_Update Translation_de_DE * 26-03-31_Update Translation_de_DE * 26-03-31_Update Fix * 26-04-08_Update Translation_de_DE * 26-05-05_TRanslation_de_DE * 26-05-21_Update Translation_de_DE * 26-06-03_Update Translation_de_DE * 26-06-09_Update Translation_de_DE --- res/values/strings_de.arb | 40 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index ab74cb166..9eaa018d6 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -1418,5 +1418,41 @@ "zcash_card_enable_later": "Sie können diese Karte jederzeit später in den Einstellungen aktivieren", "zcash_card_missing_funds": "Fehlende Gelder?", "zcash_card_scan": "Scannen", - "zcash_card_warning": "Schließen Sie die App nicht, bis der Vorgang abgeschlossen ist. Andernfalls muss der Vorgang von Grund auf neu gestartet werden." -} \ No newline at end of file + "zcash_card_warning": "Schließen Sie die App nicht, bis der Vorgang abgeschlossen ist. Andernfalls muss der Vorgang von Grund auf neu gestartet werden.", + "are_you_sure_exit": "Möchten Sie die App wirklich verlassen?", + "available": "Verfügbar", + "bridging": "Bridge-Vorgang", + "compatible_services": "Kompatible Dienste", + "compatible_services_desc": "Verwenden Sie das Scan-Tool, um die folgenden von Cake Wallet unterstützten QR-Code-Typen zu lesen:", + "crypto_addresses": "Krypto-Adressen", + "delete_this_node": "Diesen Node löschen", + "device_confirmation": "Gerätebestätigung", + "durres_PIN": "Notfall-PIN", + "durres_PIN_set_up_successfully": "Die Notfall-PIN wurde erfolgreich eingerichtet", + "favorite_token": "Bevorzugter Token", + "favorite_token_desc": "Der Kontostand des bevorzugten Tokens wird auf der Guthabenkarte angezeigt.", + "gallery": "Galerie", + "hww_exit_desc": "Dadurch wird der laufende Kopplungsvorgang mit Ihrem Hardware-Gerät beendet", + "ignor": "Ignorieren", + "input": "Eingabe", + "manual_input": "Manuelle Eingabe", + "networks": "Netzwerke", + "node_share_desc": "Scannen Sie diesen QR-Code im Scan-Bildschirm, um diesen Node zu importieren.", + "nodes_desc": "Verwalten Sie bestehende Nodes oder fügen Sie einen benutzerdefinierten Node hinzu.", + "ocp_desc": "Mit Krypto im Geschäft bezahlen", + "pairing_code": "Kopplungscode", + "pairing_code_desc_1": "Ihr Gerät zeigt einen Kopplungscode an.", + "pairing_code_desc_2": "Geben Sie ihn hier ein, um fortzufahren", + "pairing_error": "Kopplungsfehler", + "passphrase_view_keys": "Passphrase", + "payment_invoices": "Zahlungsanfragen", + "save_contact": "Kontakt speichern", + "share_this_node": "Diesen Node teilen", + "show_combined_balance": "Kombinierten Kontostand anzeigen", + "swipe_to_bridge": "Zum Bridging wischen", + "this_can_take_few_seconds": "Dies kann einige Sekunden dauern", + "verifying_code": "Code wird überprüft", + "wallet_balance": "Wallet-Guthaben", + "wc_desc": "Einfach mit DApps verbinden", + "yes_exit": "Ja, beenden" +}