Conversation
📝 WalkthroughWalkthroughThis PR enhances observability and refactors core wallet operations. Changes include adding Glide failure logging, updating a navigation dialog reference, disabling strict mode with a TODO marker, modifying address retrieval behavior, adding ANR monitoring to coin sends with relocated signing logic, and refactoring transaction confidence listening with a new helper function and threading adjustments. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 20
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (7)
wallet/res/values-fil/strings-extra.xml (1)
290-290:⚠️ Potential issue | 🟡 MinorCopyright year may need updating.
The copyright string still reads "2025" but the current year is 2026. If this is updated in the default
values/strings.xml, this locale-specific file should follow suit.wallet/androidTest/de/schildbach/wallet/security/SecurityGuardMultiThreadingTest.kt (1)
1587-1590:⚠️ Potential issue | 🟡 MinorBug:
corruptedPinis defined but never used —corruptedPasswordis written to the PIN key alias instead.Line 1589 writes
corruptedPasswordtoUI_PIN_KEY_ALIAS, but line 1587 definescorruptedPinfor that purpose. This is a copy-paste error.Proposed fix
val corruptedPin = "CORRUPTED_PIN_2345" sharedPreferences.edit() - .putString(SecurityGuard.UI_PIN_KEY_ALIAS, corruptedPassword) + .putString(SecurityGuard.UI_PIN_KEY_ALIAS, corruptedPin) .apply()wallet/src/de/schildbach/wallet/service/BlockchainServiceImpl.kt (1)
934-955:⚠️ Potential issue | 🟠 Major
onCapabilitiesChangeddoesn't updateavailableNetworks, creating inconsistency withonLost.When a network's capabilities change to lose
NET_CAPABILITY_VALIDATED, the NETWORK impediment is added unconditionally (line 950), even if other validated networks exist inavailableNetworks. This can cause false impediments during network transitions (e.g., WiFi→cellular handoff).Additionally, a network that loses validation remains in
availableNetworks, so whenonLostfires later,availableNetworksmay still be non-empty, preventing the impediment from being set when it should be.Consider updating
availableNetworkshere to stay consistent:Suggested fix
override fun onCapabilitiesChanged(network: Network, capabilities: NetworkCapabilities) { serviceScope.launch { val hasInternet = capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) val hasValidated = capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) if (log.isInfoEnabled) { val s = StringBuilder("network capabilities changed: ") .append(network) .append(", hasInternet: ").append(hasInternet) .append(", validated: ").append(hasValidated) log.info(s.toString()) } if (hasInternet && hasValidated) { + availableNetworks.add(network) impediments.remove(Impediment.NETWORK) } else { - impediments.add(Impediment.NETWORK) + availableNetworks.remove(network) + if (availableNetworks.isEmpty()) { + impediments.add(Impediment.NETWORK) + } } updateBlockchainStateImpediments() check() } }wallet/src/de/schildbach/wallet/payments/SendCoinsTaskRunner.kt (1)
462-500:⚠️ Potential issue | 🟡 Minor
monitorJobis not cancelled ifcheckBalanceConditionsthrows.If
checkBalanceConditionson Line 464 throwsLeftoverBalanceException, execution exitswithContextwithout entering thetryblock, so neither cancel at Line 486 nor Line 489 is reached. The monitor coroutine will fire a spurious ANR warning ~1s later.Consider wrapping the entire block in
try/finallyor using a structured approach:Proposed fix
val monitorJob = launch(Dispatchers.IO) { ... } - if (checkBalanceConditions) { - checkBalanceConditions(wallet, sendRequest.tx) - } - - try { + try { + if (checkBalanceConditions) { + checkBalanceConditions(wallet, sendRequest.tx) + } + log.info("sending: {}", sendRequest) ... } catch (ex: Exception) { monitorJob.cancel() ... + } finally { + monitorJob.cancel() }Alternatively, a single
finally { monitorJob.cancel() }would cover all exit paths and remove the need for the two explicitcancel()calls.wallet/src/de/schildbach/wallet/ui/send/SendCoinsViewModel.kt (1)
273-274:⚠️ Potential issue | 🟡 MinorPre-existing bug: error message is contradictory.
The guard checks
!isAssetLock, so when it triggers,isAssetLockisfalse. But the message says"must be true, but is true"— both clauses say "true".🐛 Suggested fix
- error("isAssetLock must be true, but is true") + error("isAssetLock must be true, but is false")wallet/src/de/schildbach/wallet/service/platform/work/RestoreIdentityWorker.kt (1)
176-437:⚠️ Potential issue | 🟠 MajorFix earliestCreatedAt calculation to use each contender document.
minOf { ... }currently usesdocumentWithVotesfrom the outer loop, so the “earliest” timestamp is computed from a single document rather than all contenders. This can produce incorrect voting start times and scheduling. Apply the fix in both the “current contests” and “all contests” branches.🛠️ Suggested fix (apply in both blocks)
- val earliestCreatedAt = voteContenders.map.values.minOf { - val document = documentWithVotes.serializedDocument?.let { platformRepo.platform.names.deserialize(it) } - document?.createdAt ?: 0 - } + val earliestCreatedAt = voteContenders.map.values.minOf { contender -> + val document = contender.serializedDocument?.let { platformRepo.platform.names.deserialize(it) } + document?.createdAt ?: 0 + }wallet/res/values-zh-rTW/strings-extra.xml (1)
454-455:⚠️ Potential issue | 🟡 MinorRemove the pinyin note from
timeskew_behind.
The extra “Zài hòumiàn” line will surface in the UI and looks like a translation note.Proposed fix
- <string name="timeskew_behind">在後面 -Zài hòumiàn</string> + <string name="timeskew_behind">在後面</string>
🤖 Fix all issues with AI agents
In `@features/exploredash/src/main/res/values-el/strings-explore-dash.xml`:
- Around line 194-195: The string resource purchase_check_current_balance
currently reads "Δείτε τις λεπτομέρειες της κάρτας" which implies viewing card
details; update the value to explicitly indicate checking a gift-card balance
(e.g., "Ελέγξτε το υπόλοιπο της κάρτας" or another approved translation) in the
strings-explore-dash.xml so the CTA matches the balance-check action; ensure
purchase_check_current_balance is used consistently where balance checks are
shown and adjust any related copy (purchase_card_number) only if needed for
context.
In `@features/exploredash/src/main/res/values-sk/strings-explore-dash.xml`:
- Line 69: The file mixes two terms for gift card — "karta"/"karty" and the new
"poukážka"/"poukážky" — causing inconsistent UX; update the remaining string
resources (e.g., ctx_gift_cards, explore_payment_gift_card,
explore_filter_gift_cards, explore_pay_gift_card, gift_card_types,
purchase_gift_card_total_label, purchase_gift_card_details,
gift_card_purchase_failed, gift_card_out_of_stock_error, barcode_placeholder and
the groups around lines 162-169, 191, 206-207, 225, 238-245, 262) to use
"poukážka"/"poukážky" with correct Slovak forms and grammar, keeping the
already-changed explore_buy_gift_card terminology, and run a quick grep through
strings-explore-dash.xml to ensure no residual "karta"/"karty" remain.
In `@wallet/res/values-de/strings-dashpay.xml`:
- Around line 57-58: The message for string name
"invitation_username_already_found_voting_message" is inconsistent with the key
(it says the user already has a username); update its German text to reflect the
“already requested” state instead—e.g., change the value for
invitation_username_already_found_voting_message so it reads that the user has
already requested/asked for this Dash username (for example: "Du kannst diese
Einladung nicht beanspruchen, da du diesen Dash‑Nutzernamen bereits angefragt
hast.").
In `@wallet/res/values-el/strings-dashpay.xml`:
- Around line 536-537: The string resource username_types_message contains a
typographical error: a double period ("..") after "θα εγκριθούν αυτόματα..";
edit the <string name="username_types_message"> value to replace the double
period with a single period (ensure proper spacing and punctuation remain
intact) so the UI displays "θα εγκριθούν αυτόματα." instead of "θα εγκριθούν
αυτόματα..".
In `@wallet/res/values-el/strings-extra.xml`:
- Around line 338-340: Update the Greek string resource welcome_screen_title_1
to remove the contradictory word "χωρίς" so it reads naturally as "Στείλτε και
λάβετε Dash μέσω ονομάτων χρήσης" (or use "μέσω ονομάτων χρήστη" if preferred
for singular/plural consistency); edit the value for string
name="welcome_screen_title_1" accordingly to reflect the corrected wording.
In `@wallet/res/values-es/strings-dashpay.xml`:
- Around line 20-23: Update the Spanish string entries: in
new_account_secondary_confirm_message remove the stray "1" before the
placeholder so the value becomes "Elegiste %s como nombre de usuario
instantáneo..." (keep the %s placeholder intact), and in invitation_title remove
the trailing space so the value is "Invitación". Edit the values for string
names new_account_secondary_confirm_message and invitation_title accordingly.
In `@wallet/res/values-es/strings-extra.xml`:
- Line 268: The string resource menu_invite_title contains a Spanish typo
("Invitaciónes"); update the value for the resource named menu_invite_title to
the correct plural "Invitaciones" so the XML entry reads the plural without the
accent.
In `@wallet/res/values-es/strings.xml`:
- Around line 206-212: The string resource restore_wallet_selected_date contains
a stray character ("1%s") that causes an extra character to appear in the UI;
update the value to use the proper format placeholder (for example "Seleccionó:
%s" or "Seleccionado: %s" depending on intended gender) instead of "Selecciono:
1%s" so the placeholder is rendered correctly; modify the string with name
restore_wallet_selected_date to remove the "1" and correct the accent on
"Seleccionó" if desired.
In `@wallet/res/values-fa/strings-dashpay.xml`:
- Around line 541-544: The Persian string create_instant_username_description
contains a typo "در عیر این صورت"; update that string value to use the correct
phrase "در غیر این صورت" within the <string
name="create_instant_username_description"> entry so the description reads
correctly.
- Line 19: The string resource new_account_secondary_confirm_message contains
"%sرا" without a space; update the resource value so there's a space after the
format placeholder ("%s را") to correct Persian spacing, i.e., edit the value of
new_account_secondary_confirm_message to insert a space between %s and را.
In `@wallet/res/values-fil/strings-dashpay.xml`:
- Line 525: The localization string invitation_fee_noncontested_message is
truncated and missing terminal punctuation and a clear conjunction; update the
Filippino string for the key "invitation_fee_noncontested_message" to match the
default/values/ source by replacing the ambiguous comma with "o" (or) between
the two criteria and add a period at the end so the sentence reads clearly and
completes the thought.
- Around line 534-538: Add the missing Filipino translations for the three
string resources used in the instant username flow:
create_instant_username_title, create_instant_username_description, and
create_instant_username_button; locate the nearby existing keys like
create_instant_username_cancel and accept_invitation_create in
strings-dashpay.xml and insert the three new <string
name="create_instant_username_title">, <string
name="create_instant_username_description">, and <string
name="create_instant_username_button"> entries with appropriate Filipino text so
the locale matches other translations and prevents English fallback.
In `@wallet/res/values-fr/strings-dashpay.xml`:
- Line 533: The string resource request_username_invitation_not_mixed_message
uses the masculine past participle "créé"; change it to the feminine form
"créée" so the message reads "L'invitation a été créée avec des fonds non
mélangés" (preserve the existing escaping/quote style around the string value
and update only the word "créé" to "créée").
In `@wallet/res/values-id/strings-dashpay.xml`:
- Around line 542-545: The string resource create_instant_username_title
contains a double space between "Buat" and "sebuah"; edit the value of the
<string name="create_instant_username_title"> entry to remove the extra space so
it reads "Buat sebuah nama pengguna instan" (keep the same string name and XML
structure).
In `@wallet/res/values-ko/strings-dashpay.xml`:
- Line 537: The KO strings file only contains create_instant_username_cancel;
add the missing keys used by the new instant-username flow (e.g.,
create_instant_username_title, create_instant_username_description,
create_instant_username_confirm and request_instant_username if used) with
Korean translations so the UI does not fallback to default text; update
strings-dashpay.xml by inserting these <string name="..."> entries using
appropriate Korean text matching the tone of the existing entries and keep the
same key names (create_instant_username_title,
create_instant_username_description, create_instant_username_confirm,
request_instant_username) so the app picks them up.
In `@wallet/res/values-nl/strings-dashpay.xml`:
- Line 527: The string resource invitation_fee_noncontested contains a leading
space (" Niet betwist") which will render in the UI; remove the leading
whitespace in the value so it becomes "Niet betwist" by updating the string with
name="invitation_fee_noncontested" to trim the leading space.
- Line 454: The string resource request_username_length_requirement_noncontested
contains a leading space in its value which will show in the UI; remove the
leading space so the XML entry reads with no whitespace before "Tussen 20 en 23
tekens" (i.e., ensure the text immediately follows the closing tag marker and
there are no stray spaces or tabs inside the string value).
In `@wallet/res/values-pl/strings-dashpay.xml`:
- Around line 523-544: Fix the Polish typos in the strings: update the value of
invitation_fee_confirm_and_pay_button from "Potwiedź i zapłać" to "Potwierdź i
zapłać" and correct the gender agreement in create_instant_username_description
by changing "będzie poddane głosowaniu" to "będzie poddana głosowaniu" (since
"nazwa" is feminine); ensure both string entries
(invitation_fee_confirm_and_pay_button and create_instant_username_description)
are updated exactly and keep escaping/line breaks as in the original XML.
In `@wallet/res/values-zh-rTW/strings-dashpay.xml`:
- Around line 537-545: The two new string resources username_types_message and
create_instant_username_description contain stray "." characters after Chinese
punctuation; remove those extra periods (keep the intended Chinese punctuation
and existing \n sequences) so the UI doesn't display an extra dot—for example,
edit the values for username_types_message and
create_instant_username_description to delete the stray "." characters while
preserving line breaks and semantics.
In `@wallet/src/de/schildbach/wallet/payments/SendCoinsTaskRunner.kt`:
- Around line 450-461: The error log message inside the monitor coroutine for
sendCoins incorrectly mentions "executeDryrun"; update the string in the catch
block where AnrException.logProcessMap() is invoked (monitorJob launched with
Dispatchers.IO, using currentThread and Stopwatch) to reference "sendCoins"
instead of "executeDryrun" so the log reads something like "Failed to dump
thread traces during sendCoins" to avoid misleading diagnostics.
🧹 Nitpick comments (8)
wallet/src/de/schildbach/wallet/ui/send/SendCoinsFragment.kt (1)
271-271: Consider usinglog.errororlog.warnfor send failures.This catch block handles actual transaction send failures (crypto errors, insufficient funds mid-send, etc.). Logging these at
infolevel may cause them to be overlooked in log analysis.log.errorbetter reflects the severity.The same consideration applies to line 185, though
infois more defensible there since dry-run exceptions are expected user-correctable conditions.Suggested change
- log.info("send exception: ", ex) + log.error("send exception: ", ex)wallet/src/de/schildbach/wallet/WalletApplication.java (1)
480-481: Clarify or remove the TODO comment.The TODO "do we need this commented out for saving" is ambiguous. If strict mode is intentionally disabled (as the PR indicates), either document why it was disabled (e.g., "strict mode causes wallet save failures") or remove the commented-out code entirely.
wallet/androidTest/de/schildbach/wallet/security/SecurityGuardMultiThreadingTest.kt (1)
910-1043: Prefer@Ignoreover commenting out the entire test method.The
@Ignoreannotation is already imported (line 39) but unused. Commenting out 130+ lines of test code means the compiler no longer checks it, so it silently rots as APIs evolve. Wrapping with@Ignore("IV backup recovery not yet fully implemented")keeps the code compilable and visible in test reports as skipped.wallet/src/de/schildbach/wallet/ui/main/WalletTransactionsFragment.kt (1)
430-431: Inconsistent null-safety operator onerrorMessage.Line 430 uses
errorMessage?.contains(…)(safe call), but line 431 useserrorMessage.contains(…)(non-safe). Even iferrorMessageis smart-cast to non-null here (from the!= nullcheck on line 412), the style is inconsistent with the rest of this block (lines 424–426, 430). Consider using?.on line 431 as well for consistency, or dropping the redundant?.elsewhere.Suggested consistency fix
- (errorMessage?.contains("invalid quorum: quorum not found") != true || - errorMessage.contains("invalid peer certificate: certificate expired") == true) + (errorMessage?.contains("invalid quorum: quorum not found") != true || + errorMessage?.contains("invalid peer certificate: certificate expired") == true)wallet/src/de/schildbach/wallet/service/BlockchainServiceImpl.kt (1)
1937-1942: TOCTOU race onpeerGroup!!.lock.isLocked— acceptable but worth a comment.The lock state can change between the
isLockedcheck and theremoveXxxEventListenercalls. Given this is a best-effort guard to avoid deadlocks during cleanup (as the comment suggests), the pragmatic approach is reasonable. Consider adding a brief inline comment that this is intentionally racy to prevent reviewer confusion in the future.wallet/androidTest/de/schildbach/wallet/transactions/TransactionExportTest.kt (1)
71-79: NullableupdateTimefallback may silently break the assertion.Line 73:
tx.updateTime?.time ?: System.currentTimeMillis()— the test assertion on line 92 expects"1970-01-01T00:00:00Z"(epoch 0). If a future dashj update changesTransaction(params, data, offset)to returnnullforupdateTime, the fallback toSystem.currentTimeMillis()will silently produce a non-zero timestamp and the assertion will fail with a confusing message.Consider using
tx.updateTime?.time ?: 0L(or assertingupdateTimeis non-null) so the test fails clearly at the metadata construction site rather than at the CSV string comparison.Proposed fix
val txMetadata = TransactionMetadata( tx.txId, - tx.updateTime?.time ?: System.currentTimeMillis(), + tx.updateTime?.time ?: 0L, tx.outputSum,wallet/src/de/schildbach/wallet/transactions/WalletObserver.kt (1)
140-140: Consider removing commented-out code rather than leaving it in.Lines 140, 145, 157, and 216–217 all contain commented-out log statements or a commented-out
removeManualNotifyConfidenceChangeTransactioncall. If this code is no longer needed, removing it keeps the file cleaner; if it's useful for debugging, alog.debug/log.traceguarded by level is preferable to commented-out lines.Also applies to: 145-145, 157-157, 216-217
Gemfile (1)
11-11: Consider pinning thenkfgem version for reproducible builds.The other gems (
fastlane,abbrev) specify version constraints, butnkfis unpinned. Adding a version constraint (e.g.,gem "nkf", "~> 0.2.0") would keep builds reproducible and consistent with the rest of the Gemfile.
| <string name="purchase_check_current_balance">Δείτε τις λεπτομέρειες της κάρτας</string> | ||
| <string name="purchase_card_number">Αριθμός κάρτας</string> |
There was a problem hiding this comment.
Confirm the CTA text for checking gift-card balance.
purchase_check_current_balance currently reads “Δείτε τις λεπτομέρειες της κάρτας” (see card details). If this is shown for balance checks, consider adjusting the copy to reflect that action.
🤖 Prompt for AI Agents
In `@features/exploredash/src/main/res/values-el/strings-explore-dash.xml` around
lines 194 - 195, The string resource purchase_check_current_balance currently
reads "Δείτε τις λεπτομέρειες της κάρτας" which implies viewing card details;
update the value to explicitly indicate checking a gift-card balance (e.g.,
"Ελέγξτε το υπόλοιπο της κάρτας" or another approved translation) in the
strings-explore-dash.xml so the CTA matches the balance-check action; ensure
purchase_check_current_balance is used consistently where balance checks are
shown and adjust any related copy (purchase_card_number) only if needed for
context.
| <string name="explore_pay_with_dash">Plaťte pomocou Dash</string> | ||
| <string name="explore_pay_with_dash_save">Uložiť %.2f%%</string> | ||
| <string name="explore_buy_gift_card">Kúpiť darčekovú kartu</string> | ||
| <string name="explore_buy_gift_card">Kúpiť darčekovú poukážku</string> |
There was a problem hiding this comment.
Inconsistent terminology: many strings still use "karta" instead of "poukážka".
The changed lines consistently update gift card references from "karta" (card) to "poukážka" (voucher), but numerous unchanged strings in the same file still use the old terminology. For example:
- Line 82:
ctx_gift_cards— "Darčekové karty CTX" - Line 84:
explore_payment_gift_card— "Darčeková karta" - Line 85:
explore_filter_gift_cards— "Darčekové karty" - Line 93:
explore_pay_gift_card— "Plaťte darčekovou kartou" - Line 95:
gift_card_types— "Typy darčekových kariet" - Line 196:
purchase_gift_card_total_label— "Darčeková karta spolu" - Line 200:
purchase_gift_card_details— "Podrobnosti darčekovej karty" - Line 235:
gift_card_purchase_failed— "Nákup darčekovej karty zlyhal" - Line 239:
gift_card_out_of_stock_error— "Táto darčeková karta je vypredaná" - Line 254:
barcode_placeholder— "…darčekovej karte"
This mixed usage will confuse Slovak-speaking users who see both "poukážka" and "karta" for the same concept within the app.
Also applies to: 162-169, 191-191, 206-207, 225-225, 238-245, 262-262
🤖 Prompt for AI Agents
In `@features/exploredash/src/main/res/values-sk/strings-explore-dash.xml` at line
69, The file mixes two terms for gift card — "karta"/"karty" and the new
"poukážka"/"poukážky" — causing inconsistent UX; update the remaining string
resources (e.g., ctx_gift_cards, explore_payment_gift_card,
explore_filter_gift_cards, explore_pay_gift_card, gift_card_types,
purchase_gift_card_total_label, purchase_gift_card_details,
gift_card_purchase_failed, gift_card_out_of_stock_error, barcode_placeholder and
the groups around lines 162-169, 191, 206-207, 225, 238-245, 262) to use
"poukážka"/"poukážky" with correct Slovak forms and grammar, keeping the
already-changed explore_buy_gift_card terminology, and run a quick grep through
strings-explore-dash.xml to ensure no residual "karta"/"karty" remain.
| <string name="invitation_username_already_found_voting_title">Nutzername bereits angefragt</string> | ||
| <string name="invitation_username_already_found_voting_message">Du kannst diese Einladung nicht beanspruchen, da du bereits einen Dash-Nutzernamen hast.</string> |
There was a problem hiding this comment.
Align the German message with the “already requested” state.
Line 58 currently says the user already has a username, which conflicts with the key meaning (“already requested”).
Proposed fix
- <string name="invitation_username_already_found_voting_message">Du kannst diese Einladung nicht beanspruchen, da du bereits einen Dash-Nutzernamen hast.</string>
+ <string name="invitation_username_already_found_voting_message">Du kannst diese Einladung nicht beanspruchen, da du bereits einen Dash-Nutzernamen beantragt hast.</string>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <string name="invitation_username_already_found_voting_title">Nutzername bereits angefragt</string> | |
| <string name="invitation_username_already_found_voting_message">Du kannst diese Einladung nicht beanspruchen, da du bereits einen Dash-Nutzernamen hast.</string> | |
| <string name="invitation_username_already_found_voting_title">Nutzername bereits angefragt</string> | |
| <string name="invitation_username_already_found_voting_message">Du kannst diese Einladung nicht beanspruchen, da du bereits einen Dash-Nutzernamen beantragt hast.</string> |
🤖 Prompt for AI Agents
In `@wallet/res/values-de/strings-dashpay.xml` around lines 57 - 58, The message
for string name "invitation_username_already_found_voting_message" is
inconsistent with the key (it says the user already has a username); update its
German text to reflect the “already requested” state instead—e.g., change the
value for invitation_username_already_found_voting_message so it reads that the
user has already requested/asked for this Dash username (for example: "Du kannst
diese Einladung nicht beanspruchen, da du diesen Dash‑Nutzernamen bereits
angefragt hast.").
| <string name="username_types_title">Τι είναι τα αμφισβητούμενα και μη αμφισβητούμενα ονόματα χρήστη;</string> | ||
| <string name="username_types_message">Υπάρχουν δύο τύποι ονομάτων χρήστη: αμφισβητούμενα και μη αμφισβητούμενα.\n\nΤα μη αμφισβητούμενα ονόματα χρηστών έχουν τουλάχιστον έναν αριθμό (2-9) ή είναι μεγαλύτερα από 20 χαρακτήρες και θα εγκριθούν αυτόματα..\n\nΑν θέλετε να δημιουργήσετε ένα αμφισβητούμενο όνομα χρήστη που είναι μικρότερο και χωρίς αριθμούς, πρέπει να εγγραφείτε στο DashPay χωρίς πρόσκληση, να πληρώσετε το απαιτούμενο τέλος και να περιμένετε την έγκριση μετά την ολοκλήρωση της περιόδου ψηφοφορίας.</string> |
There was a problem hiding this comment.
Remove the double period in username_types_message.
There’s a .. after “θα εγκριθούν αυτόματα..” that will display in the UI.
Proposed fix
- <string name="username_types_message">Υπάρχουν δύο τύποι ονομάτων χρήστη: αμφισβητούμενα και μη αμφισβητούμενα.\n\nΤα μη αμφισβητούμενα ονόματα χρηστών έχουν τουλάχιστον έναν αριθμό (2-9) ή είναι μεγαλύτερα από 20 χαρακτήρες και θα εγκριθούν αυτόματα..\n\nΑν θέλετε να δημιουργήσετε ένα αμφισβητούμενο όνομα χρήστη που είναι μικρότερο και χωρίς αριθμούς, πρέπει να εγγραφείτε στο DashPay χωρίς πρόσκληση, να πληρώσετε το απαιτούμενο τέλος και να περιμένετε την έγκριση μετά την ολοκλήρωση της περιόδου ψηφοφορίας.</string>
+ <string name="username_types_message">Υπάρχουν δύο τύποι ονομάτων χρήστη: αμφισβητούμενα και μη αμφισβητούμενα.\n\nΤα μη αμφισβητούμενα ονόματα χρηστών έχουν τουλάχιστον έναν αριθμό (2-9) ή είναι μεγαλύτερα από 20 χαρακτήρες και θα εγκριθούν αυτόματα.\n\nΑν θέλετε να δημιουργήσετε ένα αμφισβητούμενο όνομα χρήστη που είναι μικρότερο και χωρίς αριθμούς, πρέπει να εγγραφείτε στο DashPay χωρίς πρόσκληση, να πληρώσετε το απαιτούμενο τέλος και να περιμένετε την έγκριση μετά την ολοκλήρωση της περιόδου ψηφοφορίας.</string>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <string name="username_types_title">Τι είναι τα αμφισβητούμενα και μη αμφισβητούμενα ονόματα χρήστη;</string> | |
| <string name="username_types_message">Υπάρχουν δύο τύποι ονομάτων χρήστη: αμφισβητούμενα και μη αμφισβητούμενα.\n\nΤα μη αμφισβητούμενα ονόματα χρηστών έχουν τουλάχιστον έναν αριθμό (2-9) ή είναι μεγαλύτερα από 20 χαρακτήρες και θα εγκριθούν αυτόματα..\n\nΑν θέλετε να δημιουργήσετε ένα αμφισβητούμενο όνομα χρήστη που είναι μικρότερο και χωρίς αριθμούς, πρέπει να εγγραφείτε στο DashPay χωρίς πρόσκληση, να πληρώσετε το απαιτούμενο τέλος και να περιμένετε την έγκριση μετά την ολοκλήρωση της περιόδου ψηφοφορίας.</string> | |
| <string name="username_types_title">Τι είναι τα αμφισβητούμενα και μη αμφισβητούμενα ονόματα χρήστη;</string> | |
| <string name="username_types_message">Υπάρχουν δύο τύποι ονομάτων χρήστη: αμφισβητούμενα και μη αμφισβητούμενα.\n\nΤα μη αμφισβητούμενα ονόματα χρηστών έχουν τουλάχιστον έναν αριθμό (2-9) ή είναι μεγαλύτερα από 20 χαρακτήρες και θα εγκριθούν αυτόματα.\n\nΑν θέλετε να δημιουργήσετε ένα αμφισβητούμενο όνομα χρήστη που είναι μικρότερο και χωρίς αριθμούς, πρέπει να εγγραφείτε στο DashPay χωρίς πρόσκληση, να πληρώσετε το απαιτούμενο τέλος και να περιμένετε την έγκριση μετά την ολοκλήρωση της περιόδου ψηφοφορίας.</string> |
🤖 Prompt for AI Agents
In `@wallet/res/values-el/strings-dashpay.xml` around lines 536 - 537, The string
resource username_types_message contains a typographical error: a double period
("..") after "θα εγκριθούν αυτόματα.."; edit the <string
name="username_types_message"> value to replace the double period with a single
period (ensure proper spacing and punctuation remain intact) so the UI displays
"θα εγκριθούν αυτόματα." instead of "θα εγκριθούν αυτόματα..".
| <string name="welcome_screen_title_1">Στείλτε και λάβετε Dash χωρίς μέσω ονομάτων χρήσης</string> | ||
| <string name="welcome_screen_title_2">Ξοδέψτε Dash σε χιλιάδες καταστήματα</string> | ||
| <string name="welcome_screen_title_3">Ο ασφαλέστερος τρόπος για να αποθηκεύσετε τα Dash σας</string> |
There was a problem hiding this comment.
Fix the wording in the first welcome title.
“χωρίς μέσω” is grammatically contradictory. Consider dropping “χωρίς” so the phrase reads naturally as “via usernames”.
✏️ Suggested fix
- <string name="welcome_screen_title_1">Στείλτε και λάβετε Dash χωρίς μέσω ονομάτων χρήσης</string>
+ <string name="welcome_screen_title_1">Στείλτε και λάβετε Dash μέσω ονομάτων χρήσης</string>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <string name="welcome_screen_title_1">Στείλτε και λάβετε Dash χωρίς μέσω ονομάτων χρήσης</string> | |
| <string name="welcome_screen_title_2">Ξοδέψτε Dash σε χιλιάδες καταστήματα</string> | |
| <string name="welcome_screen_title_3">Ο ασφαλέστερος τρόπος για να αποθηκεύσετε τα Dash σας</string> | |
| <string name="welcome_screen_title_1">Στείλτε και λάβετε Dash μέσω ονομάτων χρήσης</string> | |
| <string name="welcome_screen_title_2">Ξοδέψτε Dash σε χιλιάδες καταστήματα</string> | |
| <string name="welcome_screen_title_3">Ο ασφαλέστερος τρόπος για να αποθηκεύσετε τα Dash σας</string> |
🤖 Prompt for AI Agents
In `@wallet/res/values-el/strings-extra.xml` around lines 338 - 340, Update the
Greek string resource welcome_screen_title_1 to remove the contradictory word
"χωρίς" so it reads naturally as "Στείλτε και λάβετε Dash μέσω ονομάτων χρήσης"
(or use "μέσω ονομάτων χρήστη" if preferred for singular/plural consistency);
edit the value for string name="welcome_screen_title_1" accordingly to reflect
the corrected wording.
| <string name="request_username_requirements_message_invite_noncontested">De gebruikersnaam moet aan een van deze criteria voldoen</string> | ||
| <string name="request_username_requirements_message">De gebruikersnaam moet aan deze criteria voldoen</string> | ||
| <string name="request_username_length_requirement">Tussen 3 en 23 tekens</string> | ||
| <string name="request_username_length_requirement_noncontested"> Tussen 20 en 23 tekens</string> |
There was a problem hiding this comment.
Leading whitespace in string value will appear in the UI.
The string value starts with a space ( Tussen 20 en 23 tekens), which will render as extra leading whitespace in the UI.
Proposed fix
- <string name="request_username_length_requirement_noncontested"> Tussen 20 en 23 tekens</string>
+ <string name="request_username_length_requirement_noncontested">Tussen 20 en 23 tekens</string>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <string name="request_username_length_requirement_noncontested"> Tussen 20 en 23 tekens</string> | |
| <string name="request_username_length_requirement_noncontested">Tussen 20 en 23 tekens</string> |
🤖 Prompt for AI Agents
In `@wallet/res/values-nl/strings-dashpay.xml` at line 454, The string resource
request_username_length_requirement_noncontested contains a leading space in its
value which will show in the UI; remove the leading space so the XML entry reads
with no whitespace before "Tussen 20 en 23 tekens" (i.e., ensure the text
immediately follows the closing tag marker and there are no stray spaces or tabs
inside the string value).
| <string name="transaction_metadata_continue_without_saving">Doorgaan zonder op te slaan</string> | ||
| <string name="invitation_fee_title">Vergoeding uitnodiging</string> | ||
| <string name="invitation_fee_message">Elke uitnodiging wordt gefinancierd zodat de ontvanger snel zijn gebruikersnaam op het Dash netwerk kan aanmaken.</string> | ||
| <string name="invitation_fee_noncontested"> Niet betwist</string> |
There was a problem hiding this comment.
Leading whitespace in string value will appear in the UI.
Same issue here: Niet betwist has a leading space that will be rendered.
Proposed fix
- <string name="invitation_fee_noncontested"> Niet betwist</string>
+ <string name="invitation_fee_noncontested">Niet betwist</string>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <string name="invitation_fee_noncontested"> Niet betwist</string> | |
| <string name="invitation_fee_noncontested">Niet betwist</string> |
🤖 Prompt for AI Agents
In `@wallet/res/values-nl/strings-dashpay.xml` at line 527, The string resource
invitation_fee_noncontested contains a leading space (" Niet betwist") which
will render in the UI; remove the leading whitespace in the value so it becomes
"Niet betwist" by updating the string with name="invitation_fee_noncontested" to
trim the leading space.
| <string name="invitation_fee_title">Opłata za zaproszenie</string> | ||
| <string name="invitation_fee_message">Każde zaproszenie zostanie sfinansowane tak, aby odbiorca mógł szybko utworzyć swoją nazwę użytkownika w sieci Dash.</string> | ||
| <string name="invitation_fee_noncontested">Bezsporny</string> | ||
| <string name="invitation_fee_contested">Sporny</string> | ||
| <string name="invitation_fee_contested_message">Osoba, do której wysyłasz zaproszenie, może poprosić o podanie dowolnej nazwy użytkownika, a sieć zagłosuje nad jej zatwierdzeniem.</string> | ||
| <string name="invitation_fee_noncontested_message">Osoba, do której wysyłasz to zaproszenie, może poprosić o nazwę użytkownika składającą się z cyfr 2-9 i dłuższą niż 20 znaków.</string> | ||
| <string name="invitation_creating_progress_loading">Ładuje zaproszenie...</string> | ||
| <string name="invitation_creating_progress_wip">Tworzenie zaproszenia</string> | ||
| <string name="invitation_fee_confirm_and_pay_button">Potwiedź i zapłać</string> | ||
| <string name="error_sending_invite_transaction">Błąd w wysyłaniu transakcji zaproszenia</string> | ||
| <string name="request_username_invitation_not_mixed_message">Zaproszenie zostało stworzone z niewymieszanych środków</string> | ||
| <string name="request_username_invitation_only_noncontested_message">Za pomocą tego zaproszenia możesz tylko utworzyć bezsporną nazwę użytkownika</string> | ||
| <string name="username_types_title">Czym są sporne i bezsporne nazwy użytkownika\?</string> | ||
| <string name="username_types_message">Istnieją dwa rodzaje nazw użytkowników: sporne i bezsporne.\n\nNazwy użytkowników bezsporne mają co najmniej jedną cyfrę (2-9) lub są dłuższe niż 20 znaków i zostaną automatycznie zatwierdzone.\n\nJeśli chcesz utworzyć sporną nazwę użytkownika, która jest krótsza i bez cyfr, musisz zarejestrować się w DashPay bez zaproszenia, zapłacić wymaganą opłatę i poczekać na zatwierdzenie po zakończeniu okresu głosowania.</string> | ||
| <string name="accept_invitation_hide">Ukryj</string> | ||
| <string name="accept_invitation_create">Stwórz</string> | ||
|
|
||
| <!-- Create Instant Username Dialog --> | ||
| <string name="create_instant_username_title">Stwórz natychmiastową nazwę użytkownika</string> | ||
| <string name="create_instant_username_description">Twoja wybrana nazwa użytkownika będzie poddane głosowaniu przez 2 tygodnie. Do natychmiastowych kontaktów i płatności możesz utworzyć podobną natychmiastową nazwę użytkownika.\n\nJeśli Twoja pierwotna prośba zostanie zatwierdzona, zastąpi ona natychmiastową nazwę użytkownika, zachowując kontakty i historię. W przeciwnym razie możesz ciągle korzystać z tej samej natychmiastowej nazwy.</string> | ||
| <string name="create_instant_username_button">Stwórz natychmiastową nazwę użytkownika</string> | ||
| <string name="create_instant_username_cancel">Anuluj</string> |
There was a problem hiding this comment.
Typo in invitation_fee_confirm_and_pay_button: "Potwiedź" should be "Potwierdź".
Line 531: The Polish word is missing the letter "r" — Potwiedź → Potwierdź.
Also, Line 542 has a grammatical mismatch: "nazwa użytkownika będzie poddane" should be "będzie poddana" since "nazwa" is feminine.
Proposed fixes
- <string name="invitation_fee_confirm_and_pay_button">Potwiedź i zapłać</string>
+ <string name="invitation_fee_confirm_and_pay_button">Potwierdź i zapłać</string>- <string name="create_instant_username_description">Twoja wybrana nazwa użytkownika będzie poddane głosowaniu przez 2 tygodnie. Do natychmiastowych kontaktów i płatności możesz utworzyć podobną natychmiastową nazwę użytkownika.\n\nJeśli Twoja pierwotna prośba zostanie zatwierdzona, zastąpi ona natychmiastową nazwę użytkownika, zachowując kontakty i historię. W przeciwnym razie możesz ciągle korzystać z tej samej natychmiastowej nazwy.</string>
+ <string name="create_instant_username_description">Twoja wybrana nazwa użytkownika będzie poddana głosowaniu przez 2 tygodnie. Do natychmiastowych kontaktów i płatności możesz utworzyć podobną natychmiastową nazwę użytkownika.\n\nJeśli Twoja pierwotna prośba zostanie zatwierdzona, zastąpi ona natychmiastową nazwę użytkownika, zachowując kontakty i historię. W przeciwnym razie możesz ciągle korzystać z tej samej natychmiastowej nazwy.</string>🤖 Prompt for AI Agents
In `@wallet/res/values-pl/strings-dashpay.xml` around lines 523 - 544, Fix the
Polish typos in the strings: update the value of
invitation_fee_confirm_and_pay_button from "Potwiedź i zapłać" to "Potwierdź i
zapłać" and correct the gender agreement in create_instant_username_description
by changing "będzie poddane głosowaniu" to "będzie poddana głosowaniu" (since
"nazwa" is feminine); ensure both string entries
(invitation_fee_confirm_and_pay_button and create_instant_username_description)
are updated exactly and keep escaping/line breaks as in the original XML.
| <string name="username_types_message">用戶名有兩種類型:有爭議的和沒有爭議的。.\n\n沒有爭議的用戶名至少有一個數字(2-9)或超過20個字符,該用戶名稱將自動批准.\n\n如果您想創建一個較短且沒有數字的有爭議的用戶名,則需要在沒有邀請的情況下註冊Dashpay,支付所需的費用並在投票期完成後等待批准。</string> | ||
| <string name="accept_invitation_hide">隱藏</string> | ||
| <string name="accept_invitation_create">創建</string> | ||
|
|
||
| <!-- Create Instant Username Dialog --> | ||
| <string name="create_instant_username_title">創建即時用戶名</string> | ||
| <string name="create_instant_username_description">您請求的用戶名將在 2 週內進行投票。為了立即聯繫和付款,您可以創建類似的即時用戶名。.\n\n如果您的原始請求獲得批准,它將取代即時用戶名,並保留聯繫人和歷史記錄。如果沒有獲批,請繼續使用即時用戶名。</string> | ||
| <string name="create_instant_username_button">創建即時用戶名</string> | ||
| <string name="create_instant_username_cancel">取消</string> |
There was a problem hiding this comment.
Remove the stray “.” punctuation in the new messages.
Some of the added strings include extra periods after Chinese punctuation, which will show up in the UI.
Proposed fix
- <string name="username_types_message">用戶名有兩種類型:有爭議的和沒有爭議的。.\n\n沒有爭議的用戶名至少有一個數字(2-9)或超過20個字符,該用戶名稱將自動批准.\n\n如果您想創建一個較短且沒有數字的有爭議的用戶名,則需要在沒有邀請的情況下註冊Dashpay,支付所需的費用並在投票期完成後等待批准。</string>
+ <string name="username_types_message">用戶名有兩種類型:有爭議的和沒有爭議的。\n\n沒有爭議的用戶名至少有一個數字(2-9)或超過20個字符,該用戶名稱將自動批准。\n\n如果您想創建一個較短且沒有數字的有爭議的用戶名,則需要在沒有邀請的情況下註冊Dashpay,支付所需的費用並在投票期完成後等待批准。</string>
- <string name="create_instant_username_description">您請求的用戶名將在 2 週內進行投票。為了立即聯繫和付款,您可以創建類似的即時用戶名。.\n\n如果您的原始請求獲得批准,它將取代即時用戶名,並保留聯繫人和歷史記錄。如果沒有獲批,請繼續使用即時用戶名。</string>
+ <string name="create_instant_username_description">您請求的用戶名將在 2 週內進行投票。為了立即聯繫和付款,您可以創建類似的即時用戶名。\n\n如果您的原始請求獲得批准,它將取代即時用戶名,並保留聯繫人和歷史記錄。如果沒有獲批,請繼續使用即時用戶名。</string>🤖 Prompt for AI Agents
In `@wallet/res/values-zh-rTW/strings-dashpay.xml` around lines 537 - 545, The two
new string resources username_types_message and
create_instant_username_description contain stray "." characters after Chinese
punctuation; remove those extra periods (keep the intended Chinese punctuation
and existing \n sequences) so the UI doesn't display an extra dot—for example,
edit the values for username_types_message and
create_instant_username_description to delete the stray "." characters while
preserving line breaks and semantics.
| val watch = Stopwatch.createStarted() | ||
| val currentThread = Thread.currentThread() | ||
| val monitorJob = launch(Dispatchers.IO) { | ||
| delay(1000) | ||
| log.warn("sendCoins is taking longer than 1 second") | ||
| try { | ||
| val anrException = AnrException(currentThread) | ||
| anrException.logProcessMap() | ||
| } catch (e: Exception) { | ||
| log.error("Failed to dump thread traces during executeDryrun", e) | ||
| } | ||
| } |
There was a problem hiding this comment.
Copy-paste error in log message: "executeDryrun" should be "sendCoins".
Line 459 references executeDryrun, but this monitor is in the sendCoins method. This will be misleading when diagnosing production logs.
Proposed fix
- log.error("Failed to dump thread traces during executeDryrun", e)
+ log.error("Failed to dump thread traces during sendCoins", e)🤖 Prompt for AI Agents
In `@wallet/src/de/schildbach/wallet/payments/SendCoinsTaskRunner.kt` around lines
450 - 461, The error log message inside the monitor coroutine for sendCoins
incorrectly mentions "executeDryrun"; update the string in the catch block where
AnrException.logProcessMap() is invoked (monitorJob launched with
Dispatchers.IO, using currentThread and Stopwatch) to reference "sendCoins"
instead of "executeDryrun" so the log reads something like "Failed to dump
thread traces during sendCoins" to avoid misleading diagnostics.
There was a problem hiding this comment.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Duplicate comments:
In `@wallet/src/de/schildbach/wallet/payments/SendCoinsTaskRunner.kt`:
- Around line 607-618: The catch block in SendCoinsTaskRunner's monitor
coroutine logs the wrong operation name ("executeDryrun"); update the error
message in the log.error call inside the monitorJob coroutine to reference
"sendCoins" instead of "executeDryrun" (locate the catch in the coroutine
started with launch(Dispatchers.IO) where
AnrException(currentThread).logProcessMap() is called and change the message
passed to log.error accordingly).
Issue being fixed or feature implemented
Related PR's and Dependencies
dashpay/dashj#283
Screenshots / Videos
How Has This Been Tested?
Checklist:
Summary by CodeRabbit
Bug Fixes
Chores