5 Commits

Author SHA1 Message Date
pezkuwichain 85bde7e448 Redesign: dashboard card + action row (v1.1.1) (#6)
* redesign(dashboard): brand-book restyle of Pezkuwi dashboard card

Match the brand book / handoff screenshot:
- bg_pezkuwi_dashboard: blue/indigo gradient -> frosted dark-navy surface
  (#1C1F2E) with a 1px periwinkle hairline, 20dp corners.
- item_pezkuwi_dashboard: replace hardcoded non-brand colors —
  trust value amber #FFD54F -> zer #FDB813; welati count -> positive #2FC864;
  Approve/start buttons Material-green -> kesk #009639; Sign red -> sor #E2231A;
  Share button yellow #FDD835 -> frosted-navy secondary #2A2F45 (white text);
  blue-grey text -> brand white tokens. Pill-er 12dp button corners.

* redesign(actions): circular action buttons (primary green Send + dark rest)

Match the brand-book screenshot: the balance action row (Send/Receive/Swap/
Buy/Gift) becomes circular icon buttons with a label below — Send on a kesk
green circle, the rest on frosted-dark circles. IDs preserved (used only for
click + isEnabled), so AssetsTotalBalanceView keeps working.

* redesign(dashboard): pro-level Pezkuwi card layout

Rework the card to match the brand-book screenshot: header row with a small
Newroz-flame icon + title/roles on the left and the citizen count on the right;
trust score row; full-height (48dp) pill-er (14dp) action buttons — Approve
(kesk, bold), Sign (sor), Share (frosted-dark with hairline). Adds the small
ic_nevroz_flame icon.

* release: bump versionName to 1.1.1 (dashboard & action-row redesign)
2026-06-14 23:34:49 -07:00
pezkuwichain 37c2edc6cd ci(deploy): support staged production rollout (userFraction) (#5)
Add an 'inProgress' status + a user_fraction input so production releases can
roll out gradually (e.g. 0.2 = 20%) instead of only 100% (completed).
userFraction is passed only when status=inProgress; ignored otherwise.
2026-06-14 23:02:50 -07:00
pezkuwichain 87bacc3f7c ci: fix develop PR build signing (validateSigningDevelop) (#4)
* ci: wire develop_key.jks into PR build (fix validateSigningDevelop)

The PR build runs assembleDevelop (signingConfigs.dev = develop_key.jks) but the
reusable workflow only decoded github/market keystores, so validateSigningDevelop
always failed. Add a develop-keystore decode step (reusing the existing
BASE64_DEV_KEYSTORE_FILE secret + CI_KEYSTORE_* passwords) and pass
keystore-file-name: develop_key.jks from pull_request.yml.

[temp] pin reusable workflow to the branch to validate before merge; reverted to
@main in the next commit.

* ci: revert reusable-workflow pin back to @main

Fix validated green on PR #4 (test/Build app and test passed, develop signing
works). Restore @main pin for the final merged state.
2026-06-14 22:51:12 -07:00
pezkuwichain 22422c85da Redesign: brand-book alignment + forbidden-color purge (v1.1.0) (#3)
* redesign(colors): purge forbidden magenta/purple from palette

Brand book permits only the Kurdistan palette (kesk/sor/zer/fire) + navy.
Replace the four Nova-legacy violations in common colors.xml (names preserved,
so no references break):
- crowdloan_banner_gradient_start  #BD387F -> #009639 (kesk)
- networks_banner_gradient_end     #661D78 -> #017A2F (kesk-700)
- chip_on_card_background           #443679 -> #3D999EC7 (frosted periwinkle)
- button_wallet_connect_background  #353D67 -> #1F2A4D (neutral navy)

Repo-wide grep confirmed no other hardcoded magenta/purple literals or
purple/pink-named resources remain.

* redesign(type): adopt brand fonts (Space Grotesk / Plus Jakarta Sans / JetBrains Mono)

Brand book typography. Add OFL static fonts under common/res/font and repoint
the theme font attrs (consumed app-wide via ?attr/font* in styles.xml):
- fontRegular     -> Plus Jakarta Sans Regular (body/UI)
- fontSemiBold    -> Plus Jakarta Sans SemiBold
- fontBold/ExtraBold -> Space Grotesk Bold (display: balances, titles)
- fontExtraLight  -> Plus Jakarta Sans Light
- Monospace text appearance (addresses/hashes) -> JetBrains Mono

Static TTFs chosen (minSdk 24 < variable-font API 26). All five verified to
cover Turkish + Kurdish Kurmancî glyphs (ş ğ ı İ ê î û ç …).

* redesign(splash): replace map+wordmark logo with Newroz flame brand mark

The first-launch splash logo (ic_loading_screen_logo) showed a Kurdistan map
with a baked-in wordmark. Per the brand book the mark is the Newroz flame.
Rasterized assets/nevroz-fire-flame.svg into the existing 6 density slots
(same pixel dimensions = drop-in, no bg_splash.xml change, transparent WebP so
it composites cleanly over the splash background).

* redesign(onboarding): welcome hero -> Global United States of Pezkuwi

Replace the legacy onboarding hero (ic_create_wallet_background, whose six
density PNGs had inconsistent broken dimensions) with the brand 'Global United
States of Pezkuwi' infographic. Consolidate to a single high-res WebP in
drawable-nodpi (1408x768, 204K vs 1.75MB PNG) and switch the welcome ImageView
scaleType centerCrop -> fitCenter so it shows full and uncropped above the
CTA buttons, per the brand book.

* redesign(assets): purge magenta/purple from raster illustrations

colors.xml only covers named colors; these raster drawables still carried
forbidden magenta/purple/pink pixels. Selectively rotate the 255-350 deg hue
band (purple-magenta-pink) toward kesk green/teal across all densities,
preserving gradients, shapes and the on-brand blues:
- ic_pink_siri, ic_networks_banner_image, ic_no_added_networks,
  ic_import_option_hardware, tinder_gov (6 densities each).
Third-party ic_powered_by_oak (OAK Network trademark) left untouched.
crowdloan_banner_image is being handled separately.

* redesign(assets): de-pink crowdloan banner across all densities

The crowdloan banner's magenta sphere was recolored to brand sor red (xxxhdpi).
Propagate that fix to the other five densities by downscaling the corrected
xxxhdpi master (LANCZOS), so every device shows the same brand-clean banner.
Pink-pixel scan now 0% on all six variants.

* chore: remove pre-production debug code (release-blocker)

CHANGELOG_PEZKUWI listed debug code to strip before production; two items were
still live:
- FeeLoaderV2Provider: the fee-retry dialog showed a raw "DEBUG: <err> | Runtime:
  <diagnostics>" string to users -> reverted to the localized resource string and
  dropped the diagnostics lookup.
- RuntimeFactory: removed the companion lastDiagnostics field and its assignment
  (plus the now-dangling diagnostic vars), and the matching log line in the
  PezkuwiLiveTransferTest androidTest.
Items #3-#6 were already clean. Repo now has no 'DEBUG:' literals or
lastDiagnostics references. CHANGELOG marked cleaned.

* docs: add BRAND.md — enforceable wallet brand rules

Kurdistan-only palette (no pink/magenta/purple), brand fonts, Newroz flame mark,
a PR brand checklist with a raster pink-scan snippet, the third-party-logo
exception, and the Apache-2.0 attribution rule (keep LICENSE/NOTICE). Points to
the canonical brand book at wiki.pezkuwichain.io/brand.

* release: bump versionName to 1.1.0 (brand-book UI redesign)

Live Play version is 1.0.4; minor bump for the UI redesign. versionCode stays
CI-managed (CI_BUILD_ID). Add the v1.1.0 entry to CHANGELOG_PEZKUWI.
2026-06-14 22:20:33 -07:00
pezkuwichain f5df785a42 fix(ci): free disk space before building debug androidTest APKs (#1)
The scheduled 'Run balances tests' workflow has been failing for weeks
with 'No space left on device' — assembleDebug + assembleDebugAndroidTest
for every module exceeds the ~14 GB free on GitHub-hosted runners.

Add an opt-in free-disk-space input to the reusable build workflow that
removes preinstalled toolchains we never use (dotnet, ghc, CodeQL, swift,
boost, etc., ~30+ GB), and enable it for the balances test build. Other
callers of the reusable workflow are unaffected.
2026-06-11 07:22:10 -07:00
74 changed files with 411 additions and 156 deletions
+24
View File
@@ -31,6 +31,10 @@ on:
required: false required: false
type: boolean type: boolean
default: false default: false
free-disk-space:
required: false
type: boolean
default: false
secrets: secrets:
# Crowdloan secrets - NOT NEEDED for Pezkuwi (own blockchain) # Crowdloan secrets - NOT NEEDED for Pezkuwi (own blockchain)
ACALA_PROD_AUTH_TOKEN: ACALA_PROD_AUTH_TOKEN:
@@ -115,6 +119,7 @@ env:
CI_MARKET_KEYSTORE_KEY_ALIAS: ${{ secrets.CI_MARKET_KEYSTORE_KEY_ALIAS }} CI_MARKET_KEYSTORE_KEY_ALIAS: ${{ secrets.CI_MARKET_KEYSTORE_KEY_ALIAS }}
CI_MARKET_KEYSTORE_KEY_PASS: ${{ secrets.CI_MARKET_KEYSTORE_KEY_PASS }} CI_MARKET_KEYSTORE_KEY_PASS: ${{ secrets.CI_MARKET_KEYSTORE_KEY_PASS }}
CI_MARKET_KEY_FILE: ${{ secrets.RELEASE_MARKET_KEY_FILE }} CI_MARKET_KEY_FILE: ${{ secrets.RELEASE_MARKET_KEY_FILE }}
CI_DEV_KEY_FILE: ${{ secrets.BASE64_DEV_KEYSTORE_FILE }}
CI_KEYSTORE_PASS: ${{ secrets.CI_KEYSTORE_PASS }} CI_KEYSTORE_PASS: ${{ secrets.CI_KEYSTORE_PASS }}
CI_KEYSTORE_KEY_ALIAS: ${{ secrets.CI_KEYSTORE_KEY_ALIAS }} CI_KEYSTORE_KEY_ALIAS: ${{ secrets.CI_KEYSTORE_KEY_ALIAS }}
@@ -140,6 +145,17 @@ jobs:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
timeout-minutes: 90 timeout-minutes: 90
steps: steps:
- name: 🧹 Free disk space
if: ${{ inputs.free-disk-space }}
run: |
# The androidTest build of all modules fills the ~14 GB free on
# GitHub-hosted runners; drop preinstalled toolchains we never use.
sudo rm -rf /usr/share/dotnet /usr/share/swift /opt/ghc /usr/local/.ghcup \
/opt/hostedtoolcache/CodeQL /usr/local/share/boost /usr/local/share/powershell \
/usr/local/lib/node_modules /usr/local/julia* /opt/microsoft
sudo docker image prune -af > /dev/null 2>&1 || true
df -h /
- name: Checkout particular branch - name: Checkout particular branch
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
@@ -200,6 +216,14 @@ jobs:
fileDir: './app/' fileDir: './app/'
encodedString: ${{ env.CI_MARKET_KEY_FILE }} encodedString: ${{ env.CI_MARKET_KEY_FILE }}
- name: 🔐 Getting develop sign key
if: ${{ startsWith(inputs.keystore-file-name, 'develop_key.jks') }}
uses: timheuer/base64-to-file@v1.1
with:
fileName: ${{ inputs.keystore-file-name }}
fileDir: './app/'
encodedString: ${{ env.CI_DEV_KEY_FILE }}
- name: 🏗 Build app - name: 🏗 Build app
if: ${{ !startsWith(inputs.gradlew-command, 'false') }} if: ${{ !startsWith(inputs.gradlew-command, 'false') }}
run: ./gradlew ${{ inputs.gradlew-command }} run: ./gradlew ${{ inputs.gradlew-command }}
+1
View File
@@ -14,6 +14,7 @@ jobs:
upload-name: develop-apk upload-name: develop-apk
run-tests: false run-tests: false
build-debug-tests: true build-debug-tests: true
free-disk-space: true
secrets: inherit secrets: inherit
run-tests: run-tests:
@@ -21,13 +21,19 @@ on:
- beta - beta
- production - production
status: status:
description: 'Release status (draft, completed)' description: 'Release status (draft, completed, inProgress=staged)'
required: true required: true
default: draft default: draft
type: choice type: choice
options: options:
- draft - draft
- completed - completed
- inProgress
user_fraction:
description: 'Staged rollout fraction for inProgress (e.g. 0.2 = 20%). Ignored unless status=inProgress.'
required: false
default: '0.2'
type: string
jobs: jobs:
build: build:
@@ -83,6 +89,8 @@ jobs:
releaseFiles: app/bundle/releaseMarket/pezkuwi-wallet-android-${{ github.event.inputs.app_version }}.aab releaseFiles: app/bundle/releaseMarket/pezkuwi-wallet-android-${{ github.event.inputs.app_version }}.aab
track: ${{ github.event.inputs.track }} track: ${{ github.event.inputs.track }}
status: ${{ github.event.inputs.status }} status: ${{ github.event.inputs.status }}
# userFraction only applies to staged rollout (status=inProgress); empty otherwise
userFraction: ${{ github.event.inputs.status == 'inProgress' && github.event.inputs.user_fraction || '' }}
inAppUpdatePriority: 2 inAppUpdatePriority: 2
whatsNewDirectory: distribution/whatsnew whatsNewDirectory: distribution/whatsnew
mappingFile: app/mapping/releaseMarket/mapping.txt mappingFile: app/mapping/releaseMarket/mapping.txt
+1
View File
@@ -10,5 +10,6 @@ jobs:
with: with:
branch: ${{github.head_ref}} branch: ${{github.head_ref}}
gradlew-command: assembleDevelop gradlew-command: assembleDevelop
keystore-file-name: develop_key.jks # develop variant is signed with signingConfigs.dev (develop_key.jks)
build-debug-tests: false # TODO: Enable this, when debug build will be fixed for tests build-debug-tests: false # TODO: Enable this, when debug build will be fixed for tests
secrets: inherit secrets: inherit
+89
View File
@@ -0,0 +1,89 @@
# Pezkuwi Wallet — Brand Rules
This wallet must stay aligned with the **Pezkuwi brand book**. The canonical,
ecosystem-wide source of truth lives on the wiki:
**https://wiki.pezkuwichain.io/brand/**. This file is the wallet-specific,
enforceable summary — read it before changing any colors, fonts, or imagery.
## The one hard rule
> **Only the Kurdistan palette (kesk green, sor red, zer gold, fire orange) plus
> navy/neutral are allowed. Pink, magenta and purple are FORBIDDEN — anywhere.**
This applies to XML colors, Compose `Color(0x…)` literals, vector drawables,
gradients, **and raster images** (PNG/WebP banners and illustrations).
## Palette (source of truth)
| Token | Hex | | Token | Hex |
|-------|-----|-|-------|-----|
| kesk (primary) | `#009639` | | base bg | `#05081C` |
| kesk-700 | `#017A2F` | | screen bg | `#08090E` |
| positive | `#2FC864` | | elevated | `#181920` |
| sor (red) | `#E2231A` | | nav | `#0F111A` |
| negative | `#E53450` | | text primary | `#E0FFFFFF` |
| zer (gold) | `#FDB813` | | text secondary | `#7AFFFFFF` |
| warning | `#EBC50A` | | text tertiary | `#52FFFFFF` |
| fire (orange) | `#FF7A00` | | periwinkle tint | `#999EC7` @ 10/16/24% |
| info | `#2AB0F2` | | | |
## Typography
- **Space Grotesk** — display: balances, screen titles, large numbers
- **Plus Jakarta Sans** — body / UI text
- **JetBrains Mono** — addresses, hashes, block numbers
All three are OFL-licensed and cover Latin-ext / Turkish / Kurdish Kurmancî
glyphs. Fonts live in `common/src/main/res/font/`; the theme maps them via
`fontRegular/SemiBold/Bold/ExtraBold/ExtraLight` in `common/.../values/themes.xml`.
## Brand mark & imagery
- The brand mark is the **Newroz flame** (`nevroz-fire-*`). Do **not** use the
retired Roj-rosette mark or a Kurdistan-map logo anywhere.
- First-launch splash uses the Newroz flame (`ic_loading_screen_logo`).
- Onboarding hero uses the **Global United States of Pezkuwi** infographic.
- Pull chain/token/dapp icons from `pezkuwichain/pezkuwi-wallet-utils`, don't
invent art. Keep one outline icon set (2px stroke, round caps).
## Where colors are defined
- Named colors: `common/src/main/res/values/colors.xml`
- Theme/type: `common/src/main/res/values/themes.xml`, `styles.xml`
## PR checklist (brand)
- [ ] No magenta/purple/pink in `colors.xml` (`#BD387F`, `#661D78`, `#443679`, `#FF48A5`, …).
- [ ] No `purple`/`magenta`/`pink`-named drawables or Compose color literals.
- [ ] Raster assets scanned for pink/magenta pixels (see snippet below); none above noise.
- [ ] New text uses the brand font roles; addresses use JetBrains Mono.
- [ ] Any new mark is the Newroz flame, not a map/rosette.
Raster pink scan (run from repo root):
```python
# python3 with Pillow
from PIL import Image; import glob
def pink(r,g,b): return r>150 and g<110 and b>120 and (r-g)>70
for f in glob.glob('**/res/drawable*/*.png',recursive=True)+glob.glob('**/res/drawable*/*.webp',recursive=True):
if '/build/' in f: continue
im=Image.open(f).convert('RGBA'); im.thumbnail((96,96)); px=im.load(); w,h=im.size; c=t=0
for y in range(h):
for x in range(w):
r,g,b,a=px[x,y]
if a<30: continue
t+=1; c+=pink(r,g,b)
if t and c/t>0.02: print(round(c/t*100,1),'%',f)
```
> Exception: third-party trademark logos (e.g. `ic_powered_by_oak`, OAK Network)
> must **not** be recolored — leave them as the owner ships them.
## Licensing note (important)
This app is a fork of **Nova Wallet**, licensed under **Apache-2.0**. Apache-2.0
lets us fork, rebrand and ship — **but you must KEEP `LICENSE` and `NOTICE`** and
their attributions, and state changes. Do **not** delete the attribution (that
would breach the license). Removing Nova's *trademark* (name/logo) from the UI is
required; preserving the *copyright notice* is also required. The package name
`io.novafoundation.nova.app` stays (Play Store identity; not a trademark issue).
+33 -1
View File
@@ -5,7 +5,39 @@ Context sıfırlanması durumunda referans olarak kullanılmalıdır.
--- ---
## DEBUG KODLARI (Production öncesi KALDIRILMALI) ## v1.1.1 — Dashboard & action-row screen redesign (2026-06-15)
Screen-level brand-book alignment (foundation landed in v1.1.0):
- **Pezkuwi dashboard card:** blue/indigo gradient → frosted dark-navy surface with
a small Newroz-flame icon; brand buttons (Approve = kesk, Sign = sor, Share =
frosted-dark — the old yellow Share button removed); zer/positive accents.
- **Balance action row:** flat icon+label → circular buttons (Send on a kesk-green
circle, Receive/Swap/Buy/Gift on frosted-dark circles with labels below).
## v1.1.0 — Brand-book UI redesign (2026-06-15)
Görsel kimlik Pezkuwi marka kitabına hizalandı; iş mantığına dokunulmadı.
- **Renkler:** colors.xml'deki yasak magenta/mor değerleri marka renkleriyle değiştirildi
(isimler korundu). Raster illustration'lardaki pembe/mor pikseller (siri, networks
banner, no-added-networks, hardware import, tinder-gov, crowdloan) kesk/teal'e retint
edildi. Üçüncü-taraf OAK logosuna dokunulmadı.
- **Tipografi:** Public Sans → Space Grotesk (display) + Plus Jakarta Sans (gövde) +
JetBrains Mono (adres/hash). TR + Kurmancî glifleri doğrulandı.
- **Splash:** Kurdistan-haritalı logo → Newroz alevi marka işareti.
- **Onboarding:** welcome hero → "Global United States of Pezkuwi" infografiği (tam/kırpılmadan).
- **Hijyen:** production-öncesi debug kodları kaldırıldı (FeeLoader user-facing DEBUG mesajı,
RuntimeFactory diagnostics). Brand kuralları için `BRAND.md` eklendi.
---
## DEBUG KODLARI — ✅ TEMİZLENDİ (2026-06-15, v1.1.0 öncesi)
> Aşağıdaki tüm debug kodları production'a çıkmadan kaldırıldı:
> #1 FeeLoaderV2Provider (kullanıcıya görünen DEBUG hata mesajı) ve #2 RuntimeFactory
> (`lastDiagnostics` + test referansı) bu sürümde temizlendi; #3#6 zaten kaldırılmıştı.
> Doğrulama: repoda `"DEBUG:` literali / `lastDiagnostics` referansı kalmadı.
> (Aşağıdaki kayıtlar tarihsel referans içindir.)
### 1. FeeLoaderV2Provider.kt - Hata mesajı gösterimi ### 1. FeeLoaderV2Provider.kt - Hata mesajı gösterimi
**Dosya:** `feature-wallet-api/src/main/java/io/novafoundation/nova/feature_wallet_api/presentation/mixin/fee/v2/FeeLoaderV2Provider.kt` **Dosya:** `feature-wallet-api/src/main/java/io/novafoundation/nova/feature_wallet_api/presentation/mixin/fee/v2/FeeLoaderV2Provider.kt`
@@ -229,9 +229,6 @@ class PezkuwiLiveTransferTest : BaseIntegrationTest() {
// Just log the extension names - type access might be restricted // Just log the extension names - type access might be restricted
Log.d("LiveTransferTest", "Signed extensions count: ${extrinsicMeta.signedExtensions.size}") Log.d("LiveTransferTest", "Signed extensions count: ${extrinsicMeta.signedExtensions.size}")
// Log the extrinsic address type if available
Log.d("LiveTransferTest", "RuntimeFactory diagnostics: ${io.novafoundation.nova.runtime.multiNetwork.runtime.RuntimeFactory.lastDiagnostics}")
println("Type resolution results:\n${results.joinToString("\n")}") println("Type resolution results:\n${results.joinToString("\n")}")
} }
+1 -1
View File
@@ -1,7 +1,7 @@
buildscript { buildscript {
ext { ext {
// App version // App version
versionName = '1.0.4' versionName = '1.1.1'
versionCode = 1 versionCode = 1
applicationId = "io.pezkuwichain.wallet" applicationId = "io.pezkuwichain.wallet"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 204 KiB

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 343 KiB

After

Width:  |  Height:  |  Size: 298 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 KiB

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
+26 -6
View File
@@ -1,4 +1,21 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!--
Pezkuwi Wallet — common/src/main/res/values/colors.xml
REDESIGN per Pezkuwi Wallet Design System (brand book).
This is a DROP-IN replacement for the current file: every color NAME is
preserved (so no Kotlin/XML references break), only VALUES change.
What changed vs. the shipped file — and why:
• Purged forbidden Nova-legacy PINK / MAGENTA / PURPLE. The brand permits ONLY
the Kurdistan palette (kesk green / sor red / zer gold / fire) + navy/neutral.
- crowdloan_banner_gradient_start #BD387F (magenta) -> #009639 (kesk)
- networks_banner_gradient_end #661D78 (purple) -> #017A2F (kesk-700)
- chip_on_card_background #443679 (purple) -> #3D999EC7 (frosted)
• Everything else is unchanged from the already-Kurdistan-themed file.
Search the file for "REDESIGN:" to see each changed line.
-->
<resources> <resources>
<!-- Colors not included in the design system --> <!-- Colors not included in the design system -->
<color name="address_icon_background">#eeeeee</color> <color name="address_icon_background">#eeeeee</color>
@@ -44,11 +61,13 @@
<color name="staking_type_banner_text_inactive">#52FFFFFF</color> <color name="staking_type_banner_text_inactive">#52FFFFFF</color>
<color name="tinder_gov_banner_secondary_text">#A3FFFFFF</color> <color name="tinder_gov_banner_secondary_text">#A3FFFFFF</color>
<color name="crowdloan_banner_gradient_start">#BD387F</color> <!-- REDESIGN: crowdloan banner is now the Newroz-flame gradient (kesk -> fire), not magenta -> orange -->
<color name="crowdloan_banner_gradient_start">#009639</color>
<color name="crowdloan_banner_gradient_end">#FF7A00</color> <color name="crowdloan_banner_gradient_end">#FF7A00</color>
<!-- REDESIGN: networks banner is now navy -> kesk green, not navy -> purple -->
<color name="networks_banner_gradient_start">#00072E</color> <color name="networks_banner_gradient_start">#00072E</color>
<color name="networks_banner_gradient_end">#661D78</color> <color name="networks_banner_gradient_end">#017A2F</color>
<!-- Icon Colors --> <!-- Icon Colors -->
<color name="icon_primary">#E0FFFFFF</color> <color name="icon_primary">#E0FFFFFF</color>
@@ -70,12 +89,12 @@
<color name="bottom_sheet_background">#181920</color> <color name="bottom_sheet_background">#181920</color>
<color name="block_background">#1A999EC7</color> <color name="block_background">#1A999EC7</color>
<color name="hided_networks_block_background">#3D999EC7</color> <color name="hided_networks_block_background">#3D999EC7</color>
<!-- TODO update name once in design system-->
<color name="block_background_dark">#5205081C</color> <color name="block_background_dark">#5205081C</color>
<color name="cell_background_pressed">#291F78FF</color> <color name="cell_background_pressed">#291F78FF</color>
<color name="input_background">#1A999EC7</color> <color name="input_background">#1A999EC7</color>
<color name="chips_background">#29999EC7</color> <color name="chips_background">#29999EC7</color>
<color name="chip_on_card_background">#443679</color> <!-- REDESIGN: was #443679 (purple). Now frosted periwinkle, on-brand. -->
<color name="chip_on_card_background">#3D999EC7</color>
<color name="container_background">#1A999EC7</color> <color name="container_background">#1A999EC7</color>
<color name="token_container_background">#3D08090E</color> <color name="token_container_background">#3D08090E</color>
<color name="segmented_background">#5208090E</color> <color name="segmented_background">#5208090E</color>
@@ -109,7 +128,8 @@
<color name="button_background_inactive_on_gradient">#1A999EC7</color> <color name="button_background_inactive_on_gradient">#1A999EC7</color>
<color name="button_background_inactive">#181920</color> <color name="button_background_inactive">#181920</color>
<color name="button_wallet_connect_background">#353D67</color> <!-- REDESIGN: WalletConnect button retinted off the indigo #353D67 to a neutral navy. -->
<color name="button_wallet_connect_background">#1F2A4D</color>
<color name="wallet_connections_background">#101636</color> <color name="wallet_connections_background">#101636</color>
<!-- Border Colors - Kurdistan Green --> <!-- Border Colors - Kurdistan Green -->
@@ -162,4 +182,4 @@
<color name="neutral_price_chart_line">#454968</color> <color name="neutral_price_chart_line">#454968</color>
<color name="positive_price_chart_line">#2FC864</color> <color name="positive_price_chart_line">#2FC864</color>
<color name="negative_price_chart_line">#E53450</color> <color name="negative_price_chart_line">#E53450</color>
</resources> </resources>
+1 -1
View File
@@ -245,7 +245,7 @@
<style name="TextAppearance.NovaFoundation.Regular.Monospace"> <style name="TextAppearance.NovaFoundation.Regular.Monospace">
<item name="android:textSize">12sp</item> <item name="android:textSize">12sp</item>
<item name="android:fontFamily">monospace</item> <item name="android:fontFamily">@font/jetbrains_mono_regular</item>
</style> </style>
<!-- Buttons --> <!-- Buttons -->
+6 -6
View File
@@ -30,12 +30,12 @@
<item name="textSizeSubHeadline">@dimen/text_size_subheadline</item> <item name="textSizeSubHeadline">@dimen/text_size_subheadline</item>
<!--text sizes--> <!--text sizes-->
<!--fonts--> <!--fonts: brand book — Plus Jakarta Sans (body) + Space Grotesk (display/bold)-->
<item name="fontSemiBold">@font/public_sans_semi_bold</item> <item name="fontSemiBold">@font/plus_jakarta_sans_semi_bold</item>
<item name="fontBold">@font/public_sans_bold</item> <item name="fontBold">@font/space_grotesk_bold</item>
<item name="fontExtraBold">@font/public_sans_extra_bold</item> <item name="fontExtraBold">@font/space_grotesk_bold</item>
<item name="fontRegular">@font/public_sans_regular</item> <item name="fontRegular">@font/plus_jakarta_sans_regular</item>
<item name="fontExtraLight">@font/public_sans_extra_light</item> <item name="fontExtraLight">@font/plus_jakarta_sans_light</item>
<!--fonts--> <!--fonts-->
<item name="android:forceDarkAllowed" tools:targetApi="q">false</item> <item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Brand: primary action circle — kesk green -->
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<solid android:color="#009639" />
</shape>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Brand: secondary action circle — frosted dark -->
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<solid android:color="#242838" />
<stroke android:width="1dp" android:color="#29999EC7" />
</shape>
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Brand book: frosted dark-navy surface + 1px periwinkle hairline (no blue/indigo gradient) -->
<shape xmlns:android="http://schemas.android.com/apk/res/android" <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"> android:shape="rectangle">
<gradient <solid android:color="#1C1F2E" />
android:angle="135"
android:startColor="#FF1A237E"
android:centerColor="#FF283593"
android:endColor="#FF3949AB"
android:type="linear" />
<corners android:radius="16dp" /> <stroke
android:width="1dp"
android:color="#33999EC7" />
<corners android:radius="20dp" />
</shape> </shape>
@@ -4,7 +4,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp" android:layout_marginHorizontal="16dp"
app:cardCornerRadius="16dp" app:cardBackgroundColor="@android:color/transparent"
app:cardCornerRadius="20dp"
app:cardElevation="0dp" app:cardElevation="0dp"
app:strokeWidth="0dp"> app:strokeWidth="0dp">
@@ -13,14 +14,20 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/bg_pezkuwi_dashboard" android:background="@drawable/bg_pezkuwi_dashboard"
android:orientation="vertical" android:orientation="vertical"
android:padding="16dp"> android:padding="18dp">
<!-- Top row: Title + Logo --> <!-- Header: flame badge + title/roles (left), citizen count (right) -->
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:gravity="center_vertical"
android:gravity="center_vertical"> android:orientation="horizontal">
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="12dp"
android:src="@drawable/ic_nevroz_flame" />
<LinearLayout <LinearLayout
android:layout_width="0dp" android:layout_width="0dp"
@@ -33,7 +40,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/pezkuwi_dashboard_title" android:text="@string/pezkuwi_dashboard_title"
android:textColor="@android:color/white" android:textColor="#E0FFFFFF"
android:textSize="18sp" android:textSize="18sp"
android:textStyle="bold" /> android:textStyle="bold" />
@@ -41,109 +48,113 @@
android:id="@+id/pezkuwiDashboardRoles" android:id="@+id/pezkuwiDashboardRoles"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="3dp"
app:flexWrap="wrap"
app:alignItems="center" app:alignItems="center"
app:flexWrap="wrap"
app:justifyContent="flex_start" /> app:justifyContent="flex_start" />
<!-- Trust Score -->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:orientation="horizontal"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pezkuwi_dashboard_trust_score"
android:textColor="#B0BEC5"
android:textSize="12sp" />
<TextView
android:id="@+id/pezkuwiDashboardTrustValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:textColor="#FFD54F"
android:textSize="16sp"
android:textStyle="bold" />
<com.google.android.material.button.MaterialButton
android:id="@+id/pezkuwiDashboardStartTrackingButton"
style="@style/Widget.MaterialComponents.Button"
android:layout_width="wrap_content"
android:layout_height="32dp"
android:layout_marginStart="8dp"
android:minWidth="0dp"
android:paddingHorizontal="10dp"
android:text="@string/pezkuwi_dashboard_start_tracking"
android:textAllCaps="false"
android:textColor="@android:color/white"
android:textSize="11sp"
android:visibility="gone"
app:backgroundTint="#FF9800"
app:cornerRadius="8dp" />
</LinearLayout>
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:gravity="end"
android:gravity="center" android:orientation="vertical">
android:layout_marginEnd="12dp">
<TextView <TextView
android:id="@+id/pezkuwiDashboardWelatiCount" android:id="@+id/pezkuwiDashboardWelatiCount"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textColor="#4CAF50" android:layout_gravity="end"
android:textSize="22sp" android:textColor="#2FC864"
android:textSize="24sp"
android:textStyle="bold" /> android:textStyle="bold" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="end"
android:text="@string/pezkuwi_dashboard_kurds_title" android:text="@string/pezkuwi_dashboard_kurds_title"
android:textColor="#CFD8DC" android:textColor="#7AFFFFFF"
android:textSize="10sp" /> android:textSize="10sp" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
<!-- Action buttons: Kesk (green), Sor (red), Zer (yellow) --> <!-- Trust score -->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="14dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pezkuwi_dashboard_trust_score"
android:textColor="#7AFFFFFF"
android:textSize="12sp" />
<TextView
android:id="@+id/pezkuwiDashboardTrustValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:textColor="#FDB813"
android:textSize="16sp"
android:textStyle="bold" />
<com.google.android.material.button.MaterialButton
android:id="@+id/pezkuwiDashboardStartTrackingButton"
style="@style/Widget.MaterialComponents.Button"
android:layout_width="wrap_content"
android:layout_height="32dp"
android:layout_marginStart="8dp"
android:minWidth="0dp"
android:paddingHorizontal="10dp"
android:text="@string/pezkuwi_dashboard_start_tracking"
android:textAllCaps="false"
android:textColor="@android:color/white"
android:textSize="11sp"
android:visibility="gone"
app:backgroundTint="#009639"
app:cornerRadius="8dp" />
</LinearLayout>
<!-- Action buttons -->
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/pezkuwiDashboardBasvuruButton" android:id="@+id/pezkuwiDashboardBasvuruButton"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="48dp"
android:layout_marginTop="10dp" android:layout_marginTop="16dp"
android:text="@string/pezkuwi_dashboard_basvuru" android:text="@string/pezkuwi_dashboard_basvuru"
android:textAllCaps="false" android:textAllCaps="false"
android:textColor="@android:color/white" android:textColor="@android:color/white"
app:backgroundTint="#4CAF50" android:textStyle="bold"
app:cornerRadius="8dp" /> app:backgroundTint="#009639"
app:cornerRadius="14dp" />
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/pezkuwiDashboardSignButton" android:id="@+id/pezkuwiDashboardSignButton"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="48dp"
android:layout_marginTop="6dp" android:layout_marginTop="8dp"
android:text="@string/citizenship_sign" android:text="@string/citizenship_sign"
android:textAllCaps="false" android:textAllCaps="false"
android:textColor="@android:color/white" android:textColor="@android:color/white"
app:backgroundTint="#E53935" app:backgroundTint="#E2231A"
app:cornerRadius="8dp" /> app:cornerRadius="14dp" />
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/pezkuwiDashboardShareButton" android:id="@+id/pezkuwiDashboardShareButton"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="48dp"
android:layout_marginTop="6dp" android:layout_marginTop="8dp"
android:text="@string/citizenship_share_button" android:text="@string/citizenship_share_button"
android:textAllCaps="false" android:textAllCaps="false"
android:textColor="#212121" android:textColor="#E0FFFFFF"
app:backgroundTint="#FDD835" app:backgroundTint="#2A2F45"
app:cornerRadius="8dp" /> app:cornerRadius="14dp"
app:strokeColor="#33999EC7"
app:strokeWidth="1dp" />
</LinearLayout> </LinearLayout>
</com.google.android.material.card.MaterialCardView> </com.google.android.material.card.MaterialCardView>
@@ -124,71 +124,145 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/viewAssetsTotalBalanceContainer"> app:layout_constraintTop_toBottomOf="@id/viewAssetsTotalBalanceContainer">
<TextView <LinearLayout
android:id="@+id/viewAssetsTotalBalanceSend" android:id="@+id/viewAssetsTotalBalanceSend"
style="@style/Widget.Nova.ActionButton"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:breakStrategy="high_quality" android:orientation="vertical"
android:hyphenationFrequency="full" android:gravity="center"
android:paddingBottom="8dp" android:clickable="true"
android:text="@string/wallet_asset_send" android:focusable="true"
app:drawableTopCompat="@drawable/ic_send_tokens" android:paddingVertical="6dp">
tools:drawableTop="@drawable/ic_send_tokens" />
<TextView <ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@drawable/bg_action_circle_primary"
android:padding="13dp"
android:src="@drawable/ic_send_tokens"
app:tint="@android:color/white" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:text="@string/wallet_asset_send"
android:textColor="@color/text_secondary"
android:textSize="11sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/viewAssetsTotalBalanceReceive" android:id="@+id/viewAssetsTotalBalanceReceive"
style="@style/Widget.Nova.ActionButton"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:breakStrategy="high_quality" android:orientation="vertical"
android:hyphenationFrequency="full" android:gravity="center"
android:paddingBottom="8dp" android:clickable="true"
android:text="@string/wallet_asset_receive" android:focusable="true"
app:drawableTopCompat="@drawable/ic_receive_tokens" android:paddingVertical="6dp">
tools:drawableTop="@drawable/ic_receive_tokens"
tools:text="Получить" />
<TextView <ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@drawable/bg_action_circle_secondary"
android:padding="13dp"
android:src="@drawable/ic_receive_tokens"
app:tint="@color/icon_primary" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:text="@string/wallet_asset_receive"
android:textColor="@color/text_secondary"
android:textSize="11sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/viewAssetsTotalBalanceSwap" android:id="@+id/viewAssetsTotalBalanceSwap"
style="@style/Widget.Nova.ActionButton"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:breakStrategy="high_quality" android:orientation="vertical"
android:hyphenationFrequency="full" android:gravity="center"
android:paddingBottom="8dp" android:clickable="true"
android:text="@string/wallet_asset_swap" android:focusable="true"
app:drawableTopCompat="@drawable/ic_swap" android:paddingVertical="6dp">
tools:drawableTop="@drawable/ic_swap" />
<TextView <ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@drawable/bg_action_circle_secondary"
android:padding="13dp"
android:src="@drawable/ic_swap"
app:tint="@color/icon_primary" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:text="@string/wallet_asset_swap"
android:textColor="@color/text_secondary"
android:textSize="11sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/viewAssetsTotalBalanceBuy" android:id="@+id/viewAssetsTotalBalanceBuy"
style="@style/Widget.Nova.ActionButton"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:breakStrategy="high_quality" android:orientation="vertical"
android:hyphenationFrequency="full" android:gravity="center"
android:paddingBottom="8dp" android:clickable="true"
android:text="@string/wallet_asset_buy_sell" android:focusable="true"
app:drawableTopCompat="@drawable/ic_buy_tokens" android:paddingVertical="6dp">
tools:drawableTop="@drawable/ic_buy" />
<TextView <ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@drawable/bg_action_circle_secondary"
android:padding="13dp"
android:src="@drawable/ic_buy_tokens"
app:tint="@color/icon_primary" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:text="@string/wallet_asset_buy_sell"
android:textColor="@color/text_secondary"
android:textSize="11sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/viewAssetsTotalBalanceGift" android:id="@+id/viewAssetsTotalBalanceGift"
style="@style/Widget.Nova.ActionButton"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:breakStrategy="high_quality" android:orientation="vertical"
android:hyphenationFrequency="full" android:gravity="center"
android:paddingBottom="8dp" android:clickable="true"
android:text="@string/common_gift" android:focusable="true"
app:drawableTopCompat="@drawable/ic_gift_card" android:paddingVertical="6dp">
tools:drawableTop="@drawable/ic_gift_card" />
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@drawable/bg_action_circle_secondary"
android:padding="13dp"
android:src="@drawable/ic_gift_card"
app:tint="@color/icon_primary" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:text="@string/common_gift"
android:textColor="@color/text_secondary"
android:textSize="11sp" />
</LinearLayout>
</LinearLayout> </LinearLayout>
@@ -15,7 +15,7 @@
android:id="@+id/logoImg" android:id="@+id/logoImg"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:scaleType="centerCrop" android:scaleType="fitCenter"
android:src="@drawable/ic_create_wallet_background" android:src="@drawable/ic_create_wallet_background"
app:layout_constraintBottom_toTopOf="@+id/welcomeCreateWalletButton" app:layout_constraintBottom_toTopOf="@+id/welcomeCreateWalletButton"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
@@ -160,15 +160,11 @@ internal class FeeLoaderV2Provider<F, D>(
fee.emit(FeeStatus.Error) fee.emit(FeeStatus.Error)
// Show detailed error in retry dialog with runtime diagnostics
val diagnostics = try {
io.novafoundation.nova.runtime.multiNetwork.runtime.RuntimeFactory.lastDiagnostics
} catch (e: Exception) { "N/A" }
retryEvent.postValue( retryEvent.postValue(
Event( Event(
RetryPayload( RetryPayload(
title = resourceManager.getString(R.string.choose_amount_network_error), title = resourceManager.getString(R.string.choose_amount_network_error),
message = "DEBUG: $errorMsg | Runtime: $diagnostics", message = resourceManager.getString(R.string.choose_amount_error_fee),
onRetry = { loadFee(feeConstructor) }, onRetry = { loadFee(feeConstructor) },
onCancel = { } onCancel = { }
) )
@@ -47,10 +47,6 @@ class RuntimeFactory(
private val gson: Gson, private val gson: Gson,
private val concurrencyLimit: Int = 1 private val concurrencyLimit: Int = 1
) { ) {
companion object {
@Volatile
var lastDiagnostics: String = "not yet initialized"
}
private val dispatcher = newLimitedThreadPoolExecutor(concurrencyLimit).asCoroutineDispatcher() private val dispatcher = newLimitedThreadPoolExecutor(concurrencyLimit).asCoroutineDispatcher()
private val semaphore = Semaphore(concurrencyLimit) private val semaphore = Semaphore(concurrencyLimit)
@@ -110,11 +106,6 @@ class RuntimeFactory(
val typeRegistry = TypeRegistry(finalTypes, DynamicTypeResolver(DynamicTypeResolver.DEFAULT_COMPOUND_EXTENSIONS + GenericsExtension)) val typeRegistry = TypeRegistry(finalTypes, DynamicTypeResolver(DynamicTypeResolver.DEFAULT_COMPOUND_EXTENSIONS + GenericsExtension))
// Store diagnostic info for error messages
val hasExtrinsicSignature = typeRegistry["ExtrinsicSignature"] != null
val hasAddress = typeRegistry["Address"] != null
lastDiagnostics = "typesUsage=$typesUsage, ExtrinsicSig=$hasExtrinsicSignature, Address=$hasAddress, typeCount=${finalTypes.size}"
val runtimeMetadata = VersionedRuntimeBuilder.buildMetadata(metadataReader, typeRegistry) val runtimeMetadata = VersionedRuntimeBuilder.buildMetadata(metadataReader, typeRegistry)
ConstructedRuntime( ConstructedRuntime(