diff --git a/.coverage-floor-lines b/.coverage-floor-lines new file mode 100644 index 00000000..3ad5abd0 --- /dev/null +++ b/.coverage-floor-lines @@ -0,0 +1 @@ +99 diff --git a/.coverage-floors.json b/.coverage-floors.json new file mode 100644 index 00000000..c3cbf0c5 --- /dev/null +++ b/.coverage-floors.json @@ -0,0 +1,32 @@ +{ + "_comment": [ + "Per-file MINIMUM line coverage for Tier-A files: key derivation, wallet", + "seed/setup, signing, authentication, secure storage, biometric and the", + "hardware-wallet bridge and its BLE/USB transports. Enforced by", + "scripts/check-coverage-file-floors.mjs", + "(see ci.yml job `coverage-floor`).", + "", + "Why this exists on top of .coverage-floor-lines: the aggregate floor lets", + "a single security-critical file rot to 0% as long as the mean stays high.", + "These files are the ones where a regression loses funds or leaks keys, so", + "they are pinned individually at 100. Lowering any entry is a deliberate,", + "reviewable act — do not weaken a number to make a red build pass." + ], + "files": { + "src/features/passkey/services/key-derivation.ts": 100, + "src/features/passkey/services/setup-wallet.ts": 100, + "src/features/passkey/services/passkey-service.ts": 100, + "src/features/dfx-backend/services/auth-service.ts": 100, + "src/features/dfx-backend/services/jwt.ts": 100, + "src/features/dfx-backend/services/kyc-service.ts": 100, + "src/features/biometric/biometric.ts": 100, + "src/features/hardware-wallet/services/bitbox.ts": 100, + "src/features/hardware-wallet/services/transport-ble.ts": 100, + "src/features/hardware-wallet/services/transport-usb.ts": 100, + "src/services/wallet/seed.ts": 100, + "src/services/pin.ts": 100, + "src/services/storage.ts": 100, + "src/services/evm/signature.ts": 100, + "src/services/evm/address.ts": 100 + } +} diff --git a/.detoxrc.js b/.detoxrc.js index bf9e3c7a..e8f35a28 100644 --- a/.detoxrc.js +++ b/.detoxrc.js @@ -4,12 +4,29 @@ module.exports = { args: { $0: 'jest', config: 'e2e/jest.config.js', + // The app (WDK worklet thread + balance/pricing timers) keeps the Node + // event loop alive, so jest can hang after the suite passes instead of + // exiting — intermittently on CI, which then burns the whole job to the + // timeout. Force-exit once the run (and teardown) is done. + forceExit: true, }, jest: { setupTimeout: 120_000, }, }, + behavior: { + cleanup: { + // forceExit above only kills the jest child. The detox CLI parent then + // closes its ws server, but the app still running in the simulator holds + // its connection open, so the close callback never fires ("Detox server + // has been closed abruptly") and the leaked handle keeps the CLI alive + // until the CI job timeout. Shutting the device down drops the + // connection so the CLI can actually exit after a passing run. + shutdownDevice: true, + }, + }, + apps: { 'ios.debug': { type: 'ios.app', diff --git a/.env.example b/.env.example index 932cc6f5..6715feff 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,92 @@ +# ============================================================================= +# Feature flags +# ============================================================================= +# Build-time gates for every deferred (non-MVP) function. Each variable +# is read in `src/config/features.ts` and compared against the literal +# 'true' — Metro's dead-code elimination drops the unused branch from +# the bundle when a flag is left off. Copy the lines you need into +# `.env.local` (which is gitignored) and set them to `true` to enable +# the feature in your local build. +# +# Default for every flag is OFF. The MVP build runs with none of these +# set: Welcome → Create wallet → Dashboard → Receive / Send only. +# +# See the "Feature flags" table in README.md for what each flag gates. + +# Restore wallet from 12 / 24-word seed (incl. verify-seed quiz). +EXPO_PUBLIC_ENABLE_RESTORE= + +# Create / restore wallet via WebAuthn Passkey (iOS 18+ / Android 14+). +EXPO_PUBLIC_ENABLE_PASSKEY= + +# Legal disclaimer step in onboarding + Settings → Legal-documents launcher. +EXPO_PUBLIC_ENABLE_LEGAL= + +# PIN setup + PIN unlock + auth gate around `(auth)/*` routes. +EXPO_PUBLIC_ENABLE_PIN= + +# Biometric unlock (Face ID / Touch ID / fingerprint) + Settings toggle. +EXPO_PUBLIC_ENABLE_BIOMETRIC= + +# Portfolio screen (local + linked wallets), asset detail, chain manage, +# Hide-balance toggle, Dashboard portfolio pill. +EXPO_PUBLIC_ENABLE_PORTFOLIO= + +# Buy (fiat on-ramp) + Sell (fiat off-ramp) flows. +EXPO_PUBLIC_ENABLE_BUY_SELL= + +# Linked-wallet detail screen (per-address holdings + tx feed). +EXPO_PUBLIC_ENABLE_LINKED_WALLETS= + +# Transaction history (list + detail). +EXPO_PUBLIC_ENABLE_TX_HISTORY= + +# Pay (QR scan). Currently a placeholder that returns a coming-soon alert. +EXPO_PUBLIC_ENABLE_PAY= + +# DFX backend integration: silent sign-in, e-mail login, auto-link, +# linked-wallets management, KYC, user data, support, contact channels. +# Many of the deferred features above are non-functional without this on +# (e.g. Buy/Sell, Linked wallets), so flip this first when enabling them. +EXPO_PUBLIC_ENABLE_DFX_BACKEND= + +# Tax report CSV export (CoinTracking et al.). +EXPO_PUBLIC_ENABLE_TAX_REPORT= + +# Settings hub + screens it owns (language, currency, seed export, +# delete wallet, screen-capture protection on the seed screen). +EXPO_PUBLIC_ENABLE_SETTINGS= + +# BitBox02 hardware wallet pairing (USB + BLE + WASM bridge). +EXPO_PUBLIC_ENABLE_HARDWARE_WALLET= + +# Multi-sig vault setup (local cosigner list, no on-chain signing yet). +EXPO_PUBLIC_ENABLE_MULTISIG= + +# `dfxwallet://` deep-link handler. +EXPO_PUBLIC_ENABLE_DEEPLINKS= + +# In-app WebView (KYC iframe + payment hand-off, gated by safe-url allow-list). +EXPO_PUBLIC_ENABLE_WEBVIEW= + +# ============================================================================= +# Build-time configuration +# ============================================================================= +# URLs / API keys / RPC overrides. Defaults are baked into +# `src/config/chains.ts` / `src/config/env.ts`, so the app runs with +# none of these set. Override only when pointing the build at a +# private RPC / custom backend. + EXPO_PUBLIC_DFX_API_URL=https://api.dfx.swiss/v1 +EXPO_PUBLIC_LDS_URL= +EXPO_PUBLIC_ETHERSCAN_API_KEY= EXPO_PUBLIC_ETH_RPC_URL= EXPO_PUBLIC_ARBITRUM_RPC_URL= EXPO_PUBLIC_POLYGON_RPC_URL= +EXPO_PUBLIC_BASE_RPC_URL= +EXPO_PUBLIC_PLASMA_RPC_URL= +EXPO_PUBLIC_SEPOLIA_RPC_URL= +EXPO_PUBLIC_BTC_ELECTRUM_HOST= +EXPO_PUBLIC_BTC_ELECTRUM_PORT= +EXPO_PUBLIC_WDK_INDEXER_URL= +EXPO_PUBLIC_WDK_INDEXER_API_KEY= diff --git a/.env.testnet b/.env.testnet index 69c763a1..e0f94640 100644 --- a/.env.testnet +++ b/.env.testnet @@ -13,6 +13,12 @@ EXPO_PUBLIC_DFX_API_URL=https://api.dfx.swiss/v1 # TODO(testnet): replace with the real WDK testnet indexer once provisioned. EXPO_PUBLIC_WDK_INDEXER_URL=https://wdk-api.tether.io +# Minimal WDK chain set for E2E. WDK inits every configured chain on first +# wallet setup; the full set blows past the visual-regression onboard timeout +# on a fresh CI simulator. The authenticated screens only need a wallet to +# exist, so init just one EVM testnet + bitcoin. Unset = all chains (prod). +EXPO_PUBLIC_WDK_CHAINS=sepolia,bitcoin + # Chain RPCs — leave blank to fall through to the public defaults baked into # `src/config/chains.ts`. Override here if you want to point E2E at private # testnet RPCs. diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..67405a15 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,43 @@ +# Code owners for security-critical paths. +# +# Effective only once the develop/main rulesets enable +# "require review from Code Owners" — see docs/security/roadmap.md (P0.6). +# Until then this file still routes review requests automatically. +# +# Rationale (docs/security/roadmap.md, "Reviews"): any PR touching key +# handling, signing, secure storage, the DFX backend client, dependency +# manifests or CI itself needs a security-conscious review — enforced +# here instead of by convention. + +# Key handling & signing +/src/services/wallet/ @Danswar @davidleomay @TaprootFreak +/src/services/security/ @Danswar @davidleomay @TaprootFreak +/src/services/evm/ @Danswar @davidleomay @TaprootFreak +/src/services/storage.ts @Danswar @davidleomay @TaprootFreak +/src/services/pin.ts @Danswar @davidleomay @TaprootFreak +/src/features/hardware-wallet/ @Danswar @davidleomay @TaprootFreak +/src/features/passkey/ @Danswar @davidleomay @TaprootFreak +/src/features/biometric/ @Danswar @davidleomay @TaprootFreak +/src/features/pin/ @Danswar @davidleomay @TaprootFreak + +# Feature flags decide which security features are live +/src/config/features.ts @Danswar @davidleomay @TaprootFreak + +# Security-critical screens (seed export, PIN entry, onboarding/key creation) +/app/(auth)/seed-export.tsx @Danswar @davidleomay @TaprootFreak +/app/(pin)/ @Danswar @davidleomay @TaprootFreak +/app/(onboarding)/ @Danswar @davidleomay @TaprootFreak + +# Backend trust boundary +/src/features/dfx-backend/ @Danswar @davidleomay @TaprootFreak + +# Supply chain & build integrity +/package.json @Danswar @davidleomay @TaprootFreak +/package-lock.json @Danswar @davidleomay @TaprootFreak +/plugins/ @Danswar @davidleomay @TaprootFreak + +# CI and the gates themselves (a gate nobody guards is not a gate) +/.github/ @Danswar @davidleomay @TaprootFreak +/scripts/ @Danswar @davidleomay @TaprootFreak +/.coverage-floor-lines @Danswar @davidleomay @TaprootFreak +/.coverage-floors.json @Danswar @davidleomay @TaprootFreak diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..34eb3f60 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,26 @@ +## What + + + +## Feature matrix + + + +- [ ] No user-facing function added/changed/removed — matrix untouched +- [ ] Matrix row(s) updated in this PR: +- [ ] New screen added → classified in `e2e/visual-coverage.json` (CI enforces it) + +## Tests + +- [ ] New/changed logic is covered (coverage floor must not drop — CI enforces it) +- [ ] Touched a deferred feature: its test status in the matrix is still accurate + +## Security checklist (tick what applies) + +- [ ] Touches key handling, signing, secure storage, or the DFX client → code-owner review requested +- [ ] No secret, seed, token, or PII is logged, persisted outside `expo-secure-store`, or sent to a third party +- [ ] New dependency added → justified here: + +## How to verify + + diff --git a/.github/dependabot.yml b/.github/dependabot.yml index c34d0a63..5b7da58c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -11,10 +11,12 @@ updates: open-pull-requests-limit: 5 labels: - dependencies + # `prefix` already carries the conventional-commit scope, so `include: scope` + # must stay off — together they produce a double scope ("chore(deps)(deps): …") + # that fails the pr-policy conventional-commit gate. commit-message: prefix: chore(deps) prefix-development: chore(deps-dev) - include: scope - package-ecosystem: github-actions directory: / @@ -28,6 +30,6 @@ updates: labels: - dependencies - github-actions + # See note above: `prefix` carries the scope; `include: scope` would double it. commit-message: prefix: chore(ci) - include: scope diff --git a/.github/workflows/auto-release-pr.yaml b/.github/workflows/auto-release-pr.yaml index 83f1c447..11ab0ac7 100644 --- a/.github/workflows/auto-release-pr.yaml +++ b/.github/workflows/auto-release-pr.yaml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: fetch-depth: 0 diff --git a/.github/workflows/auto-tag.yaml b/.github/workflows/auto-tag.yaml index bc10e971..a0d34c50 100644 --- a/.github/workflows/auto-tag.yaml +++ b/.github/workflows/auto-tag.yaml @@ -17,13 +17,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: fetch-depth: 0 fetch-tags: true - name: Setup SSH for Deploy Key - uses: webfactory/ssh-agent@v0.9.0 + uses: webfactory/ssh-agent@v0.10.0 with: ssh-private-key: ${{ secrets.TAG_DEPLOY_KEY }} diff --git a/.github/workflows/beta-release-android.yaml b/.github/workflows/beta-release-android.yaml index c6d224ef..024bb7d1 100644 --- a/.github/workflows/beta-release-android.yaml +++ b/.github/workflows/beta-release-android.yaml @@ -18,10 +18,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v7 with: node-version: 22 cache: npm @@ -30,7 +30,7 @@ jobs: run: npm ci - name: Setup EAS - uses: expo/expo-github-action@v8 + uses: expo/expo-github-action@v9 with: eas-version: latest token: ${{ secrets.EXPO_TOKEN }} diff --git a/.github/workflows/beta-release-ios.yaml b/.github/workflows/beta-release-ios.yaml index 48f0979f..2f87ace5 100644 --- a/.github/workflows/beta-release-ios.yaml +++ b/.github/workflows/beta-release-ios.yaml @@ -18,10 +18,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v7 with: node-version: 22 cache: npm @@ -30,7 +30,7 @@ jobs: run: npm ci - name: Setup EAS - uses: expo/expo-github-action@v8 + uses: expo/expo-github-action@v9 with: eas-version: latest token: ${{ secrets.EXPO_TOKEN }} diff --git a/.github/workflows/beta-release.yaml b/.github/workflows/beta-release.yaml index ce94276f..1313356e 100644 --- a/.github/workflows/beta-release.yaml +++ b/.github/workflows/beta-release.yaml @@ -13,15 +13,30 @@ concurrency: cancel-in-progress: false jobs: + create-release: + name: Create Release + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags/v') + steps: + - name: Ensure GitHub Release exists + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release view "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1 \ + || gh release create "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --title "$GITHUB_REF_NAME" --notes "" --draft \ + || gh release view "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1 + build-android: name: Build Android + needs: [create-release] + if: ${{ always() && !cancelled() && (needs.create-release.result == 'success' || needs.create-release.result == 'skipped') }} runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v7 with: node-version: 22 cache: npm @@ -30,7 +45,7 @@ jobs: run: npm ci - name: Setup EAS - uses: expo/expo-github-action@v8 + uses: expo/expo-github-action@v9 with: eas-version: latest token: ${{ secrets.EXPO_TOKEN }} @@ -41,30 +56,39 @@ jobs: echo "$BUILD_JSON" > /tmp/android-build.json APK_URL=$(echo "$BUILD_JSON" | jq -r '.[0].artifacts.buildUrl // .[0].artifacts.applicationArchiveUrl // empty') echo "APK_URL=$APK_URL" >> $GITHUB_ENV + if [[ "$GITHUB_REF" == refs/tags/v* ]] && [ -z "$APK_URL" ]; then + echo "APK_URL is empty for tag ref; failing closed." >&2 + exit 1 + fi - name: Download APK if: env.APK_URL != '' run: | TAG="${GITHUB_REF_NAME:-dev}" VERSION="${TAG#v}" - curl -fsSL "$APK_URL" -o "dfx-wallet-${VERSION}.apk" + curl -fsSL "$APK_URL" -o "dfx-wallet-${VERSION}.apk" && test -s "dfx-wallet-${VERSION}.apk" - - name: Upload APK artifact - if: env.APK_URL != '' - uses: actions/upload-artifact@v4 - with: - name: android-apk - path: dfx-wallet-*.apk + - name: Upload APK to GitHub Release + if: env.APK_URL != '' && startsWith(github.ref, 'refs/tags/v') + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release view "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1 \ + || gh release create "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --title "$GITHUB_REF_NAME" --notes "" --draft \ + || gh release view "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1 + gh release upload "$GITHUB_REF_NAME" dfx-wallet-*.apk --clobber --repo "$GITHUB_REPOSITORY" build-ios: name: Build iOS + needs: [create-release] + if: ${{ always() && !cancelled() && (needs.create-release.result == 'success' || needs.create-release.result == 'skipped') }} runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v7 with: node-version: 22 cache: npm @@ -73,7 +97,7 @@ jobs: run: npm ci - name: Setup EAS - uses: expo/expo-github-action@v8 + uses: expo/expo-github-action@v9 with: eas-version: latest token: ${{ secrets.EXPO_TOKEN }} @@ -84,35 +108,42 @@ jobs: echo "$BUILD_JSON" > /tmp/ios-build.json IPA_URL=$(echo "$BUILD_JSON" | jq -r '.[0].artifacts.buildUrl // .[0].artifacts.applicationArchiveUrl // empty') echo "IPA_URL=$IPA_URL" >> $GITHUB_ENV + if [[ "$GITHUB_REF" == refs/tags/v* ]] && [ -z "$IPA_URL" ]; then + echo "IPA_URL is empty for tag ref; failing closed." >&2 + exit 1 + fi - name: Download IPA if: env.IPA_URL != '' run: | TAG="${GITHUB_REF_NAME:-dev}" VERSION="${TAG#v}" - curl -fsSL "$IPA_URL" -o "dfx-wallet-${VERSION}.ipa" + curl -fsSL "$IPA_URL" -o "dfx-wallet-${VERSION}.ipa" && test -s "dfx-wallet-${VERSION}.ipa" - - name: Upload IPA artifact - if: env.IPA_URL != '' - uses: actions/upload-artifact@v4 - with: - name: ios-ipa - path: dfx-wallet-*.ipa + - name: Upload IPA to GitHub Release + if: env.IPA_URL != '' && startsWith(github.ref, 'refs/tags/v') + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release view "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1 \ + || gh release create "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --title "$GITHUB_REF_NAME" --notes "" --draft \ + || gh release view "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1 + gh release upload "$GITHUB_REF_NAME" dfx-wallet-*.ipa --clobber --repo "$GITHUB_REPOSITORY" github-release: - name: Create GitHub Release + name: Publish GitHub Release needs: [build-android, build-ios] runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/v') steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: fetch-depth: 0 - name: Generate Changelog id: changelog - uses: mikepenz/release-changelog-builder-action@v6.0.1 + uses: mikepenz/release-changelog-builder-action@v6.2.3 with: configurationJson: | { @@ -151,28 +182,18 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Download APK artifact - uses: actions/download-artifact@v4 - with: - name: android-apk - path: . - - - name: Download iOS artifact - uses: actions/download-artifact@v4 - with: - name: ios-ipa - path: . - - - name: Create Release - uses: softprops/action-gh-release@v2 - with: - tag_name: ${{ github.ref_name }} - body: ${{ steps.changelog.outputs.changelog }} - files: | - dfx-wallet-*.apk - dfx-wallet-*.ipa - generate_release_notes: false - draft: false - prerelease: false + - name: Publish Release env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CHANGELOG: ${{ steps.changelog.outputs.changelog }} + run: | + assets=$(gh release view "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --json assets) + has_apk=$(printf '%s' "$assets" | jq '[.assets[] | select(.name | test("\\.apk$")) | .size] | any(. > 0)') + has_ipa=$(printf '%s' "$assets" | jq '[.assets[] | select(.name | test("\\.ipa$")) | .size] | any(. > 0)') + if [ "$has_apk" != "true" ] || [ "$has_ipa" != "true" ]; then + echo "Release is missing apk and/or ipa assets; refusing to publish." >&2 + exit 1 + fi + printf '%s' "$CHANGELOG" > /tmp/release-notes.md + gh release edit "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --notes-file /tmp/release-notes.md + gh release edit "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --draft=false diff --git a/.github/workflows/bitbox-simulator.yml b/.github/workflows/bitbox-simulator.yml new file mode 100644 index 00000000..f35c3bd3 --- /dev/null +++ b/.github/workflows/bitbox-simulator.yml @@ -0,0 +1,50 @@ +name: BitBox Simulator + +# Tier 2: runs the real BitBox02 firmware simulator (official binary from +# BitBoxSwiss/bitbox02-firmware, SHA256-pinned inside the testkit) and +# exercises the firmware surface this wallet depends on: Noise XX pairing, +# ETH address derivation (chainId 1 + 137), ETH personal-message signing +# (incl. the 1024-byte boundary), EIP-1559 signing, EIP-712 typed data and +# BTC address/sign scenarios — 15 scenarios total, asserted against known +# vectors by the testkit CLI. +# +# The app-side counterpart (BitboxProvider → WasmBridge protocol) is covered +# by the behavioral fake in test/helpers/fake-bitbox.ts on every PR; this +# workflow covers the firmware side. A future tier connects the bitbox-api +# WASM npm package itself to the simulator over TCP (needs a Go seeder — +# restoreFromMnemonic is not exported in the WASM bindings yet). +# +# NOTE: the dual pin is deliberate — the `uses:` SHA pins action.yml, the +# `testkit-ref` input pins the go-installed CLI. Keep both in sync. + +on: + workflow_dispatch: + pull_request: + branches-ignore: [main] + paths: + - 'src/features/hardware-wallet/**' + - 'test/services/hardware-wallet/**' + - 'test/helpers/fake-bitbox.ts' + - 'modules/**' + - 'package.json' + - 'package-lock.json' + - '.github/workflows/bitbox-simulator.yml' + +concurrency: + group: bitbox-simulator-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +permissions: + contents: read + pull-requests: write # sticky result comment on the PR (skipped for forks) + +jobs: + simulator: + if: github.event_name == 'workflow_dispatch' || github.event.pull_request.draft != true + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: DFXswiss/bitbox-testkit/.github/actions/bitbox-simulator@45a1253d23b545d801cf5a1f42c040b85e389c7d # v0.5.0 + with: + testkit-ref: v0.5.0 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5422ac64..3e56b0ab 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,8 +13,8 @@ jobs: typecheck: runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 22 cache: npm @@ -26,8 +26,8 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 22 cache: npm @@ -39,8 +39,8 @@ jobs: format: runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 22 cache: npm @@ -50,23 +50,254 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 22 cache: npm - run: npm ci --legacy-peer-deps --ignore-scripts - run: npx patch-package - - run: npm test + - run: npm test -- --coverage + - name: Upload coverage summary + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: coverage-summary + path: coverage/coverage-summary.json + if-no-files-found: error + retention-days: 1 + + # Separate job on purpose: a required status check must be its own check + # context, otherwise it cannot independently block the merge. Fail-closed — + # a missing coverage artifact is an error, never a pass. + coverage-floor: + runs-on: ubuntu-latest + needs: test + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: coverage-summary + path: coverage + - run: node scripts/check-coverage-floor.mjs + # Per-file Tier-A floors: the aggregate floor above can't catch a single + # security-critical file rotting to zero. This pins each one individually. + - run: node scripts/check-coverage-file-floors.mjs + + # Lowering the coverage floor needs an explicit, visible decision: the + # `coverage:lower-floor` label. Without it, a quiet floor-file edit inside a + # big diff fails here. + coverage-floor-label: + if: github.event_name == 'pull_request' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + fetch-depth: 0 + - name: Floors (aggregate + per-file) may only decrease with the coverage:lower-floor label + env: + BASE_SHA: ${{ github.event.pull_request.base.sha }} + HAS_LABEL: ${{ contains(github.event.pull_request.labels.*.name, 'coverage:lower-floor') }} + run: | + # Compare against the merge-base, not the base-branch tip: a floor the + # base raised after this PR forked must not look like a decrease here. + MERGE_BASE=$(git merge-base "$BASE_SHA" HEAD) + echo "merge-base: $MERGE_BASE" + mkdir -p .floor-base + git show "$MERGE_BASE:.coverage-floor-lines" > .floor-base/lines 2>/dev/null || echo 0 > .floor-base/lines + git show "$MERGE_BASE:.coverage-floors.json" > .floor-base/floors.json 2>/dev/null || echo '{"files":{}}' > .floor-base/floors.json + node scripts/check-floor-not-lowered.mjs + + # The README feature matrix is the source of truth for what the wallet does. + # This job makes matrix drift a merge blocker: referenced files must exist, + # flags must match src/config/features.ts, and every screen needs a row. + matrix-check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: 22 + # Dependency-free script — no npm install needed. + - run: node scripts/check-feature-matrix.mjs + + # Visual-baseline coverage: every screen under app/ must be classified in + # e2e/visual-coverage.json (baselined / exempt-with-reason / pending). A new + # screen that nobody snapshots cannot ship unaccounted — the structural + # sibling of the coverage floors, for appearance instead of logic. + visual-coverage: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: 22 + # Dependency-free script — no npm install needed. + - run: node scripts/check-visual-coverage.mjs + # The gate validates its own logic against synthetic fixtures so a + # refactor of the checker can't quietly stop catching regressions. + - run: node scripts/check-visual-coverage.mjs --self-test + + # Lockfile hygiene: every resolved package must come from registry.npmjs.org + # over https with an integrity hash. Blocks lockfile-poisoning PRs that + # repoint a dependency at a hostile mirror or git URL. + lockfile-lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: 22 + - run: > + npx --yes lockfile-lint@4.14.1 + --path package-lock.json + --type npm + --allowed-hosts npm + --validate-https + --validate-integrity + + # PR hygiene: conventional title (greppable history, clean release notes) + # and a size cap (big PRs get worse reviews; split or label size:override). + pr-policy: + if: github.event_name == 'pull_request' + runs-on: ubuntu-latest + steps: + - name: Conventional PR title + env: + TITLE: ${{ github.event.pull_request.title }} + run: | + if ! echo "$TITLE" | grep -qE '^(feat|fix|docs|chore|refactor|test|ci|build|perf|style|revert)(\([a-z0-9._/-]+\))?!?: .+'; then + echo "::error::PR title '$TITLE' does not follow conventional-commit format, e.g. 'feat(send): validate EIP-681 amounts'" + exit 1 + fi + - name: Size cap (1000 changed lines, label size:override to bypass) + env: + ADDITIONS: ${{ github.event.pull_request.additions }} + DELETIONS: ${{ github.event.pull_request.deletions }} + HAS_OVERRIDE: ${{ contains(github.event.pull_request.labels.*.name, 'size:override') }} + run: | + TOTAL=$((ADDITIONS + DELETIONS)) + echo "changed lines: $TOTAL" + if [ "$TOTAL" -gt 1000 ] && [ "$HAS_OVERRIDE" != "true" ]; then + echo "::error::PR changes $TOTAL lines (cap 1000). Split it, or add the 'size:override' label with a justification in the description (e.g. generated code, lockfile)." + exit 1 + fi audit: runs-on: ubuntu-latest - continue-on-error: true steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 22 cache: npm + # Blocking since the test-gates overhaul — a known-high vuln in the + # dependency tree of a wallet is a merge blocker, not a yellow badge. + # image-size GHSA-w3rx-r6r6-pgpr / GHSA-5p2g-fcmc-qvqq: no published + # patched release (latest 2.0.2, repo archived) — allowlist only those. - name: npm audit (high+) - run: npm audit --audit-level=high + run: | + set +e + npm audit --json --audit-level=high > /tmp/npm-audit.json + set -e + python3 <<'PY' + import json, re, sys + ALLOWED = { + "GHSA-W3RX-R6R6-PGPR", + "GHSA-5P2G-FCMC-QVQQ", + } + GHSA_RE = re.compile(r"GHSA-[a-z0-9]+-[a-z0-9]+-[a-z0-9]+", re.I) + try: + with open("/tmp/npm-audit.json") as f: + data = json.load(f) + except (OSError, json.JSONDecodeError) as exc: + print(f"npm audit did not produce JSON; failing closed: {exc}") + sys.exit(1) + if data.get("error"): + print("npm audit error:", data["error"]) + sys.exit(1) + if "vulnerabilities" not in data: + print("npm audit JSON missing vulnerabilities; failing closed") + sys.exit(1) + vulns = data["vulnerabilities"] + + def collect_ghsas(name, seen=None): + if seen is None: + seen = set() + if name in seen or name not in vulns: + return set() + seen.add(name) + found = set() + for via in vulns[name].get("via") or []: + if isinstance(via, dict): + for key in ("url", "source"): + val = via.get(key) + if isinstance(val, str): + found.update(m.upper() for m in GHSA_RE.findall(val)) + elif isinstance(via, str): + found.update(m.upper() for m in GHSA_RE.findall(via)) + found |= collect_ghsas(via, seen) + return found + + blockers = [] + for name, vuln in vulns.items(): + sev = (vuln.get("severity") or "").lower() + if sev not in ("high", "critical"): + continue + ghsas = collect_ghsas(name) + if ghsas and ghsas <= ALLOWED: + continue + blockers.append((name, sev, sorted(ghsas) or ["(no GHSA id)"])) + if blockers: + print("Unallowed high/critical vulnerabilities:") + for name, sev, ghsas in blockers: + print(f" {name} [{sev}]: {', '.join(ghsas)}") + sys.exit(1) + print("npm audit: only allowlisted (or no) high/critical findings") + PY + + bundle: + name: Bundle (${{ matrix.variant }}) + # Builds the JS bundle that `expo run:ios` / `eas build` would ship, + # catching regressions that pure typecheck/lint cannot — most importantly + # missing assets, broken `require()` paths in deferred-feature wrappers, + # and feature-flag combinations that fail to resolve at module-load time. + # `mvp` builds with every `EXPO_PUBLIC_ENABLE_*` unset (the MVP scope); + # `full` flips every flag on so a deferred path that drifts out of sync + # with the rest of the codebase is also caught. + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + variant: [mvp, full] + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: 22 + cache: npm + # `postinstall` builds @tetherto/wdk-react-native-core's dist/ and the + # `.wdk/` worklet bundle that the app imports unconditionally. + - run: npm ci --legacy-peer-deps + - name: Enable all feature flags (full build only) + if: matrix.variant == 'full' + run: | + for flag in RESTORE PASSKEY LEGAL PIN BIOMETRIC PORTFOLIO BUY_SELL LINKED_WALLETS TX_HISTORY PAY DFX_BACKEND TAX_REPORT SETTINGS HARDWARE_WALLET MULTISIG DEEPLINKS WEBVIEW; do + echo "EXPO_PUBLIC_ENABLE_$flag=true" >> "$GITHUB_ENV" + done + - name: Export iOS JS bundle + run: npx expo export --platform ios --no-bytecode --output-dir dist + - name: Verify bundle was produced + run: | + BUNDLE=$(find dist/_expo/static/js/ios -name '*.js' | head -1) + if [ -z "$BUNDLE" ]; then + echo "::error::No JS bundle produced under dist/_expo/static/js/ios/" + ls -laR dist + exit 1 + fi + SIZE=$(stat -c%s "$BUNDLE" 2>/dev/null || stat -f%z "$BUNDLE") + echo "Bundle: $BUNDLE ($SIZE bytes, variant=${{ matrix.variant }})" + # Empty or near-empty bundle would silently break the app at boot. + if [ "$SIZE" -lt 1000000 ]; then + echo "::error::Bundle suspiciously small ($SIZE bytes)" + exit 1 + fi diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 6464c97d..60ccd7a4 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -24,15 +24,15 @@ jobs: language: [javascript-typescript] steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Initialize CodeQL - uses: github/codeql-action/init@e46ed2cbd01164d986452f91f178727624ae40d7 # v4.35.3 + uses: github/codeql-action/init@7188fc363630916deb702c7fdcf4e481b751f97a # v4.37.1 with: languages: ${{ matrix.language }} queries: security-and-quality - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@e46ed2cbd01164d986452f91f178727624ae40d7 # v4.35.3 + uses: github/codeql-action/analyze@7188fc363630916deb702c7fdcf4e481b751f97a # v4.37.1 with: category: '/language:${{ matrix.language }}' diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml new file mode 100644 index 00000000..3d1819ed --- /dev/null +++ b/.github/workflows/dependency-review.yml @@ -0,0 +1,23 @@ +name: Dependency Review + +# Blocks PRs that introduce dependencies with known vulnerabilities. +# Complements the (blocking) npm-audit job in ci.yml: audit checks the whole +# tree on its schedule, this gates the PR diff itself — a new package with a +# known high-severity advisory cannot enter the repo. + +on: + pull_request: + branches: [main, develop] + +permissions: + contents: read + +jobs: + dependency-review: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294 # v5.0.0 + with: + fail-on-severity: high + comment-summary-in-pr: on-failure diff --git a/.github/workflows/maestro-e2e.yml b/.github/workflows/maestro-e2e.yml index 38eb0e70..8552a177 100644 --- a/.github/workflows/maestro-e2e.yml +++ b/.github/workflows/maestro-e2e.yml @@ -31,11 +31,15 @@ jobs: # Skip drafts so WIP pushes don't burn ~30 min of macOS minutes per push. if: github.event_name == 'workflow_dispatch' || github.event.pull_request.draft != true runs-on: macos-latest - timeout-minutes: 60 + # The iOS build (xcodebuild + pod install + simctl boot + framework + # cache) alone takes ~50min on macos-latest. With the MVP Maestro + # suite (~5min for 7 flows) the old 60min ceiling was hitting the + # wall on roughly every other PR. + timeout-minutes: 75 steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: ${{ env.NODE_VERSION }} cache: npm @@ -70,36 +74,47 @@ jobs: run: npx expo run:ios --configuration Release --device "$SIM_DEVICE_ID" --no-bundler - name: Run Maestro tests - run: maestro --platform ios test .maestro/ - - - name: Upload Maestro artifacts - if: always() - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 - with: - name: maestro-ios-artifacts - path: ~/.maestro/tests/**/* - if-no-files-found: ignore + # MVP build ships every EXPO_PUBLIC_ENABLE_* flag off — restrict + # to the `mvp` tag so the gated-feature flows (restore wallet, + # PIN unlock, full create-with-pin-legal) don't run against + # disabled stubs. Drop `--include-tags` once the corresponding + # features land. + run: maestro --platform ios test --include-tags mvp --env APP_ID=wallet.dfx.swiss .maestro/ android: name: Android Emulator if: github.event_name == 'workflow_dispatch' || github.event.pull_request.draft != true - runs-on: macos-latest - timeout-minutes: 75 + runs-on: ubuntu-latest + # The release Gradle build takes ~40min on the smaller Linux runner, + # plus the emulator-runner's cold-boot (with its own internal retry), + # the launcher swap + settle, and the MVP Maestro suite (~5min). + # 90min leaves a comfortable buffer. + timeout-minutes: 90 strategy: fail-fast: false steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: ${{ env.NODE_VERSION }} cache: npm - - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 + - uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5.6.0 with: distribution: temurin java-version: '17' + # GitHub's macos-latest runners disable Hypervisor.framework, so any + # Android AVD (x86_64 via Rosetta or arm64-v8a via HVF) fails to boot. + # Linux runners ship with /dev/kvm; enabling user-level access lets the + # emulator drop into native KVM acceleration and boot reliably. + - name: Enable KVM + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + - name: Install JS dependencies run: | npm ci --legacy-peer-deps --ignore-scripts @@ -118,7 +133,7 @@ jobs: run: npx expo prebuild --platform android --no-install - name: Run E2E in emulator - uses: reactivecircus/android-emulator-runner@e89f39f1abbbd05b1113a29cf4db69e7540cae5a # v2.37.0 + uses: reactivecircus/android-emulator-runner@a421e43855164a8197daf9d8d40fe71c6996bb0d # v2.38.0 with: api-level: 34 target: google_apis @@ -128,14 +143,18 @@ jobs: emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none disable-animations: true script: | - cd android && ./gradlew :app:assembleRelease && cd .. + cd android && ./gradlew :app:assembleRelease -Dorg.gradle.jvmargs="-Xmx4096m -XX:MaxMetaspaceSize=1024m" && cd .. adb install -r android/app/build/outputs/apk/release/app-release.apk - maestro --platform android test .maestro/ - - - name: Upload Maestro artifacts - if: always() - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 - with: - name: maestro-android-artifacts - path: ~/.maestro/tests/**/* - if-no-files-found: ignore + # The Pixel Launcher (com.google.android.apps.nexuslauncher) + # on the emulator AVD repeatedly spawns ANR dialogs + # ("Pixel Launcher isn't responding" with Wait/Close-app) + # that overlay the foregrounded app on every navigation + # transition. Disabling it for user 0 forces the system to + # its AOSP fallback (com.android.launcher3), which doesn't + # ANR and is invisible to flows that assert on app testIDs. + adb shell pm disable-user --user 0 com.google.android.apps.nexuslauncher || true + adb shell am kill-all + sleep 10 + # MVP-only — see the iOS step for why; drop --include-tags + # once the gated features ship. + maestro --platform android test --include-tags mvp --env APP_ID=swiss.dfx.wallet .maestro/ diff --git a/.github/workflows/reclaim-artifact-storage.yml b/.github/workflows/reclaim-artifact-storage.yml new file mode 100644 index 00000000..2c4afdc7 --- /dev/null +++ b/.github/workflows/reclaim-artifact-storage.yml @@ -0,0 +1,71 @@ +name: Reclaim Actions storage + +on: + workflow_dispatch: + schedule: + - cron: "27 4 * * *" + push: + branches: [develop] + paths: + - ".github/workflows/reclaim-artifact-storage.yml" + +permissions: + actions: write +jobs: + reclaim: + name: Delete stored Actions artifacts + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Delete stored Actions artifacts + env: + GH_TOKEN: ${{ github.token }} + run: | + set -euo pipefail + deleted=0 + # Daily cron keeps a 24h floor so in-flight job hops survive. Push and + # workflow_dispatch reclaim everything currently stored. + if [ "${GITHUB_EVENT_NAME}" = "schedule" ]; then + age_seconds=86400 + else + age_seconds=0 + fi + cutoff_epoch=$(($(date -u +%s) - age_seconds)) + while :; do + old_ids="" + page=1 + while :; do + json=$(gh api "repos/${GITHUB_REPOSITORY}/actions/artifacts?per_page=100&page=${page}") + page_len=$(printf '%s' "$json" | jq '.artifacts | length') + if [ "$page_len" -eq 0 ]; then + break + fi + page_ids=$(printf '%s' "$json" | jq -r --argjson cutoff "$cutoff_epoch" ' + .artifacts[] + | select(.expired == false) + | select((.created_at | fromdateiso8601) < $cutoff) + | .id + ') + [ -n "$page_ids" ] && old_ids="${old_ids:+${old_ids}$'\n'}${page_ids}" + page=$((page + 1)) + done + if [ -z "$old_ids" ]; then + echo "Deleted ${deleted} artifacts (age floor ${age_seconds}s)." + break + fi + count=0 + while read -r id; do + [ -z "$id" ] && continue + if ! err=$(gh api -X DELETE "repos/${GITHUB_REPOSITORY}/actions/artifacts/${id}" --silent 2>&1); then + printf '%s' "$err" | grep -qiE '404|Not Found' && continue + printf '%s\n' "$err" >&2 + exit 1 + fi + count=$((count + 1)) + done <<< "$old_ids" + if [ "$count" -eq 0 ]; then + echo "Deleted ${deleted} artifacts (age floor ${age_seconds}s)." + break + fi + deleted=$((deleted + count)) + done diff --git a/.github/workflows/visual-regression.yml b/.github/workflows/visual-regression.yml index 5c612606..e4c47c72 100644 --- a/.github/workflows/visual-regression.yml +++ b/.github/workflows/visual-regression.yml @@ -2,9 +2,14 @@ name: Visual Regression on: workflow_dispatch: + schedule: + # Nightly drift check on develop. 03:00 UTC = low-traffic window. + - cron: '0 3 * * *' pull_request: branches: [develop] - types: [opened, synchronize, reopened, ready_for_review] + # `synchronize` removed on purpose — iterative pushes don't run visual + # regression. Re-trigger via `ready_for_review` or the `needs-visual` label. + types: [opened, reopened, ready_for_review, labeled] paths-ignore: - '**/*.md' - 'docs/**' @@ -24,20 +29,45 @@ env: jobs: ios: - name: iOS Visual Regression - if: github.event_name == 'workflow_dispatch' || github.event.pull_request.draft != true + name: iOS Visual Regression (${{ matrix.variant }}) + # On `labeled` we only run when the trigger label is `needs-visual`, + # otherwise every label change (size/area/etc.) would burn a macOS run. + if: | + github.event_name == 'workflow_dispatch' || + github.event_name == 'schedule' || + (github.event_name == 'pull_request' && + github.event.pull_request.draft != true && + (github.event.action != 'labeled' || github.event.label.name == 'needs-visual')) runs-on: macos-latest - timeout-minutes: 60 + timeout-minutes: 90 + # QUARANTINE: the `full` (authenticated) variant has never gone green on CI + # since it was introduced in #186 — the full-feature build hangs during fresh + # wallet creation, so `setup-pin-screen` never appears and the whole suite + # times out (fails on develop's own nightly run and even on zero-code PRs like + # dependency bumps). It is not a required check, but a perpetually-red leg + # paints every PR red and drowns the signal. Until the suite is stabilised + # (tracking: #189 / #190) the `full` leg may fail without failing the check. + # The `mvp` leg stays a hard signal. Remove this once `full` is reliably green. + continue-on-error: ${{ matrix.variant == 'full' }} + strategy: + fail-fast: false + matrix: + # `mvp` builds with every EXPO_PUBLIC_ENABLE_* unset (the MVP scope) and + # snapshots the unauthenticated/onboarding screens. `full` flips every + # flag on so the feature-gated authenticated screens resolve to their + # real implementations and can be snapshotted at all (onboarding.test.ts + # would only ever see the *Disabled stubs otherwise). + variant: ${{ github.event_name == 'pull_request' && fromJSON('["mvp"]') || fromJSON('["mvp", "full"]') }} steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: ${{ env.NODE_VERSION }} cache: npm - name: Install applesimutils - run: brew tap wix/brew && brew install applesimutils + run: brew tap wix/brew && brew trust --tap wix/brew && brew install applesimutils - name: Install JS dependencies run: | @@ -49,7 +79,20 @@ jobs: run: npx detox build-framework-cache - name: Provision testnet env - run: cp .env.testnet .env + run: | + cp .env.testnet .env + # Keep visual builds deterministic and prevent live background work + # from contending with PIN hashing on hosted simulator runners. + echo "EXPO_PUBLIC_E2E=true" >> .env + + - name: Enable all feature flags (full variant only) + if: matrix.variant == 'full' + run: | + for f in BIOMETRIC BUY_SELL DEEPLINKS DFX_BACKEND HARDWARE_WALLET \ + LEGAL LINKED_WALLETS MULTISIG PASSKEY PAY PIN PORTFOLIO \ + RESTORE SETTINGS TAX_REPORT TX_HISTORY WEBVIEW; do + echo "EXPO_PUBLIC_ENABLE_${f}=true" >> .env + done - name: Generate native iOS project run: npx expo prebuild --platform ios --no-install @@ -61,20 +104,17 @@ jobs: run: npm run e2e:build:ios - name: Run visual regression tests - run: npm run e2e:test:ios - - - name: Upload diff images on failure - if: failure() - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 - with: - name: visual-regression-diffs - path: e2e/__diffs__/ - if-no-files-found: ignore - - - name: Upload Detox artifacts - if: always() - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 - with: - name: detox-artifacts - path: artifacts/ - if-no-files-found: ignore + # MVP build snapshots the onboarding/unauthenticated screens; the full + # build snapshots the feature-gated authenticated screens. Each leg runs + # only its own suite so a build never runs the other variant's screens + # (which would render *Disabled stubs / real screens out of scope). + # The suites themselves finish in 10-15 min; the step cap means a + # wedged detox CLI fails here instead of burning the job to its 90-min + # ceiling with tests already passed. + timeout-minutes: 30 + run: | + if [ "${{ matrix.variant }}" = "full" ]; then + npm run e2e:test:ios -- e2e/visual/authenticated.test.ts + else + npm run e2e:test:ios -- e2e/visual/onboarding.test.ts + fi diff --git a/.gitignore b/.gitignore index 0dfb3327..6f55d1bc 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,11 @@ expo-env.d.ts # Metro .metro-health-check* +# Test / build output +artifacts/ +coverage/ +modules/*/android/build/ + # debug npm-debug.* yarn-debug.* diff --git a/.maestro/01-welcome.yaml b/.maestro/01-welcome.yaml index 2568b452..018985d4 100644 --- a/.maestro/01-welcome.yaml +++ b/.maestro/01-welcome.yaml @@ -1,15 +1,26 @@ -appId: swiss.dfx.wallet +appId: ${APP_ID} name: 01-welcome tags: - smoke - onboarding + - mvp --- - launchApp: clearState: true clearKeychain: true -- assertVisible: - id: "welcome-screen" +# Belt-and-suspenders for the Android emulator: in case the +# Pixel-Launcher disable in the workflow does not take effect (e.g. +# on a future AVD without launcher3 as fallback), dismiss any ANR +# dialog that still overlays the app. 'optional: true' makes this a +# no-op on iOS and when the dialog does not appear. +- tapOn: + text: "Wait" + optional: true +# Cold boot warms the WDK worklet; wait for the first screen instead of +# asserting against the short default timeout (avoids a flaky boot race). +- extendedWaitUntil: + visible: + id: "welcome-screen" + timeout: 30000 - assertVisible: id: "welcome-create-wallet-button" -- assertVisible: - id: "welcome-restore-toggle" diff --git a/.maestro/02-welcome-restore-toggle.yaml b/.maestro/02-welcome-restore-toggle.yaml new file mode 100644 index 00000000..0a6ff8ef --- /dev/null +++ b/.maestro/02-welcome-restore-toggle.yaml @@ -0,0 +1,22 @@ +appId: ${APP_ID} +name: 02-welcome-restore-toggle +tags: + - smoke + - onboarding + - feature-restore +--- +# welcome-restore-toggle is only rendered when EXPO_PUBLIC_ENABLE_RESTORE +# or EXPO_PUBLIC_ENABLE_PASSKEY is set. With both off (the MVP build), +# the welcome screen has the Create-Wallet button only; this flow runs +# whenever restore-style onboarding gets shipped. +- launchApp: + clearState: true + clearKeychain: true +# Cold boot warms the WDK worklet; wait for the first screen instead of +# asserting against the short default timeout (avoids a flaky boot race). +- extendedWaitUntil: + visible: + id: "welcome-screen" + timeout: 30000 +- assertVisible: + id: "welcome-restore-toggle" diff --git a/.maestro/10-onboarding-create.yaml b/.maestro/10-onboarding-create.yaml index 620348aa..f9490225 100644 --- a/.maestro/10-onboarding-create.yaml +++ b/.maestro/10-onboarding-create.yaml @@ -1,15 +1,28 @@ -appId: swiss.dfx.wallet +appId: ${APP_ID} name: 10-onboarding-create tags: - onboarding + - mvp --- - launchApp: clearState: true clearKeychain: true +# Belt-and-suspenders for the Android emulator: in case the +# Pixel-Launcher disable in the workflow does not take effect (e.g. +# on a future AVD without launcher3 as fallback), dismiss any ANR +# dialog that still overlays the app. 'optional: true' makes this a +# no-op on iOS and when the dialog does not appear. +- tapOn: + text: "Wait" + optional: true # Welcome -> Create Wallet -- assertVisible: - id: "welcome-screen" +# Cold boot warms the WDK worklet; wait for the first screen instead of +# asserting against the short default timeout (avoids a flaky boot race). +- extendedWaitUntil: + visible: + id: "welcome-screen" + timeout: 30000 - tapOn: id: "welcome-create-wallet-button" @@ -23,40 +36,16 @@ tags: - tapOn: id: "create-wallet-continue-button" -# Setup PIN (create step) -> tap "1" six times -- assertVisible: - id: "setup-pin-screen" -- repeat: - times: 6 - commands: - - tapOn: - id: "pin-key-1" - -# Setup PIN (confirm step) -> tap "1" six times +# With EXPO_PUBLIC_ENABLE_PIN + EXPO_PUBLIC_ENABLE_LEGAL off (the MVP +# build), SetupPinDisabled flips `isOnboarded` + `isAuthenticated` and +# routes straight to the dashboard. The full PIN + legal-disclaimer +# variant of this flow lives in 11-onboarding-create-pin-legal.yaml +# and runs once those features ship. +- extendedWaitUntil: + visible: + id: "dashboard-screen" + timeout: 30000 - assertVisible: - id: "setup-pin-confirm-screen" -- repeat: - times: 6 - commands: - - tapOn: - id: "pin-key-1" - -# Legal disclaimer -> accept -> continue -- assertVisible: - id: "legal-disclaimer-screen" -- tapOn: - id: "legal-accept-checkbox" -- tapOn: - id: "legal-continue-button" - -# Dashboard reached -- assertVisible: - id: "dashboard-screen" -- assertVisible: - id: "dashboard-action-buy" -- assertVisible: - id: "dashboard-action-sell" + id: "dashboard-action-receive" - assertVisible: id: "dashboard-action-send" -- assertVisible: - id: "dashboard-action-receive" diff --git a/.maestro/11-onboarding-create-pin-legal.yaml b/.maestro/11-onboarding-create-pin-legal.yaml new file mode 100644 index 00000000..ce2433ff --- /dev/null +++ b/.maestro/11-onboarding-create-pin-legal.yaml @@ -0,0 +1,79 @@ +appId: ${APP_ID} +name: 11-onboarding-create-pin-legal +tags: + - onboarding + - feature-pin + - feature-legal +--- +# Full create-wallet onboarding including PIN setup + legal-disclaimer. +# Requires EXPO_PUBLIC_ENABLE_PIN=true and EXPO_PUBLIC_ENABLE_LEGAL=true; +# with either off, the corresponding step is replaced by a Disabled +# stub that routes around it and this flow fails on the missing +# `setup-pin-screen` / `legal-disclaimer-screen` assertion. +- launchApp: + clearState: true + clearKeychain: true + +# Welcome -> Create Wallet +# Cold boot warms the WDK worklet; wait for the first screen instead of +# asserting against the short default timeout (avoids a flaky boot race). +- extendedWaitUntil: + visible: + id: "welcome-screen" + timeout: 30000 +- tapOn: + id: "welcome-create-wallet-button" + +# Create Wallet -> reveal seed -> continue +- assertVisible: + id: "create-wallet-screen" +- tapOn: + id: "create-wallet-reveal-button" +- assertVisible: + id: "create-wallet-seed-container" +- tapOn: + id: "create-wallet-continue-button" + +# Setup PIN (create step) -> tap "1" six times +- assertVisible: + id: "setup-pin-screen" +- repeat: + times: 6 + commands: + - tapOn: + id: "pin-key-1" + +# Setup PIN (confirm step) -> tap "1" six times +- assertVisible: + id: "setup-pin-confirm-screen" +- repeat: + times: 6 + commands: + - tapOn: + id: "pin-key-1" + +# Legal disclaimer -> accept -> continue +- assertVisible: + id: "legal-disclaimer-screen" +- tapOn: + id: "legal-accept-checkbox" +- scrollUntilVisible: + element: + id: "legal-continue-button" + direction: DOWN +- tapOn: + id: "legal-continue-button" + +# Dashboard reached +- assertVisible: + id: "dashboard-screen" +- assertVisible: + id: "dashboard-action-portfolio" +- assertVisible: + id: "dashboard-action-pay" +- assertVisible: + id: "dashboard-action-transactions" +- assertVisible: + id: "dashboard-action-send" +- assertVisible: + id: "dashboard-action-receive" diff --git a/.maestro/11-onboarding-restore.yaml b/.maestro/12-onboarding-restore.yaml similarity index 68% rename from .maestro/11-onboarding-restore.yaml rename to .maestro/12-onboarding-restore.yaml index 44e29719..072fd86d 100644 --- a/.maestro/11-onboarding-restore.yaml +++ b/.maestro/12-onboarding-restore.yaml @@ -1,10 +1,13 @@ -appId: swiss.dfx.wallet -name: 11-onboarding-restore +appId: ${APP_ID} +name: 12-onboarding-restore tags: - onboarding + - feature-restore + - feature-pin + - feature-legal env: # Standard 12-word BIP39 test mnemonic. Override via: - # maestro test --env "TEST_MNEMONIC=word1 word2 ..." .maestro/11-onboarding-restore.yaml + # maestro test --env "TEST_MNEMONIC=word1 word2 ..." .maestro/12-onboarding-restore.yaml TEST_MNEMONIC: "test test test test test test test test test test test junk" --- - launchApp: @@ -12,8 +15,12 @@ env: clearKeychain: true # Welcome -> Restore Wallet (toggle reveals options) -- assertVisible: - id: "welcome-screen" +# Cold boot warms the WDK worklet; wait for the first screen instead of +# asserting against the short default timeout (avoids a flaky boot race). +- extendedWaitUntil: + visible: + id: "welcome-screen" + timeout: 30000 - tapOn: id: "welcome-restore-toggle" - tapOn: @@ -26,6 +33,10 @@ env: id: "restore-wallet-seed-input" - inputText: ${TEST_MNEMONIC} - hideKeyboard +- scrollUntilVisible: + element: + id: "restore-wallet-continue-button" + direction: DOWN - tapOn: id: "restore-wallet-continue-button" @@ -52,6 +63,10 @@ env: id: "legal-disclaimer-screen" - tapOn: id: "legal-accept-checkbox" +- scrollUntilVisible: + element: + id: "legal-continue-button" + direction: DOWN - tapOn: id: "legal-continue-button" diff --git a/.maestro/12-pin-unlock.yaml b/.maestro/13-pin-unlock.yaml similarity index 81% rename from .maestro/12-pin-unlock.yaml rename to .maestro/13-pin-unlock.yaml index 1e306afa..a96f3c5b 100644 --- a/.maestro/12-pin-unlock.yaml +++ b/.maestro/13-pin-unlock.yaml @@ -1,8 +1,10 @@ -appId: swiss.dfx.wallet -name: 12-pin-unlock +appId: ${APP_ID} +name: 13-pin-unlock tags: - pin - onboarding + - feature-pin + - feature-legal --- # Onboard a fresh wallet so secureStorage holds a PIN hash and the # `isOnboarded` flag. We duplicate the onboarding steps inline rather @@ -12,8 +14,12 @@ tags: clearState: true clearKeychain: true -- assertVisible: - id: "welcome-screen" +# Cold boot warms the WDK worklet; wait for the first screen instead of +# asserting against the short default timeout (avoids a flaky boot race). +- extendedWaitUntil: + visible: + id: "welcome-screen" + timeout: 30000 - tapOn: id: "welcome-create-wallet-button" @@ -46,6 +52,10 @@ tags: id: "legal-disclaimer-screen" - tapOn: id: "legal-accept-checkbox" +- scrollUntilVisible: + element: + id: "legal-continue-button" + direction: DOWN - tapOn: id: "legal-continue-button" diff --git a/.maestro/20-receive.yaml b/.maestro/20-receive.yaml new file mode 100644 index 00000000..ab0f745d --- /dev/null +++ b/.maestro/20-receive.yaml @@ -0,0 +1,75 @@ +appId: ${APP_ID} +name: 20-receive +tags: + - smoke + - dashboard + - mvp +--- +# Walks an MVP user from a fresh install through the Receive flow: +# Dashboard -> Receive (asset list) -> tap BTC -> QR step (container +# rendered even before WDK has produced an address) -> back to assets. +# With EXPO_PUBLIC_ENABLE_PIN + EXPO_PUBLIC_ENABLE_LEGAL off, +# SetupPinDisabled bridges Create -> Dashboard without a PIN or legal +# step (see 10-onboarding-create.yaml for the same bridge). +- launchApp: + clearState: true + clearKeychain: true +# Belt-and-suspenders for the Android emulator: in case the +# Pixel-Launcher disable in the workflow does not take effect (e.g. +# on a future AVD without launcher3 as fallback), dismiss any ANR +# dialog that still overlays the app. 'optional: true' makes this a +# no-op on iOS and when the dialog does not appear. +- tapOn: + text: "Wait" + optional: true + +# Cold boot warms the WDK worklet; wait for the first screen instead of +# asserting against the short default timeout (avoids a flaky boot race). +- extendedWaitUntil: + visible: + id: "welcome-screen" + timeout: 30000 +- tapOn: + id: "welcome-create-wallet-button" + +- assertVisible: + id: "create-wallet-screen" +- tapOn: + id: "create-wallet-reveal-button" +- assertVisible: + id: "create-wallet-seed-container" +- tapOn: + id: "create-wallet-continue-button" + +# Dashboard -> Receive (asset step) +- extendedWaitUntil: + visible: + id: "dashboard-screen" + timeout: 30000 +- tapOn: + id: "dashboard-action-receive" + +- assertVisible: + id: "receive-screen" +- assertVisible: + id: "receive-asset-list" +- assertVisible: + id: "receive-asset-btc" +- assertVisible: + id: "receive-asset-chf" + +# Asset -> QR step +- tapOn: + id: "receive-asset-btc" +- assertVisible: + id: "receive-qr" +- assertVisible: + id: "receive-address" +- assertVisible: + id: "receive-copy-button" + +# Back to asset step via the selected-asset pill +- tapOn: + id: "receive-selected-asset-pill" +- assertVisible: + id: "receive-asset-list" diff --git a/.maestro/21-send.yaml b/.maestro/21-send.yaml new file mode 100644 index 00000000..08bcf22b --- /dev/null +++ b/.maestro/21-send.yaml @@ -0,0 +1,83 @@ +appId: ${APP_ID} +name: 21-send +tags: + - smoke + - dashboard + - mvp +--- +# Walks an MVP user from a fresh install through the Send flow: +# Dashboard -> Send (asset list) -> tap BTC -> input step -> back to +# asset list. We deliberately stop at the input step: +# +# - The Confirm step is tested in the Detox visual-regression suite +# (e2e/visual/onboarding.test.ts), where we have programmatic +# control over the keyboard. Maestro's `tapOn: "return"` works on +# the iOS keyboard but not the Android one, and `hideKeyboard` +# fails on iOS with "Couldn't hide the keyboard" on the custom +# send recipient input. +# - The actual Confirm tap is intentionally never exercised — it +# calls handleSend() which broadcasts a real transaction. +- launchApp: + clearState: true + clearKeychain: true +# Belt-and-suspenders for the Android emulator: in case the +# Pixel-Launcher disable in the workflow does not take effect (e.g. +# on a future AVD without launcher3 as fallback), dismiss any ANR +# dialog that still overlays the app. 'optional: true' makes this a +# no-op on iOS and when the dialog does not appear. +- tapOn: + text: "Wait" + optional: true + +# Cold boot warms the WDK worklet; wait for the first screen instead of +# asserting against the short default timeout (avoids a flaky boot race). +- extendedWaitUntil: + visible: + id: "welcome-screen" + timeout: 30000 +- tapOn: + id: "welcome-create-wallet-button" + +- assertVisible: + id: "create-wallet-screen" +- tapOn: + id: "create-wallet-reveal-button" +- assertVisible: + id: "create-wallet-seed-container" +- tapOn: + id: "create-wallet-continue-button" + +# Dashboard -> Send (asset step) +- extendedWaitUntil: + visible: + id: "dashboard-screen" + timeout: 30000 +- tapOn: + id: "dashboard-action-send" + +- assertVisible: + id: "send-screen" +- assertVisible: + id: "send-asset-list" +- assertVisible: + id: "send-asset-btc" +- assertVisible: + id: "send-asset-chf" + +# Asset -> Input step +- tapOn: + id: "send-asset-btc" +- assertVisible: + id: "send-input-step" +- assertVisible: + id: "send-recipient-input" +- assertVisible: + id: "send-amount-input" +- assertVisible: + id: "send-continue-button" + +# Back to asset step via the selected-asset pill +- tapOn: + id: "send-selected-asset-pill" +- assertVisible: + id: "send-asset-list" diff --git a/.maestro/22-dashboard-balance-toggle.yaml b/.maestro/22-dashboard-balance-toggle.yaml new file mode 100644 index 00000000..4abecfbe --- /dev/null +++ b/.maestro/22-dashboard-balance-toggle.yaml @@ -0,0 +1,65 @@ +appId: ${APP_ID} +name: 22-dashboard-balance-toggle +tags: + - smoke + - dashboard + - mvp +--- +# Walks an MVP user from a fresh install to the dashboard and flips +# the balance eye-toggle: visible balance -> hidden bullets -> visible +# balance again. The toggle keeps `balanceVisible` in component state +# only (no persisted setting), so each tap should round-trip the two +# render states. +- launchApp: + clearState: true + clearKeychain: true +# Belt-and-suspenders for the Android emulator: in case the +# Pixel-Launcher disable in the workflow does not take effect (e.g. +# on a future AVD without launcher3 as fallback), dismiss any ANR +# dialog that still overlays the app. 'optional: true' makes this a +# no-op on iOS and when the dialog does not appear. +- tapOn: + text: "Wait" + optional: true + +# Cold boot warms the WDK worklet; wait for the first screen instead of +# asserting against the short default timeout (avoids a flaky boot race). +- extendedWaitUntil: + visible: + id: "welcome-screen" + timeout: 30000 +- tapOn: + id: "welcome-create-wallet-button" + +- assertVisible: + id: "create-wallet-screen" +- tapOn: + id: "create-wallet-reveal-button" +- assertVisible: + id: "create-wallet-seed-container" +- tapOn: + id: "create-wallet-continue-button" + +# Dashboard renders with the balance visible by default +- extendedWaitUntil: + visible: + id: "dashboard-screen" + timeout: 30000 +- assertVisible: + id: "dashboard-balance-value" + +# Tap toggle -> hidden state +- tapOn: + id: "dashboard-balance-toggle" +- assertVisible: + id: "dashboard-balance-hidden" +- assertNotVisible: + id: "dashboard-balance-value" + +# Tap toggle again -> visible state +- tapOn: + id: "dashboard-balance-toggle" +- assertVisible: + id: "dashboard-balance-value" +- assertNotVisible: + id: "dashboard-balance-hidden" diff --git a/.maestro/23-receive-chain-switch.yaml b/.maestro/23-receive-chain-switch.yaml new file mode 100644 index 00000000..b10cb90d --- /dev/null +++ b/.maestro/23-receive-chain-switch.yaml @@ -0,0 +1,93 @@ +appId: ${APP_ID} +name: 23-receive-chain-switch +tags: + - smoke + - dashboard + - mvp +--- +# Tests the chain selector on the Receive screen. BTC ships with two +# layers in the MVP build (DFX_BACKEND off): SegWit (chain=bitcoin) and +# EVM (chain=ethereum); the Taproot + Lightning layers only appear with +# DFX_BACKEND on. Stablecoin assets (CHF/EUR/USD) all have a single +# chain so the bar is hidden — BTC is the only MVP asset that +# exercises the multi-chain path. +- launchApp: + clearState: true + clearKeychain: true +# Belt-and-suspenders for the Android emulator: in case the +# Pixel-Launcher disable in the workflow does not take effect (e.g. +# on a future AVD without launcher3 as fallback), dismiss any ANR +# dialog that still overlays the app. 'optional: true' makes this a +# no-op on iOS and when the dialog does not appear. +- tapOn: + text: "Wait" + optional: true + +# Cold boot warms the WDK worklet; wait for the first screen instead of +# asserting against the short default timeout (avoids a flaky boot race). +- extendedWaitUntil: + visible: + id: "welcome-screen" + timeout: 30000 +- tapOn: + id: "welcome-create-wallet-button" + +- assertVisible: + id: "create-wallet-screen" +- tapOn: + id: "create-wallet-reveal-button" +- assertVisible: + id: "create-wallet-seed-container" +- tapOn: + id: "create-wallet-continue-button" + +# Dashboard -> Receive -> BTC -> QR step with chain selector +- extendedWaitUntil: + visible: + id: "dashboard-screen" + timeout: 30000 +- tapOn: + id: "dashboard-action-receive" +- assertVisible: + id: "receive-screen" +- tapOn: + id: "receive-asset-btc" + +- assertVisible: + id: "receive-qr" +- assertVisible: + id: "receive-chain-bar" +- assertVisible: + id: "receive-chain-bitcoin" +- assertVisible: + id: "receive-chain-ethereum" + +# Switch to the EVM layer — the chain chips themselves are stateful; +# we just confirm the chips remain reachable after the tap rather +# than assert a particular address string (WDK may still be deriving +# it in CI). +- tapOn: + id: "receive-chain-ethereum" +- assertVisible: + id: "receive-chain-ethereum" +- assertVisible: + id: "receive-address" + +- tapOn: + id: "receive-chain-bitcoin" +- assertVisible: + id: "receive-chain-bitcoin" +- assertVisible: + id: "receive-address" + +# Stablecoins (single-chain) - chain bar is hidden entirely +- tapOn: + id: "receive-selected-asset-pill" +- assertVisible: + id: "receive-asset-list" +- tapOn: + id: "receive-asset-chf" +- assertVisible: + id: "receive-qr" +- assertNotVisible: + id: "receive-chain-bar" diff --git a/.maestro/24-send-chain-switch.yaml b/.maestro/24-send-chain-switch.yaml new file mode 100644 index 00000000..1e111c39 --- /dev/null +++ b/.maestro/24-send-chain-switch.yaml @@ -0,0 +1,89 @@ +appId: ${APP_ID} +name: 24-send-chain-switch +tags: + - smoke + - dashboard + - mvp +--- +# Tests the chain selector on the Send screen. CHF/EUR/USD each have +# four EVM chains (Ethereum, Arbitrum, Polygon, Base); BTC ships with +# a single chain (spark / Lightning) and the chain bar is hidden in +# that case. CHF is the canonical multi-chain MVP asset. +- launchApp: + clearState: true + clearKeychain: true +# Belt-and-suspenders for the Android emulator: in case the +# Pixel-Launcher disable in the workflow does not take effect (e.g. +# on a future AVD without launcher3 as fallback), dismiss any ANR +# dialog that still overlays the app. 'optional: true' makes this a +# no-op on iOS and when the dialog does not appear. +- tapOn: + text: "Wait" + optional: true + +# Cold boot warms the WDK worklet; wait for the first screen instead of +# asserting against the short default timeout (avoids a flaky boot race). +- extendedWaitUntil: + visible: + id: "welcome-screen" + timeout: 30000 +- tapOn: + id: "welcome-create-wallet-button" + +- assertVisible: + id: "create-wallet-screen" +- tapOn: + id: "create-wallet-reveal-button" +- assertVisible: + id: "create-wallet-seed-container" +- tapOn: + id: "create-wallet-continue-button" + +# Dashboard -> Send -> CHF -> Input step with chain selector +- extendedWaitUntil: + visible: + id: "dashboard-screen" + timeout: 30000 +- tapOn: + id: "dashboard-action-send" +- assertVisible: + id: "send-screen" +- tapOn: + id: "send-asset-chf" + +- assertVisible: + id: "send-input-step" +- assertVisible: + id: "send-chain-bar" +- assertVisible: + id: "send-chain-ethereum" +- assertVisible: + id: "send-chain-arbitrum" +- assertVisible: + id: "send-chain-polygon" +- assertVisible: + id: "send-chain-base" + +# Switch between chains — assertion is on chip presence after the tap, +# not the chain-dependent fee estimate (that races against WDK init). +- tapOn: + id: "send-chain-arbitrum" +- assertVisible: + id: "send-recipient-input" + +- tapOn: + id: "send-chain-polygon" +- assertVisible: + id: "send-recipient-input" + +# BTC has a single chain (spark / Lightning) — chain bar is hidden +- tapOn: + id: "send-selected-asset-pill" +- assertVisible: + id: "send-asset-list" +- tapOn: + id: "send-asset-btc" +- assertVisible: + id: "send-input-step" +- assertNotVisible: + id: "send-chain-bar" diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..2bd5a0a9 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22 diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index bdbe7378..00000000 --- a/CLAUDE.md +++ /dev/null @@ -1,126 +0,0 @@ -# DFX Wallet — Claude Code Guidelines - -## Branch Workflow — CRITICAL - -- Every change goes in a **feature-specific branch** with a **pull request against `develop`**. Never push directly to `develop` or `main`. -- **Always start from the latest `develop`** before creating a new branch: - ```bash - git checkout develop && git pull origin develop - git checkout -b feat/your-feature # or fix/..., docs/..., chore/... - ``` -- `develop` moves quickly — multiple PRs land in parallel. Treat any local `develop` older than a few minutes as stale and pull again before branching. -- Never reuse an old branch after its PR was merged or closed — cut a fresh branch from current `develop`. -- Build **on top of** existing changes in `develop`. If your work overlaps with a recent merge, rebase onto the new `develop` rather than working around it. - -## Build & Run - -```bash -npm install -npx expo start # dev server -npx expo start --ios # iOS simulator -npx expo start --android # Android emulator -npx expo prebuild --clean # generate native projects -npm run typecheck # TypeScript check -npm run lint # ESLint -``` - -## Tech Stack - -- **Framework**: React Native (Expo ~54, Expo Router) -- **Language**: TypeScript (strict mode) -- **Wallet SDK**: Tether WDK (`@tetherto/wdk-react-native-provider`) -- **State**: Zustand -- **i18n**: i18next + react-i18next (DE, EN) -- **Storage**: react-native-mmkv (fast KV), expo-secure-store (secrets) -- **Navigation**: Expo Router (file-based, mirrors Next.js) - -## Project Structure - -``` -app/ # Expo Router screens (file-based routing) - (onboarding)/ # Welcome, Create/Restore Wallet, Verify Seed, Setup PIN - (pin)/ # PIN verification - (auth)/ # Authenticated area - (tabs)/ # Bottom tabs: Dashboard, Settings - buy/ sell/ send/ receive/ # Wallet action flows - kyc/ # Multi-step KYC verification - support/ # Ticket system - transaction-history/ -src/ - components/ # Shared UI components - config/ # Chain configs, environment - hooks/ # Custom React hooks - i18n/ # Localization (DE, EN) - models/ # Domain models / types - services/dfx/ # DFX API client + DTOs - store/ # Zustand stores - theme/ # Colors, typography -``` - -## Supported Blockchains (via WDK) - -- Bitcoin On-Chain (wdk-wallet-btc) -- Ethereum + L2s: Arbitrum, Polygon, Optimism, Base (wdk-wallet-evm) -- Solana (wdk-wallet-solana) -- TON (wdk-wallet-ton) -- TRON (wdk-wallet-tron) -- Spark/Lightning (wdk-wallet-spark) - -## Hardware Wallet Support — CRITICAL - -BitBox02 integration is a MUST-HAVE requirement. - -**Dual-transport architecture:** -- **USB HID** — Standard BitBox02, **Android only** (Apple blocks USB-HID for 3rd party apps) -- **BLE** — BitBox02 Nova, **Android + iOS** -- View-only wallet model: no seed stored locally, signing delegated to hardware - -**SDK:** `bitbox-api` (npm, v0.12.0, WASM from BitBoxSwiss/bitbox-api-rs) -- Protocol stack (Noise XX handshake, Protobuf, signing) is transport-agnostic -- Only the ReadWrite transport layer needs native implementation - -**Implementation**: `src/services/hardware-wallet/` -- `types.ts` — `HardwareWalletProvider`, `BitboxTransport` interfaces -- `bitbox.ts` — `BitboxProvider` (scans USB + BLE, auto-selects transport) -- `transport-usb.ts` — Android native HID module (pattern: @ledgerhq/react-native-hid) -- `transport-ble.ts` — BLE via react-native-ble-plx (Android + iOS) - -**Connection flow:** Scan (USB+BLE) → Detect → Connect → Noise handshake → Channel Verify → Get Address -**Signing:** BTC (SegWit, Taproot, PSBT) + ETH (EIP-1559, ERC-20, EIP-712) - -**RealUnit reference files**: -- `lib/screens/hardware_connect_bitbox/` — UI + connection flow -- `lib/packages/hardware_wallet/bitbox_credentials.dart` — signing logic -- `lib/packages/hardware_wallet/bitbox.dart` — service wrapper - -## Design Reference - -- **Theme**: Light. Soft sky-blue / white surfaces, dark navy text, blue (`#2F7CF7`) as the UI accent for icons, links, and active controls. The DFX brand red (`#F5516C`) is preserved as `DfxColors.brandRed` for the logo only. -- **Dashboard**: full-screen mountain-illustration background (`assets/dashboard-bg.png`), DFX logo header + hamburger menu, large balance display with eye-toggle, Portfolio + Pay pill buttons, Transactions link, and a bottom Receive | Send pill. Buy and Sell are reached from inside the Receive and Send flows respectively. -- **Onboarding flow**: Welcome → Create/Restore (passkey or seed) → Verify Seed → Legal → PIN → Dashboard -- **Settings**: reached from the Dashboard hamburger menu (no bottom tab bar). Flat list with sub-pages. -- **KYC**: Multi-step wizard (Registration → Email → Nationality → Financial Data → 2FA → Ident) - -## Styling — CRITICAL - -- **Colors**: Always use `DfxColors.*` from `src/theme/colors.ts`. NEVER use raw hex values or RN defaults. -- **Typography**: Always use `Typography.*` from `src/theme/typography.ts`. NEVER hardcode font sizes. -- **Loading**: Use RN `ActivityIndicator` — no third-party spinners. - -## Localization (i18n) - -- Source files: `src/i18n/locales/de.json` and `en.json` -- Keys are nested by feature: `dashboard.title`, `buy.title`, etc. -- Keys MUST be alphabetically sorted within each namespace. -- Always update BOTH de and en files. - -## Code Conventions - -- Prefer functional components with hooks -- State management: Zustand stores in `src/store/` -- API calls: through `src/services/dfx/api.ts` -- DTOs: `src/services/dfx/dto/` with explicit types (no `any`) -- Imports: use `@/` path alias for `src/` -- Imports order: react → react-native → expo → third-party → @/ local -- No `console.log` in committed code -- No unused imports diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..ddfe2f6a --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,250 @@ +# Contributing to DFX Wallet + +This guide covers everything you need to develop, test, and contribute to the DFX Wallet app. + +## Quick Start + +```bash +git clone https://github.com/DFXswiss/dfx-wallet.git +cd dfx-wallet +npm install +npx expo start # dev server +npx expo start --ios # iOS simulator +npx expo start --android # Android emulator +``` + +## Prerequisites + +| Tool | Version | Purpose | +| ----------- | ---------- | ---------------------------------------- | +| Node.js | 20+ | Runtime | +| npm | 10+ | Package manager | +| Xcode | 15+ | iOS builds (macOS only) | +| Android SDK | API 34+ | Android builds | +| Expo CLI | bundled | React Native tooling (via `npx expo`) | + +## Build & Test Commands + +```bash +npm run typecheck # TypeScript check (tsc --noEmit) +npm run lint # ESLint +npm run lint:fix # ESLint auto-fix +npm run format # Prettier check +npm run format:fix # Prettier auto-fix +npm run test # Jest +npm run check # typecheck + lint + format (run before pushing) +npx expo prebuild --clean # regenerate native projects +``` + +Run `npm run check` before every push. Never push if it fails. + +## Tech Stack + +- **Framework**: React Native (Expo ~54, Expo Router) +- **Language**: TypeScript (strict mode) +- **Wallet SDK**: Tether WDK (`@tetherto/wdk-react-native-provider`) +- **State**: Zustand +- **i18n**: i18next + react-i18next (DE, EN) +- **Storage**: react-native-mmkv (fast KV), expo-secure-store (secrets) +- **Navigation**: Expo Router (file-based, mirrors Next.js) + +## Project Structure + +``` +app/ # Expo Router screens (file-based routing) + (onboarding)/ # Welcome, Create/Restore Wallet, Verify Seed, Setup PIN + (pin)/ # PIN verification + (auth)/ # Authenticated area + (tabs)/ # Bottom tabs: Dashboard, Settings + buy/ sell/ send/ receive/ # Wallet action flows + kyc/ # Multi-step KYC verification + support/ # Ticket system + transaction-history/ +src/ + components/ # Shared UI components + config/ # Chain configs, environment + hooks/ # Custom React hooks + i18n/ # Localization (DE, EN) + models/ # Domain models / types + services/dfx/ # DFX API client + DTOs + services/hardware-wallet/ # BitBox02 integration + store/ # Zustand stores + theme/ # Colors, typography +``` + +## Git Workflow — CRITICAL + +### Branches + +| Branch | Purpose | Deploy target | +| --------- | ---------------------------------- | ------------- | +| `develop` | Default branch, active development | DEV builds | +| `main` | Production releases | Store builds | + +- Every change goes in a **feature-specific branch** with a **pull request against `develop`**. Never push directly to `develop` or `main`. +- **Always start from the latest `develop`** before creating a new branch: + +```bash +git checkout develop && git pull origin develop +git checkout -b feat/your-feature # or fix/..., docs/..., chore/... +``` + +- `develop` moves quickly — multiple PRs land in parallel. Treat any local `develop` older than a few minutes as stale and pull again before branching. +- Never reuse an old branch after its PR was merged or closed — cut a fresh branch from current `develop`. +- Build **on top of** existing changes in `develop`. If your work overlaps with a recent merge, rebase onto the new `develop` rather than working around it. +- Never force-push, never amend published commits. +- Squash-and-merge when merging to `develop` — preserve atomic commits on the branch; the squash keeps only the PR title on `develop`. +- Release PRs (`develop` → `main`) are created automatically — never open them manually. + +### Branch Naming + +- Features: `feat/-` +- Fixes: `fix/-` +- Docs: `docs/` +- Chores: `chore/` + +### Commit Messages + +Write in English. Imperative mood. No trailing period on the subject. Describe _what_ changed, not _how_. + +``` +# Good +Add BitBox02 BLE transport for Nova +Fix balance refresh after send transaction +Use DfxColors instead of raw hex in dashboard + +# Bad +update stuff +WIP +fix +``` + +## Code Style + +### TypeScript + +- **Strict mode** — `strict: true` in tsconfig +- **Functional components with hooks** — no class components +- **No `any`** — use explicit types, especially in DTOs +- **No `console.log`** in committed code +- **No unused imports** +- **Named exports** for components, default exports only for routed screens + +### Formatting + +- **ESLint**: `npm run lint` +- **Prettier**: enforced via `npm run format` +- Run `npm run check` before every commit + +### Imports + +Order: React → React Native → Expo → third-party → `@/` local. + +```typescript +// 1. React +import { useCallback, useState } from 'react'; + +// 2. React Native +import { View, Text } from 'react-native'; + +// 3. Expo +import { useRouter } from 'expo-router'; + +// 4. Third-party +import { create } from 'zustand'; + +// 5. Internal (absolute paths via @/) +import { useWalletStore } from '@/store/wallet'; +import { DfxColors } from '@/theme/colors'; +``` + +Use the `@/` path alias for everything under `src/`. + +### Styling — CRITICAL + +- **Colors**: Always use `DfxColors.*` from `src/theme/colors.ts`. NEVER use raw hex values or RN defaults. +- **Typography**: Always use `Typography.*` from `src/theme/typography.ts`. NEVER hardcode font sizes. +- **Loading**: Use RN `ActivityIndicator` — no third-party spinners. + +### State Management + +- **Zustand** stores in `src/store/` +- **No React Context** for state — Zustand stores are global singletons +- Secrets in `expo-secure-store`, fast KV in `react-native-mmkv` + +### API Client + +All DFX backend communication goes through `src/features/dfx-backend/services/api.ts`: + +- DTOs in `src/features/dfx-backend/services/dto/` with explicit types (no `any`) +- Never call `fetch()` directly — always use the typed API client + +## Localization (i18n) + +- Source files: `src/i18n/locales/de.json` and `en.json` +- Keys are nested by feature: `dashboard.title`, `buy.title`, etc. +- Keys MUST be alphabetically sorted within each namespace +- Always update BOTH `de` and `en` files in the same PR + +## Design Reference + +- **Theme**: Light. Soft sky-blue / white surfaces, dark navy text, blue (`#2F7CF7`) as the UI accent for icons, links, and active controls. The DFX brand red (`#F5516C`) is preserved as `DfxColors.brandRed` for the logo only. +- **Dashboard**: full-screen mountain-illustration background (`assets/dashboard-bg.png`), DFX logo header + hamburger menu, large balance display with eye-toggle, Portfolio + Pay pill buttons, Transactions link, and a bottom Receive | Send pill. Buy and Sell are reached from inside the Receive and Send flows respectively. +- **Onboarding flow**: Welcome → Create/Restore (passkey or seed) → Verify Seed → Legal → PIN → Dashboard +- **Settings**: reached from the Dashboard hamburger menu (no bottom tab bar). Flat list with sub-pages. +- **KYC**: Multi-step wizard (Registration → Email → Nationality → Financial Data → 2FA → Ident) + +## Supported Blockchains (via WDK) + +- Bitcoin On-Chain (`wdk-wallet-btc`) +- Ethereum + L2s: Arbitrum, Polygon, Optimism, Base (`wdk-wallet-evm`) +- Solana (`wdk-wallet-solana`) +- TON (`wdk-wallet-ton`) +- TRON (`wdk-wallet-tron`) +- Spark / Lightning (`wdk-wallet-spark`) + +## Hardware Wallet Support — CRITICAL + +BitBox02 integration is a MUST-HAVE requirement. + +**Dual-transport architecture:** + +- **USB HID** — Standard BitBox02, **Android only** (Apple blocks USB-HID for 3rd party apps) +- **BLE** — BitBox02 Nova, **Android + iOS** +- View-only wallet model: no seed stored locally, signing delegated to hardware + +**SDK:** `bitbox-api` (npm, v0.12.0, WASM from BitBoxSwiss/bitbox-api-rs) + +- Protocol stack (Noise XX handshake, Protobuf, signing) is transport-agnostic +- Only the ReadWrite transport layer needs native implementation + +**Implementation**: `src/features/hardware-wallet/` + +- `types.ts` — `HardwareWalletProvider`, `BitboxTransport` interfaces +- `bitbox.ts` — `BitboxProvider` (scans USB + BLE, auto-selects transport) +- `transport-usb.ts` — Android native HID module (pattern: `@ledgerhq/react-native-hid`) +- `transport-ble.ts` — BLE via `react-native-ble-plx` (Android + iOS) + +**Connection flow:** Scan (USB+BLE) → Detect → Connect → Noise handshake → Channel Verify → Get Address + +**Signing:** BTC (SegWit, Taproot, PSBT) + ETH (EIP-1559, ERC-20, EIP-712) + +**RealUnit reference files** (Flutter, useful as a reference for the signing flow): + +- `lib/screens/hardware_connect_bitbox/` — UI + connection flow +- `lib/packages/hardware_wallet/bitbox_credentials.dart` — signing logic +- `lib/packages/hardware_wallet/bitbox.dart` — service wrapper + +## Testing + +- **Unit tests**: Jest, co-located with the code they cover +- **E2E**: Maestro (`npm run e2e:maestro`) for cross-platform flows, Detox (`npm run e2e:test:ios`) for iOS-specific scenarios. See [docs/maestro.md](docs/maestro.md) and [docs/visual-regression.md](docs/visual-regression.md) for the MVP/feature-gated tag split, baseline workflow, and CI runner setup. +- Add tests for new business logic in `src/services/` and `src/store/` + +## Security + +See `SECURITY.md` for the responsible disclosure policy and the security model. + +- Never commit secrets, seed phrases, or API keys +- Test fixtures must not contain real wallet credentials +- All secrets in `.env.local` (gitignored) diff --git a/README.md b/README.md index aa44326b..424b21ae 100644 --- a/README.md +++ b/README.md @@ -6,19 +6,198 @@ Self-custodial mobile wallet for the DFX ecosystem. Multi-chain, hardware-wallet ## Features -- **Self-custodial** — keys are generated and stored on device; the seed never leaves the user. -- **Multi-chain** via WDK: - - Bitcoin on-chain - - Ethereum + L2s (Arbitrum, Polygon, Optimism, Base) - - Solana - - TON - - TRON - - Spark / Lightning -- **Hardware wallet support** for BitBox02 (USB-HID on Android, BLE on Android + iOS via BitBox02 Nova). -- **Passkey-based wallet creation** (WebAuthn PRF) as an alternative to a 12/24-word seed. -- **DFX integration** — Buy, Sell, Send, Receive, KYC, transaction history and support tickets directly in the app. -- **Biometric unlock** (Face ID / Touch ID / fingerprint) on top of a local PIN. -- **i18n** — German and English. +This matrix lists every user-facing function the app exposes, the technical +components that implement it, whether it ships on by default, and the +current test coverage. It is the source of truth for "what does this wallet +actually do" — keep it in sync when adding or removing a flow. + +**MVP scope.** The MVP is intentionally narrow: _create a wallet, receive +tokens, send tokens._ Everything else is `deferred` behind a build-time +`EXPO_PUBLIC_ENABLE_*` flag (off by default) and only ships when it has +dedicated test coverage. A function being marked `deferred` is a +**triage decision**, not a statement about code quality — most of these +flows already exist and work; they are simply held back until their +tests are written. + +**Code isolation.** Every deferred feature lives in +`src/features//` and is loaded through a conditional +`require()` against a `FEATURES.X` constant from `src/config/features.ts`. +Expo's `babel-preset-expo` inlines `process.env.EXPO_PUBLIC_*` at build +time, so each `FEATURES.X` resolves to a boolean literal inside +`features.ts` itself. + +At the call site (`const Screen = FEATURES.X ? require('A') : require('B')`) +Metro keeps both `require()` calls — the boolean is read at runtime +from a separate module, so the bundler cannot fold the ternary +across module boundaries. The effect: + +- A build with the flag off **never evaluates** the deferred module's + top-level code (no `new BitboxProvider()`, no service-singleton + bootstrap, no fetch interceptors), because the `require()` for the + real implementation is unreachable. This is the crash- and + exfiltration-isolation property the matrix relies on. +- The deferred module's source **does** still ship in the JavaScript + bundle as an unevaluated factory. Surface-isolation (symbol absent + from the binary) is a stronger property and is a known limitation; + closing it requires a babel-plugin that folds `FEATURES.X` across + modules. Tracked separately. + +**Status legend** + +- `always` — MVP function, wired up on every build, no flag to turn off +- `deferred (EXPO_PUBLIC_ENABLE_X)` — off by default, opt-in via the + named build-time flag; required to be 100% test-covered before the + flag flips on by default +- `env` — configuration variable (URL / API key / RPC override), not a + feature switch; defaults are baked into `src/config/` + +**Test legend** + +- `full` — unit + integration tests cover the happy path and at least one + failure mode +- `partial` — only a helper, sub-service, or screen baseline is covered; + the end-to-end flow has no dedicated test +- `none` — no automated test references the code path + +`deferred` rows are not required to be `full` today — the flag stays off +until they are. `always` rows must reach `full` for the MVP to ship. + +### Onboarding & Authentication + +| Function | Technical components | Status | Tests | +| ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | +| Welcome / entry screen | `app/(onboarding)/welcome.tsx`, `isPasskeySupported()` gate | always | partial (Detox visual baseline, Maestro `01-welcome.yaml`) | +| Create wallet from generated seed | `(onboarding)/create-wallet.tsx`, `services/wallet/seed.ts`, WDK `useWalletManager.initializeFromMnemonic` | always | full (`test/services/seed.test.ts`, Detox `onboarding.test.ts`, Maestro `10-onboarding-create.yaml`) | +| Restore wallet from 12 / 24-word seed | `(onboarding)/restore-wallet.tsx`, `validateSeedPhrase`, WDK | deferred (`EXPO_PUBLIC_ENABLE_RESTORE`) | partial (seed unit tests + Detox + Maestro `11-onboarding-restore.yaml`, no screen unit test) | +| Verify seed phrase (post-create quiz) | `(onboarding)/verify-seed.tsx` | deferred (`EXPO_PUBLIC_ENABLE_RESTORE`) | none | +| Create wallet via Passkey (WebAuthn PRF) | `(onboarding)/create-passkey.tsx`, `features/passkey/services/passkey-service.ts`, `key-derivation.ts` (HKDF → BIP-39) | deferred (`EXPO_PUBLIC_ENABLE_PASSKEY`) — iOS 18+ / Android 14+ | partial (`passkey-service.test.ts`, `passkey-key-derivation.test.ts` cover the PRF → HKDF → BIP-39 services; no screen test) | +| Restore wallet via Passkey | `(onboarding)/restore-passkey.tsx`, `features/passkey/services/setup-wallet.ts` | deferred (`EXPO_PUBLIC_ENABLE_PASSKEY`) | partial (`passkey-setup-wallet.test.ts` covers `setup-wallet.ts`; no screen test) | +| Legal disclaimer acceptance | `(onboarding)/legal-disclaimer.tsx` | deferred (`EXPO_PUBLIC_ENABLE_LEGAL`) | partial (Detox baseline only) | +| PIN setup | `(onboarding)/setup-pin.tsx`, `services/pin.ts`, `useAuthStore.setPin` | deferred (`EXPO_PUBLIC_ENABLE_PIN`) | full (`test/store/auth.test.ts`, Detox `setup-pin`/`setup-pin-confirm` baselines) | + +### Lock / Unlock + +| Function | Technical components | Status | Tests | +| --------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------- | +| PIN unlock (cold start, deep link, JS reload) | `app/(pin)/verify.tsx`, `useAuthStore.verifyPin`, WDK `useWalletManager.unlock`, `MAX_ATTEMPTS = 5` | deferred (`EXPO_PUBLIC_ENABLE_PIN`) | full (`test/store/auth.test.ts` + Detox `verify-pin*` + Maestro `12-pin-unlock.yaml`) | +| Biometric unlock (Face ID / Touch ID / fingerprint) | `features/biometric/biometric.ts`, `expo-local-authentication`, `useAuthStore.authenticateBiometric`, `biometricEnabled` flag | deferred (`EXPO_PUBLIC_ENABLE_BIOMETRIC`) | full (`test/services/biometric.test.ts`, `test/store/auth.test.ts`) | +| Auth gate around every `(auth)/*` route | `app/(auth)/_layout.tsx`, hard redirect to `/(pin)/verify` when `isAuthenticated` is false | deferred (`EXPO_PUBLIC_ENABLE_PIN`) | partial (covered indirectly via PIN-unlock E2E) | + +### Wallet actions + +| Function | Technical components | Status | Tests | +| -------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Dashboard total balance | `app/(auth)/(tabs)/dashboard.tsx`, `useTotalPortfolioFiat`, `services/balances/`, `pricing-service.ts` | always | partial (`pricing-service.test.ts`, `test/store/wallet.test.ts`; no hook/screen test) | +| Hide balance (eye toggle) | `dashboard.tsx` local state | deferred (`EXPO_PUBLIC_ENABLE_PORTFOLIO`) | none | +| Receive (BTC native / Lightning / EVM stables) | `(auth)/receive/index.tsx`, `components/QrCode`, WDK `useAccount`, `useLdsWallet` (LN address) | always | none | +| Send native + ERC-20 | `(auth)/send/index.tsx`, `useSendFlow`, WDK `sendFromAccount` / `estimateFee`, `components/QrScanner` | always | full (`use-send-flow.test.tsx` happy+failure paths, `evm-address`/`evm-signature` + property suites, Maestro `21-send.yaml`) | +| Buy (DFX fiat on-ramp, SEPA) | `(auth)/buy/index.tsx`, `useBuyFlow`, `features/dfx-backend/services/payment-service.ts`, `features/dfx-backend/services/asset-service.ts`, `features/dfx-backend/services/fiat-service.ts`, `DfxAuthGate` | deferred (`EXPO_PUBLIC_ENABLE_BUY_SELL`) | partial (`dfx-api.test.ts`, `dfx-auth-gate.test.ts`, `dfx-auth-service.test.ts`; no flow test) | +| Sell (DFX off-ramp to IBAN) | `(auth)/sell/index.tsx`, `useSellFlow`, `features/dfx-backend/services/payment-service.ts`, `DfxAuthGate` | deferred (`EXPO_PUBLIC_ENABLE_BUY_SELL`) | partial (same DFX-API/auth tests; no flow test) | +| Portfolio (local + DFX-linked wallets) | `(auth)/portfolio/index.tsx`, `services/balances/useBalances.ts`, `useEvmBalances`, `useWdkBalances`, `useLinkedWalletDiscovery`, `useLinkedWalletFiat` | deferred (`EXPO_PUBLIC_ENABLE_PORTFOLIO`) | partial (`btc-fetcher.test.ts`, `blockscout.test.ts`, `etherscan.test.ts`, `coingecko-*.test.ts`, `discoverable-tokens.test.ts`, `pricing-service.test.ts`; no screen/hook test) | +| Asset detail screen | `(auth)/portfolio/[symbol].tsx` | deferred (`EXPO_PUBLIC_ENABLE_PORTFOLIO`) | none | +| Chain enable / disable | `(auth)/portfolio/manage.tsx`, `useEnabledChains` (MMKV-backed) | deferred (`EXPO_PUBLIC_ENABLE_PORTFOLIO`) | none | +| Linked wallet detail (per-address holdings + tx history) | `(auth)/linked-wallet/[address].tsx`, `useLinkedWalletDiscovery`, `useWalletTransactions`, `useLinkedWalletNames`, Blockscout + Etherscan + mempool.space | deferred (`EXPO_PUBLIC_ENABLE_LINKED_WALLETS`) | partial (explorer + discovery libs tested; no hook test) | +| Transaction history (local wallet, DFX-side) | `(auth)/transaction-history/index.tsx`, `(auth)/transaction-history/[id].tsx`, `features/dfx-backend/services/transaction-service.ts` | deferred (`EXPO_PUBLIC_ENABLE_TX_HISTORY`) | none | +| Pay (QR scan → payment URL) | `(auth)/pay/index.tsx`, `(auth)/pay/opencryptopay.tsx`, `services/opencryptopay/`, `expo-camera` CameraView | deferred (`EXPO_PUBLIC_ENABLE_PAY`) — OpenCryptoPay QRs route to a quote screen (signing is a follow-up); other QRs still show the coming-soon alert | partial (`opencryptopay-lnurl.test.ts`, `opencryptopay-service.test.ts`, `OpenCryptoPayScreen.test.tsx`) | + +### DFX backend integration + +| Function | Technical components | Status | Tests | +| --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------- | ------------------------------------------------------------------------------------------------ | +| DFX silent sign-in (wallet → JWT) | `useDfxAuth`, `features/dfx-backend/services/auth-service.ts`, `features/dfx-backend/services/jwt.ts`, `features/dfx-backend/services/api.ts` 401-retry hook | deferred (`EXPO_PUBLIC_ENABLE_DFX_BACKEND`) | full (`dfx-auth-service.test.ts`, `dfx-jwt.test.ts`, `dfx-api.test.ts`, `dfx-auth-gate.test.ts`) | +| DFX e-mail login / account merge | `(auth)/dfx-login/index.tsx`, `dfxAuthService`, `/v1/auth/mail`, JWT `account` claim diff | deferred (`EXPO_PUBLIC_ENABLE_DFX_BACKEND`) | partial (auth-service tested; merge flow not) | +| Auto-link BTC / EVM / Lightning to DFX account | `useDfxAutoLink`, `DFX_LINKED_CHAINS` cache in secure store, `useLdsWallet` | deferred (`EXPO_PUBLIC_ENABLE_DFX_BACKEND`) | none | +| DFX-linked wallets management (list / rename / hide / link extra address) | `(auth)/wallets/index.tsx`, `features/dfx-backend/services/user-service.ts`, `useLinkedWalletNames`, `useLinkedWalletSelection`, `useLinkedWalletReauth` | deferred (`EXPO_PUBLIC_ENABLE_DFX_BACKEND`) | none | +| KYC multi-step wizard (Email → Personal → Nationality → Financial → 2FA → Sumsub/IDnow) | `(auth)/kyc/index.tsx`, `useKycFlow`, `features/dfx-backend/services/kyc-service.ts`, `(auth)/webview.tsx`, `services/security/safe-url.ts` | deferred (`EXPO_PUBLIC_ENABLE_DFX_BACKEND`) | partial (only `dfx-kyc-service.test.ts → registerEmail`; wizard untested) | +| User data summary (email, phone) | `(auth)/email/index.tsx`, `features/dfx-backend/services/user-service.ts` `/v2/user` | deferred (`EXPO_PUBLIC_ENABLE_DFX_BACKEND`) | none | +| Support tickets (list / create / chat) | `(auth)/support/index.tsx`, `features/dfx-backend/services/support-service.ts` | deferred (`EXPO_PUBLIC_ENABLE_DFX_BACKEND`) | none | +| Contact channels (mailto, tel, web, in-app support) | `(auth)/contact/index.tsx`, `Linking`, `services/security/safe-url.ts` | deferred (`EXPO_PUBLIC_ENABLE_DFX_BACKEND`) | none | +| Tax report CSV export (CoinTracking et al.) | `(auth)/tax-report/index.tsx`, `features/dfx-backend/services/transaction-service.ts` (`requestCsv`), `expo-file-system`, `expo-sharing` (soft import) | deferred (`EXPO_PUBLIC_ENABLE_TAX_REPORT`) | none | +| Legal documents launcher (T&C, Privacy, Disclaimer) | `(auth)/legal/index.tsx`, OS browser hand-off via `Linking`, `safe-url` allow-list | deferred (`EXPO_PUBLIC_ENABLE_LEGAL`) | none | + +### Settings & preferences + +| Function | Technical components | Status | Tests | +| ------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Language switcher (DE ↔ EN) | `(auth)/(tabs)/settings.tsx`, `i18next`, `dfxUserService.updateUser` sync | deferred (`EXPO_PUBLIC_ENABLE_SETTINGS`) | none | +| Display currency (CHF / EUR / USD) | `settings.tsx`, `useWalletStore.setSelectedCurrency`, persisted in secure store, `dfxUserService.updateUser` sync | deferred (`EXPO_PUBLIC_ENABLE_SETTINGS`) | full (`test/store/wallet.test.ts`) | +| Biometric unlock toggle | `settings.tsx`, `useAuthStore.setBiometricEnabled` | deferred (`EXPO_PUBLIC_ENABLE_BIOMETRIC`) | full (covered under "Biometric unlock" above) | +| Seed phrase export | `(auth)/seed-export.tsx`, WDK `useWalletManager`, passkey re-auth for passkey-origin wallets, `expo-screen-capture` (soft import) | deferred (`EXPO_PUBLIC_ENABLE_SETTINGS`) | partial (`seed.test.ts` covers the lib; screen untested) | +| Hardware wallet pairing (BitBox02) | `(auth)/hardware-connect/index.tsx`, `features/hardware-wallet/services/bitbox.ts`, `transport-usb.ts` (Android only), `transport-ble.ts`, `BitboxWasmWebView.tsx`, `wasm-bridge.ts`, `bitbox-protocol.ts` | deferred (`EXPO_PUBLIC_ENABLE_HARDWARE_WALLET`) | full (`wasm-bridge`, `bitbox-provider` cross-layer vs. behavioral fake, `transport-usb`/`transport-ble`, `bitbox-wasm-html` suites; firmware side via `bitbox-simulator.yml`) | +| Multi-sig vault setup (local cosigner list) | `(auth)/multi-sig/index.tsx`, `(auth)/multi-sig/setup.tsx`, `useMultiSigStore` | deferred (`EXPO_PUBLIC_ENABLE_MULTISIG`) — Zustand store only, no on-chain signing yet | none | +| Delete wallet | `settings.tsx`, WDK `deleteWallet`, `useAuthStore.reset`, secure-store wipe | deferred (`EXPO_PUBLIC_ENABLE_SETTINGS`) | partial (`auth.test.ts` covers `reset`; flow itself untested) | + +### Security & platform + +| Function | Technical components | Status | Tests | +| ------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------- | ----------------------------------------------------------------------------------------------- | +| PIN bruteforce limit (5 attempts → reset to onboarding) | `app/(pin)/verify.tsx` `MAX_ATTEMPTS = 5` | deferred (`EXPO_PUBLIC_ENABLE_PIN`) | partial (Detox `verify-pin-error` baseline; counter logic untested) | +| Screen-capture protection on seed screen | `(auth)/seed-export.tsx` soft import of `expo-screen-capture` | deferred (`EXPO_PUBLIC_ENABLE_SETTINGS`) | none | +| Deep-link payment URL handling (`dfxwallet://buy`, `sell`, `send?to=...`) | `useDeepLink`, `expo-linking` | deferred (`EXPO_PUBLIC_ENABLE_DEEPLINKS`) | none | +| WebView host allow-list (KYC, legal, payment hand-off) | `(auth)/webview.tsx`, `services/security/safe-url.ts` (`isAllowedDfxHost`, `isDfxOwnedHost`, `isSafeHttpsUrl`) | deferred (`EXPO_PUBLIC_ENABLE_WEBVIEW`) | partial (`security-safe-url.test.ts`: 126 adversarial allowlist tests; WebView screen untested) | +| Offline banner | `components/OfflineBanner.tsx`, `@react-native-community/netinfo` | always | none | +| Global error boundary | `components/ErrorBoundary.tsx`, mounted in `app/_layout.tsx` | always | none | +| DFX session 401 silent retry | `features/dfx-backend/services/api.ts` `setOnUnauthorized`, `useDfxAuth.authenticateSilent` | deferred (`EXPO_PUBLIC_ENABLE_DFX_BACKEND`) | full (`dfx-api.test.ts`, `dfx-auth-service.test.ts`) | + +### Feature flags (`EXPO_PUBLIC_ENABLE_*`) + +Every `deferred` row in the matrix above is gated by one of these +build-time flags. They are **off by default**. A flag flips to "on by +default" only once every function it gates is `full` in the test +matrix. Each flag isolates the code path so that a build with the flag +off can never load, parse, or execute the deferred module — the goal +is both crash-safety (broken WIP code can't take the MVP down) and +defense-in-depth (a compromised dependency in a non-MVP path can't +reach the MVP runtime). + +| Flag | Gated functions | Default | +| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | +| `EXPO_PUBLIC_ENABLE_RESTORE` | Restore wallet from seed, Verify seed phrase | off | +| `EXPO_PUBLIC_ENABLE_PASSKEY` | Create + Restore wallet via Passkey | off | +| `EXPO_PUBLIC_ENABLE_LEGAL` | Legal disclaimer acceptance, Legal documents launcher | off | +| `EXPO_PUBLIC_ENABLE_PIN` | PIN setup, PIN unlock, Auth gate around `(auth)/*`, PIN bruteforce limit | off | +| `EXPO_PUBLIC_ENABLE_BIOMETRIC` | Biometric unlock, Biometric toggle in Settings | off | +| `EXPO_PUBLIC_ENABLE_PORTFOLIO` | Hide-balance toggle, Portfolio screen, Asset detail, Chain enable/disable | off | +| `EXPO_PUBLIC_ENABLE_BUY_SELL` | Buy (fiat on-ramp), Sell (off-ramp) | off | +| `EXPO_PUBLIC_ENABLE_LINKED_WALLETS` | Linked wallet detail screen | off | +| `EXPO_PUBLIC_ENABLE_TX_HISTORY` | Transaction history | off | +| `EXPO_PUBLIC_ENABLE_PAY` | Pay (QR scan placeholder) | off | +| `EXPO_PUBLIC_ENABLE_DFX_BACKEND` | DFX silent sign-in, e-mail login, auto-link, DFX-linked wallets management, KYC, user data summary, support tickets, contact channels, DFX session 401 silent retry | off | +| `EXPO_PUBLIC_ENABLE_TAX_REPORT` | Tax report CSV export | off | +| `EXPO_PUBLIC_ENABLE_SETTINGS` | Settings screen and the entries it owns: language switcher, display currency, seed phrase export, delete wallet, screen-capture protection | off | +| `EXPO_PUBLIC_ENABLE_HARDWARE_WALLET` | BitBox02 pairing (USB + BLE + WASM bridge) | off | +| `EXPO_PUBLIC_ENABLE_MULTISIG` | Multi-sig vault setup (local cosigner list) | off | +| `EXPO_PUBLIC_ENABLE_DEEPLINKS` | Deep-link payment URL handler | off | +| `EXPO_PUBLIC_ENABLE_WEBVIEW` | In-app WebView (KYC iframe, payment hand-off) and the `safe-url` allow-list | off | + +### Build-time configuration (`EXPO_PUBLIC_*`) + +These variables are configuration, not feature switches: they override +URLs, RPC providers, or API keys. Defaults are baked into +`src/config/chains.ts` / `src/config/env.ts` so the app runs with none of +them set. + +| Variable | Effect | Default | Tests | +| ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | ------------------------------------------------------------- | +| `EXPO_PUBLIC_DFX_API_URL` | DFX backend base URL (auth, buy/sell, KYC, support, tx history) | `https://api.dfx.swiss` | full (covered by every `dfx-*` service test) | +| `EXPO_PUBLIC_LDS_URL` | Lightning Data Service base URL (LN address resolution) | `https://lightning.space/v1` | none | +| `EXPO_PUBLIC_ETHERSCAN_API_KEY` | Enables Etherscan V2 transaction feed for linked-wallet history; without it falls back to Blockscout / curated tokens | empty | full (`test/services/etherscan.test.ts` exercises both paths) | +| `EXPO_PUBLIC_ETH_RPC_URL` | Custom Ethereum RPC (Alchemy / Infura / keyed provider) | `https://ethereum-rpc.publicnode.com` | none | +| `EXPO_PUBLIC_ARBITRUM_RPC_URL` | Custom Arbitrum RPC | `https://arbitrum-one-rpc.publicnode.com` | none | +| `EXPO_PUBLIC_POLYGON_RPC_URL` | Custom Polygon RPC | `https://polygon-bor-rpc.publicnode.com` | none | +| `EXPO_PUBLIC_BASE_RPC_URL` | Custom Base RPC | `https://base-rpc.publicnode.com` | none | +| `EXPO_PUBLIC_PLASMA_RPC_URL` | Custom Plasma RPC | `https://rpc.plasma.to` | none | +| `EXPO_PUBLIC_SEPOLIA_RPC_URL` | Custom Sepolia (testnet) RPC | `https://sepolia.gateway.tenderly.co` | none | +| `EXPO_PUBLIC_BTC_ELECTRUM_HOST` / `EXPO_PUBLIC_BTC_ELECTRUM_PORT` | Custom Electrum server for the BTC WDK provider | `electrum.blockstream.info:50001` | none | +| `EXPO_PUBLIC_WDK_INDEXER_URL` / `EXPO_PUBLIC_WDK_INDEXER_API_KEY` | WDK indexer for richer balance + transaction queries | unset (RPC-only mode) | none | + +### Supported chains (via WDK bundle) + +Production: Bitcoin on-chain, Spark / Lightning, Ethereum, Arbitrum, +Polygon, Base, Plasma. Testnet: Sepolia. Each EVM chain ships with an +ERC-4337 paymaster (Candide) so users can pay gas in USDT / USDC where +available. The active set lives in `wdk.config.js`; the worklet bundle +is regenerated by `npm run bundle:wdk` (also runs in `postinstall`). ## Tech Stack @@ -77,6 +256,24 @@ npm run prebuild | `npm run check` | `typecheck` + `lint` + `format` (run before pushing). | | `npm run bundle:bitbox` | Rebuild the bundled BitBox WASM module. | +### Test coverage gates + +Coverage is scoped to the logic surface (`collectCoverageFrom` in +`jest.config.js`: services, stores, feature services, hooks) — forcing line +coverage on JSX produces render tests, not safety. Screens and UI flows are +covered behaviourally instead (component tests, visual regression, Maestro). + +Two gates run in CI on top of that scope (job `coverage-floor`): + +- **Aggregate floor** — `.coverage-floor-lines` is the minimum overall scoped + line coverage (ratchet: raise it in the same commit when coverage climbs; + lowering needs the `coverage:lower-floor` label). +- **Per-file Tier-A floors** — `.coverage-floors.json` pins each + security-critical file (key derivation, seed/wallet setup, signing, auth, + secure storage, biometric, hardware-wallet bridge) to its own minimum (100). + The aggregate floor alone would let one such file rot to zero behind a high + mean; this catches that. Enforced by `scripts/check-coverage-file-floors.mjs`. + ## Project Structure ``` diff --git a/app.json b/app.json index 71cc2a97..3c6846b7 100644 --- a/app.json +++ b/app.json @@ -6,7 +6,7 @@ "version": "0.1.0", "orientation": "portrait", "icon": "./assets/icon.png", - "userInterfaceStyle": "dark", + "userInterfaceStyle": "automatic", "scheme": "dfxwallet", "newArchEnabled": true, "runtimeVersion": { @@ -22,9 +22,7 @@ "bundleIdentifier": "wallet.dfx.swiss", "appleTeamId": "Y4QBY6387T", "deploymentTarget": "18.0", - "associatedDomains": [ - "webcredentials:dfx.swiss?mode=developer" - ], + "associatedDomains": ["webcredentials:dfx.swiss?mode=developer"], "infoPlist": { "NSBluetoothAlwaysUsageDescription": "Bluetooth is needed to connect to BitBox02 Nova hardware wallet.", "NSBluetoothPeripheralUsageDescription": "Bluetooth is needed to connect to BitBox02 Nova hardware wallet.", diff --git a/app/(auth)/(tabs)/_layout.tsx b/app/(auth)/(tabs)/_layout.tsx index 5ddb0e90..d43e4e9a 100644 --- a/app/(auth)/(tabs)/_layout.tsx +++ b/app/(auth)/(tabs)/_layout.tsx @@ -1,24 +1,37 @@ import { Stack } from 'expo-router'; -import { useTranslation } from 'react-i18next'; -import { DfxColors, Typography } from '@/theme'; +import { Typography, useColors } from '@/theme'; -export default function TabsLayout() { - const { t } = useTranslation(); +// Ensure deep-linking and Metro reloads always land on the dashboard, not on +// whichever child screen happened to be visible when the bundle reloaded. +// The PIN verify flow already replaces to /dashboard on success, so there's +// no need for a second redirect here. +export const unstable_settings = { + initialRouteName: 'dashboard', +}; +export default function TabsLayout() { + const colors = useColors(); return ( - - + + ); } diff --git a/app/(auth)/(tabs)/dashboard.tsx b/app/(auth)/(tabs)/dashboard.tsx index a5fa0708..dd51007f 100644 --- a/app/(auth)/(tabs)/dashboard.tsx +++ b/app/(auth)/(tabs)/dashboard.tsx @@ -1,12 +1,19 @@ -import { useEffect, useRef, useState } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; import { ImageBackground, Pressable, StyleSheet, Text, View } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import { useRouter } from 'expo-router'; import { useTranslation } from 'react-i18next'; -import { DashboardHeader, Icon, ShortcutAction } from '@/components'; +import { DarkBackdrop, DashboardHeader, Icon, ShortcutAction } from '@/components'; +import { FEATURES } from '@/config/features'; import { useDfxAuth, useTotalPortfolioFiat } from '@/hooks'; import { useAuthStore, useWalletStore } from '@/store'; -import { DfxColors, Typography } from '@/theme'; +import { + Typography, + useColors, + useResolvedScheme, + type ResolvedScheme, + type ThemeColors, +} from '@/theme'; const CURRENCY_SYMBOLS = new Map([ ['USD', '$'], @@ -38,10 +45,13 @@ const splitBalance = (value: string): { whole: string; fraction: string } => { export default function DashboardScreen() { const router = useRouter(); const { t } = useTranslation(); - const { totalBalanceFiat, selectedCurrency } = useWalletStore(); + const { selectedCurrency } = useWalletStore(); const { isDfxAuthenticated } = useAuthStore(); const { authenticate, isAuthenticating } = useDfxAuth(); - useTotalPortfolioFiat(); + const totalPortfolioFiat = useTotalPortfolioFiat(); + const colors = useColors(); + const scheme = useResolvedScheme(); + const styles = useMemo(() => makeStyles(colors, scheme), [colors, scheme]); const [balanceVisible, setBalanceVisible] = useState(true); @@ -55,218 +65,294 @@ export default function DashboardScreen() { }, [isDfxAuthenticated, isAuthenticating, authenticate]); const symbol = CURRENCY_SYMBOLS.get(selectedCurrency) ?? selectedCurrency; - const { whole, fraction } = splitBalance(totalBalanceFiat); + const displayBalance = Number.isFinite(totalPortfolioFiat) + ? String(Math.round(totalPortfolioFiat * 100) / 100) + : '0'; + const { whole, fraction } = splitBalance(displayBalance); - return ( - - - - router.push('/(auth)/(tabs)/settings')} /> + const content = ( + + + router.push('/settings') : undefined} + onShieldPress={FEATURES.MULTISIG ? () => router.push('/(auth)/multi-sig') : undefined} + /> - - setBalanceVisible((v) => !v)} - accessibilityRole="button" - accessibilityLabel={t('dashboard.toggleBalance')} - testID="dashboard-balance-toggle" - hitSlop={8} - > - {t('dashboard.totalBalance')} - - - - - {symbol} - {balanceVisible ? ( - <> - {whole} - .{fraction} - - ) : ( - •••• - )} + + setBalanceVisible((v) => !v)} + accessibilityRole="button" + accessibilityLabel={t('dashboard.toggleBalance')} + testID="dashboard-balance-toggle" + hitSlop={12} + > + {t('dashboard.totalBalance')} + + + + + + {symbol} + {balanceVisible ? ( + <> + {whole} + .{fraction} + + ) : ( + •••• + )} + + {(FEATURES.PORTFOLIO || FEATURES.PAY) && ( - } - label={t('dashboard.portfolio')} - testID="dashboard-action-portfolio" - onPress={() => router.push('/(auth)/portfolio')} - style={styles.actionPill} - /> - } - label={t('dashboard.pay')} - testID="dashboard-action-pay" - onPress={() => router.push('/(auth)/pay')} - style={styles.actionPill} - /> + {FEATURES.PORTFOLIO && ( + } + label={t('dashboard.portfolio')} + testID="dashboard-action-portfolio" + onPress={() => router.push('/(auth)/portfolio')} + style={styles.actionPill} + /> + )} + {FEATURES.PAY && ( + } + label={t('dashboard.pay')} + testID="dashboard-action-pay" + onPress={() => router.push('/(auth)/pay')} + style={styles.actionPill} + /> + )} + )} + {FEATURES.TX_HISTORY && ( router.push('/(auth)/transaction-history')} testID="dashboard-action-transactions" accessibilityRole="button" > - + {t('dashboard.transactions')} + )} - - - router.push('/(auth)/receive')} - testID="dashboard-action-receive" - accessibilityRole="button" - accessibilityLabel={t('receive.title')} - > - - {t('receive.title')} - - - router.push('/(auth)/send')} - testID="dashboard-action-send" - accessibilityRole="button" - accessibilityLabel={t('send.title')} - > - - {t('send.title')} - - + + {/* Send left, Receive right — matches the Revolut / Coinbase / + Cash-App convention of giving the more-frequent action + ("Send") thumb-priority on the left. */} + + router.push('/(auth)/send')} + testID="dashboard-action-send" + accessibilityRole="button" + accessibilityLabel={t('send.title')} + > + + {t('send.title')} + + + router.push('/(auth)/receive')} + testID="dashboard-action-receive" + accessibilityRole="button" + accessibilityLabel={t('receive.title')} + > + + {t('receive.title')} + - - + + + ); + + return ( + + {scheme === 'dark' ? ( + + ) : ( + + )} + {content} + ); } -const styles = StyleSheet.create({ - bg: { - flex: 1, - backgroundColor: DfxColors.background, - }, - safeArea: { - flex: 1, - }, - content: { - flex: 1, - paddingHorizontal: 20, - }, - balanceSection: { - marginTop: 'auto', - alignItems: 'center', - paddingTop: 8, - paddingBottom: 24, - }, - balanceLabelRow: { - flexDirection: 'row', - alignItems: 'center', - gap: 8, - paddingVertical: 4, - }, - balanceLabel: { - ...Typography.bodyMedium, - color: DfxColors.textSecondary, - fontWeight: '500', - }, - balanceValueRow: { - flexDirection: 'row', - alignItems: 'baseline', - marginTop: 4, - }, - balanceSymbol: { - fontSize: 36, - lineHeight: 56, - fontWeight: '300', - color: DfxColors.textTertiary, - marginRight: 4, - }, - balanceWhole: { - fontSize: 52, - lineHeight: 56, - fontWeight: '600', - color: DfxColors.text, - letterSpacing: -1, - flexShrink: 1, - }, - balanceFraction: { - fontSize: 24, - lineHeight: 48, - fontWeight: '500', - color: DfxColors.textSecondary, - }, - balanceHidden: { - fontSize: 64, - lineHeight: 84, - fontWeight: '600', - color: DfxColors.text, - letterSpacing: 4, - }, - actions: { - flexDirection: 'row', - gap: 12, - }, - actionPill: { - flex: 1, - }, - transactions: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'center', - gap: 10, - paddingVertical: 18, - marginTop: 8, - }, - transactionsLabel: { - ...Typography.bodyLarge, - color: DfxColors.primary, - fontWeight: '600', - }, - footer: { - marginTop: 'auto', - alignItems: 'center', - paddingBottom: 24, - }, - bottomPill: { - flexDirection: 'row', - alignItems: 'center', - backgroundColor: DfxColors.surface, - borderRadius: 999, - paddingHorizontal: 8, - paddingVertical: 10, - width: '70%', - shadowColor: '#0B1426', - shadowOpacity: 0.08, - shadowRadius: 16, - shadowOffset: { width: 0, height: 6 }, - elevation: 3, - }, - bottomPillItem: { - flex: 1, - alignItems: 'center', - justifyContent: 'center', - gap: 4, - paddingVertical: 6, - }, - bottomPillSeparator: { - width: StyleSheet.hairlineWidth, - height: 32, - backgroundColor: DfxColors.border, - }, - bottomPillLabel: { - ...Typography.bodyMedium, - color: DfxColors.text, - fontWeight: '500', - }, -}); +const makeStyles = (colors: ThemeColors, scheme: ResolvedScheme) => { + // In dark mode the balance sits over the cinematic mountain photo, so the + // muted label/symbol/fraction tones need a soft navy shadow to stay crisp + // over the brighter mist. Light mode keeps its flat surface — no shadow. + const overImage = + scheme === 'dark' + ? ({ + textShadowColor: 'rgba(4,16,32,0.6)', + textShadowOffset: { width: 0, height: 1 }, + textShadowRadius: 10, + } as const) + : null; + return StyleSheet.create({ + bg: { + flex: 1, + backgroundColor: colors.background, + }, + safeArea: { + flex: 1, + }, + content: { + flex: 1, + paddingHorizontal: 20, + }, + balanceSection: { + marginTop: 'auto', + alignItems: 'center', + paddingTop: 16, + paddingBottom: 28, + }, + balanceLabelRow: { + flexDirection: 'row', + alignItems: 'center', + gap: 8, + // Bumped from 6 → 12 so the tap target clears 44pt without relying on hitSlop alone. + paddingVertical: 12, + paddingHorizontal: 12, + }, + balanceLabel: { + ...Typography.bodyMedium, + color: colors.textSecondary, + fontWeight: '500', + ...overImage, + }, + balanceEyeBubble: { + width: 28, + height: 28, + borderRadius: 14, + backgroundColor: colors.primaryLight, + alignItems: 'center', + justifyContent: 'center', + }, + balanceValueRow: { + flexDirection: 'row', + alignItems: 'baseline', + marginTop: 8, + maxWidth: '100%', + }, + // Currency code + fraction are intentionally subdued so the whole-number + // portion of the balance carries the hierarchy. Tabular figures keep the + // digit-grid stable when the value changes (no width jitter). + balanceSymbol: { + fontSize: 22, + lineHeight: 58, + fontWeight: '500', + color: colors.textSecondary, + marginRight: 8, + letterSpacing: 0.5, + ...overImage, + }, + balanceWhole: { + fontSize: 56, + lineHeight: 60, + fontWeight: '700', + color: colors.text, + flexShrink: 1, + letterSpacing: -1, + fontVariant: ['tabular-nums'], + ...overImage, + }, + balanceFraction: { + fontSize: 22, + lineHeight: 58, + fontWeight: '500', + color: colors.textSecondary, + fontVariant: ['tabular-nums'], + ...overImage, + }, + balanceHidden: { + fontSize: 52, + lineHeight: 58, + fontWeight: '600', + color: colors.text, + letterSpacing: 4, + ...overImage, + }, + actions: { + flexDirection: 'row', + gap: 10, + }, + actionPill: { + flex: 1, + }, + transactions: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + gap: 10, + minHeight: 54, + paddingVertical: 14, + marginTop: 10, + }, + transactionsLabel: { + ...Typography.bodyLarge, + color: colors.primary, + fontWeight: '600', + }, + footer: { + marginTop: 'auto', + alignItems: 'center', + paddingBottom: 22, + }, + bottomPill: { + flexDirection: 'row', + alignItems: 'center', + backgroundColor: colors.cardOverlay, + borderRadius: 24, + borderWidth: 1, + borderColor: colors.cardOverlayBorder, + paddingHorizontal: 6, + paddingVertical: 8, + width: '100%', + maxWidth: 360, + shadowColor: colors.shadow, + shadowOpacity: 0.18, + shadowRadius: 18, + shadowOffset: { width: 0, height: 8 }, + elevation: 3, + }, + bottomPillItem: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + gap: 4, + minHeight: 58, + paddingVertical: 8, + borderRadius: 18, + }, + bottomPillSeparator: { + width: 1, + height: 28, + // `colors.divider` is tuned per-theme: a near-invisible 10%-white + // overlay in dark (where `border` sits ≤ 1 RGB unit from the pill + // surface and disappears), and the standard hairline grey in light. + backgroundColor: colors.divider, + borderRadius: 1, + }, + bottomPillLabel: { + ...Typography.bodyMedium, + color: colors.text, + fontWeight: '600', + }, + }); +}; diff --git a/app/(auth)/(tabs)/settings.tsx b/app/(auth)/(tabs)/settings.tsx index 523fdfa0..8194957b 100644 --- a/app/(auth)/(tabs)/settings.tsx +++ b/app/(auth)/(tabs)/settings.tsx @@ -1,356 +1,15 @@ -import { useEffect, useState } from 'react'; -import { - Alert, - ImageBackground, - Pressable, - ScrollView, - StyleSheet, - Text, - View, -} from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import { Stack, useRouter } from 'expo-router'; -import { useTranslation } from 'react-i18next'; -import i18n from 'i18next'; -import { useWalletManager } from '@tetherto/wdk-react-native-core'; -import { Linking } from 'react-native'; -import { AppHeader, Icon } from '@/components'; -import { secureStorage, StorageKeys } from '@/services/storage'; -import { useAuthStore, useWalletStore } from '@/store'; -import { DfxColors, Typography } from '@/theme'; - -type IconName = 'user' | 'wallet' | 'shield' | 'globe' | 'document' | 'support'; - -type SettingsRow = { - label: string; - value?: string; - testID: string; - icon: IconName; - route?: string; - onPress?: () => void; -}; - -type SettingsSection = { - title: string; - rows: SettingsRow[]; -}; - -export default function SettingsScreen() { - const router = useRouter(); - const { t } = useTranslation(); - const { reset } = useAuthStore(); - const { selectedCurrency, setSelectedCurrency } = useWalletStore(); - const CURRENCIES = ['CHF', 'EUR', 'USD'] as const; - const currentLang = i18n.language?.startsWith('de') ? 'DE' : 'EN'; - const { deleteWallet } = useWalletManager(); - const [walletOrigin, setWalletOrigin] = useState(null); - - useEffect(() => { - void secureStorage.get(StorageKeys.WALLET_ORIGIN).then(setWalletOrigin); - }, []); - - const handleDeleteWallet = () => { - const isPasskey = walletOrigin === 'passkey'; - const message = isPasskey - ? t('settings.deleteWalletConfirmPasskey') - : t('settings.deleteWalletConfirm'); - - Alert.alert(t('settings.deleteWallet'), message, [ - { text: t('common.cancel'), style: 'cancel' }, - { - text: t('settings.deleteWallet'), - style: 'destructive', - onPress: async () => { - try { - await deleteWallet('default'); - } catch { - // Wallet may not exist; reset auth state regardless. - } - await reset(); - router.replace('/'); - }, - }, - ]); - }; - - const sections: SettingsSection[] = [ - { - title: t('settings.sectionAccount'), - rows: [ - { - icon: 'user', - label: t('settings.userData'), - testID: 'settings-user-data', - route: '/(auth)/kyc', - }, - ], - }, - { - title: t('settings.sectionWalletSecurity'), - rows: [ - { - icon: 'wallet', - label: t('settings.walletAddress'), - testID: 'settings-wallet-address', - route: '/(auth)/receive', - }, - { - icon: 'shield', - label: t(walletOrigin === 'passkey' ? 'settings.seed' : 'settings.seedPhrase'), - testID: 'settings-seed', - route: '/(auth)/seed-export', - }, - { - icon: 'shield', - label: t('settings.hardwareWallet'), - testID: 'settings-hardware-wallet', - route: '/(auth)/hardware-connect', - }, - ], - }, - { - title: t('settings.sectionPreferences'), - rows: [ - { - icon: 'globe', - label: t('settings.language'), - value: currentLang, - testID: 'settings-language', - onPress: () => { - void i18n.changeLanguage(currentLang === 'DE' ? 'en' : 'de'); - }, - }, - { - icon: 'globe', - label: t('settings.currencies'), - value: selectedCurrency, - testID: 'settings-currencies', - onPress: () => { - const idx = CURRENCIES.indexOf(selectedCurrency as (typeof CURRENCIES)[number]); - const next = CURRENCIES[(idx + 1) % CURRENCIES.length]!; - setSelectedCurrency(next); - }, - }, - { - icon: 'globe', - label: t('settings.network'), - testID: 'settings-network', - route: '/(auth)/portfolio/manage', - }, - ], - }, - { - title: t('settings.sectionReportsLegal'), - rows: [ - { - icon: 'document', - label: t('settings.taxReport'), - testID: 'settings-tax-report', - onPress: () => { - router.push({ - pathname: '/(auth)/webview', - params: { url: 'https://docs.dfx.swiss/de/faq.html', title: t('settings.taxReport') }, - }); - }, - }, - { - icon: 'document', - label: t('settings.legalDocuments'), - testID: 'settings-legal-documents', - onPress: () => { - router.push({ - pathname: '/(auth)/webview', - params: { - url: 'https://docs.dfx.swiss/de/tnc.html', - title: t('settings.legalDocuments'), - }, - }); - }, - }, - ], - }, - { - title: t('settings.sectionHelp'), - rows: [ - { - icon: 'support', - label: t('settings.contact'), - testID: 'settings-contact', - onPress: () => { - void Linking.openURL('mailto:support@dfx.swiss'); - }, - }, - { - icon: 'support', - label: t('support.title'), - testID: 'settings-support', - route: '/(auth)/support', - }, - ], - }, - ]; - - return ( - <> - - - - - {sections.map((section) => ( - - {section.title} - - {section.rows.map((row, index) => ( - { - if (row.onPress) row.onPress(); - else if (row.route) router.push(row.route as never); - }} - /> - ))} - - - ))} - - [styles.dangerCard, pressed && styles.pressed]} - onPress={handleDeleteWallet} - > - {t('settings.deleteWallet')} - - - DFX Wallet v0.1.0 - - - - - ); -} - -type RowProps = { - row: SettingsRow; - isLast: boolean; - onPress: () => void; -}; - -function SettingsRowView({ row, isLast, onPress }: RowProps) { - return ( - [styles.row, !isLast && styles.rowDivider, pressed && styles.pressed]} - onPress={onPress} - > - - - - {row.label} - {row.value ? {row.value} : null} - - - ); -} - -const styles = StyleSheet.create({ - bg: { - flex: 1, - backgroundColor: DfxColors.background, - }, - safeArea: { - flex: 1, - }, - scroll: { - flex: 1, - }, - scrollContent: { - paddingHorizontal: 20, - paddingBottom: 48, - gap: 20, - }, - section: { - gap: 8, - }, - sectionTitle: { - ...Typography.bodySmall, - color: DfxColors.textSecondary, - textTransform: 'uppercase', - letterSpacing: 1, - fontWeight: '600', - paddingHorizontal: 4, - }, - sectionCard: { - backgroundColor: DfxColors.surface, - borderRadius: 16, - overflow: 'hidden', - shadowColor: '#0B1426', - shadowOpacity: 0.04, - shadowRadius: 10, - shadowOffset: { width: 0, height: 3 }, - elevation: 1, - }, - row: { - flexDirection: 'row', - alignItems: 'center', - paddingVertical: 14, - paddingHorizontal: 14, - gap: 12, - }, - rowDivider: { - borderBottomWidth: StyleSheet.hairlineWidth, - borderBottomColor: DfxColors.border, - }, - rowIcon: { - width: 32, - height: 32, - borderRadius: 16, - backgroundColor: DfxColors.primaryLight, - alignItems: 'center', - justifyContent: 'center', - }, - rowLabel: { - flex: 1, - ...Typography.bodyLarge, - color: DfxColors.text, - fontWeight: '500', - }, - rowValue: { - ...Typography.bodyMedium, - color: DfxColors.textSecondary, - }, - pressed: { - opacity: 0.7, - }, - dangerCard: { - marginTop: 8, - paddingVertical: 16, - backgroundColor: DfxColors.surface, - borderRadius: 16, - alignItems: 'center', - shadowColor: '#0B1426', - shadowOpacity: 0.04, - shadowRadius: 10, - shadowOffset: { width: 0, height: 3 }, - }, - dangerLabel: { - ...Typography.bodyLarge, - color: DfxColors.error, - fontWeight: '600', - }, - version: { - ...Typography.bodySmall, - color: DfxColors.textTertiary, - textAlign: 'center', - marginTop: 16, - }, -}); +import { FEATURES } from '@/config/features'; + +/** + * Settings hub route. Resolves at build time to either the real + * `SettingsScreenImpl` (which pulls in the DFX user service, the + * biometric toggle, hardware-wallet pairing entry, and the seed export + * navigation) or a `` stub. + */ +const SettingsScreen = FEATURES.SETTINGS + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/settings/SettingsScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/settings/SettingsDisabled').default as React.ComponentType); + +export default SettingsScreen; diff --git a/app/(auth)/_layout.tsx b/app/(auth)/_layout.tsx index 250db3a0..7de36894 100644 --- a/app/(auth)/_layout.tsx +++ b/app/(auth)/_layout.tsx @@ -1,18 +1,65 @@ -import { Stack } from 'expo-router'; -import { useDeepLink } from '@/hooks'; -import { DfxColors } from '@/theme'; +import { useEffect } from 'react'; +import { Redirect, Stack, useSegments } from 'expo-router'; +import { useDeepLink, useDfxAuth, useDfxAutoLink } from '@/hooks'; +import { dfxApi } from '@/features/dfx-backend/services'; +import { useAuthStore } from '@/store'; +import { useColors } from '@/theme'; export default function AuthLayout() { useDeepLink(); + const segments = useSegments(); + const isAuthenticated = useAuthStore((s) => s.isAuthenticated); + const isAuthRoute = segments[0] === '(auth)'; + // Hard auth gate: any entry into (auth)/* — including Metro reloads or + // deep-link restores of dashboard/settings — must pass through PIN or + // biometric first. `isAuthenticated` is in-memory only, so it resets on + // every cold start and every JS reload. Hydration happens in the root + // layout, so by the time this renders the auth state is already loaded. + if (!isAuthenticated && isAuthRoute) { + return ; + } + + if (!isAuthenticated) { + return ; + } + + return ; +} + +function AuthStack() { + const colors = useColors(); return ( ); } + +/** + * Inner layout wired up only after the PIN gate has passed. We register a + * silent 401-recovery handler on `dfxApi` here so any expired-token call + * transparently re-signs with the wallet and retries before bubbling up to + * the user as a "login required" popup. The popup should only ever fire for + * genuine registration / KYC states or when the wallet itself can't sign. + */ +function AuthenticatedLayout() { + const { authenticateSilent } = useDfxAuth(); + + useEffect(() => { + dfxApi.setOnUnauthorized(authenticateSilent); + }, [authenticateSilent]); + + // Once we have a DFX session, attach BTC + Spark wallets to the user's + // account in the background so the very first BTC / Lightning quote no + // longer hits "Asset blockchain mismatch". Each chain is signed at most + // once across app launches. + useDfxAutoLink(); + + return ; +} diff --git a/app/(auth)/buy/index.tsx b/app/(auth)/buy/index.tsx index 572b16a3..e0d757cc 100644 --- a/app/(auth)/buy/index.tsx +++ b/app/(auth)/buy/index.tsx @@ -1,324 +1,13 @@ -import { useState } from 'react'; -import { Pressable, StyleSheet, Text, TextInput, View } from 'react-native'; -import { useRouter } from 'expo-router'; -import { useTranslation } from 'react-i18next'; -import { ChainSelector, PrimaryButton, ScreenContainer } from '@/components'; -import { useBuyFlow } from '@/hooks'; -import type { ChainId } from '@/config/chains'; -import { DfxColors, Typography } from '@/theme'; - -type BuyStep = 'amount' | 'payment' | 'confirm'; - -const CURRENCIES = ['CHF', 'EUR', 'USD'] as const; - -const CHAIN_ASSET: Record = { - ethereum: 'ETH', - arbitrum: 'ETH', - polygon: 'MATIC', - base: 'ETH', - spark: 'BTC', - plasma: 'ETH', - sepolia: 'ETH', -}; - -export default function BuyScreen() { - const router = useRouter(); - const { t } = useTranslation(); - const { paymentInfo, isLoading, error, createPaymentInfo, confirmPayment } = useBuyFlow(); - const [step, setStep] = useState('amount'); - const [selectedChain, setSelectedChain] = useState('ethereum'); - const [amount, setAmount] = useState(''); - const [selectedCurrency, setSelectedCurrency] = useState<(typeof CURRENCIES)[number]>('CHF'); - - const renderAmountStep = () => ( - - How much do you want to buy? - - - - - - - {CURRENCIES.map((cur) => ( - setSelectedCurrency(cur)} - > - - {cur} - - - ))} - - - - - {['100', '500', '1000', '5000'].map((val) => ( - setAmount(val)}> - {val} - - ))} - - - - - {error && {error}} - - { - const info = await createPaymentInfo({ - amount: parseFloat(amount), - currency: selectedCurrency, - // eslint-disable-next-line security/detect-object-injection -- selectedChain is a ChainId literal union - asset: CHAIN_ASSET[selectedChain], - blockchain: selectedChain.charAt(0).toUpperCase() + selectedChain.slice(1), - }); - if (info) setStep('payment'); - }} - disabled={!amount || parseFloat(amount) <= 0} - loading={isLoading} - /> - - ); - - const renderPaymentStep = () => ( - - Payment Information - - - - IBAN - {paymentInfo?.iban ?? '—'} - - - BIC - {paymentInfo?.bic ?? '—'} - - - Recipient - {paymentInfo?.name ?? 'DFX AG'} - - - Reference - - {paymentInfo?.remittanceInfo ?? '—'} - - - - Amount - - {paymentInfo?.amount ?? amount} {paymentInfo?.currency?.name ?? selectedCurrency} - - - - You receive (est.) - - ~{paymentInfo?.estimatedAmount?.toFixed(6) ?? '—'} {paymentInfo?.asset?.name ?? ''} - - - - Fee - {paymentInfo?.fees?.total?.toFixed(2) ?? '—'}% - - - - - Transfer the exact amount with the reference code. Your crypto will be sent to your wallet - after payment is received. - - - - - { - if (paymentInfo) { - await confirmPayment(paymentInfo.id); - } - setStep('confirm'); - }} - loading={isLoading} - /> - - ); - - const renderConfirmStep = () => ( - - - {'\u2705'} - Order placed - - Your purchase of {amount} {selectedCurrency} worth of crypto on {selectedChain} has been - initiated. Make the bank transfer to complete your order. - - - - - - router.back()} /> - - ); - - return ( - - - - (step === 'amount' ? router.back() : setStep('amount'))}> - {'\u2190'} - - {t('buy.title')} - - - - {step === 'amount' && renderAmountStep()} - {step === 'payment' && renderPaymentStep()} - {step === 'confirm' && renderConfirmStep()} - - - ); -} - -const styles = StyleSheet.create({ - content: { - flex: 1, - paddingVertical: 16, - gap: 16, - }, - header: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - }, - backButton: { - fontSize: 24, - color: DfxColors.text, - width: 32, - }, - title: { - ...Typography.headlineSmall, - color: DfxColors.text, - }, - stepContent: { - flex: 1, - gap: 20, - }, - stepTitle: { - ...Typography.headlineSmall, - color: DfxColors.text, - }, - amountContainer: { - gap: 12, - }, - amountInput: { - backgroundColor: DfxColors.surface, - borderRadius: 16, - padding: 20, - fontSize: 32, - fontWeight: '700', - color: DfxColors.text, - textAlign: 'center', - }, - currencySelector: { - flexDirection: 'row', - justifyContent: 'center', - gap: 8, - }, - currencyChip: { - paddingHorizontal: 16, - paddingVertical: 8, - borderRadius: 16, - backgroundColor: DfxColors.surface, - }, - currencyChipActive: { - backgroundColor: DfxColors.primary, - }, - currencyText: { - ...Typography.bodyMedium, - fontWeight: '600', - color: DfxColors.textSecondary, - }, - currencyTextActive: { - color: DfxColors.white, - }, - quickAmounts: { - flexDirection: 'row', - gap: 8, - justifyContent: 'center', - }, - quickAmount: { - paddingHorizontal: 16, - paddingVertical: 10, - borderRadius: 12, - backgroundColor: DfxColors.surface, - }, - quickAmountText: { - ...Typography.bodySmall, - fontWeight: '600', - color: DfxColors.textSecondary, - }, - paymentInfo: { - backgroundColor: DfxColors.surface, - borderRadius: 16, - padding: 20, - gap: 16, - }, - infoRow: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - }, - infoLabel: { - ...Typography.bodyMedium, - color: DfxColors.textTertiary, - }, - infoValue: { - ...Typography.bodyMedium, - fontWeight: '600', - color: DfxColors.text, - textAlign: 'right', - flexShrink: 1, - }, - hint: { - ...Typography.bodySmall, - color: DfxColors.textTertiary, - textAlign: 'center', - paddingHorizontal: 16, - }, - successContainer: { - alignItems: 'center', - paddingVertical: 48, - gap: 16, - }, - successIcon: { - fontSize: 64, - }, - successTitle: { - ...Typography.headlineMedium, - color: DfxColors.text, - }, - successDescription: { - ...Typography.bodyLarge, - color: DfxColors.textSecondary, - textAlign: 'center', - paddingHorizontal: 16, - }, - errorText: { - ...Typography.bodySmall, - color: DfxColors.error, - textAlign: 'center', - }, - spacer: { - flex: 1, - }, -}); +import { FEATURES } from '@/config/features'; + +/** + * Buy (fiat on-ramp) route. With `EXPO_PUBLIC_ENABLE_BUY_SELL` off, + * resolves to a `` stub that bounces back to the dashboard. + */ +const BuyScreen = FEATURES.BUY_SELL + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/buy-sell/BuyScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/buy-sell/BuySellDisabled').default as React.ComponentType); + +export default BuyScreen; diff --git a/app/(auth)/contact/index.tsx b/app/(auth)/contact/index.tsx new file mode 100644 index 00000000..fced2a4e --- /dev/null +++ b/app/(auth)/contact/index.tsx @@ -0,0 +1,9 @@ +import { FEATURES } from '@/config/features'; + +const ContactScreen = FEATURES.DFX_BACKEND + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/dfx-backend/screens/ContactScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/dfx-backend/screens/DfxBackendDisabled').default as React.ComponentType); + +export default ContactScreen; diff --git a/app/(auth)/dfx-login/index.tsx b/app/(auth)/dfx-login/index.tsx new file mode 100644 index 00000000..a780cf83 --- /dev/null +++ b/app/(auth)/dfx-login/index.tsx @@ -0,0 +1,13 @@ +import { FEATURES } from '@/config/features'; + +/** + * DFX e-mail-login route. With `EXPO_PUBLIC_ENABLE_DFX_BACKEND` off, + * resolves to a `` stub. + */ +const DfxLoginScreen = FEATURES.DFX_BACKEND + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/dfx-backend/screens/DfxLoginScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/dfx-backend/screens/DfxBackendDisabled').default as React.ComponentType); + +export default DfxLoginScreen; diff --git a/app/(auth)/email/index.tsx b/app/(auth)/email/index.tsx new file mode 100644 index 00000000..bb1f4a57 --- /dev/null +++ b/app/(auth)/email/index.tsx @@ -0,0 +1,9 @@ +import { FEATURES } from '@/config/features'; + +const EmailScreen = FEATURES.DFX_BACKEND + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/dfx-backend/screens/EmailScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/dfx-backend/screens/DfxBackendDisabled').default as React.ComponentType); + +export default EmailScreen; diff --git a/app/(auth)/hardware-connect/index.tsx b/app/(auth)/hardware-connect/index.tsx index 7217f3b8..55e0497f 100644 --- a/app/(auth)/hardware-connect/index.tsx +++ b/app/(auth)/hardware-connect/index.tsx @@ -1,305 +1,14 @@ -import { useEffect, useState } from 'react'; -import { ActivityIndicator, Platform, Pressable, StyleSheet, Text, View } from 'react-native'; -import { useRouter } from 'expo-router'; -import { PrimaryButton, ScreenContainer } from '@/components'; -import { BitboxProvider, BitboxWasmWebView } from '@/services/hardware-wallet'; -import type { HardwareWalletDevice, HardwareWalletStatus } from '@/services/hardware-wallet'; -import { useHardwareWalletStore } from '@/store'; -import { DfxColors, Typography } from '@/theme'; - -const provider = new BitboxProvider(); - -const STATUS_TEXT: Record = { - disconnected: 'Not connected', - scanning: 'Scanning for devices...', - detected: 'Device found', - connecting: 'Connecting...', - verifying: 'Verify on device...', - connected: 'Connected', -}; - -export default function HardwareConnectScreen() { - const router = useRouter(); - const { status, device, setStatus, setDevice, setAddress, setError, reset } = - useHardwareWalletStore(); - const [devices, setDevices] = useState([]); - - const isAndroid = Platform.OS === 'android'; - - const handleScan = async () => { - setStatus('scanning'); - try { - const found = await provider.scanDevices(); - setDevices(found); - setStatus(found.length > 0 ? 'detected' : 'disconnected'); - } catch (err) { - setError(err instanceof Error ? err.message : 'Scan failed'); - } - }; - - const handleConnect = async (dev: HardwareWalletDevice) => { - setDevice(dev); - setStatus('connecting'); - try { - await provider.connect(dev); - setStatus('verifying'); - const address = await provider.getEthAddress(); - setAddress(address); - setStatus('connected'); - } catch (err) { - setError(err instanceof Error ? err.message : 'Connection failed'); - } - }; - - const [, setWasmReady] = useState(false); - - useEffect(() => { - return () => { - void provider.disconnect(); - }; - }, []); - - return ( - - - - router.back()}> - {'\u2190'} - - Hardware Wallet - - - - - - BitBox02 - - - - {status === 'scanning' && } - {/* eslint-disable-next-line security/detect-object-injection -- status is a HardwareWalletStatus literal union */} - {STATUS_TEXT[status]} - - - {status === 'disconnected' && ( - <> - - {isAndroid - ? 'Connect your BitBox02 via USB or scan for BitBox02 Nova via Bluetooth.' - : 'Scan for your BitBox02 Nova via Bluetooth.'} - - - {isAndroid && ( - - - USB - - BitBox02 (Standard) - - )} - - - BLE - - BitBox02 Nova - - - - )} - - {devices.length > 0 && status === 'detected' && ( - - {devices.map((dev) => ( - handleConnect(dev)} - > - - {dev.name} - - {dev.transport.toUpperCase()} - - - Connect - - ))} - - )} - - {status === 'verifying' && ( - - Please confirm the pairing code on your BitBox02 device. - - )} - - {status === 'connected' && ( - - {'\u2705'} - - {device?.name} connected via {device?.transport.toUpperCase()} - - - )} - - - - {status === 'disconnected' && ( - - )} - {status === 'connected' && router.back()} />} - {(status === 'connecting' || status === 'verifying') && ( - { - void provider.disconnect(); - reset(); - }} - /> - )} - - - {/* Hidden WebView for BitBox WASM — mounted when scanning/connecting */} - setWasmReady(true)} /> - - ); -} - -const styles = StyleSheet.create({ - content: { - flex: 1, - paddingVertical: 16, - gap: 16, - }, - header: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - }, - backButton: { - fontSize: 24, - color: DfxColors.text, - width: 32, - }, - title: { - ...Typography.headlineSmall, - color: DfxColors.text, - }, - body: { - flex: 1, - alignItems: 'center', - gap: 24, - paddingTop: 24, - }, - illustration: { - width: 200, - height: 120, - borderRadius: 16, - backgroundColor: DfxColors.surface, - alignItems: 'center', - justifyContent: 'center', - }, - illustrationText: { - ...Typography.headlineSmall, - color: DfxColors.textTertiary, - }, - statusContainer: { - flexDirection: 'row', - alignItems: 'center', - gap: 8, - }, - statusText: { - ...Typography.bodyLarge, - fontWeight: '600', - color: DfxColors.text, - }, - description: { - ...Typography.bodyMedium, - color: DfxColors.textSecondary, - textAlign: 'center', - paddingHorizontal: 32, - }, - transportInfo: { - gap: 12, - width: '100%', - paddingHorizontal: 32, - }, - transportRow: { - flexDirection: 'row', - alignItems: 'center', - gap: 12, - }, - transportBadge: { - paddingHorizontal: 10, - paddingVertical: 4, - borderRadius: 6, - }, - usbBadge: { - backgroundColor: DfxColors.info, - }, - bleBadge: { - backgroundColor: DfxColors.success, - }, - transportBadgeText: { - ...Typography.bodySmall, - fontWeight: '700', - color: DfxColors.black, - }, - transportLabel: { - ...Typography.bodyMedium, - color: DfxColors.textSecondary, - }, - deviceList: { - width: '100%', - gap: 8, - }, - deviceItem: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - padding: 16, - backgroundColor: DfxColors.surface, - borderRadius: 12, - }, - deviceInfo: { - flexDirection: 'row', - alignItems: 'center', - gap: 10, - }, - deviceName: { - ...Typography.bodyLarge, - fontWeight: '600', - color: DfxColors.text, - }, - connectText: { - ...Typography.bodyMedium, - fontWeight: '600', - color: DfxColors.primary, - }, - hint: { - ...Typography.bodyMedium, - color: DfxColors.warning, - textAlign: 'center', - paddingHorizontal: 32, - }, - successContainer: { - alignItems: 'center', - gap: 12, - }, - successIcon: { - fontSize: 48, - }, - successText: { - ...Typography.bodyLarge, - color: DfxColors.success, - }, - actions: { - gap: 12, - }, -}); +import { FEATURES } from '@/config/features'; + +/** + * BitBox02 pairing route. With `EXPO_PUBLIC_ENABLE_HARDWARE_WALLET` + * off, neither the WASM bitbox-api bridge, the BLE transport, nor the + * Android USB-HID native module is loaded into the bundle. + */ +const HardwareConnectScreen = FEATURES.HARDWARE_WALLET + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/hardware-wallet/HardwareConnectScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/hardware-wallet/HardwareWalletDisabled').default as React.ComponentType); + +export default HardwareConnectScreen; diff --git a/app/(auth)/kyc/index.tsx b/app/(auth)/kyc/index.tsx index 3264e8fb..7ec382df 100644 --- a/app/(auth)/kyc/index.tsx +++ b/app/(auth)/kyc/index.tsx @@ -1,309 +1,9 @@ -import { useEffect, useState } from 'react'; -import { - ActivityIndicator, - Linking, - Pressable, - StyleSheet, - Text, - TextInput, - View, -} from 'react-native'; -import { useRouter } from 'expo-router'; -import { PrimaryButton, ScreenContainer } from '@/components'; -import { useKycFlow } from '@/hooks'; -import { DfxColors, Typography } from '@/theme'; +import { FEATURES } from '@/config/features'; -const STEP_LABELS: Record = { - ContactData: 'Contact', - PersonalData: 'Personal Data', - NationalityData: 'Nationality', - FinancialData: 'Financial Info', - Ident: 'Identity Check', -}; +const KycScreen = FEATURES.DFX_BACKEND + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/dfx-backend/screens/KycScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/dfx-backend/screens/DfxBackendDisabled').default as React.ComponentType); -const STATUS_COLORS: Record = { - Completed: DfxColors.success, - InProgress: DfxColors.warning, - InReview: DfxColors.info, - Failed: DfxColors.error, - NotStarted: DfxColors.textTertiary, -}; - -export default function KycScreen() { - const router = useRouter(); - const { - kycLevel, - currentSession, - isLoading, - error, - loadKycStatus, - continueKyc, - submitContactData, - submitPersonalData, - } = useKycFlow(); - - const [email, setEmail] = useState(''); - const [firstName, setFirstName] = useState(''); - const [lastName, setLastName] = useState(''); - - useEffect(() => { - void loadKycStatus(); - }, [loadKycStatus]); - - const handleContinue = async () => { - const session = await continueKyc(); - if (session?.currentStep?.session) { - const { type, url } = session.currentStep.session; - if (type === 'Browser') { - await Linking.openURL(url); - } - } - }; - - const handleSubmitStep = async () => { - const step = currentSession?.currentStep; - if (!step) return; - - let success = false; - if (step.name === 'ContactData') { - success = await submitContactData(step.sequenceNumber, email); - } else if (step.name === 'PersonalData') { - success = await submitPersonalData(step.sequenceNumber, { firstName, lastName }); - } - - if (success) { - await continueKyc(); - } - }; - - if (isLoading && !kycLevel) { - return ( - - - - - - ); - } - - const steps = kycLevel?.kycSteps ?? []; - const currentStep = currentSession?.currentStep; - - return ( - - - - router.back()}> - {'\u2190'} - - KYC Verification - - - - {/* KYC Level */} - - Current Level - {kycLevel?.kycLevel ?? 0} - - - {/* Steps overview */} - - {steps.map((step) => ( - - - {STEP_LABELS[step.name] ?? step.name} - {step.status} - - ))} - - - {/* Current step form */} - {currentStep?.session?.type === 'API' && ( - - - {STEP_LABELS[currentStep.name] ?? currentStep.name} - - - {currentStep.name === 'ContactData' && ( - - )} - - {currentStep.name === 'PersonalData' && ( - <> - - - - )} - - - - )} - - {currentStep?.session?.type === 'Browser' && ( - - - {STEP_LABELS[currentStep.name] ?? currentStep.name} - - - This step requires identity verification in your browser. - - Linking.openURL(currentStep.session!.url)} - /> - - )} - - {error && {error}} - - {!currentStep && steps.length > 0 && ( - - )} - - {steps.every((s) => s.status === 'Completed') && ( - - {'\u2705'} - KYC verification complete - - )} - - - ); -} - -const styles = StyleSheet.create({ - content: { - flex: 1, - paddingVertical: 16, - gap: 16, - }, - header: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - }, - backButton: { - fontSize: 24, - color: DfxColors.text, - width: 32, - }, - title: { - ...Typography.headlineSmall, - color: DfxColors.text, - }, - loadingContainer: { - flex: 1, - alignItems: 'center', - justifyContent: 'center', - }, - levelCard: { - backgroundColor: DfxColors.surface, - borderRadius: 16, - padding: 20, - alignItems: 'center', - gap: 4, - }, - levelLabel: { - ...Typography.bodySmall, - color: DfxColors.textTertiary, - textTransform: 'uppercase', - letterSpacing: 1, - }, - levelValue: { - ...Typography.headlineLarge, - color: DfxColors.primary, - }, - stepsContainer: { - backgroundColor: DfxColors.surface, - borderRadius: 16, - padding: 16, - gap: 12, - }, - stepRow: { - flexDirection: 'row', - alignItems: 'center', - gap: 12, - }, - stepDot: { - width: 10, - height: 10, - borderRadius: 5, - }, - stepName: { - ...Typography.bodyMedium, - color: DfxColors.text, - flex: 1, - }, - stepStatus: { - ...Typography.bodySmall, - color: DfxColors.textTertiary, - }, - formContainer: { - backgroundColor: DfxColors.surface, - borderRadius: 16, - padding: 20, - gap: 16, - }, - formTitle: { - ...Typography.headlineSmall, - color: DfxColors.text, - }, - formDescription: { - ...Typography.bodyMedium, - color: DfxColors.textSecondary, - }, - input: { - backgroundColor: DfxColors.surfaceLight, - borderRadius: 12, - padding: 16, - color: DfxColors.text, - ...Typography.bodyLarge, - }, - errorText: { - ...Typography.bodySmall, - color: DfxColors.error, - textAlign: 'center', - }, - completeContainer: { - alignItems: 'center', - paddingVertical: 24, - gap: 12, - }, - completeIcon: { - fontSize: 48, - }, - completeText: { - ...Typography.bodyLarge, - color: DfxColors.success, - fontWeight: '600', - }, -}); +export default KycScreen; diff --git a/app/(auth)/legal/index.tsx b/app/(auth)/legal/index.tsx new file mode 100644 index 00000000..27973fae --- /dev/null +++ b/app/(auth)/legal/index.tsx @@ -0,0 +1,14 @@ +import { FEATURES } from '@/config/features'; + +/** + * Settings → Legal-documents launcher route. Pulls in the `Linking` + * + `safe-url` chain to hand a list of legal-document URLs off to the + * OS browser; with the flag off, the route is a `` stub. + */ +const LegalDocumentsScreen = FEATURES.LEGAL + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/legal/LegalDocumentsScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/legal/LegalDisabled').default as React.ComponentType); + +export default LegalDocumentsScreen; diff --git a/app/(auth)/linked-wallet/[address].tsx b/app/(auth)/linked-wallet/[address].tsx new file mode 100644 index 00000000..b869e1f2 --- /dev/null +++ b/app/(auth)/linked-wallet/[address].tsx @@ -0,0 +1,15 @@ +import { FEATURES } from '@/config/features'; + +/** + * Linked-wallet detail screen entry (per-address holdings + tx feed). + * With `EXPO_PUBLIC_ENABLE_LINKED_WALLETS` off, resolves to a + * `` stub. + */ +const LinkedWalletDetailScreen = FEATURES.LINKED_WALLETS + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/linked-wallets/LinkedWalletDetailScreenImpl') + .default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/linked-wallets/LinkedWalletsDisabled').default as React.ComponentType); + +export default LinkedWalletDetailScreen; diff --git a/app/(auth)/multi-sig/index.tsx b/app/(auth)/multi-sig/index.tsx new file mode 100644 index 00000000..1fe436cb --- /dev/null +++ b/app/(auth)/multi-sig/index.tsx @@ -0,0 +1,16 @@ +import { FEATURES } from '@/config/features'; + +/** + * Multi-sig vault management route. See `app/(auth)/pay/index.tsx` for + * the same pattern: the file stays put because Expo Router demands it, + * but the body resolves to one of two siblings at build time so a + * production build with the flag off does not load the Zustand store, + * the MMKV instance it opens, or the screen's translation surface. + */ +const MultiSigManageScreen = FEATURES.MULTISIG + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/multi-sig/MultiSigManageScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/multi-sig/MultiSigDisabled').default as React.ComponentType); + +export default MultiSigManageScreen; diff --git a/app/(auth)/multi-sig/setup.tsx b/app/(auth)/multi-sig/setup.tsx new file mode 100644 index 00000000..154420f7 --- /dev/null +++ b/app/(auth)/multi-sig/setup.tsx @@ -0,0 +1,14 @@ +import { FEATURES } from '@/config/features'; + +/** + * Multi-sig setup wizard route. Companion to `multi-sig/index.tsx`; + * both routes are gated by the same `EXPO_PUBLIC_ENABLE_MULTISIG` + * flag and share the disabled-path component. + */ +const MultiSigSetupScreen = FEATURES.MULTISIG + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/multi-sig/MultiSigSetupScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/multi-sig/MultiSigDisabled').default as React.ComponentType); + +export default MultiSigSetupScreen; diff --git a/app/(auth)/pay/index.tsx b/app/(auth)/pay/index.tsx index 2000583f..4073b899 100644 --- a/app/(auth)/pay/index.tsx +++ b/app/(auth)/pay/index.tsx @@ -1,206 +1,29 @@ -import { useEffect, useState } from 'react'; -import { - Alert, - Image, - ImageBackground, - Pressable, - StyleSheet, - Text, - View, - useWindowDimensions, -} from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import { Stack, useRouter } from 'expo-router'; -import { useTranslation } from 'react-i18next'; -import { CameraView, useCameraPermissions } from 'expo-camera'; -import { Icon, MenuModal } from '@/components'; -import { DfxColors, Typography } from '@/theme'; - -const CUTOUT_PCT = { - left: 0.0925, - top: 0.3257, - width: 0.8115, - height: 0.3838, -}; - -export default function PayScreen() { - const router = useRouter(); - const { t } = useTranslation(); - const { width, height } = useWindowDimensions(); - const [permission, requestPermission] = useCameraPermissions(); - const [scanned, setScanned] = useState(false); - const [menuOpen, setMenuOpen] = useState(false); - - useEffect(() => { - if (!permission?.granted) void requestPermission(); - }, [permission, requestPermission]); - - const handleScan = ({ data }: { data: string }) => { - if (scanned) return; - setScanned(true); - Alert.alert(t('pay.comingSoonTitle'), t('pay.comingSoonMessage', { data }), [ - { text: t('common.ok'), onPress: () => router.back() }, - ]); - }; - - const cutoutStyle = { - left: width * CUTOUT_PCT.left, - top: height * CUTOUT_PCT.top, - width: width * CUTOUT_PCT.width, - height: height * CUTOUT_PCT.height, - }; - - return ( - <> - - - - - router.back()} - hitSlop={12} - style={styles.headerSlot} - accessibilityRole="button" - accessibilityLabel={t('common.back')} - testID="pay-back-button" - > - - - - - - setMenuOpen(true)} - hitSlop={12} - style={[styles.headerSlot, styles.headerSlotRight]} - accessibilityRole="button" - accessibilityLabel="Menu" - testID="pay-menu-button" - > - - - - - - - - Alert.alert(t('pay.lightningComingSoon'))} - accessibilityRole="button" - accessibilityLabel={t('pay.lightning')} - testID="pay-lightning-button" - > - - - - - - - {permission?.granted && ( - - )} - {!permission?.granted && ( - - {t('pay.cameraPermission')} - - {t('pay.grantPermission')} - - - )} - - - setMenuOpen(false)} /> - - - ); -} - -const styles = StyleSheet.create({ - bg: { - flex: 1, - backgroundColor: DfxColors.background, - }, - flow: { - flex: 1, - paddingHorizontal: 20, - }, - cutout: { - position: 'absolute', - overflow: 'hidden', - borderRadius: 16, - backgroundColor: 'rgba(11, 20, 38, 0.18)', - }, - header: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - paddingTop: 4, - paddingBottom: 8, - }, - headerSlot: { - width: 36, - height: 36, - alignItems: 'flex-start', - justifyContent: 'center', - }, - headerSlotRight: { - alignItems: 'flex-end', - }, - logo: { - height: 30, - width: 110, - }, - lightningWrapper: { - alignItems: 'center', - paddingBottom: 32, - }, - lightningButton: { - width: 64, - height: 64, - borderRadius: 32, - backgroundColor: DfxColors.surface, - alignItems: 'center', - justifyContent: 'center', - shadowColor: '#0B1426', - shadowOpacity: 0.18, - shadowRadius: 16, - shadowOffset: { width: 0, height: 8 }, - elevation: 6, - }, - permissionFallback: { - alignItems: 'center', - justifyContent: 'center', - padding: 16, - gap: 12, - backgroundColor: 'rgba(255,255,255,0.85)', - }, - permissionText: { - ...Typography.bodyMedium, - color: DfxColors.text, - textAlign: 'center', - }, - permissionButton: { - backgroundColor: DfxColors.primary, - paddingHorizontal: 18, - paddingVertical: 10, - borderRadius: 999, - }, - permissionButtonText: { - ...Typography.bodyMedium, - color: DfxColors.white, - fontWeight: '600', - }, -}); +import { FEATURES } from '@/config/features'; + +/** + * Pay route entry. Expo Router requires this file at + * `app/(auth)/pay/index.tsx` (file-based routing), so it cannot be + * removed when the feature is off. Instead we resolve to one of two + * sibling modules under `src/features/pay/`: + * + * - `PayScreenImpl` — the real QR-scanner screen, pulls in + * `expo-camera`, `CameraView`, `useCameraPermissions`, the + * translation/asset chain. + * - `PayDisabled` — a tiny `` stub. + * + * `FEATURES.PAY` is a build-time boolean literal (Expo inlines + * `process.env.EXPO_PUBLIC_*` via babel-preset-expo). Combined with + * the conditional `require()`, Metro's dead-code elimination can drop + * the unused module from the bundle: a production build with the flag + * unset never loads `expo-camera` or the scanner logic. + * + * Don't refactor the ternary into a plain `import` — that would defeat + * the DCE and reintroduce the camera-stack into every MVP build. + */ +const PayScreen = FEATURES.PAY + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/pay/PayScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/pay/PayDisabled').default as React.ComponentType); + +export default PayScreen; diff --git a/app/(auth)/pay/opencryptopay.tsx b/app/(auth)/pay/opencryptopay.tsx new file mode 100644 index 00000000..3a2c58eb --- /dev/null +++ b/app/(auth)/pay/opencryptopay.tsx @@ -0,0 +1,375 @@ +import { useEffect, useMemo, useState } from 'react'; +import { ActivityIndicator, Pressable, StyleSheet, Text, View } from 'react-native'; +import { Redirect, useLocalSearchParams, useRouter } from 'expo-router'; +import { useTranslation } from 'react-i18next'; +import { AppHeader, PrimaryButton, ScreenContainer } from '@/components'; +import { FEATURES } from '@/config/features'; +import { + cancelQuote, + fetchQuote, + lnurlToEndpoint, + OpenCryptoPayError, + type OpenCryptoPayInvoice, +} from '@/services/opencryptopay'; +import { Typography, useColors, type ThemeColors } from '@/theme'; + +/** + * OpenCryptoPay payment confirmation screen. + * + * Reached from the Pay scanner via `router.replace('/(auth)/pay/opencryptopay', + * { lnurl })`. The screen decodes the LNURL → endpoint, fetches the + * provider's quote (display name + transfer options + expiry), and lets + * the user pick an asset/chain to pay with. + * + * The on-chain broadcast step (sign the resulting ERC-681 URI, submit + * via WDK, then commit the tx hex back to the OCP provider) is wired + * up in a follow-up — first iteration's contract is "scan a DFX + * `LNURL1…` QR and land on the right invoice screen, with the right + * amount in the right currency, instead of the generic Coming-Soon + * alert". The Continue CTA today persists the asset/chain pick to a + * "Coming soon: signing" hint, the API surface for the next iteration + * is already in place via `getPaymentTarget` + `commitTx`. + */ + +const FALLBACK_EXPIRY_MS = 5 * 60 * 1000; + +/** + * Route gate. `pay/index.tsx` swaps in `PayDisabled` when the flag is + * off, but Expo Router registers THIS file as its own route, so a deep + * link to `/(auth)/pay/opencryptopay` would otherwise reach the quote + * screen (and its network fetch) with the Pay feature disabled. + */ +export default function OpenCryptoPayRoute() { + if (!FEATURES.PAY) return ; + return ; +} + +function OpenCryptoPayScreen() { + const router = useRouter(); + const colors = useColors(); + const styles = useMemo(() => makeStyles(colors), [colors]); + const { t } = useTranslation(); + const params = useLocalSearchParams<{ lnurl?: string }>(); + const lnurl = typeof params.lnurl === 'string' ? params.lnurl : ''; + + const [invoice, setInvoice] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [pickedMethod, setPickedMethod] = useState(null); + const [pickedAsset, setPickedAsset] = useState(null); + const [now, setNow] = useState(Date.now()); + + useEffect(() => { + if (!lnurl) { + setError(t('opencryptopay.errors.invalidQr')); + setLoading(false); + return; + } + let cancelled = false; + void (async () => { + try { + const endpoint = lnurlToEndpoint(lnurl); + const inv = await fetchQuote(endpoint); + if (cancelled) return; + setInvoice(inv); + // Default pick: first method + its first asset. The Flutter + // reference defaults to ZCHF on Polygon but DFX' merchants + // frequently offer multiple, so we don't hard-code the asset — + // the user's wallet may have one but not the other. + const firstMethod = inv.transferAmounts[0]; + if (firstMethod) { + setPickedMethod(firstMethod.method); + setPickedAsset(firstMethod.assets[0]?.asset ?? null); + } + } catch (err) { + if (cancelled) return; + if (err instanceof OpenCryptoPayError) { + setError(messageForError(err, t)); + } else { + setError(err instanceof Error ? err.message : t('opencryptopay.errors.fetchFailed')); + } + } finally { + if (!cancelled) setLoading(false); + } + })(); + return () => { + cancelled = true; + }; + }, [lnurl, t]); + + // 1 Hz tick so the expiry countdown decrements visibly. Stopped on + // unmount; the React Query refetch path isn't relevant here because + // the OCP quote is single-shot per scan. + useEffect(() => { + const i = setInterval(() => setNow(Date.now()), 1000); + return () => clearInterval(i); + }, []); + + const expiresInMs = useMemo(() => { + if (!invoice) return 0; + const target = invoice.quote.expiresAt || now + FALLBACK_EXPIRY_MS; + return Math.max(0, target - now); + }, [invoice, now]); + + const isExpired = invoice !== null && invoice.quote.expiresAt > 0 && expiresInMs <= 0; + + const activeMethod = useMemo( + () => invoice?.transferAmounts.find((tm) => tm.method === pickedMethod) ?? null, + [invoice, pickedMethod], + ); + const activeAmount = useMemo( + () => activeMethod?.assets.find((a) => a.asset === pickedAsset)?.amount ?? null, + [activeMethod, pickedAsset], + ); + + const handleCancel = () => { + if (invoice?.callbackUrl) void cancelQuote(invoice.callbackUrl); + if (router.canGoBack()) router.back(); + else router.replace('/(auth)/(tabs)/dashboard'); + }; + + const handleConfirm = () => { + // First iteration: confirm prepares for the next step (sign + broadcast + // via WDK). We surface a transparent hint instead of pretending the + // payment went through. Subsequent PR wires `getPaymentTarget` → + // WDK send → `commitTx` once the wallet-side signing harness exists. + setError(t('opencryptopay.confirmHint')); + }; + + return ( + + + + {loading ? ( + + + {t('opencryptopay.loading')} + + ) : !invoice ? ( + + {error ?? t('opencryptopay.errors.fetchFailed')} + + + ) : ( + <> + + {t('opencryptopay.payTo')} + + {invoice.displayName || t('opencryptopay.unknownMerchant')} + + {invoice.quote.expiresAt > 0 ? ( + + {isExpired + ? t('opencryptopay.expired') + : t('opencryptopay.expiresIn', { time: formatMs(expiresInMs) })} + + ) : null} + + + {t('opencryptopay.methodLabel')} + + {invoice.transferAmounts.map((tm) => { + const active = tm.method === pickedMethod; + return ( + { + setPickedMethod(tm.method); + setPickedAsset(tm.assets[0]?.asset ?? null); + }} + testID={`opencryptopay-method-${tm.method}`} + > + + {tm.method} + + + ); + })} + + + {activeMethod ? ( + <> + {t('opencryptopay.assetLabel')} + + {activeMethod.assets.map((a) => { + const active = a.asset === pickedAsset; + return ( + setPickedAsset(a.asset)} + testID={`opencryptopay-asset-${a.asset}`} + > + + {active ? : null} + + + {a.asset} + + {a.amount} {a.asset} + + + + ); + })} + + + ) : null} + + {error ? {error} : null} + + + + [styles.cancelButton, pressed && styles.pressed]} + onPress={handleCancel} + testID="opencryptopay-cancel" + > + {t('common.cancel')} + + + )} + + + ); +} + +function messageForError(err: OpenCryptoPayError, t: (k: string) => string): string { + switch (err.code) { + case 'invalid-qr': + return t('opencryptopay.errors.invalidQr'); + case 'invalid-response': + return t('opencryptopay.errors.invalidResponse'); + case 'expired': + return t('opencryptopay.expired'); + case 'commit-failed': + return t('opencryptopay.errors.commitFailed'); + case 'fetch-failed': + default: + return t('opencryptopay.errors.fetchFailed'); + } +} + +function formatMs(ms: number): string { + const totalSec = Math.floor(ms / 1000); + const m = Math.floor(totalSec / 60); + const s = totalSec % 60; + return `${m}:${String(s).padStart(2, '0')}`; +} + +const makeStyles = (colors: ThemeColors) => + StyleSheet.create({ + content: { paddingTop: 12, paddingBottom: 32, gap: 18 }, + center: { paddingVertical: 32, alignItems: 'center', gap: 16 }, + muted: { ...Typography.bodyMedium, color: colors.textSecondary }, + errorText: { ...Typography.bodyMedium, color: colors.error, textAlign: 'center' }, + errorInline: { + ...Typography.bodySmall, + color: colors.error, + textAlign: 'center', + marginTop: -4, + }, + summaryCard: { + backgroundColor: colors.primaryLight, + borderRadius: 16, + padding: 16, + gap: 4, + }, + summaryLabel: { + ...Typography.bodySmall, + color: colors.primary, + textTransform: 'uppercase', + letterSpacing: 1, + fontWeight: '700', + }, + summaryName: { + ...Typography.headlineSmall, + color: colors.text, + }, + summaryHint: { + ...Typography.bodySmall, + color: colors.textSecondary, + marginTop: 6, + }, + summaryHintError: { color: colors.error }, + sectionLabel: { + ...Typography.bodySmall, + color: colors.textSecondary, + textTransform: 'uppercase', + letterSpacing: 1, + fontWeight: '600', + }, + methodList: { flexDirection: 'row', flexWrap: 'wrap', gap: 8 }, + methodChip: { + paddingHorizontal: 14, + paddingVertical: 10, + borderRadius: 999, + borderWidth: 1.5, + borderColor: colors.border, + backgroundColor: colors.surface, + }, + methodChipActive: { + borderColor: colors.primary, + backgroundColor: colors.primaryLight, + }, + methodChipText: { + ...Typography.bodyMedium, + color: colors.textSecondary, + fontWeight: '600', + }, + methodChipTextActive: { color: colors.primary }, + assetList: { + backgroundColor: colors.surface, + borderRadius: 16, + overflow: 'hidden', + }, + assetRow: { + flexDirection: 'row', + alignItems: 'center', + padding: 14, + gap: 12, + borderBottomWidth: StyleSheet.hairlineWidth, + borderBottomColor: colors.border, + }, + assetRowActive: { backgroundColor: colors.primaryLight }, + radio: { + width: 20, + height: 20, + borderRadius: 10, + borderWidth: 2, + borderColor: colors.textTertiary, + alignItems: 'center', + justifyContent: 'center', + }, + radioActive: { borderColor: colors.primary }, + radioDot: { + width: 10, + height: 10, + borderRadius: 5, + backgroundColor: colors.primary, + }, + assetSymbol: { ...Typography.bodyLarge, fontWeight: '600', color: colors.text }, + assetAmount: { ...Typography.bodySmall, color: colors.textSecondary }, + cancelButton: { alignSelf: 'center', paddingVertical: 12 }, + cancelText: { + ...Typography.bodyMedium, + color: colors.textSecondary, + }, + pressed: { opacity: 0.7 }, + }); diff --git a/app/(auth)/portfolio/[symbol].tsx b/app/(auth)/portfolio/[symbol].tsx index 88cce9af..96b3d194 100644 --- a/app/(auth)/portfolio/[symbol].tsx +++ b/app/(auth)/portfolio/[symbol].tsx @@ -1,332 +1,13 @@ -import { useEffect, useMemo, useState } from 'react'; -import { ImageBackground, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import { Stack, useLocalSearchParams, useRouter } from 'expo-router'; -import { useTranslation } from 'react-i18next'; -import { useBalancesForWallet } from '@tetherto/wdk-react-native-core'; -import { Icon } from '@/components'; -import { - getAssetsForCanonicalSymbol, - getAssets, - getCanonicalNameForSymbol, - getMockRawBalance, - getAssetMeta, -} from '@/config/tokens'; -import { - CHAIN_LABELS, - computeFiatValue, - formatBalance, - formatNumber, - SYMBOL_COLORS, - SYMBOL_GLYPH, - toNumeric, -} from '@/config/portfolio-presentation'; -import { useEnabledChains } from '@/hooks'; -import { useWalletStore } from '@/store'; -import { FiatCurrency, pricingService } from '@/services/pricing-service'; -import { DfxColors, Typography } from '@/theme'; - -type Holding = { - id: string; - network: string; - chainLabel: string; - symbol: string; - name: string; - balanceNum: number; - balanceFormatted: string; - fiatValue: number; -}; - -export default function AssetDetailScreen() { - const { symbol } = useLocalSearchParams<{ symbol: string }>(); - const canonicalSymbol = String(symbol ?? '').toUpperCase(); - const canonicalName = getCanonicalNameForSymbol(canonicalSymbol); - - const { t } = useTranslation(); - const router = useRouter(); - const { enabledChains } = useEnabledChains(); - const { selectedCurrency } = useWalletStore(); - - const holdingMetas = useMemo( - () => getAssetsForCanonicalSymbol(canonicalSymbol, enabledChains), - [canonicalSymbol, enabledChains], - ); - const allAssetConfigs = useMemo(() => getAssets(enabledChains), [enabledChains]); - const { data: balanceResults } = useBalancesForWallet(0, allAssetConfigs); - const [pricingReady, setPricingReady] = useState(pricingService.isReady()); - - useEffect(() => { - if (pricingService.isReady()) { - setPricingReady(true); - return; - } - void pricingService - .initialize() - .then(() => setPricingReady(true)) - .catch(() => setPricingReady(false)); - }, []); - - const fiatCurrency = selectedCurrency === 'CHF' ? FiatCurrency.CHF : FiatCurrency.USD; - const currencySymbol = fiatCurrency === FiatCurrency.CHF ? 'CHF' : '$'; - - const holdings = useMemo(() => { - const NETWORK_ORDER: Record = { - ethereum: 0, - arbitrum: 1, - polygon: 2, - base: 3, - spark: 4, - plasma: 5, - sepolia: 6, - }; - - const list = holdingMetas.map((meta) => { - const result = balanceResults?.find((r) => r.assetId === meta.id); - const liveRaw = result?.success ? (result.balance ?? '0') : '0'; - const mockRaw = getMockRawBalance(meta.network, meta.symbol, meta.decimals); - const rawBalance = liveRaw !== '0' ? liveRaw : (mockRaw ?? '0'); - const balanceFormatted = formatBalance(rawBalance, meta.decimals); - const balanceNum = toNumeric(balanceFormatted); - - const fiatValue = computeFiatValue(balanceNum, canonicalSymbol, fiatCurrency, pricingReady); - - return { - id: meta.id, - network: meta.network, - chainLabel: CHAIN_LABELS.get(meta.network) ?? meta.network, - symbol: meta.symbol, - name: meta.name, - balanceNum, - balanceFormatted, - fiatValue, - }; - }); - - return list.sort((a, b) => { - const symbolCmp = a.symbol.localeCompare(b.symbol); - if (symbolCmp !== 0) return symbolCmp; - return (NETWORK_ORDER[a.network] ?? 99) - (NETWORK_ORDER[b.network] ?? 99); - }); - }, [holdingMetas, balanceResults, canonicalSymbol, fiatCurrency, pricingReady]); - - const totalBalance = useMemo( - () => holdings.reduce((sum, h) => sum + h.balanceNum, 0), - [holdings], - ); - const totalFiat = useMemo(() => holdings.reduce((sum, h) => sum + h.fiatValue, 0), [holdings]); - - const color = SYMBOL_COLORS.get(canonicalSymbol) ?? DfxColors.primary; - const glyph = SYMBOL_GLYPH.get(canonicalSymbol) ?? canonicalSymbol.slice(0, 1); - - return ( - <> - - - - - router.back()} - hitSlop={12} - style={styles.headerIcon} - testID="asset-detail-back" - > - - - {canonicalName} - - - - - - - {glyph} - - - {formatNumber(totalBalance)} {canonicalSymbol} - - - {currencySymbol}{' '} - {Number.isFinite(totalFiat) - ? (Math.round(totalFiat * 100) / 100).toLocaleString('de-CH', { - minimumFractionDigits: 2, - maximumFractionDigits: 2, - }) - : '0.00'} - - - - {t('portfolio.holdings')} - - - {holdings.map((holding) => ( - [styles.holdingRow, pressed && styles.holdingPressed]} - testID={`holding-${holding.network}-${holding.symbol}`} - onPress={() => - router.push({ - pathname: '/(auth)/transaction-history', - params: { asset: holding.symbol, network: holding.network }, - }) - } - > - - {holding.name} - {holding.chainLabel} - - - - {currencySymbol}{' '} - {Number.isFinite(holding.fiatValue) - ? (Math.round(holding.fiatValue * 100) / 100).toLocaleString('de-CH', { - minimumFractionDigits: 2, - maximumFractionDigits: 2, - }) - : '0.00'} - - - {formatNumber(holding.balanceNum)} {holding.symbol} - - - - ))} - - - - - - ); -} - -const styles = StyleSheet.create({ - bg: { - flex: 1, - backgroundColor: DfxColors.background, - }, - safeArea: { - flex: 1, - }, - header: { - flexDirection: 'row', - alignItems: 'center', - paddingHorizontal: 16, - paddingTop: 4, - paddingBottom: 8, - }, - headerIcon: { - width: 40, - height: 32, - alignItems: 'flex-start', - justifyContent: 'center', - }, - headerTitle: { - flex: 1, - textAlign: 'center', - ...Typography.headlineSmall, - color: DfxColors.text, - }, - scroll: { - flex: 1, - }, - scrollContent: { - paddingHorizontal: 20, - paddingBottom: 48, - gap: 12, - }, - totalCard: { - paddingTop: 12, - paddingBottom: 24, - alignItems: 'center', - gap: 12, - }, - iconBubble: { - width: 64, - height: 64, - borderRadius: 32, - alignItems: 'center', - justifyContent: 'center', - shadowColor: '#0B1426', - shadowOpacity: 0.18, - shadowRadius: 12, - shadowOffset: { width: 0, height: 4 }, - }, - iconText: { - color: DfxColors.white, - fontWeight: '700', - fontSize: 32, - lineHeight: 36, - }, - totalCrypto: { - fontSize: 32, - lineHeight: 36, - fontWeight: '700', - color: DfxColors.text, - }, - totalFiat: { - ...Typography.bodyLarge, - color: DfxColors.textSecondary, - fontWeight: '500', - }, - sectionLabel: { - ...Typography.bodySmall, - color: DfxColors.textSecondary, - textTransform: 'uppercase', - letterSpacing: 1, - fontWeight: '600', - marginTop: 4, - marginBottom: 4, - }, - holdingsList: { - gap: 8, - }, - holdingRow: { - flexDirection: 'row', - alignItems: 'center', - backgroundColor: DfxColors.surface, - borderRadius: 14, - padding: 14, - gap: 12, - shadowColor: '#0B1426', - shadowOpacity: 0.05, - shadowRadius: 10, - shadowOffset: { width: 0, height: 3 }, - elevation: 1, - }, - holdingPressed: { - opacity: 0.7, - }, - holdingInfo: { - flex: 1, - gap: 2, - }, - holdingChain: { - ...Typography.bodyLarge, - fontWeight: '600', - color: DfxColors.text, - }, - holdingSymbol: { - ...Typography.bodySmall, - color: DfxColors.textSecondary, - }, - holdingBalance: { - alignItems: 'flex-end', - gap: 2, - }, - holdingValue: { - ...Typography.bodyLarge, - fontWeight: '600', - color: DfxColors.text, - }, - holdingCrypto: { - ...Typography.bodySmall, - color: DfxColors.textSecondary, - }, -}); +import { FEATURES } from '@/config/features'; + +/** + * Asset-detail route. Companion to the portfolio index; gated by the + * same flag and shares the disabled stub. + */ +const PortfolioAssetDetailScreen = FEATURES.PORTFOLIO + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/portfolio/PortfolioAssetDetailScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/portfolio/PortfolioDisabled').default as React.ComponentType); + +export default PortfolioAssetDetailScreen; diff --git a/app/(auth)/portfolio/index.tsx b/app/(auth)/portfolio/index.tsx index 0ac6087a..16d27eb6 100644 --- a/app/(auth)/portfolio/index.tsx +++ b/app/(auth)/portfolio/index.tsx @@ -1,367 +1,13 @@ -import { useEffect, useMemo, useState } from 'react'; -import { ImageBackground, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import { Stack, useRouter } from 'expo-router'; -import { useTranslation } from 'react-i18next'; -import { useBalancesForWallet } from '@tetherto/wdk-react-native-core'; -import { Icon } from '@/components'; -import { getAssetMeta, getAssets, getMockRawBalance, type TokenCategory } from '@/config/tokens'; -import { - computeFiatValue, - formatBalance, - formatNumber, - SYMBOL_COLORS, - SYMBOL_GLYPH, - toNumeric, -} from '@/config/portfolio-presentation'; -import { useEnabledChains } from '@/hooks'; -import { useWalletStore } from '@/store'; -import { FiatCurrency, pricingService } from '@/services/pricing-service'; -import { DfxColors, Typography } from '@/theme'; - -type PortfolioGroup = { - canonicalSymbol: string; - canonicalName: string; - category: TokenCategory; - totalBalanceNum: number; - totalFiat: number; - chainCount: number; -}; - -export default function PortfolioScreen() { - const { t } = useTranslation(); - const router = useRouter(); - const { enabledChains } = useEnabledChains(); - const { selectedCurrency } = useWalletStore(); - - const assetConfigs = useMemo(() => getAssets(enabledChains), [enabledChains]); - const { data: balanceResults } = useBalancesForWallet(0, assetConfigs); - const [pricingReady, setPricingReady] = useState(pricingService.isReady()); - - useEffect(() => { - if (pricingService.isReady()) { - setPricingReady(true); - return; - } - void pricingService - .initialize() - .then(() => setPricingReady(true)) - .catch(() => setPricingReady(false)); - }, []); - - const fiatCurrency = selectedCurrency === 'CHF' ? FiatCurrency.CHF : FiatCurrency.USD; - const currencySymbol = fiatCurrency === FiatCurrency.CHF ? 'CHF' : '$'; - - const groups = useMemo(() => { - const byCanonical = new Map(); - - for (const asset of assetConfigs) { - const meta = getAssetMeta(asset.getId()); - if (!meta) continue; - // Hide native gas tokens (ETH, MATIC) from the overview — they are - // tracked for fees but not interesting as a portfolio holding. - if (meta.category === 'native') continue; - const result = balanceResults?.find((r) => r.assetId === asset.getId()); - const liveRaw = result?.success ? (result.balance ?? '0') : '0'; - const mockRaw = getMockRawBalance(meta.network, meta.symbol, asset.getDecimals()); - const rawBalance = liveRaw !== '0' ? liveRaw : (mockRaw ?? '0'); - const balance = formatBalance(rawBalance, asset.getDecimals()); - const balanceNum = toNumeric(balance); - - const fiatValue = computeFiatValue( - balanceNum, - meta.canonicalSymbol, - fiatCurrency, - pricingReady, - ); - - const existing = byCanonical.get(meta.canonicalSymbol); - if (existing) { - existing.totalBalanceNum += balanceNum; - existing.totalFiat += fiatValue; - existing.chainCount += 1; - } else { - byCanonical.set(meta.canonicalSymbol, { - canonicalSymbol: meta.canonicalSymbol, - canonicalName: meta.canonicalName, - category: meta.category, - totalBalanceNum: balanceNum, - totalFiat: fiatValue, - chainCount: 1, - }); - } - } - - const CATEGORY_ORDER: Record = { - btc: 0, - stablecoin: 1, - native: 2, - other: 3, - }; - - return Array.from(byCanonical.values()).sort((a, b) => { - // BTC always first - if (a.category === 'btc' && b.category !== 'btc') return -1; - if (a.category !== 'btc' && b.category === 'btc') return 1; - // Then by balance: non-zero before zero - if (a.totalBalanceNum > 0 && b.totalBalanceNum === 0) return -1; - if (a.totalBalanceNum === 0 && b.totalBalanceNum > 0) return 1; - // Then by fiat value descending - if (a.totalBalanceNum > 0 && b.totalBalanceNum > 0) return b.totalFiat - a.totalFiat; - const cat = CATEGORY_ORDER[a.category] - CATEGORY_ORDER[b.category]; - if (cat !== 0) return cat; - return a.canonicalSymbol.localeCompare(b.canonicalSymbol); - }); - }, [assetConfigs, balanceResults, fiatCurrency, pricingReady]); - - const totalFiat = useMemo(() => groups.reduce((sum, g) => sum + g.totalFiat, 0), [groups]); - - return ( - <> - - - - - router.back()} - hitSlop={12} - style={styles.headerIcon} - accessibilityRole="button" - accessibilityLabel={t('common.back')} - testID="portfolio-back-button" - > - - - {t('dashboard.portfolio')} - router.push('/(auth)/portfolio/manage')} - hitSlop={12} - style={styles.headerIcon} - accessibilityRole="button" - accessibilityLabel={t('portfolio.manage')} - testID="portfolio-manage-button" - > - {t('portfolio.manage')} - - - - - - {t('portfolio.totalValue')} - - {currencySymbol} - - {Number.isFinite(totalFiat) - ? (Math.round(totalFiat * 100) / 100).toLocaleString('de-CH', { - minimumFractionDigits: 2, - maximumFractionDigits: 2, - }) - : '0.00'} - - - - - - {groups.map((group) => ( - - router.push({ - pathname: '/(auth)/portfolio/[symbol]', - params: { symbol: group.canonicalSymbol }, - }) - } - /> - ))} - - - - - - ); -} - -type GroupCardProps = { - group: PortfolioGroup; - currencySymbol: string; - onPress: () => void; -}; - -function PortfolioGroupCard({ group, currencySymbol, onPress }: GroupCardProps) { - const color = SYMBOL_COLORS.get(group.canonicalSymbol) ?? DfxColors.primary; - const glyph = SYMBOL_GLYPH.get(group.canonicalSymbol) ?? group.canonicalSymbol.slice(0, 1); - return ( - [styles.card, pressed && styles.cardPressed]} - testID={`portfolio-asset-${group.canonicalSymbol}`} - accessibilityRole="button" - accessibilityLabel={group.canonicalName} - > - - {glyph} - - - - {group.canonicalName} - - - {group.chainCount === 1 ? '1 network' : `${group.chainCount} networks`} - - - - - {currencySymbol} {group.totalFiat.toFixed(2)} - - - {formatNumber(group.totalBalanceNum)} {group.canonicalSymbol} - - - - ); -} - -const styles = StyleSheet.create({ - bg: { - flex: 1, - backgroundColor: DfxColors.background, - }, - safeArea: { - flex: 1, - }, - header: { - flexDirection: 'row', - alignItems: 'center', - paddingHorizontal: 16, - paddingTop: 4, - paddingBottom: 8, - }, - headerIcon: { - minWidth: 80, - height: 32, - alignItems: 'flex-start', - justifyContent: 'center', - }, - headerTitle: { - flex: 1, - textAlign: 'center', - ...Typography.headlineSmall, - color: DfxColors.text, - }, - manageLink: { - ...Typography.bodyMedium, - color: DfxColors.primary, - fontWeight: '600', - textAlign: 'right', - width: 80, - }, - scroll: { - flex: 1, - }, - scrollContent: { - paddingHorizontal: 20, - paddingBottom: 48, - gap: 12, - }, - totalCard: { - paddingTop: 8, - paddingBottom: 24, - alignItems: 'center', - gap: 6, - }, - totalLabel: { - ...Typography.bodyMedium, - color: DfxColors.textSecondary, - fontWeight: '500', - }, - totalRow: { - flexDirection: 'row', - alignItems: 'baseline', - gap: 6, - }, - totalCurrency: { - fontSize: 24, - color: DfxColors.textTertiary, - fontWeight: '500', - }, - totalValue: { - fontSize: 44, - lineHeight: 50, - fontWeight: '700', - color: DfxColors.text, - letterSpacing: -1, - }, - assetList: { - gap: 8, - }, - card: { - flexDirection: 'row', - alignItems: 'center', - backgroundColor: DfxColors.surface, - borderRadius: 18, - padding: 14, - gap: 12, - shadowColor: '#0B1426', - shadowOpacity: 0.05, - shadowRadius: 10, - shadowOffset: { width: 0, height: 3 }, - elevation: 2, - }, - cardPressed: { - opacity: 0.7, - }, - iconBubble: { - width: 44, - height: 44, - borderRadius: 22, - alignItems: 'center', - justifyContent: 'center', - shadowColor: '#0B1426', - shadowOpacity: 0.12, - shadowRadius: 6, - shadowOffset: { width: 0, height: 2 }, - }, - iconText: { - color: DfxColors.white, - fontWeight: '700', - fontSize: 22, - lineHeight: 26, - }, - info: { - flex: 1, - gap: 4, - }, - name: { - ...Typography.bodyLarge, - fontWeight: '600', - color: DfxColors.text, - }, - chainCountText: { - ...Typography.bodySmall, - color: DfxColors.textSecondary, - }, - balanceColumn: { - alignItems: 'flex-end', - gap: 2, - minWidth: 90, - }, - fiatValue: { - ...Typography.bodyLarge, - fontWeight: '600', - color: DfxColors.text, - }, - cryptoBalance: { - ...Typography.bodySmall, - color: DfxColors.textSecondary, - }, -}); +import { FEATURES } from '@/config/features'; + +/** + * Portfolio (local + DFX-linked) screen entry. With + * `EXPO_PUBLIC_ENABLE_PORTFOLIO` off, resolves to a `` stub. + */ +const PortfolioScreen = FEATURES.PORTFOLIO + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/portfolio/PortfolioScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/portfolio/PortfolioDisabled').default as React.ComponentType); + +export default PortfolioScreen; diff --git a/app/(auth)/portfolio/manage.tsx b/app/(auth)/portfolio/manage.tsx index 27182721..cc8435c7 100644 --- a/app/(auth)/portfolio/manage.tsx +++ b/app/(auth)/portfolio/manage.tsx @@ -1,178 +1,13 @@ -import { - ImageBackground, - Pressable, - ScrollView, - StyleSheet, - Switch, - Text, - View, -} from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import { Stack, useRouter } from 'expo-router'; -import { useTranslation } from 'react-i18next'; -import { Icon } from '@/components'; -import type { ChainId } from '@/config/chains'; -import { ALWAYS_ON_CHAINS, SELECTABLE_CHAINS } from '@/config/tokens'; -import { useEnabledChains } from '@/hooks'; -import { DfxColors, Typography } from '@/theme'; - -const CHAIN_LABEL = new Map([ - ['ethereum', 'Ethereum'], - ['arbitrum', 'Arbitrum'], - ['polygon', 'Polygon'], - ['base', 'Base'], - ['spark', 'Bitcoin'], - ['plasma', 'Plasma'], - ['sepolia', 'Sepolia'], -]); - -const CHAIN_DESCRIPTION = new Map([]); - -export default function ManageChainsScreen() { - const { t } = useTranslation(); - const router = useRouter(); - const { enabledChains, toggleChain } = useEnabledChains(); - - return ( - <> - - - - - router.back()} - hitSlop={12} - style={styles.headerIcon} - testID="manage-back-button" - > - - - {t('portfolio.manageChains')} - - - - - {t('portfolio.alwaysOn')} - {ALWAYS_ON_CHAINS.map((chain) => ( - - - {CHAIN_LABEL.get(chain) ?? chain} - - - - ))} - - {t('portfolio.optional')} - {SELECTABLE_CHAINS.map((chain) => { - const enabled = enabledChains.includes(chain); - const description = CHAIN_DESCRIPTION.get(chain); - return ( - - - {CHAIN_LABEL.get(chain) ?? chain} - {description && {description}} - - toggleChain(chain)} - trackColor={{ false: DfxColors.border, true: DfxColors.primary }} - thumbColor={DfxColors.white} - testID={`manage-chain-${chain}`} - /> - - ); - })} - - - - - ); -} - -const styles = StyleSheet.create({ - bg: { - flex: 1, - backgroundColor: DfxColors.background, - }, - safeArea: { - flex: 1, - }, - header: { - flexDirection: 'row', - alignItems: 'center', - paddingHorizontal: 16, - paddingTop: 4, - paddingBottom: 8, - }, - headerIcon: { - width: 40, - height: 32, - alignItems: 'flex-start', - justifyContent: 'center', - }, - headerTitle: { - flex: 1, - textAlign: 'center', - ...Typography.headlineSmall, - color: DfxColors.text, - }, - scroll: { - flex: 1, - }, - scrollContent: { - paddingHorizontal: 20, - paddingBottom: 48, - gap: 8, - }, - sectionLabel: { - ...Typography.bodySmall, - color: DfxColors.textSecondary, - textTransform: 'uppercase', - letterSpacing: 1, - fontWeight: '600', - marginTop: 16, - marginBottom: 4, - }, - row: { - flexDirection: 'row', - alignItems: 'center', - backgroundColor: DfxColors.surface, - borderRadius: 14, - padding: 14, - gap: 12, - shadowColor: '#0B1426', - shadowOpacity: 0.05, - shadowRadius: 10, - shadowOffset: { width: 0, height: 3 }, - elevation: 1, - }, - rowDisabled: { - opacity: 0.65, - }, - info: { - flex: 1, - gap: 4, - }, - label: { - ...Typography.bodyLarge, - fontWeight: '600', - color: DfxColors.text, - }, - description: { - ...Typography.bodySmall, - color: DfxColors.textSecondary, - }, - lockedHint: { - ...Typography.bodySmall, - color: DfxColors.textTertiary, - fontStyle: 'italic', - }, -}); +import { FEATURES } from '@/config/features'; + +/** + * Chain-enable/disable management route. Shares the portfolio flag + * and disabled stub. + */ +const PortfolioManageScreen = FEATURES.PORTFOLIO + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/portfolio/PortfolioManageScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/portfolio/PortfolioDisabled').default as React.ComponentType); + +export default PortfolioManageScreen; diff --git a/app/(auth)/receive/index.tsx b/app/(auth)/receive/index.tsx index eca6da9e..17640774 100644 --- a/app/(auth)/receive/index.tsx +++ b/app/(auth)/receive/index.tsx @@ -1,160 +1,422 @@ -import { useState } from 'react'; -import { ImageBackground, ScrollView, StyleSheet, Text, View } from 'react-native'; +import { useMemo, useState } from 'react'; +import { ImageBackground, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import { Stack, useRouter } from 'expo-router'; import { useTranslation } from 'react-i18next'; import * as Clipboard from 'expo-clipboard'; import * as Haptics from 'expo-haptics'; import { useAccount } from '@tetherto/wdk-react-native-core'; -import { AppHeader, ChainSelector, PrimaryButton, QrCode, ShortcutAction } from '@/components'; +import { AppHeader, DarkBackdrop, Icon, PrimaryButton, QrCode } from '@/components'; import type { ChainId } from '@/config/chains'; -import { DfxColors, Typography } from '@/theme'; +import { FEATURES } from '@/config/features'; +import { useLdsWallet } from '@/hooks'; +import { Typography, useColors, useResolvedScheme, type ThemeColors } from '@/theme'; + +type ReceiveStep = 'asset' | 'qr'; + +type AssetOption = { + symbol: string; + label: string; + chains: { chain: ChainId; label: string }[]; +}; + +/** + * Bitcoin offers three receive layers — Native on-chain, Lightning, and EVM + * (wrapped). Stablecoins only ship over EVM; rather than asking the user to + * pick between identical EVM chains, we default to Ethereum and skip the chain + * selector entirely. The Taproot/Lightning option resolves a DFX-managed + * Lightning address via the LDS service, so it is hidden when + * `FEATURES.DFX_BACKEND` is off — without it the QR would be blank. + * + * Computed at render time so a test can flip `FEATURES.DFX_BACKEND` between + * mounts and exercise both layer combinations. + */ +const buildReceiveAssets = (): AssetOption[] => [ + { + symbol: 'BTC', + label: 'Bitcoin', + chains: [ + { chain: 'bitcoin', label: 'SegWit' }, + ...(FEATURES.DFX_BACKEND + ? ([ + { chain: 'bitcoin-taproot', label: 'Taproot' }, + { chain: 'spark', label: 'Lightning' }, + ] as const) + : []), + { chain: 'ethereum', label: 'EVM' }, + ], + }, + { symbol: 'CHF', label: 'CHF', chains: [{ chain: 'ethereum', label: 'Ethereum' }] }, + { symbol: 'EUR', label: 'Euro', chains: [{ chain: 'ethereum', label: 'Ethereum' }] }, + { symbol: 'USD', label: 'Dollar', chains: [{ chain: 'ethereum', label: 'Ethereum' }] }, +]; export default function ReceiveScreen() { const router = useRouter(); const { t } = useTranslation(); + const colors = useColors(); + const scheme = useResolvedScheme(); + const styles = useMemo(() => makeStyles(colors), [colors]); + const receiveAssets = useMemo(buildReceiveAssets, []); + const [step, setStep] = useState('asset'); + // Start unselected so no card has a border on first render — the active + // border appears only after the user explicitly picks an asset. + const [selectedAsset, setSelectedAsset] = useState(null); const [selectedChain, setSelectedChain] = useState('ethereum'); const [copied, setCopied] = useState(false); + // Taproot in this app is the DFX Lightning Address (lightning.space-managed + // custodial wallet, Taproot Asset channels under the hood). For every other + // chain we use the local WDK-derived address. const { address: derivedAddress } = useAccount({ network: selectedChain, accountIndex: 0 }); - const address = derivedAddress ?? ''; + const lds = useLdsWallet(); + const address = + selectedChain === 'bitcoin-taproot' + ? (lds.user?.lightning.address ?? '') + : (derivedAddress ?? ''); + + const handleAssetSelect = (asset: AssetOption) => { + setSelectedAsset(asset); + setSelectedChain(asset.chains[0]!.chain); + setStep('qr'); + }; const handleCopy = async () => { - if (!address) return; + // The Copy button is gated on `address` via its `disabled` prop, so by + // the time we land here the string is guaranteed to be non-empty. await Clipboard.setStringAsync(address); void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); setCopied(true); setTimeout(() => setCopied(false), 2000); }; - return ( - <> - - - - + const renderAssetStep = () => ( + + {t('receive.selectAsset')} + + {receiveAssets.map((asset) => ( + [ + styles.assetCard, + selectedAsset?.symbol === asset.symbol && styles.assetCardActive, + pressed && styles.pressed, + ]} + onPress={() => handleAssetSelect(asset)} + > + + {asset.symbol} + + {asset.label} + + ))} + + + {FEATURES.BUY_SELL && ( + [styles.destinationCard, pressed && styles.pressed]} + onPress={() => router.push('/(auth)/buy')} + testID="receive-destination-bank" + accessibilityRole="button" + accessibilityLabel={t('receive.buyFromBank')} + > + + + + + {t('receive.buyFromBank')} + {t('receive.buyFromBankSubtitle')} + + + + )} + + ); + + const renderQrStep = (asset: AssetOption) => { + return ( + + setStep('asset')} + > + {asset.symbol} + + + {asset.chains.length > 1 && ( - - - - {address ? ( - - ) : ( - - No address - - )} - + {asset.chains.map((c) => ( + setSelectedChain(c.chain)} + > + + {c.label} + + + ))} + + )} - - - {t('receive.yourAddress', { chain: selectedChain })} - - - {address || 'Wallet not initialized'} - + + {address ? ( + + ) : ( + + {t('receive.noAddress')} + )} + - - - - {t('receive.onlyCorrectNetwork', { - asset: selectedChain === 'spark' ? 'BTC' : 'compatible tokens', - network: selectedChain, - })} - + + + {t('receive.yourAddress', { chain: selectedChain })} + + + {address || t('receive.walletNotInitialized')} + + - {'€'}} - label={t('receive.buyBtcWithEuro')} - onPress={() => router.push('/(auth)/buy')} - testID="receive-action-buy" - /> - - - + + + ); + }; + + const body = ( + + { + if (step === 'qr') setStep('asset'); + else router.back(); + }} + testID="receive-screen" + /> + + + {step === 'asset' && renderAssetStep()} + {step === 'qr' && selectedAsset && renderQrStep(selectedAsset)} + + + ); + + return ( + <> + + + {scheme === 'dark' ? ( + + ) : ( + + )} + {body} + ); } -const styles = StyleSheet.create({ - bg: { - flex: 1, - backgroundColor: DfxColors.background, - }, - safeArea: { - flex: 1, - }, - scroll: { - flex: 1, - }, - scrollContent: { - paddingHorizontal: 20, - paddingBottom: 32, - gap: 18, - }, - qrContainer: { - alignItems: 'center', - paddingVertical: 12, - }, - qrPlaceholder: { - width: 220, - height: 220, - borderRadius: 16, - backgroundColor: DfxColors.surface, - alignItems: 'center', - justifyContent: 'center', - }, - qrPlaceholderText: { - ...Typography.bodyMedium, - color: DfxColors.textTertiary, - }, - addressContainer: { - backgroundColor: DfxColors.surface, - borderRadius: 16, - padding: 20, - gap: 8, - alignItems: 'center', - shadowColor: '#0B1426', - shadowOpacity: 0.04, - shadowRadius: 10, - shadowOffset: { width: 0, height: 3 }, - }, - addressLabel: { - ...Typography.bodySmall, - color: DfxColors.textTertiary, - textTransform: 'uppercase', - letterSpacing: 1, - }, - address: { - ...Typography.bodyMedium, - color: DfxColors.text, - textAlign: 'center', - fontFamily: 'monospace', - }, - warning: { - ...Typography.bodySmall, - color: DfxColors.warning, - textAlign: 'center', - paddingHorizontal: 32, - }, - currencyIcon: { - fontSize: 18, - fontWeight: '700', - color: DfxColors.white, - lineHeight: 22, - }, -}); +const makeStyles = (colors: ThemeColors) => + StyleSheet.create({ + bg: { + flex: 1, + backgroundColor: colors.background, + }, + safeArea: { + flex: 1, + }, + scroll: { + flex: 1, + }, + scrollContent: { + paddingHorizontal: 20, + paddingBottom: 32, + gap: 18, + }, + stepContent: { + gap: 18, + }, + stepSubtitle: { + ...Typography.bodyLarge, + color: colors.textSecondary, + fontWeight: '500', + marginBottom: 4, + }, + assetList: { + gap: 10, + }, + assetCard: { + flexDirection: 'row', + alignItems: 'center', + backgroundColor: colors.cardOverlay, + borderRadius: 12, + padding: 18, + gap: 14, + borderWidth: 1, + borderColor: colors.border, + }, + assetCardActive: { + borderColor: colors.primary, + backgroundColor: colors.primaryLight, + }, + pressed: { + opacity: 0.7, + }, + assetSymbol: { + ...Typography.headlineSmall, + color: colors.text, + fontWeight: '700', + width: 56, + }, + assetSymbolActive: { + color: colors.primary, + }, + assetLabel: { + ...Typography.bodyLarge, + color: colors.textSecondary, + }, + selectedAssetPill: { + flexDirection: 'row', + alignItems: 'center', + alignSelf: 'flex-start', + backgroundColor: colors.primaryLight, + borderRadius: 12, + paddingVertical: 8, + paddingHorizontal: 14, + gap: 6, + }, + selectedAssetText: { + ...Typography.bodyMedium, + color: colors.primary, + fontWeight: '700', + }, + chainBar: { + flexGrow: 0, + }, + chainChip: { + backgroundColor: colors.cardOverlay, + borderRadius: 10, + paddingVertical: 8, + paddingHorizontal: 14, + marginRight: 8, + borderWidth: 1.5, + borderColor: 'transparent', + }, + chainChipActive: { + borderColor: colors.primary, + backgroundColor: colors.primaryLight, + }, + chainChipText: { + ...Typography.bodyMedium, + color: colors.textSecondary, + fontWeight: '500', + }, + chainChipTextActive: { + color: colors.primary, + fontWeight: '600', + }, + qrContainer: { + alignItems: 'center', + paddingVertical: 8, + }, + qrPlaceholder: { + width: 200, + height: 200, + borderRadius: 16, + backgroundColor: colors.surface, + alignItems: 'center', + justifyContent: 'center', + }, + qrPlaceholderText: { + ...Typography.bodyMedium, + color: colors.textTertiary, + }, + addressContainer: { + backgroundColor: colors.cardOverlay, + borderRadius: 12, + borderWidth: 1, + borderColor: colors.border, + padding: 20, + gap: 8, + alignItems: 'center', + shadowColor: colors.shadow, + shadowOpacity: 0.04, + shadowRadius: 10, + shadowOffset: { width: 0, height: 3 }, + }, + addressLabel: { + ...Typography.bodySmall, + color: colors.textTertiary, + textTransform: 'uppercase', + letterSpacing: 1, + }, + address: { + ...Typography.bodyMedium, + color: colors.text, + textAlign: 'center', + fontFamily: 'monospace', + }, + destinationCard: { + flexDirection: 'row', + alignItems: 'center', + backgroundColor: colors.cardOverlay, + borderRadius: 12, + padding: 16, + gap: 14, + borderWidth: 1, + borderColor: colors.primary, + }, + destinationIcon: { + width: 40, + height: 40, + borderRadius: 12, + backgroundColor: colors.primaryLight, + alignItems: 'center', + justifyContent: 'center', + }, + destinationText: { + flex: 1, + gap: 2, + }, + destinationTitle: { + ...Typography.bodyLarge, + color: colors.text, + fontWeight: '600', + }, + destinationSubtitle: { + ...Typography.bodySmall, + color: colors.textSecondary, + }, + }); diff --git a/app/(auth)/seed-export.tsx b/app/(auth)/seed-export.tsx index 9916b397..d567fd81 100644 --- a/app/(auth)/seed-export.tsx +++ b/app/(auth)/seed-export.tsx @@ -1,195 +1,15 @@ -import { useEffect, useState } from 'react'; -import { Alert, Platform, Pressable, StyleSheet, Text, View } from 'react-native'; -import { useTranslation } from 'react-i18next'; -import * as Clipboard from 'expo-clipboard'; -import * as Haptics from 'expo-haptics'; -import { ScreenContainer } from '@/components'; -import { - authenticatePasskey, - deriveMnemonicFromPrf, - PasskeyPrfUnsupportedError, -} from '@/services/passkey'; -import { secureStorage, StorageKeys } from '@/services/storage'; -import { seedToWords } from '@/services/wallet'; -import { DfxColors, Typography } from '@/theme'; - -export default function SeedExportScreen() { - const { t } = useTranslation(); - const [walletOrigin, setWalletOrigin] = useState(null); - const [seedWords, setSeedWords] = useState(null); - const [isLoading, setIsLoading] = useState(false); - const [copied, setCopied] = useState(false); - - useEffect(() => { - void secureStorage.get(StorageKeys.WALLET_ORIGIN).then(setWalletOrigin); - }, []); - - const isPasskey = walletOrigin === 'passkey'; - - const handleReveal = async () => { - if (isPasskey) { - setIsLoading(true); - try { - const versionStr = await secureStorage.get(StorageKeys.PASSKEY_DERIVATION_VERSION); - const version = versionStr ? parseInt(versionStr, 10) : 1; - const { prfOutput } = await authenticatePasskey(); - const mnemonic = deriveMnemonicFromPrf(prfOutput, version); - setSeedWords(seedToWords(mnemonic)); - void Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); - } catch (error) { - void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error); - if (error instanceof PasskeyPrfUnsupportedError) { - const provider = Platform.select({ - ios: 'iCloud Keychain', - default: 'Google Password Manager', - }); - Alert.alert(t('common.error'), t('passkey.prfUnsupported', { provider })); - } else { - Alert.alert(t('common.error'), t('seedExport.deriveFailed')); - } - } finally { - setIsLoading(false); - } - } else { - const seed = await secureStorage.get(StorageKeys.ENCRYPTED_SEED); - if (seed) { - setSeedWords(seedToWords(seed)); - void Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); - } else { - Alert.alert(t('common.error'), t('seedExport.deriveFailed')); - } - } - }; - - const handleCopy = async () => { - if (!seedWords) return; - await Clipboard.setStringAsync(seedWords.join(' ')); - setCopied(true); - void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); - setTimeout(() => setCopied(false), 2000); - }; - - return ( - - - {t(isPasskey ? 'settings.seed' : 'settings.seedPhrase')} - - {isPasskey ? t('seedExport.descriptionPasskey') : t('seedExport.descriptionSeed')} - - - {!seedWords ? ( - - - {isLoading - ? t('common.loading') - : isPasskey - ? t('seedExport.revealPasskey') - : t('seedExport.revealSeed')} - - - ) : ( - <> - - {t('seedExport.warning')} - - - - {seedWords.map((word, index) => ( - - {index + 1}. - {word} - - ))} - - - - {copied ? t('common.copied') : t('common.copy')} - - - )} - - - ); -} - -const styles = StyleSheet.create({ - content: { - flex: 1, - paddingVertical: 24, - gap: 24, - }, - title: { - ...Typography.headlineMedium, - color: DfxColors.text, - }, - description: { - ...Typography.bodyLarge, - color: DfxColors.textSecondary, - }, - revealButton: { - padding: 48, - borderRadius: 16, - backgroundColor: DfxColors.surface, - borderWidth: 1, - borderColor: DfxColors.border, - borderStyle: 'dashed', - alignItems: 'center', - justifyContent: 'center', - }, - revealButtonDisabled: { - opacity: 0.5, - }, - revealText: { - ...Typography.bodyLarge, - color: DfxColors.primary, - fontWeight: '600', - }, - warningContainer: { - backgroundColor: DfxColors.surface, - borderRadius: 12, - borderWidth: 1, - borderColor: DfxColors.warning, - padding: 16, - }, - warningText: { - ...Typography.bodyMedium, - color: DfxColors.warning, - }, - seedContainer: { - flexDirection: 'row', - flexWrap: 'wrap', - gap: 8, - }, - wordCard: { - flexDirection: 'row', - alignItems: 'center', - backgroundColor: DfxColors.surface, - borderRadius: 12, - paddingHorizontal: 12, - paddingVertical: 10, - gap: 6, - minWidth: '30%', - }, - wordIndex: { - ...Typography.bodySmall, - color: DfxColors.textTertiary, - width: 24, - }, - word: { - ...Typography.bodyMedium, - color: DfxColors.text, - }, - copyButton: { - alignSelf: 'center', - paddingVertical: 8, - paddingHorizontal: 16, - }, - copyText: { - ...Typography.bodySmall, - color: DfxColors.primary, - }, -}); +import { FEATURES } from '@/config/features'; + +/** + * Seed-export route. Companion to the Settings hub; gated by the + * same flag and shares the disabled stub. Pulls in the WDK + * `useWalletManager`, the optional passkey re-auth chain and the + * `expo-screen-capture` soft-import only when the flag is on. + */ +const SeedExportScreen = FEATURES.SETTINGS + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/settings/SeedExportScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/settings/SettingsDisabled').default as React.ComponentType); + +export default SeedExportScreen; diff --git a/app/(auth)/sell/index.tsx b/app/(auth)/sell/index.tsx index 1fec2860..a4b7736a 100644 --- a/app/(auth)/sell/index.tsx +++ b/app/(auth)/sell/index.tsx @@ -1,259 +1,13 @@ -import { useState } from 'react'; -import { Pressable, StyleSheet, Text, TextInput, View } from 'react-native'; -import { useRouter } from 'expo-router'; -import { useTranslation } from 'react-i18next'; -import { ChainSelector, PrimaryButton, ScreenContainer } from '@/components'; -import { useSellFlow } from '@/hooks'; -import type { ChainId } from '@/config/chains'; -import { DfxColors, Typography } from '@/theme'; - -type SellStep = 'amount' | 'bank' | 'confirm'; - -const CHAIN_ASSET: Record = { - ethereum: 'ETH', - arbitrum: 'ETH', - polygon: 'MATIC', - base: 'ETH', - spark: 'BTC', - plasma: 'ETH', - sepolia: 'ETH', -}; - -export default function SellScreen() { - const router = useRouter(); - const { t } = useTranslation(); - const { paymentInfo, isLoading, error, createPaymentInfo } = useSellFlow(); - const [step, setStep] = useState('amount'); - const [selectedChain, setSelectedChain] = useState('ethereum'); - const [amount, setAmount] = useState(''); - const [iban, setIban] = useState(''); - - const renderAmountStep = () => ( - - How much do you want to sell? - - - - - - - {/* eslint-disable-next-line security/detect-object-injection -- selectedChain is a ChainId literal union */} - {CHAIN_ASSET[selectedChain]} - - - - - - setStep('bank')} - disabled={!amount || parseFloat(amount) <= 0} - /> - - ); - - const renderBankStep = () => ( - - Bank Account - Enter the IBAN where you want to receive your funds. - - - - - - {error && {error}} - - { - const info = await createPaymentInfo({ - amount: parseFloat(amount), - // eslint-disable-next-line security/detect-object-injection -- selectedChain is a ChainId literal union - asset: CHAIN_ASSET[selectedChain], - blockchain: selectedChain.charAt(0).toUpperCase() + selectedChain.slice(1), - currency: 'CHF', - iban: iban.replace(/\s/g, ''), - }); - if (info) setStep('confirm'); - }} - disabled={iban.replace(/\s/g, '').length < 15} - loading={isLoading} - /> - - ); - - const renderConfirmStep = () => ( - - Confirm Sale - - - - You sell - - {paymentInfo?.amount ?? amount}{' '} - {paymentInfo?.asset?.name ?? - // eslint-disable-next-line security/detect-object-injection -- selectedChain is a ChainId literal union - CHAIN_ASSET[selectedChain]} - - - - You receive (est.) - - ~{paymentInfo?.estimatedAmount?.toFixed(2) ?? '—'}{' '} - {paymentInfo?.currency?.name ?? 'CHF'} - - - - To IBAN - {paymentInfo?.beneficiary?.iban ?? iban} - - - Deposit to - - {paymentInfo?.depositAddress - ? `${paymentInfo.depositAddress.slice(0, 10)}...${paymentInfo.depositAddress.slice(-6)}` - : '—'} - - - - Fee - {paymentInfo?.fees?.total?.toFixed(2) ?? '—'}% - - - - - Send the exact amount to the deposit address above. The fiat amount will be transferred to - your bank account after the transaction is confirmed. - - - - - router.back()} /> - - ); - - return ( - - - - (step === 'amount' ? router.back() : setStep('amount'))}> - {'\u2190'} - - {t('sell.title')} - - - - {step === 'amount' && renderAmountStep()} - {step === 'bank' && renderBankStep()} - {step === 'confirm' && renderConfirmStep()} - - - ); -} - -const styles = StyleSheet.create({ - content: { - flex: 1, - paddingVertical: 16, - gap: 16, - }, - header: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - }, - backButton: { - fontSize: 24, - color: DfxColors.text, - width: 32, - }, - title: { - ...Typography.headlineSmall, - color: DfxColors.text, - }, - stepContent: { - flex: 1, - gap: 20, - }, - stepTitle: { - ...Typography.headlineSmall, - color: DfxColors.text, - }, - description: { - ...Typography.bodyMedium, - color: DfxColors.textSecondary, - }, - amountContainer: { - alignItems: 'center', - gap: 8, - }, - amountInput: { - backgroundColor: DfxColors.surface, - borderRadius: 16, - padding: 20, - fontSize: 32, - fontWeight: '700', - color: DfxColors.text, - textAlign: 'center', - width: '100%', - }, - amountUnit: { - ...Typography.bodyLarge, - color: DfxColors.textSecondary, - }, - ibanInput: { - backgroundColor: DfxColors.surface, - borderRadius: 16, - padding: 16, - color: DfxColors.text, - ...Typography.bodyLarge, - letterSpacing: 1, - }, - summary: { - backgroundColor: DfxColors.surface, - borderRadius: 16, - padding: 20, - gap: 16, - }, - summaryRow: { - flexDirection: 'row', - justifyContent: 'space-between', - }, - summaryLabel: { - ...Typography.bodyMedium, - color: DfxColors.textTertiary, - }, - summaryValue: { - ...Typography.bodyMedium, - fontWeight: '600', - color: DfxColors.text, - }, - hint: { - ...Typography.bodySmall, - color: DfxColors.textTertiary, - textAlign: 'center', - }, - errorText: { - ...Typography.bodySmall, - color: DfxColors.error, - textAlign: 'center', - }, - spacer: { - flex: 1, - }, -}); +import { FEATURES } from '@/config/features'; + +/** + * Sell (fiat off-ramp) route. Companion to `buy/index.tsx`; gated by + * the same flag and shares the disabled stub. + */ +const SellScreen = FEATURES.BUY_SELL + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/buy-sell/SellScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/buy-sell/BuySellDisabled').default as React.ComponentType); + +export default SellScreen; diff --git a/app/(auth)/send/index.tsx b/app/(auth)/send/index.tsx index a6ea15f0..bdd0487c 100644 --- a/app/(auth)/send/index.tsx +++ b/app/(auth)/send/index.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useCallback, useMemo, useRef, useState } from 'react'; import { ImageBackground, Pressable, @@ -12,11 +12,15 @@ import { SafeAreaView } from 'react-native-safe-area-context'; import { Stack, useRouter } from 'expo-router'; import { useTranslation } from 'react-i18next'; import * as Haptics from 'expo-haptics'; -import { AppHeader, ChainSelector, Icon, PrimaryButton, ShortcutAction } from '@/components'; +import { AppHeader, DarkBackdrop, Icon, PrimaryButton, ShortcutAction } from '@/components'; import { QrScanner } from '@/components/QrScanner'; import { useSendFlow } from '@/hooks'; import type { ChainId } from '@/config/chains'; -import { DfxColors, Typography } from '@/theme'; +import { getPaymasterTokenInfo } from '@/config/chains'; +import { FEATURES } from '@/config/features'; +import { formatBalance } from '@/config/portfolio-presentation'; +import { getSendAssetForCanonical } from '@/config/tokens'; +import { Typography, useColors, useResolvedScheme, type ThemeColors } from '@/theme'; type SendStep = 'asset' | 'input' | 'confirm' | 'success'; @@ -67,15 +71,34 @@ const SEND_ASSETS: AssetOption[] = [ export default function SendScreen() { const router = useRouter(); const { t } = useTranslation(); + const colors = useColors(); + const scheme = useResolvedScheme(); + const styles = useMemo(() => makeStyles(colors), [colors]); const [step, setStep] = useState('asset'); - const [selectedAsset, setSelectedAsset] = useState(SEND_ASSETS[0]!); + // Start unselected so no card has a border on first render — the active + // border appears only after the user explicitly picks an asset. + const [selectedAsset, setSelectedAsset] = useState(null); const [selectedChain, setSelectedChain] = useState('spark'); const [recipient, setRecipient] = useState(''); const [amount, setAmount] = useState(''); const [scannerVisible, setScannerVisible] = useState(false); - const { send, isLoading, txHash, error, reset } = useSendFlow(selectedChain); + const { send, estimate, isLoading, txHash, error, reset } = useSendFlow(selectedChain); - const symbol = selectedAsset.symbol; + type FeeState = + | { status: 'idle' } + | { status: 'loading' } + | { status: 'ok'; fee: string } + | { status: 'error'; message: string }; + const [feeState, setFeeState] = useState({ status: 'idle' }); + const estimateReqRef = useRef(0); + + const symbol = selectedAsset?.symbol ?? ''; + const sendAsset = useMemo( + () => + selectedAsset ? getSendAssetForCanonical(selectedAsset.symbol, selectedChain) : undefined, + [selectedAsset, selectedChain], + ); + const paymasterToken = useMemo(() => getPaymasterTokenInfo(selectedChain), [selectedChain]); const isValidAddress = recipient.length >= 26; const handleAssetSelect = (asset: AssetOption) => { @@ -84,8 +107,24 @@ export default function SendScreen() { setStep('input'); }; + const goToConfirm = useCallback(async () => { + // Continue + Confirm buttons are gated on `sendAsset` via their + // `disabled` props, so it is non-null by the time these handlers run. + setStep('confirm'); + setFeeState({ status: 'loading' }); + const reqId = ++estimateReqRef.current; + const result = await estimate({ asset: sendAsset!, to: recipient, amount }); + // Drop stale results from earlier estimate calls (e.g. user went back, edited, returned). + if (reqId !== estimateReqRef.current) return; + if (result.success) { + setFeeState({ status: 'ok', fee: result.fee }); + } else { + setFeeState({ status: 'error', message: result.error }); + } + }, [sendAsset, estimate, recipient, amount]); + const handleSend = async () => { - const hash = await send({ to: recipient, amount }); + const hash = await send({ asset: sendAsset!, to: recipient, amount }); if (hash) { void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); setStep('success'); @@ -94,14 +133,15 @@ export default function SendScreen() { const renderAssetStep = () => ( - {t('send.selectAsset')} - + {t('send.sendToCrypto')} + {SEND_ASSETS.map((asset) => ( [ styles.assetCard, - selectedAsset.symbol === asset.symbol && styles.assetCardActive, + selectedAsset?.symbol === asset.symbol && styles.assetCardActive, pressed && styles.pressed, ]} onPress={() => handleAssetSelect(asset)} @@ -109,7 +149,7 @@ export default function SendScreen() { {asset.symbol} @@ -118,128 +158,184 @@ export default function SendScreen() { ))} + + {FEATURES.BUY_SELL && ( + [styles.destinationCard, pressed && styles.pressed]} + onPress={() => router.push('/(auth)/sell')} + testID="send-destination-bank" + accessibilityRole="button" + accessibilityLabel={t('send.sendToBank')} + > + + + + + {t('send.sendToBank')} + {t('send.sendToBankSubtitle')} + + + + )} ); - const renderInputStep = () => ( - - setStep('asset')}> - {selectedAsset.symbol} - - + const renderInputStep = (asset: AssetOption) => { + return ( + + setStep('asset')} + > + {asset.symbol} + + - {selectedAsset.chains.length > 1 && ( - - {t('send.network')} - - {selectedAsset.chains.map((c) => ( - setSelectedChain(c.chain)} - > - 1 && ( + + {t('send.network')} + + {asset.chains.map((c) => ( + setSelectedChain(c.chain)} > - {c.label} - - - ))} - + + {c.label} + + + ))} + + + )} + + + {t('send.recipient')} + + + setScannerVisible(true)} + > + {t('send.scan')} + + - )} - - {t('send.recipient')} - + + + {t('send.amount')} ({symbol}) + - setScannerVisible(true)}> - {t('send.scan')} - - - - - - {t('send.amount')} ({symbol}) - - - - {error && {error}} + {error && ( + + {error} + + )} - + - setStep('confirm')} - disabled={!isValidAddress || !amount || parseFloat(amount) <= 0} - /> + - } - label={t('send.sellInstead')} - onPress={() => router.push('/(auth)/sell')} - testID="send-action-sell" - /> - - ); + {FEATURES.BUY_SELL && ( + } + label={t('send.sellInstead')} + onPress={() => router.push('/(auth)/sell')} + testID="send-action-sell" + /> + )} + + ); + }; const renderConfirmStep = () => ( - - Confirm Transaction + + {t('send.confirmTransaction')} - Network + {t('send.network')} {selectedChain} - To + {t('send.recipient')} {recipient.slice(0, 10)}...{recipient.slice(-6)} - Amount + {t('send.amount')} {amount} {symbol} + + {t('send.networkFee')} + + {feeState.status === 'loading' && t('send.feeEstimating')} + {feeState.status === 'error' && t('send.feeUnavailable')} + {feeState.status === 'ok' && + paymasterToken && + `${formatBalance(feeState.fee, paymasterToken.decimals)} ${paymasterToken.symbol}`} + + - - Transactions are irreversible. Please verify the recipient address and amount. - + {t('send.irreversible')} {error && {error}} - + { reset(); + // Drop any in-flight estimate so a late-arriving result doesn't render after cancel. + estimateReqRef.current += 1; + setFeeState({ status: 'idle' }); setStep('input'); }} /> @@ -249,261 +345,321 @@ export default function SendScreen() { const renderSuccessStep = () => ( - {'\u2705'} - Transaction Sent + {'\u2713'} + {t('send.sent')} - {amount} {symbol} sent to {recipient.slice(0, 10)}...{recipient.slice(-6)} + {t('send.sentDescription', { + amount, + symbol, + recipient: `${recipient.slice(0, 10)}...${recipient.slice(-6)}`, + })} {txHash && ( - TX: {txHash.slice(0, 12)}...{txHash.slice(-8)} + {t('send.txHash', { hash: `${txHash.slice(0, 12)}...${txHash.slice(-8)}` })} )} - router.back()} /> + router.back()} /> ); + const body = ( + + { + if (step === 'confirm') setStep('input'); + else if (step === 'input') setStep('asset'); + else router.back(); + }} + testID="send-screen" + /> + + + {step === 'asset' && renderAssetStep()} + {step === 'input' && selectedAsset && renderInputStep(selectedAsset)} + {step === 'confirm' && renderConfirmStep()} + {step === 'success' && renderSuccessStep()} + + + { + // Handle various QR formats: plain address, ethereum:0x..., bitcoin:bc1... + // String.prototype.split always yields at least one element, so [0] is defined. + const address = data.replace(/^(ethereum|bitcoin):/, '').split('?')[0]!; + setRecipient(address); + }} + onClose={() => setScannerVisible(false)} + /> + + ); + return ( <> - - - { - if (step === 'confirm') setStep('input'); - else if (step === 'input') setStep('asset'); - else router.back(); - }} - testID="send-screen" - /> - - - {step === 'asset' && renderAssetStep()} - {step === 'input' && renderInputStep()} - {step === 'confirm' && renderConfirmStep()} - {step === 'success' && renderSuccessStep()} - - - { - // Handle various QR formats: plain address, ethereum:0x..., bitcoin:bc1... - // String.prototype.split always yields at least one element, so [0] is defined. - const address = data.replace(/^(ethereum|bitcoin):/, '').split('?')[0]!; - setRecipient(address); - }} - onClose={() => setScannerVisible(false)} + + {scheme === 'dark' ? ( + + ) : ( + - - + )} + {body} + ); } -const styles = StyleSheet.create({ - bg: { - flex: 1, - backgroundColor: DfxColors.background, - }, - safeArea: { - flex: 1, - }, - scroll: { - flex: 1, - }, - scrollContent: { - paddingHorizontal: 20, - paddingBottom: 32, - }, - stepContent: { - flex: 1, - gap: 20, - }, - stepTitle: { - ...Typography.headlineSmall, - color: DfxColors.text, - }, - stepSubtitle: { - ...Typography.bodyLarge, - color: DfxColors.textSecondary, - fontWeight: '500', - marginBottom: 4, - }, - assetList: { - gap: 10, - }, - assetCard: { - flexDirection: 'row', - alignItems: 'center', - backgroundColor: DfxColors.surface, - borderRadius: 16, - padding: 18, - gap: 14, - borderWidth: 2, - borderColor: 'transparent', - }, - assetCardActive: { - borderColor: DfxColors.primary, - }, - pressed: { - opacity: 0.7, - }, - assetSymbol: { - ...Typography.headlineSmall, - color: DfxColors.text, - fontWeight: '700', - width: 56, - }, - assetSymbolActive: { - color: DfxColors.primary, - }, - assetLabel: { - ...Typography.bodyLarge, - color: DfxColors.textSecondary, - }, - selectedAssetPill: { - flexDirection: 'row', - alignItems: 'center', - alignSelf: 'flex-start', - backgroundColor: DfxColors.primaryLight, - borderRadius: 12, - paddingVertical: 8, - paddingHorizontal: 14, - gap: 6, - marginBottom: 4, - }, - selectedAssetText: { - ...Typography.bodyMedium, - color: DfxColors.primary, - fontWeight: '700', - }, - chainBar: { - flexGrow: 0, - }, - chainChip: { - backgroundColor: DfxColors.surface, - borderRadius: 10, - paddingVertical: 8, - paddingHorizontal: 14, - marginRight: 8, - borderWidth: 1.5, - borderColor: 'transparent', - }, - chainChipActive: { - borderColor: DfxColors.primary, - backgroundColor: DfxColors.primaryLight, - }, - chainChipText: { - ...Typography.bodyMedium, - color: DfxColors.textSecondary, - fontWeight: '500', - }, - chainChipTextActive: { - color: DfxColors.primary, - fontWeight: '600', - }, - inputGroup: { - gap: 8, - }, - inputLabel: { - ...Typography.bodySmall, - fontWeight: '600', - color: DfxColors.textSecondary, - textTransform: 'uppercase', - letterSpacing: 1, - }, - input: { - backgroundColor: DfxColors.surface, - borderRadius: 12, - padding: 16, - color: DfxColors.text, - ...Typography.bodyLarge, - }, - recipientRow: { - flexDirection: 'row', - gap: 8, - }, - recipientInput: { - flex: 1, - }, - scanButton: { - backgroundColor: DfxColors.surface, - borderRadius: 12, - paddingHorizontal: 16, - justifyContent: 'center', - }, - scanText: { - ...Typography.bodyMedium, - fontWeight: '600', - color: DfxColors.primary, - }, - summary: { - backgroundColor: DfxColors.surface, - borderRadius: 16, - padding: 20, - gap: 16, - }, - summaryRow: { - flexDirection: 'row', - justifyContent: 'space-between', - }, - summaryLabel: { - ...Typography.bodyMedium, - color: DfxColors.textTertiary, - }, - summaryValue: { - ...Typography.bodyMedium, - fontWeight: '600', - color: DfxColors.text, - maxWidth: '60%', - }, - warning: { - ...Typography.bodySmall, - color: DfxColors.warning, - textAlign: 'center', - }, - errorText: { - ...Typography.bodySmall, - color: DfxColors.error, - textAlign: 'center', - }, - successContainer: { - alignItems: 'center', - paddingVertical: 48, - gap: 12, - }, - successIcon: { - fontSize: 64, - }, - successTitle: { - ...Typography.headlineMedium, - color: DfxColors.text, - }, - successDescription: { - ...Typography.bodyLarge, - color: DfxColors.textSecondary, - textAlign: 'center', - }, - txHash: { - ...Typography.bodySmall, - color: DfxColors.textTertiary, - fontFamily: 'monospace', - marginTop: 8, - }, - spacer: { - flex: 1, - }, -}); +const makeStyles = (colors: ThemeColors) => + StyleSheet.create({ + bg: { + flex: 1, + backgroundColor: colors.background, + }, + safeArea: { + flex: 1, + }, + scroll: { + flex: 1, + }, + scrollContent: { + paddingHorizontal: 20, + paddingBottom: 32, + }, + stepContent: { + flex: 1, + gap: 20, + }, + stepTitle: { + ...Typography.headlineSmall, + color: colors.text, + }, + stepSubtitle: { + ...Typography.bodyLarge, + color: colors.textSecondary, + fontWeight: '500', + marginBottom: 4, + }, + destinationCard: { + flexDirection: 'row', + alignItems: 'center', + backgroundColor: colors.cardOverlay, + borderRadius: 12, + padding: 16, + gap: 14, + borderWidth: 1, + borderColor: colors.primary, + }, + destinationIcon: { + width: 40, + height: 40, + borderRadius: 12, + backgroundColor: colors.primaryLight, + alignItems: 'center', + justifyContent: 'center', + }, + destinationText: { + flex: 1, + gap: 2, + }, + destinationTitle: { + ...Typography.bodyLarge, + color: colors.text, + fontWeight: '600', + }, + destinationSubtitle: { + ...Typography.bodySmall, + color: colors.textSecondary, + }, + assetList: { + gap: 10, + }, + assetCard: { + flexDirection: 'row', + alignItems: 'center', + backgroundColor: colors.cardOverlay, + borderRadius: 12, + padding: 18, + gap: 14, + borderWidth: 1, + borderColor: colors.border, + }, + assetCardActive: { + borderColor: colors.primary, + backgroundColor: colors.primaryLight, + }, + pressed: { + opacity: 0.7, + }, + assetSymbol: { + ...Typography.headlineSmall, + color: colors.text, + fontWeight: '700', + width: 56, + }, + assetSymbolActive: { + color: colors.primary, + }, + assetLabel: { + ...Typography.bodyLarge, + color: colors.textSecondary, + }, + selectedAssetPill: { + flexDirection: 'row', + alignItems: 'center', + alignSelf: 'flex-start', + backgroundColor: colors.primaryLight, + borderRadius: 12, + paddingVertical: 8, + paddingHorizontal: 14, + gap: 6, + marginBottom: 4, + }, + selectedAssetText: { + ...Typography.bodyMedium, + color: colors.primary, + fontWeight: '700', + }, + chainBar: { + flexGrow: 0, + }, + chainChip: { + backgroundColor: colors.cardOverlay, + borderRadius: 10, + paddingVertical: 8, + paddingHorizontal: 14, + marginRight: 8, + borderWidth: 1.5, + borderColor: 'transparent', + }, + chainChipActive: { + borderColor: colors.primary, + backgroundColor: colors.primaryLight, + }, + chainChipText: { + ...Typography.bodyMedium, + color: colors.textSecondary, + fontWeight: '500', + }, + chainChipTextActive: { + color: colors.primary, + fontWeight: '600', + }, + inputGroup: { + gap: 8, + }, + inputLabel: { + ...Typography.bodySmall, + fontWeight: '600', + color: colors.textSecondary, + textTransform: 'uppercase', + letterSpacing: 1, + }, + input: { + backgroundColor: colors.cardOverlay, + borderRadius: 12, + borderWidth: 1, + borderColor: colors.border, + padding: 16, + color: colors.text, + ...Typography.bodyLarge, + }, + recipientRow: { + flexDirection: 'row', + gap: 8, + }, + recipientInput: { + flex: 1, + }, + scanButton: { + backgroundColor: colors.cardOverlay, + borderRadius: 12, + borderWidth: 1, + borderColor: colors.border, + paddingHorizontal: 16, + justifyContent: 'center', + }, + scanText: { + ...Typography.bodyMedium, + fontWeight: '600', + color: colors.primary, + }, + summary: { + backgroundColor: colors.cardOverlay, + borderRadius: 12, + borderWidth: 1, + borderColor: colors.border, + padding: 20, + gap: 16, + }, + summaryRow: { + flexDirection: 'row', + justifyContent: 'space-between', + }, + summaryLabel: { + ...Typography.bodyMedium, + color: colors.textTertiary, + }, + summaryValue: { + ...Typography.bodyMedium, + fontWeight: '600', + color: colors.text, + maxWidth: '60%', + }, + warning: { + ...Typography.bodySmall, + color: colors.warning, + textAlign: 'center', + }, + errorText: { + ...Typography.bodySmall, + color: colors.error, + textAlign: 'center', + }, + successContainer: { + alignItems: 'center', + paddingVertical: 48, + gap: 12, + }, + successIcon: { + width: 72, + height: 72, + borderRadius: 36, + backgroundColor: colors.success, + color: colors.white, + fontSize: 42, + lineHeight: 72, + textAlign: 'center', + overflow: 'hidden', + }, + successTitle: { + ...Typography.headlineMedium, + color: colors.text, + }, + successDescription: { + ...Typography.bodyLarge, + color: colors.textSecondary, + textAlign: 'center', + }, + txHash: { + ...Typography.bodySmall, + color: colors.textTertiary, + fontFamily: 'monospace', + marginTop: 8, + }, + spacer: { + flex: 1, + }, + }); diff --git a/app/(auth)/support/index.tsx b/app/(auth)/support/index.tsx index c4fd283f..f96a5937 100644 --- a/app/(auth)/support/index.tsx +++ b/app/(auth)/support/index.tsx @@ -1,361 +1,9 @@ -import { useCallback, useEffect, useState } from 'react'; -import { - ActivityIndicator, - Pressable, - ScrollView, - StyleSheet, - Text, - TextInput, - View, -} from 'react-native'; -import { useRouter } from 'expo-router'; -import { useTranslation } from 'react-i18next'; -import * as Haptics from 'expo-haptics'; -import { PrimaryButton, ScreenContainer } from '@/components'; -import { dfxSupportService, type SupportIssueDto } from '@/services/dfx'; -import { DfxColors, Typography } from '@/theme'; +import { FEATURES } from '@/config/features'; -type SupportView = 'list' | 'create' | 'chat'; +const SupportScreen = FEATURES.DFX_BACKEND + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/dfx-backend/screens/SupportScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/dfx-backend/screens/DfxBackendDisabled').default as React.ComponentType); -const STATE_COLORS: Record = { - Open: DfxColors.warning, - InProgress: DfxColors.info, - Resolved: DfxColors.success, - Closed: DfxColors.textTertiary, -}; - -export default function SupportScreen() { - const router = useRouter(); - const { t } = useTranslation(); - const [view, setView] = useState('list'); - const [issues, setIssues] = useState([]); - const [isLoading, setIsLoading] = useState(true); - const [subject, setSubject] = useState(''); - const [message, setMessage] = useState(''); - const [selectedIssue, setSelectedIssue] = useState(null); - const [chatMessage, setChatMessage] = useState(''); - - const loadIssues = useCallback(async () => { - setIsLoading(true); - try { - const data = await dfxSupportService.getIssues(); - setIssues(data); - } catch { - // May not be authenticated - } finally { - setIsLoading(false); - } - }, []); - - useEffect(() => { - void loadIssues(); - }, [loadIssues]); - - const handleCreate = async () => { - if (!subject || !message) return; - setIsLoading(true); - try { - await dfxSupportService.createIssue(subject, message); - void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); - setSubject(''); - setMessage(''); - setView('list'); - await loadIssues(); - } catch { - // Handle error - } finally { - setIsLoading(false); - } - }; - - const handleSendMessage = async () => { - if (!selectedIssue || !chatMessage) return; - try { - await dfxSupportService.sendMessage(selectedIssue.id, chatMessage); - setChatMessage(''); - // Reload to get updated messages - const updated = await dfxSupportService.getIssues(); - setIssues(updated); - setSelectedIssue(updated.find((i) => i.id === selectedIssue.id) ?? null); - } catch { - // Handle error - } - }; - - const renderList = () => ( - - {isLoading ? ( - - - - ) : issues.length === 0 ? ( - - No support tickets - - ) : ( - - {issues.map((issue) => ( - { - setSelectedIssue(issue); - setView('chat'); - }} - > - - {issue.reason} - - {new Date(issue.createdDate).toLocaleDateString()} - - - - {issue.state} - - - ))} - - )} - - setView('create')} /> - - ); - - const renderCreate = () => ( - - {t('support.createTicket')} - - - - - - - - - - ); - - const renderChat = () => ( - - {selectedIssue?.reason} - - - {selectedIssue?.messages.map((msg) => ( - - {msg.author} - {msg.message} - {new Date(msg.createdDate).toLocaleString()} - - ))} - - - - - - Send - - - - ); - - return ( - - - - { - if (view === 'list') router.back(); - else if (view === 'chat') setView('list'); - else setView('list'); - }} - > - {'\u2190'} - - {t('support.title')} - - - - {view === 'list' && renderList()} - {view === 'create' && renderCreate()} - {view === 'chat' && renderChat()} - - - ); -} - -const styles = StyleSheet.create({ - content: { - flex: 1, - paddingVertical: 16, - gap: 16, - }, - header: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - }, - backButton: { - fontSize: 24, - color: DfxColors.text, - width: 32, - }, - title: { - ...Typography.headlineSmall, - color: DfxColors.text, - }, - stepContent: { - flex: 1, - gap: 16, - }, - stepTitle: { - ...Typography.headlineSmall, - color: DfxColors.text, - }, - loadingContainer: { - flex: 1, - alignItems: 'center', - justifyContent: 'center', - }, - emptyState: { - flex: 1, - alignItems: 'center', - justifyContent: 'center', - }, - emptyText: { - ...Typography.bodyLarge, - color: DfxColors.textTertiary, - }, - ticketList: { - gap: 8, - }, - ticketItem: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - padding: 16, - backgroundColor: DfxColors.surface, - borderRadius: 12, - }, - ticketInfo: { - flex: 1, - gap: 4, - }, - ticketSubject: { - ...Typography.bodyMedium, - fontWeight: '600', - color: DfxColors.text, - }, - ticketDate: { - ...Typography.bodySmall, - color: DfxColors.textTertiary, - }, - statusBadge: { - paddingHorizontal: 10, - paddingVertical: 4, - borderRadius: 8, - }, - statusText: { - ...Typography.bodySmall, - fontWeight: '600', - color: DfxColors.black, - }, - input: { - backgroundColor: DfxColors.surface, - borderRadius: 12, - padding: 16, - color: DfxColors.text, - ...Typography.bodyLarge, - }, - messageInput: { - minHeight: 160, - }, - chatMessages: { - flex: 1, - }, - chatBubble: { - padding: 12, - borderRadius: 12, - marginBottom: 8, - maxWidth: '85%', - }, - userBubble: { - backgroundColor: DfxColors.primary, - alignSelf: 'flex-end', - }, - supportBubble: { - backgroundColor: DfxColors.surface, - alignSelf: 'flex-start', - }, - chatAuthor: { - ...Typography.bodySmall, - fontWeight: '600', - color: DfxColors.textSecondary, - marginBottom: 4, - }, - chatText: { - ...Typography.bodyMedium, - color: DfxColors.text, - }, - chatDate: { - ...Typography.bodySmall, - color: DfxColors.textTertiary, - marginTop: 4, - }, - chatInputRow: { - flexDirection: 'row', - gap: 8, - }, - chatInput: { - flex: 1, - }, - sendButton: { - backgroundColor: DfxColors.primary, - borderRadius: 12, - paddingHorizontal: 20, - justifyContent: 'center', - }, - sendText: { - ...Typography.bodyMedium, - fontWeight: '600', - color: DfxColors.white, - }, - spacer: { - flex: 1, - }, -}); +export default SupportScreen; diff --git a/app/(auth)/tax-report/index.tsx b/app/(auth)/tax-report/index.tsx new file mode 100644 index 00000000..285d7f98 --- /dev/null +++ b/app/(auth)/tax-report/index.tsx @@ -0,0 +1,19 @@ +import { FEATURES } from '@/config/features'; + +/** + * Tax-report route entry. Same conditional-`require()` pattern as + * `app/(auth)/pay/index.tsx`: the file stays in place because Expo + * Router scans `app/`, but the body resolves to either the real screen + * (which pulls in the DFX transaction service, `expo-file-system` and + * the optional `expo-sharing` native module) or a tiny redirect stub. + * + * With `FEATURES.TAX_REPORT` off, a production build will not load the + * CSV export pipeline or the share-sheet bridge. + */ +const TaxReportScreen = FEATURES.TAX_REPORT + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/tax-report/TaxReportScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/tax-report/TaxReportDisabled').default as React.ComponentType); + +export default TaxReportScreen; diff --git a/app/(auth)/transaction-history/[id].tsx b/app/(auth)/transaction-history/[id].tsx index 58c8c087..e23e8cc1 100644 --- a/app/(auth)/transaction-history/[id].tsx +++ b/app/(auth)/transaction-history/[id].tsx @@ -1,281 +1,13 @@ -import { useEffect, useState } from 'react'; -import { - ActivityIndicator, - ImageBackground, - Linking, - Pressable, - ScrollView, - StyleSheet, - Text, - View, -} from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import { Stack, useLocalSearchParams } from 'expo-router'; -import { useTranslation } from 'react-i18next'; -import { AppHeader, Icon } from '@/components'; -import { CHAIN_LABELS } from '@/config/portfolio-presentation'; -import { dfxTransactionService, type TransactionDto } from '@/services/dfx'; -import { DfxColors, Typography } from '@/theme'; - -const STATE_COLORS = new Map([ - ['Completed', DfxColors.success], - ['Processing', DfxColors.warning], - ['AmlCheck', DfxColors.warning], - ['Created', DfxColors.info], - ['Failed', DfxColors.error], - ['Returned', DfxColors.error], -]); - -const EXPLORER_BASE = new Map([ - ['ethereum', 'https://etherscan.io/tx/'], - ['arbitrum', 'https://arbiscan.io/tx/'], - ['polygon', 'https://polygonscan.com/tx/'], - ['base', 'https://basescan.org/tx/'], - ['plasma', 'https://explorer.plasma.to/tx/'], - ['sepolia', 'https://sepolia.etherscan.io/tx/'], -]); - -export default function TransactionDetailScreen() { - const { t } = useTranslation(); - const { id, network } = useLocalSearchParams<{ id: string; network?: string }>(); - - const [tx, setTx] = useState(null); - const [isLoading, setIsLoading] = useState(true); - - useEffect(() => { - let cancelled = false; - void (async () => { - try { - const list = await dfxTransactionService.getTransactions(); - if (!cancelled) { - const found = list.find((t) => String(t.id) === String(id)); - setTx(found ?? null); - } - } finally { - if (!cancelled) setIsLoading(false); - } - })(); - return () => { - cancelled = true; - }; - }, [id]); - - const explorerBase = - network && typeof network === 'string' ? EXPLORER_BASE.get(network) : undefined; - const explorerUrl = explorerBase && tx?.txId ? `${explorerBase}${tx.txId}` : undefined; - - return ( - <> - - - - - - {isLoading ? ( - - - - ) : !tx ? ( - - {t('transactions.notFound')} - - ) : ( - - - {tx.type} - - {tx.type === 'Sell' || tx.type === 'Pay' ? '-' : '+'} - {tx.outputAmount} {tx.outputAsset} - - - - {tx.state} - - - - - - - - {network ? ( - - ) : null} - {tx.txId ? ( - - ) : null} - - - {explorerUrl ? ( - [ - styles.explorerButton, - pressed && styles.explorerPressed, - ]} - onPress={() => void Linking.openURL(explorerUrl)} - testID="tx-explorer-button" - > - - {t('transactions.viewOnExplorer')} - - - ) : null} - - )} - - - - ); -} - -function DetailRow({ label, value, isLast }: { label: string; value: string; isLast?: boolean }) { - return ( - - {label} - - {value} - - - ); -} - -const styles = StyleSheet.create({ - bg: { - flex: 1, - backgroundColor: DfxColors.background, - }, - safeArea: { - flex: 1, - }, - center: { - flex: 1, - alignItems: 'center', - justifyContent: 'center', - }, - emptyText: { - ...Typography.bodyMedium, - color: DfxColors.textTertiary, - }, - scroll: { - flex: 1, - }, - scrollContent: { - paddingHorizontal: 20, - paddingBottom: 32, - gap: 16, - }, - summaryCard: { - paddingVertical: 24, - alignItems: 'center', - gap: 8, - }, - summaryType: { - ...Typography.bodyMedium, - color: DfxColors.textSecondary, - fontWeight: '500', - }, - summaryAmount: { - fontSize: 32, - lineHeight: 38, - fontWeight: '700', - color: DfxColors.text, - }, - statusRow: { - flexDirection: 'row', - alignItems: 'center', - gap: 6, - marginTop: 4, - }, - statusDot: { - width: 8, - height: 8, - borderRadius: 4, - }, - summaryState: { - ...Typography.bodyMedium, - color: DfxColors.textSecondary, - fontWeight: '500', - }, - detailCard: { - backgroundColor: DfxColors.surface, - borderRadius: 16, - overflow: 'hidden', - shadowColor: '#0B1426', - shadowOpacity: 0.04, - shadowRadius: 10, - shadowOffset: { width: 0, height: 3 }, - elevation: 1, - }, - detailRow: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - paddingVertical: 14, - paddingHorizontal: 16, - gap: 12, - }, - detailRowDivider: { - borderBottomWidth: StyleSheet.hairlineWidth, - borderBottomColor: DfxColors.border, - }, - detailLabel: { - ...Typography.bodyMedium, - color: DfxColors.textSecondary, - }, - detailValue: { - ...Typography.bodyMedium, - color: DfxColors.text, - fontWeight: '500', - textAlign: 'right', - flexShrink: 1, - }, - explorerButton: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'center', - gap: 10, - paddingVertical: 14, - backgroundColor: DfxColors.surface, - borderRadius: 999, - shadowColor: '#0B1426', - shadowOpacity: 0.05, - shadowRadius: 8, - shadowOffset: { width: 0, height: 2 }, - }, - explorerPressed: { - opacity: 0.7, - }, - explorerText: { - ...Typography.bodyLarge, - fontWeight: '600', - color: DfxColors.primary, - }, -}); +import { FEATURES } from '@/config/features'; + +/** + * Transaction-history detail route. Companion to the list screen; + * gated by the same flag and shares the disabled stub. + */ +const TxHistoryDetailScreen = FEATURES.TX_HISTORY + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/tx-history/TxHistoryDetailScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/tx-history/TxHistoryDisabled').default as React.ComponentType); + +export default TxHistoryDetailScreen; diff --git a/app/(auth)/transaction-history/index.tsx b/app/(auth)/transaction-history/index.tsx index d44dd1f1..ea6189f9 100644 --- a/app/(auth)/transaction-history/index.tsx +++ b/app/(auth)/transaction-history/index.tsx @@ -1,360 +1,14 @@ -import { useCallback, useEffect, useMemo, useState } from 'react'; -import { - ActivityIndicator, - ImageBackground, - Pressable, - RefreshControl, - ScrollView, - StyleSheet, - Text, - View, -} from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import { Stack, useLocalSearchParams, useRouter } from 'expo-router'; -import { useTranslation } from 'react-i18next'; -import * as Clipboard from 'expo-clipboard'; -import { useAccount } from '@tetherto/wdk-react-native-core'; -import { AppHeader, Icon, TransactionRow } from '@/components'; -import { CHAIN_LABELS } from '@/config/portfolio-presentation'; -import { dfxTransactionService, type TransactionDto } from '@/services/dfx'; -import { DfxColors, Typography } from '@/theme'; - -type FilterType = 'all' | 'in' | 'out' | 'pay'; - -// Tabs map to TX types as follows: -// - "in" = Buy (DFX on-ramp) + Receive (on-chain) -// - "out" = Sell (DFX off-ramp) + Send (on-chain) + Swap (in-wallet conversion) -// - "pay" = Pay (merchant payment) -const FILTER_TYPES: Record, readonly TransactionDto['type'][]> = { - in: ['Buy'], - out: ['Sell', 'Swap'], - pay: ['Pay'], -}; - -export default function TransactionHistoryScreen() { - const { t } = useTranslation(); - const router = useRouter(); - const params = useLocalSearchParams<{ asset?: string; network?: string }>(); - const assetFilter = typeof params.asset === 'string' ? params.asset.toUpperCase() : undefined; - const networkFilter = typeof params.network === 'string' ? params.network : undefined; - - const [transactions, setTransactions] = useState([]); - const [isLoading, setIsLoading] = useState(true); - const [filter, setFilter] = useState('all'); - - const loadTransactions = useCallback(async () => { - setIsLoading(true); - try { - const data = await dfxTransactionService.getTransactions(); - setTransactions(data); - } catch { - // Silently fail — user may not be authenticated yet - } finally { - setIsLoading(false); - } - }, []); - - useEffect(() => { - void loadTransactions(); - }, [loadTransactions]); - - const filtered = useMemo(() => { - let list = transactions; - if (assetFilter) { - list = list.filter( - (tx) => - tx.inputAsset?.toUpperCase() === assetFilter || - tx.outputAsset?.toUpperCase() === assetFilter, - ); - } - // Network filter not supported by current DTO — skip. - if (filter !== 'all') { - const allowed = - filter === 'in' ? FILTER_TYPES.in : filter === 'out' ? FILTER_TYPES.out : FILTER_TYPES.pay; - list = list.filter((tx) => allowed.includes(tx.type)); - } - return [...list].sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()); - }, [transactions, assetFilter, networkFilter, filter]); - - const filters: readonly { key: FilterType; label: string }[] = [ - { key: 'all', label: t('transactions.filterAll') }, - { key: 'pay', label: t('transactions.filterPay') }, - { key: 'in', label: t('transactions.filterIn') }, - { key: 'out', label: t('transactions.filterOut') }, - ]; - - const headerTitle = (() => { - if (assetFilter && networkFilter) { - return `${assetFilter} · ${CHAIN_LABELS.get(networkFilter) ?? networkFilter}`; - } - if (assetFilter) return assetFilter; - return t('transactions.title'); - })(); - - return ( - <> - - - - - - {networkFilter && } - - {!assetFilter && ( - - - {filters.map((f) => { - const isActive = filter === f.key; - return ( - setFilter(f.key)} - accessibilityRole="button" - accessibilityState={{ selected: isActive }} - > - - {f.label} - - - ); - })} - - - )} - - {isLoading ? ( - - - - ) : filtered.length === 0 ? ( - - {t('transactions.noTransactions')} - - ) : ( - - } - > - {filtered.map((tx) => ( - - router.push({ - pathname: '/(auth)/transaction-history/[id]', - params: { id: String(tx.id), network: networkFilter ?? '' }, - }) - } - /> - ))} - - )} - - - - ); -} - -function WalletAddressBar({ network }: { network: string }) { - const { address } = useAccount({ network, accountIndex: 0 }); - const [copied, setCopied] = useState(false); - - if (!address) return null; - - const short = `${address.slice(0, 10)}...${address.slice(-8)}`; - - const handleCopy = async () => { - await Clipboard.setStringAsync(address); - setCopied(true); - setTimeout(() => setCopied(false), 2000); - }; - - return ( - - - - - Wallet-Adresse - - {short} - - - {copied ? 'Kopiert!' : 'Kopieren'} - - - ); -} - -const styles = StyleSheet.create({ - addressCard: { - alignItems: 'center', - marginHorizontal: 20, - marginBottom: 16, - paddingVertical: 24, - paddingHorizontal: 20, - backgroundColor: DfxColors.surface, - borderRadius: 20, - shadowColor: '#0B1426', - shadowOpacity: 0.06, - shadowRadius: 16, - shadowOffset: { width: 0, height: 4 }, - elevation: 2, - gap: 8, - }, - addressIconCircle: { - width: 48, - height: 48, - borderRadius: 24, - backgroundColor: DfxColors.primaryLight, - alignItems: 'center', - justifyContent: 'center', - marginBottom: 4, - }, - addressLabel: { - ...Typography.bodySmall, - color: DfxColors.textSecondary, - fontWeight: '600', - textTransform: 'uppercase', - letterSpacing: 1, - }, - addressText: { - ...Typography.bodyLarge, - color: DfxColors.text, - fontFamily: 'monospace', - fontWeight: '500', - textAlign: 'center', - }, - copyBadge: { - marginTop: 4, - paddingHorizontal: 20, - paddingVertical: 8, - backgroundColor: DfxColors.primaryLight, - borderRadius: 12, - }, - copyText: { - ...Typography.bodyMedium, - color: DfxColors.primary, - fontWeight: '700', - }, - bg: { - flex: 1, - backgroundColor: DfxColors.background, - }, - safeArea: { - flex: 1, - }, - segmentedWrapper: { - paddingHorizontal: 16, - paddingVertical: 12, - }, - segmented: { - flexDirection: 'row', - backgroundColor: DfxColors.surface, - borderRadius: 12, - padding: 4, - }, - segment: { - flex: 1, - height: 36, - borderRadius: 8, - alignItems: 'center', - justifyContent: 'center', - }, - segmentActive: { - backgroundColor: DfxColors.primary, - }, - segmentText: { - ...Typography.bodySmall, - fontWeight: '600', - color: DfxColors.textSecondary, - lineHeight: 16, - includeFontPadding: false, - textAlignVertical: 'center', - }, - segmentTextActive: { - color: DfxColors.white, - }, - loadingContainer: { - flex: 1, - alignItems: 'center', - justifyContent: 'center', - }, - emptyState: { - flex: 1, - alignItems: 'center', - justifyContent: 'center', - padding: 24, - }, - emptyText: { - ...Typography.bodyMedium, - color: DfxColors.textTertiary, - }, - scroll: { - flex: 1, - }, - txList: { - paddingHorizontal: 20, - paddingTop: 4, - paddingBottom: 32, - gap: 4, - }, - txItem: { - flexDirection: 'row', - alignItems: 'center', - paddingVertical: 12, - paddingHorizontal: 4, - gap: 12, - }, - txItemPressed: { - opacity: 0.6, - }, - txIcon: { - width: 36, - height: 36, - borderRadius: 18, - alignItems: 'center', - justifyContent: 'center', - }, - txInfo: { - flex: 1, - gap: 2, - }, - txType: { - ...Typography.bodyLarge, - fontWeight: '600', - color: DfxColors.text, - }, - txDate: { - ...Typography.bodySmall, - color: DfxColors.textTertiary, - }, - txAmountColumn: { - alignItems: 'flex-end', - gap: 2, - minWidth: 110, - }, - txAmount: { - ...Typography.bodyMedium, - fontWeight: '600', - }, - txState: { - ...Typography.bodySmall, - fontWeight: '500', - }, -}); +import { FEATURES } from '@/config/features'; + +/** + * Transaction-history list route. Loads the DFX transaction service + * and renders typed Buy/Sell/Send/Receive/Swap rows. With + * `EXPO_PUBLIC_ENABLE_TX_HISTORY` off, resolves to a `` stub. + */ +const TxHistoryListScreen = FEATURES.TX_HISTORY + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/tx-history/TxHistoryListScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/tx-history/TxHistoryDisabled').default as React.ComponentType); + +export default TxHistoryListScreen; diff --git a/app/(auth)/wallets/index.tsx b/app/(auth)/wallets/index.tsx new file mode 100644 index 00000000..57691aae --- /dev/null +++ b/app/(auth)/wallets/index.tsx @@ -0,0 +1,9 @@ +import { FEATURES } from '@/config/features'; + +const WalletsScreen = FEATURES.DFX_BACKEND + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/dfx-backend/screens/WalletsScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/dfx-backend/screens/DfxBackendDisabled').default as React.ComponentType); + +export default WalletsScreen; diff --git a/app/(auth)/webview.tsx b/app/(auth)/webview.tsx index 9ac33720..07196b72 100644 --- a/app/(auth)/webview.tsx +++ b/app/(auth)/webview.tsx @@ -1,59 +1,16 @@ -import { Pressable, StyleSheet, Text, View } from 'react-native'; -import { useLocalSearchParams, useRouter } from 'expo-router'; -import { WebView } from 'react-native-webview'; -import { ScreenContainer } from '@/components'; -import { DfxColors, Typography } from '@/theme'; +import { FEATURES } from '@/config/features'; /** - * Generic WebView screen for opening external URLs (KYC ident, legal docs, etc.) - * Usage: router.push({ pathname: '/(auth)/webview', params: { url, title } }) + * In-app WebView route. Loads external URLs (KYC iframe, payment + * hand-off) inside a `` gated by the `safe-url` allow-list. + * With `EXPO_PUBLIC_ENABLE_WEBVIEW` off, the route resolves to a tiny + * stub that redirects to the dashboard — keeping `react-native-webview` + * and the host allow-list out of the MVP bundle. */ -export default function WebViewScreen() { - const router = useRouter(); - const { url, title } = useLocalSearchParams<{ url: string; title?: string }>(); +const WebViewScreen = FEATURES.WEBVIEW + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/webview/WebViewScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/webview/WebViewDisabled').default as React.ComponentType); - return ( - - - router.back()}> - {'\u2190'} - - - {title ?? 'DFX'} - - - - - - ); -} - -const styles = StyleSheet.create({ - header: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - paddingHorizontal: 16, - paddingVertical: 8, - }, - backButton: { - fontSize: 24, - color: DfxColors.text, - width: 32, - }, - title: { - ...Typography.bodyLarge, - fontWeight: '600', - color: DfxColors.text, - flex: 1, - textAlign: 'center', - }, - webview: { - flex: 1, - }, -}); +export default WebViewScreen; diff --git a/app/(onboarding)/_layout.tsx b/app/(onboarding)/_layout.tsx index d442c18c..bc25f2f1 100644 --- a/app/(onboarding)/_layout.tsx +++ b/app/(onboarding)/_layout.tsx @@ -1,12 +1,34 @@ -import { Stack } from 'expo-router'; -import { DfxColors } from '@/theme'; +import { Redirect, Stack, useSegments } from 'expo-router'; +import { useWalletManager } from '@tetherto/wdk-react-native-core'; +import { useAuthStore } from '@/store'; +import { useColors } from '@/theme'; export default function OnboardingLayout() { + const colors = useColors(); + const segments = useSegments(); + const { isOnboarded, isAuthenticated } = useAuthStore(); + const { activeWalletId } = useWalletManager(); + const currentScreen = segments.at(-1); + const isOnboardingRoute = segments[0] === '(onboarding)'; + + if (isOnboardingRoute && isOnboarded && currentScreen !== 'legal-disclaimer') { + return ; + } + + if ( + isOnboardingRoute && + activeWalletId && + currentScreen !== 'setup-pin' && + currentScreen !== 'legal-disclaimer' + ) { + return ; + } + return ( { - setIsCreating(true); - try { - const { prfOutput, credentialId } = await createPasskey(); - await setupPasskeyWallet(prfOutput, credentialId, async (mnemonic) => { - await restoreWallet(mnemonic, 'default'); - }); - - void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); - router.push('/(onboarding)/setup-pin'); - } catch (error) { - console.warn('create-passkey: setup failed', error); - void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error); - if (error instanceof PasskeyPrfUnsupportedError) { - const provider = Platform.select({ - ios: 'iCloud Keychain', - default: 'Google Password Manager', - }); - Alert.alert(t('common.error'), t('passkey.prfUnsupported', { provider }), [ - { text: t('common.retry'), style: 'cancel' }, - { - text: t('passkey.useSeedInstead'), - onPress: () => router.replace('/(onboarding)/create-wallet'), - }, - ]); - } else { - Alert.alert(t('common.error'), t('passkey.createError')); - } - } finally { - setIsCreating(false); - } - }; - - return ( - - - {t('passkey.createTitle')} - {t('passkey.createDescription')} - - - - 1 - {t('passkey.step1')} - - - 2 - {t('passkey.step2')} - - - 3 - {t('passkey.step3')} - - - - - {t('passkey.backupWarning')} - - - - - - - - ); -} - -const styles = StyleSheet.create({ - content: { - flex: 1, - paddingVertical: 24, - gap: 24, - }, - title: { - ...Typography.headlineMedium, - color: DfxColors.text, - }, - description: { - ...Typography.bodyLarge, - color: DfxColors.textSecondary, - }, - infoContainer: { - gap: 16, - }, - infoItem: { - flexDirection: 'row', - alignItems: 'center', - gap: 16, - backgroundColor: DfxColors.surface, - borderRadius: 12, - padding: 16, - }, - infoIcon: { - ...Typography.headlineSmall, - color: DfxColors.primary, - width: 32, - height: 32, - textAlign: 'center', - lineHeight: 32, - backgroundColor: DfxColors.surfaceLight, - borderRadius: 16, - overflow: 'hidden', - }, - infoText: { - ...Typography.bodyMedium, - color: DfxColors.text, - flex: 1, - }, - warningContainer: { - backgroundColor: DfxColors.surface, - borderRadius: 12, - borderWidth: 1, - borderColor: DfxColors.warning, - padding: 16, - }, - warningText: { - ...Typography.bodyMedium, - color: DfxColors.warning, - }, - spacer: { - flex: 1, - }, -}); +import { FEATURES } from '@/config/features'; + +/** + * Passkey create route entry. With `EXPO_PUBLIC_ENABLE_PASSKEY` off + * the welcome screen hides the passkey button, so this route is + * unreachable from the UI. The disabled stub stays as a safety net for + * deep-link / file-system entry. + * + * Pulls in `react-native-passkey`, HKDF derivation and the WDK + * `restoreWallet` import only when the flag is on. + */ +const CreatePasskeyScreen = FEATURES.PASSKEY + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/passkey/CreatePasskeyScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/passkey/PasskeyDisabled').default as React.ComponentType); + +export default CreatePasskeyScreen; diff --git a/app/(onboarding)/create-wallet.tsx b/app/(onboarding)/create-wallet.tsx index 7a668ac3..bd84aafb 100644 --- a/app/(onboarding)/create-wallet.tsx +++ b/app/(onboarding)/create-wallet.tsx @@ -1,16 +1,27 @@ -import { useState } from 'react'; +import { useMemo, useState } from 'react'; import { Pressable, StyleSheet, Text, View } from 'react-native'; import { useRouter } from 'expo-router'; import { useTranslation } from 'react-i18next'; import * as Clipboard from 'expo-clipboard'; import * as Haptics from 'expo-haptics'; import { useWalletManager } from '@tetherto/wdk-react-native-core'; -import { ScreenContainer, PrimaryButton } from '@/components'; +import { + AppHeader, + DfxBackgroundScreen, + OnboardingStepIndicator, + PrimaryButton, +} from '@/components'; import { generateSeedPhrase, wordsToSeed } from '@/services/wallet'; -import { DfxColors, Typography } from '@/theme'; +import { Typography, useColors, type ThemeColors } from '@/theme'; + +function isWalletAlreadyExistsError(err: unknown): boolean { + return err instanceof Error && err.message.toLowerCase().includes('already exists'); +} export default function CreateWalletScreen() { const router = useRouter(); + const colors = useColors(); + const styles = useMemo(() => makeStyles(colors), [colors]); const { t } = useTranslation(); const [seedWords] = useState(() => generateSeedPhrase(12)); const [revealed, setRevealed] = useState(false); @@ -30,14 +41,21 @@ export default function CreateWalletScreen() { setTimeout(() => setCopied(false), 2000); }; - const { restoreWallet } = useWalletManager(); + const { restoreWallet, deleteWallet } = useWalletManager(); const handleContinue = async () => { setIsCreating(true); setError(null); try { const seed = wordsToSeed(seedWords); - await restoreWallet(seed, 'default'); + try { + await restoreWallet(seed, 'default'); + } catch (err) { + if (!isWalletAlreadyExistsError(err)) throw err; + + await deleteWallet('default'); + await restoreWallet(seed, 'default'); + } router.push('/(onboarding)/setup-pin'); } catch (err) { console.warn('create-wallet: failed to create wallet', err); @@ -49,21 +67,30 @@ export default function CreateWalletScreen() { }; return ( - - - {t('onboarding.createWallet')} - - Write down your seed phrase and store it in a safe place. This is the only way to recover - your wallet. - + + + router.canGoBack() ? router.back() : router.replace('/(onboarding)/welcome') + } + testID="create-wallet" + /> + + + {t('onboarding.seedDescription')} + {t('onboarding.seedBackupWarning')} + + + {!revealed ? ( - Tap to reveal seed phrase + {t('onboarding.seedReveal')} + {t('onboarding.seedRevealHint')} ) : ( <> @@ -85,94 +112,116 @@ export default function CreateWalletScreen() { style={styles.copyButton} onPress={handleCopy} > - {copied ? 'Copied!' : 'Copy to clipboard'} + + {copied ? t('onboarding.seedCopied') : t('onboarding.seedCopy')} + )} + - {error && {error}} + {error && {error}} - + - - - + + ); } -const styles = StyleSheet.create({ - content: { - flex: 1, - paddingVertical: 24, - gap: 24, - }, - title: { - ...Typography.headlineMedium, - color: DfxColors.text, - }, - description: { - ...Typography.bodyLarge, - color: DfxColors.textSecondary, - }, - revealButton: { - padding: 48, - borderRadius: 16, - backgroundColor: DfxColors.surface, - borderWidth: 1, - borderColor: DfxColors.border, - borderStyle: 'dashed', - alignItems: 'center', - justifyContent: 'center', - }, - revealText: { - ...Typography.bodyLarge, - color: DfxColors.primary, - fontWeight: '600', - }, - seedContainer: { - flexDirection: 'row', - flexWrap: 'wrap', - gap: 8, - }, - wordCard: { - flexDirection: 'row', - alignItems: 'center', - backgroundColor: DfxColors.surface, - borderRadius: 12, - paddingHorizontal: 12, - paddingVertical: 10, - gap: 6, - minWidth: '30%', - }, - wordIndex: { - ...Typography.bodySmall, - color: DfxColors.textTertiary, - width: 24, - }, - word: { - ...Typography.bodyMedium, - color: DfxColors.text, - }, - copyButton: { - alignSelf: 'center', - paddingVertical: 8, - paddingHorizontal: 16, - }, - copyText: { - ...Typography.bodySmall, - color: DfxColors.primary, - }, - error: { - ...Typography.bodyMedium, - color: DfxColors.error, - }, - spacer: { - flex: 1, - }, -}); +const makeStyles = (colors: ThemeColors) => + StyleSheet.create({ + content: { + paddingTop: 4, + paddingBottom: 24, + gap: 24, + }, + intro: { + gap: 12, + }, + description: { + ...Typography.bodyLarge, + color: colors.textSecondary, + textAlign: 'center', + }, + warning: { + ...Typography.bodyMedium, + color: colors.text, + textAlign: 'center', + }, + seedCard: { + backgroundColor: colors.cardOverlay, + borderRadius: 12, + borderWidth: 1, + borderColor: colors.border, + padding: 16, + }, + revealButton: { + minHeight: 168, + borderRadius: 8, + backgroundColor: colors.surfaceLight, + borderWidth: 1, + borderColor: colors.border, + borderStyle: 'dashed', + alignItems: 'center', + justifyContent: 'center', + padding: 24, + gap: 8, + }, + revealText: { + ...Typography.bodyLarge, + color: colors.primary, + fontWeight: '600', + }, + revealHint: { + ...Typography.bodyMedium, + color: colors.textSecondary, + textAlign: 'center', + }, + seedContainer: { + flexDirection: 'row', + flexWrap: 'wrap', + gap: 8, + }, + wordCard: { + flexDirection: 'row', + alignItems: 'center', + backgroundColor: colors.surfaceLight, + borderRadius: 8, + paddingHorizontal: 12, + paddingVertical: 10, + gap: 6, + width: '31%', + }, + wordIndex: { + ...Typography.bodySmall, + color: colors.textTertiary, + width: 24, + }, + word: { + ...Typography.bodyMedium, + color: colors.text, + }, + copyButton: { + alignSelf: 'center', + paddingVertical: 8, + paddingHorizontal: 16, + }, + copyText: { + ...Typography.bodySmall, + color: colors.primary, + }, + error: { + ...Typography.bodyMedium, + color: colors.error, + }, + spacer: { + flex: 1, + }, + }); diff --git a/app/(onboarding)/legal-disclaimer.tsx b/app/(onboarding)/legal-disclaimer.tsx index ae432003..3737e94c 100644 --- a/app/(onboarding)/legal-disclaimer.tsx +++ b/app/(onboarding)/legal-disclaimer.tsx @@ -1,138 +1,16 @@ -import { useState } from 'react'; -import { Linking, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native'; -import { useRouter } from 'expo-router'; -import { PrimaryButton, ScreenContainer } from '@/components'; -import { DfxColors, Typography } from '@/theme'; - -const LEGAL_LINKS = [ - { label: 'Terms of Service', url: 'https://docs.dfx.swiss/en/tnc.html' }, - { label: 'Privacy Policy', url: 'https://docs.dfx.swiss/en/privacy.html' }, - { label: 'Disclaimer', url: 'https://docs.dfx.swiss/en/disclaimer.html' }, -]; - -export default function LegalDisclaimerScreen() { - const router = useRouter(); - const [accepted, setAccepted] = useState(false); - - return ( - - - Legal Information - - - - DFX AG is a Swiss company regulated by VQF (self-regulatory organization recognized by - FINMA). By using this app, you agree to the following terms and conditions. - - - - DFX Wallet is a non-custodial wallet. You are solely responsible for securing your seed - phrase and PIN. DFX AG has no access to your private keys and cannot recover your wallet - if you lose your seed phrase. - - - - Cryptocurrency transactions are irreversible. Please ensure all transaction details are - correct before confirming. DFX AG is not responsible for losses due to user error, - including sending assets to incorrect addresses. - - - - KYC (Know Your Customer) verification is required for certain transaction limits as - mandated by Swiss anti-money laundering regulations. - - - - {LEGAL_LINKS.map((link) => ( - Linking.openURL(link.url)}> - {link.label} - - ))} - - - - setAccepted(!accepted)} - > - - {accepted && {'\u2713'}} - - - I have read and agree to the Terms of Service, Privacy Policy, and Disclaimer. - - - - router.replace('/(auth)/(tabs)/dashboard')} - disabled={!accepted} - /> - - - ); -} - -const styles = StyleSheet.create({ - content: { - flex: 1, - paddingVertical: 24, - gap: 20, - }, - title: { - ...Typography.headlineMedium, - color: DfxColors.text, - }, - scrollContent: { - flex: 1, - }, - paragraph: { - ...Typography.bodyMedium, - color: DfxColors.textSecondary, - marginBottom: 16, - lineHeight: 22, - }, - links: { - gap: 12, - marginTop: 8, - }, - link: { - ...Typography.bodyMedium, - color: DfxColors.primary, - fontWeight: '600', - textDecorationLine: 'underline', - }, - checkboxRow: { - flexDirection: 'row', - alignItems: 'flex-start', - gap: 12, - paddingVertical: 8, - }, - checkbox: { - width: 24, - height: 24, - borderRadius: 6, - borderWidth: 2, - borderColor: DfxColors.textTertiary, - alignItems: 'center', - justifyContent: 'center', - marginTop: 2, - }, - checkboxChecked: { - backgroundColor: DfxColors.primary, - borderColor: DfxColors.primary, - }, - checkmark: { - color: DfxColors.white, - fontSize: 14, - fontWeight: '700', - }, - checkboxLabel: { - ...Typography.bodySmall, - color: DfxColors.textSecondary, - flex: 1, - lineHeight: 20, - }, -}); +import { FEATURES } from '@/config/features'; + +/** + * Onboarding legal-disclaimer route. With `EXPO_PUBLIC_ENABLE_LEGAL` + * off, the onboarding flow in `setup-pin.tsx` skips this screen + * entirely. The wrapper is here as the file-system entry Expo Router + * needs, plus a safety net for any code path that hard-references the + * route (the disabled stub just redirects to the dashboard). + */ +const LegalDisclaimerScreen = FEATURES.LEGAL + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/legal/LegalDisclaimerScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/legal/LegalDisabled').default as React.ComponentType); + +export default LegalDisclaimerScreen; diff --git a/app/(onboarding)/restore-passkey.tsx b/app/(onboarding)/restore-passkey.tsx index b68d645c..a02bf41d 100644 --- a/app/(onboarding)/restore-passkey.tsx +++ b/app/(onboarding)/restore-passkey.tsx @@ -1,96 +1,14 @@ -import { useState } from 'react'; -import { Alert, Platform, StyleSheet, Text, View } from 'react-native'; -import { useRouter } from 'expo-router'; -import { useTranslation } from 'react-i18next'; -import * as Haptics from 'expo-haptics'; -import { useWalletManager } from '@tetherto/wdk-react-native-core'; -import { ScreenContainer, PrimaryButton } from '@/components'; -import { - authenticatePasskey, - setupPasskeyWallet, - PasskeyPrfUnsupportedError, -} from '@/services/passkey'; -import { DfxColors, Typography } from '@/theme'; - -export default function RestorePasskeyScreen() { - const router = useRouter(); - const { t } = useTranslation(); - const { restoreWallet } = useWalletManager(); - const [isRestoring, setIsRestoring] = useState(false); - - const handleRestore = async () => { - setIsRestoring(true); - try { - const { prfOutput, credentialId } = await authenticatePasskey(); - await setupPasskeyWallet(prfOutput, credentialId, async (mnemonic) => { - await restoreWallet(mnemonic, 'default'); - }); - - void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); - router.push('/(onboarding)/setup-pin'); - } catch (error) { - console.warn('restore-passkey: restore failed', error); - void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error); - if (error instanceof PasskeyPrfUnsupportedError) { - const provider = Platform.select({ - ios: 'iCloud Keychain', - default: 'Google Password Manager', - }); - Alert.alert(t('common.error'), t('passkey.prfUnsupported', { provider })); - } else { - Alert.alert(t('common.error'), t('passkey.restoreError')); - } - } finally { - setIsRestoring(false); - } - }; - - return ( - - - {t('passkey.restoreTitle')} - {t('passkey.restoreDescription')} - - - {t('passkey.restoreInfo')} - - - - - - - - ); -} - -const styles = StyleSheet.create({ - content: { - flex: 1, - paddingVertical: 24, - gap: 24, - }, - title: { - ...Typography.headlineMedium, - color: DfxColors.text, - }, - description: { - ...Typography.bodyLarge, - color: DfxColors.textSecondary, - }, - infoContainer: { - backgroundColor: DfxColors.surface, - borderRadius: 12, - padding: 16, - }, - infoText: { - ...Typography.bodyMedium, - color: DfxColors.textSecondary, - }, - spacer: { - flex: 1, - }, -}); +import { FEATURES } from '@/config/features'; + +/** + * Passkey restore route entry. Companion to `create-passkey.tsx`; both + * routes are gated by the same flag and share the disabled-path + * component. + */ +const RestorePasskeyScreen = FEATURES.PASSKEY + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/passkey/RestorePasskeyScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/passkey/PasskeyDisabled').default as React.ComponentType); + +export default RestorePasskeyScreen; diff --git a/app/(onboarding)/restore-wallet.tsx b/app/(onboarding)/restore-wallet.tsx index de7e63e5..8bb8936c 100644 --- a/app/(onboarding)/restore-wallet.tsx +++ b/app/(onboarding)/restore-wallet.tsx @@ -1,133 +1,15 @@ -import { useState } from 'react'; -import { StyleSheet, Text, TextInput, View } from 'react-native'; -import { useRouter } from 'expo-router'; -import { useTranslation } from 'react-i18next'; -import * as Haptics from 'expo-haptics'; -import { useWalletManager } from '@tetherto/wdk-react-native-core'; -import { ScreenContainer, PrimaryButton } from '@/components'; -import { validateSeedPhrase, seedToWords, wordsToSeed } from '@/services/wallet'; -import { DfxColors, Typography } from '@/theme'; - -export default function RestoreWalletScreen() { - const router = useRouter(); - const { restoreWallet } = useWalletManager(); - const { t } = useTranslation(); - const [seedPhrase, setSeedPhrase] = useState(''); - const [error, setError] = useState(null); - const [isRestoring, setIsRestoring] = useState(false); - - const words = seedToWords(seedPhrase); - const isValid = validateSeedPhrase(words); - const wordCount = words.length; - - const handleContinue = async () => { - if (!isValid) { - setError(t('onboarding.invalidSeed')); - void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error); - return; - } - - setIsRestoring(true); - setError(null); - try { - const seed = wordsToSeed(words); - await restoreWallet(seed, 'default'); - void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); - router.push('/(onboarding)/setup-pin'); - } catch (err) { - console.warn('restore-wallet: failed to restore', err); - void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error); - setError(t('onboarding.restoreError')); - } finally { - setIsRestoring(false); - } - }; - - return ( - - - {t('onboarding.restoreWallet')} - - Enter your 12 or 24 word seed phrase to restore your wallet. - - - - { - setSeedPhrase(text); - setError(null); - }} - placeholder="Enter seed phrase..." - placeholderTextColor={DfxColors.textTertiary} - multiline - autoCapitalize="none" - autoCorrect={false} - autoComplete="off" - /> - - {wordCount} / {wordCount > 12 ? 24 : 12} words - - - - {error && ( - - {error} - - )} - - - - - - - ); -} - -const styles = StyleSheet.create({ - content: { - flex: 1, - paddingVertical: 24, - gap: 24, - }, - title: { - ...Typography.headlineMedium, - color: DfxColors.text, - }, - description: { - ...Typography.bodyLarge, - color: DfxColors.textSecondary, - }, - inputContainer: { - gap: 8, - }, - input: { - backgroundColor: DfxColors.surface, - borderRadius: 16, - padding: 16, - minHeight: 140, - color: DfxColors.text, - ...Typography.bodyLarge, - textAlignVertical: 'top', - }, - wordCount: { - ...Typography.bodySmall, - color: DfxColors.textTertiary, - textAlign: 'right', - }, - error: { - ...Typography.bodyMedium, - color: DfxColors.error, - }, - spacer: { - flex: 1, - }, -}); +import { FEATURES } from '@/config/features'; + +/** + * Restore-wallet route entry. With `EXPO_PUBLIC_ENABLE_RESTORE` off, + * the welcome screen hides the "restore from seed" affordance, so this + * route is unreachable from the UI. The disabled stub stays here as a + * safety net for deep-links and a future-proof file-system entry. + */ +const RestoreWalletScreen = FEATURES.RESTORE + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/restore/RestoreWalletScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/restore/RestoreDisabled').default as React.ComponentType); + +export default RestoreWalletScreen; diff --git a/app/(onboarding)/setup-pin.tsx b/app/(onboarding)/setup-pin.tsx index 2fdb17f0..bd6471f8 100644 --- a/app/(onboarding)/setup-pin.tsx +++ b/app/(onboarding)/setup-pin.tsx @@ -1,180 +1,16 @@ -import { useState } from 'react'; -import { Pressable, StyleSheet, Text, View } from 'react-native'; -import { useRouter } from 'expo-router'; -import { useTranslation } from 'react-i18next'; -import * as Haptics from 'expo-haptics'; -import { ScreenContainer } from '@/components'; -import { useAuthStore } from '@/store'; -import { DfxColors, Typography } from '@/theme'; - -type SetupError = 'mismatch' | 'save'; - -export default function SetupPinScreen() { - const router = useRouter(); - const { t } = useTranslation(); - const { setPin, setOnboarded, setAuthenticated } = useAuthStore(); - const [pin, setPinValue] = useState(''); - const [step, setStep] = useState<'create' | 'confirm'>('create'); - const [firstPin, setFirstPin] = useState(''); - const [error, setError] = useState(null); - - const handleDigit = (digit: string) => { - setError(null); - const newPin = pin + digit; - if (newPin.length > 6) return; - setPinValue(newPin); - - if (newPin.length === 6) { - if (step === 'create') { - setFirstPin(newPin); - setPinValue(''); - setStep('confirm'); - } else if (newPin === firstPin) { - void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); - void completeSetup(newPin); - } else { - void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error); - setError('mismatch'); - setPinValue(''); - } - } - }; - - const completeSetup = async (pinValue: string) => { - try { - await setPin(pinValue); - await setOnboarded(true); - setAuthenticated(true); - router.replace('/(onboarding)/legal-disclaimer'); - } catch (err) { - console.warn('setup-pin: failed to persist PIN', err); - void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error); - setError('save'); - setPinValue(''); - setFirstPin(''); - setStep('create'); - } - }; - - const handleDelete = () => { - setError(null); - setPinValue(pin.slice(0, -1)); - }; - - return ( - - - {step === 'create' ? 'Create PIN' : 'Confirm PIN'} - - {step === 'create' - ? 'Choose a 6-digit PIN to secure your wallet.' - : 'Enter your PIN again to confirm.'} - - {error && ( - - {error === 'save' ? t('pin.saveError') : t('pin.mismatch')} - - )} - - - {Array.from({ length: 6 }).map((_, i) => ( - - ))} - - - - {['1', '2', '3', '4', '5', '6', '7', '8', '9', '', '0', 'del'].map((key) => { - if (key === '') { - return ; - } - return ( - [styles.numpadKey, pressed && styles.numpadKeyPressed]} - onPress={() => (key === 'del' ? handleDelete() : handleDigit(key))} - android_ripple={{ color: DfxColors.surfaceLight, borderless: false, radius: 36 }} - accessibilityRole="button" - accessibilityLabel={key === 'del' ? 'Delete' : key} - > - {key === 'del' ? '\u232B' : key} - - ); - })} - - - - ); -} - -const styles = StyleSheet.create({ - content: { - flex: 1, - alignItems: 'center', - paddingVertical: 48, - gap: 24, - }, - title: { - ...Typography.headlineMedium, - color: DfxColors.text, - }, - description: { - ...Typography.bodyMedium, - color: DfxColors.textSecondary, - textAlign: 'center', - }, - error: { - ...Typography.bodyMedium, - color: DfxColors.error, - }, - dots: { - flexDirection: 'row', - gap: 16, - marginVertical: 32, - }, - dot: { - width: 16, - height: 16, - borderRadius: 8, - borderWidth: 2, - borderColor: DfxColors.primary, - }, - dotFilled: { - backgroundColor: DfxColors.primary, - }, - dotError: { - borderColor: DfxColors.error, - }, - numpad: { - flexDirection: 'row', - flexWrap: 'wrap', - justifyContent: 'center', - width: 280, - marginTop: 'auto', - }, - numpadKey: { - width: 72, - height: 72, - borderRadius: 36, - margin: 8, - alignItems: 'center', - justifyContent: 'center', - }, - numpadKeyPressed: { - backgroundColor: DfxColors.surfaceLight, - }, - numpadText: { - color: DfxColors.text, - fontSize: 28, - fontWeight: '600', - lineHeight: 32, - textAlign: 'center', - includeFontPadding: false, - }, -}); +import { FEATURES } from '@/config/features'; +import { IS_E2E } from '@/config/e2e'; + +/** + * PIN-setup onboarding route. With `EXPO_PUBLIC_ENABLE_PIN` off the + * disabled stub silently marks onboarding complete and replaces to + * the dashboard — the MVP build does not gate the wallet behind a PIN. + */ +const SetupPinScreen = + FEATURES.PIN && !IS_E2E + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/pin/SetupPinScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/pin/SetupPinDisabled').default as React.ComponentType); + +export default SetupPinScreen; diff --git a/app/(onboarding)/verify-seed.tsx b/app/(onboarding)/verify-seed.tsx index d3aac328..8e7fc980 100644 --- a/app/(onboarding)/verify-seed.tsx +++ b/app/(onboarding)/verify-seed.tsx @@ -1,212 +1,15 @@ -import { useCallback, useState } from 'react'; -import { Pressable, StyleSheet, Text, View } from 'react-native'; -import { useLocalSearchParams, useRouter } from 'expo-router'; -import { useTranslation } from 'react-i18next'; -import * as Haptics from 'expo-haptics'; -import { ScreenContainer, PrimaryButton } from '@/components'; -import { seedToWords } from '@/services/wallet'; -import { DfxColors, Typography } from '@/theme'; - -const VERIFY_COUNT = 4; - -function getRandomIndices(total: number, count: number): number[] { - const indices: number[] = []; - while (indices.length < count) { - const idx = Math.floor(Math.random() * total); - if (!indices.includes(idx)) indices.push(idx); - } - return indices.sort((a, b) => a - b); -} - -export default function VerifySeedScreen() { - const router = useRouter(); - const { t } = useTranslation(); - const { seed } = useLocalSearchParams<{ seed: string }>(); - const seedWords = seedToWords(seed ?? ''); - - const [verifyIndices] = useState(() => getRandomIndices(seedWords.length, VERIFY_COUNT)); - const [currentStep, setCurrentStep] = useState(0); - const [selectedWord, setSelectedWord] = useState(null); - const [error, setError] = useState(false); - - // eslint-disable-next-line security/detect-object-injection -- currentStep is bounded to [0, VERIFY_COUNT) and verifyIndices.length === VERIFY_COUNT - const currentIndex = verifyIndices[currentStep]!; - // eslint-disable-next-line security/detect-object-injection -- currentIndex was generated by getRandomIndices(seedWords.length, ...) so it's a valid seedWords index - const correctWord = seedWords[currentIndex]!; - - const getOptions = useCallback(() => { - const options = [correctWord]; - while (options.length < 4) { - // Random index is in [0, seedWords.length) so the lookup always yields a word. - const randomWord = seedWords[Math.floor(Math.random() * seedWords.length)]!; - if (!options.includes(randomWord)) options.push(randomWord); - } - return options.sort(() => Math.random() - 0.5); - }, [correctWord, seedWords]); - - const [options] = useState(getOptions); - - const handleSelect = (word: string) => { - setSelectedWord(word); - setError(false); - - if (word === correctWord) { - void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); - if (currentStep < VERIFY_COUNT - 1) { - setTimeout(() => { - setCurrentStep((s) => s + 1); - setSelectedWord(null); - }, 500); - } - } else { - void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error); - setError(true); - setTimeout(() => { - setSelectedWord(null); - setError(false); - }, 1000); - } - }; - - const isComplete = currentStep === VERIFY_COUNT - 1 && selectedWord === correctWord; - - return ( - - - {t('onboarding.verifySeed')} - - Select word #{currentIndex + 1} from your seed phrase. - - - - {verifyIndices.map((_, i) => ( - - ))} - - - - Word #{currentIndex + 1} - - - - {options.map((word) => { - const isSelected = selectedWord === word; - const isCorrect = isSelected && word === correctWord; - const isWrong = isSelected && error; - - return ( - handleSelect(word)} - disabled={selectedWord !== null} - > - - {word} - - - ); - })} - - - - - router.push('/(onboarding)/setup-pin')} - disabled={!isComplete} - /> - - - ); -} - -const styles = StyleSheet.create({ - content: { - flex: 1, - paddingVertical: 24, - gap: 24, - }, - title: { - ...Typography.headlineMedium, - color: DfxColors.text, - }, - description: { - ...Typography.bodyLarge, - color: DfxColors.textSecondary, - }, - progress: { - flexDirection: 'row', - gap: 8, - justifyContent: 'center', - }, - progressDot: { - width: 32, - height: 4, - borderRadius: 2, - backgroundColor: DfxColors.surfaceLight, - }, - progressComplete: { - backgroundColor: DfxColors.success, - }, - progressActive: { - backgroundColor: DfxColors.primary, - }, - wordNumber: { - alignSelf: 'center', - backgroundColor: DfxColors.surface, - paddingHorizontal: 20, - paddingVertical: 12, - borderRadius: 24, - }, - wordNumberText: { - ...Typography.headlineSmall, - color: DfxColors.text, - }, - options: { - gap: 12, - }, - option: { - padding: 16, - borderRadius: 12, - backgroundColor: DfxColors.surface, - alignItems: 'center', - }, - optionCorrect: { - backgroundColor: DfxColors.success, - }, - optionError: { - backgroundColor: DfxColors.error, - }, - optionText: { - ...Typography.bodyLarge, - color: DfxColors.text, - fontWeight: '600', - }, - optionTextCorrect: { - color: DfxColors.black, - }, - optionTextError: { - color: DfxColors.white, - }, - spacer: { - flex: 1, - }, -}); +import { FEATURES } from '@/config/features'; + +/** + * Verify-seed (post-create quiz) route. Currently not part of the + * active onboarding flow — `create-wallet.tsx` jumps straight to + * `setup-pin`, so this screen is only reachable via deep-link. Still + * deferred for code-isolation regardless. + */ +const VerifySeedScreen = FEATURES.RESTORE + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/restore/VerifySeedScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/restore/RestoreDisabled').default as React.ComponentType); + +export default VerifySeedScreen; diff --git a/app/(onboarding)/welcome.tsx b/app/(onboarding)/welcome.tsx index 9dbb3e4d..0e4ef955 100644 --- a/app/(onboarding)/welcome.tsx +++ b/app/(onboarding)/welcome.tsx @@ -1,122 +1,170 @@ -import { useState } from 'react'; -import { Image, Pressable, StyleSheet, Text, View } from 'react-native'; +import { useMemo, useState } from 'react'; +import { Pressable, StyleSheet, Text, View } from 'react-native'; import { useRouter } from 'expo-router'; import { useTranslation } from 'react-i18next'; -import { ScreenContainer, PrimaryButton } from '@/components'; -import { isPasskeySupported } from '@/services/passkey'; -import { DfxColors, Typography } from '@/theme'; +import { BrandLogo, DfxBackgroundScreen, Icon, PrimaryButton } from '@/components'; +import { FEATURES } from '@/config/features'; +import { isPasskeyOsSupported } from '@/config/platform'; +import { Typography, useColors, type ThemeColors } from '@/theme'; export default function WelcomeScreen() { const router = useRouter(); + const colors = useColors(); + const styles = useMemo(() => makeStyles(colors), [colors]); const { t } = useTranslation(); const [showRestore, setShowRestore] = useState(false); - const passkeySupported = isPasskeySupported(); + // Passkey support is the AND of an OS gate (iOS 18+ / Android 14+) + // and the build-time flag — either being off removes the affordance. + const passkeySupported = FEATURES.PASSKEY && isPasskeyOsSupported(); + // The restore toggle is the gateway to both seed-restore and + // passkey-restore; hide it when neither flag is on, so users do not + // see a control that opens an empty menu. + const showRestoreToggle = FEATURES.RESTORE || passkeySupported; + + const handleBack = () => { + if (router.canGoBack()) router.back(); + else router.replace('/'); + }; return ( - - - - - {t('onboarding.title')} - {t('onboarding.subtitle')} - + + + [styles.backButton, pressed && styles.pressed]} + accessibilityRole="button" + accessibilityLabel="Back" + testID="welcome-back-button" + > + + + + + + + {t('onboarding.title')} + {t('onboarding.subtitle')} + - - {passkeySupported && ( - router.push('/(onboarding)/create-passkey')} - testID="welcome-create-passkey-button" - /> - )} + + {passkeySupported && ( router.push('/(onboarding)/create-wallet')} - {...(passkeySupported ? { variant: 'outlined' as const } : {})} + title={t('onboarding.createPasskey')} + onPress={() => router.push('/(onboarding)/create-passkey')} + testID="welcome-create-passkey-button" /> + )} + router.push('/(onboarding)/create-wallet')} + {...(passkeySupported ? { variant: 'outlined' as const } : {})} + /> - setShowRestore(!showRestore)}> - {t('onboarding.restoreWallet')} - + {showRestoreToggle && ( + <> + setShowRestore(!showRestore)}> + {t('onboarding.restoreWallet')} + - {showRestore && ( - - {passkeySupported && ( - [styles.restoreOption, pressed && styles.pressed]} - onPress={() => router.push('/(onboarding)/restore-passkey')} - > - {t('onboarding.restorePasskey')} - - )} - [styles.restoreOption, pressed && styles.pressed]} - onPress={() => router.push('/(onboarding)/restore-wallet')} - > - {t('onboarding.restoreSeed')} - - - )} - + {showRestore && ( + + {passkeySupported && ( + [styles.restoreOption, pressed && styles.pressed]} + onPress={() => router.push('/(onboarding)/restore-passkey')} + > + {t('onboarding.restorePasskey')} + + )} + {FEATURES.RESTORE && ( + [styles.restoreOption, pressed && styles.pressed]} + onPress={() => router.push('/(onboarding)/restore-wallet')} + > + {t('onboarding.restoreSeed')} + + )} + + )} + + )} - + ); } -const styles = StyleSheet.create({ - content: { - flex: 1, - justifyContent: 'space-between', - paddingVertical: 48, - }, - header: { - flex: 1, - alignItems: 'center', - justifyContent: 'center', - gap: 16, - }, - logo: { - width: 96, - height: 96, - marginBottom: 24, - }, - title: { - ...Typography.headlineLarge, - color: DfxColors.text, - textAlign: 'center', - }, - subtitle: { - ...Typography.bodyLarge, - color: DfxColors.textSecondary, - textAlign: 'center', - }, - actions: { - gap: 16, - }, - restoreToggle: { - ...Typography.bodyLarge, - color: DfxColors.primary, - textAlign: 'center', - paddingVertical: 8, - }, - restoreOptions: { - gap: 8, - }, - restoreOption: { - paddingVertical: 14, - paddingHorizontal: 16, - backgroundColor: DfxColors.surface, - borderRadius: 12, - }, - pressed: { - opacity: 0.7, - }, - restoreOptionText: { - ...Typography.bodyLarge, - color: DfxColors.text, - textAlign: 'center', - }, -}); +const makeStyles = (colors: ThemeColors) => + StyleSheet.create({ + content: { + justifyContent: 'space-between', + paddingTop: 4, + paddingBottom: 16, + }, + topBar: { + height: 44, + justifyContent: 'center', + }, + backButton: { + width: 40, + height: 40, + borderRadius: 12, + alignItems: 'center', + justifyContent: 'center', + backgroundColor: colors.cardOverlay, + borderWidth: 1, + borderColor: colors.border, + }, + header: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + gap: 12, + paddingBottom: 24, + }, + logo: { + marginBottom: 20, + }, + title: { + ...Typography.headlineMedium, + color: colors.text, + textAlign: 'center', + }, + subtitle: { + ...Typography.bodyLarge, + color: colors.textSecondary, + textAlign: 'center', + }, + actions: { + gap: 14, + }, + restoreToggle: { + ...Typography.bodyLarge, + color: colors.primary, + textAlign: 'center', + paddingVertical: 10, + fontWeight: '500', + }, + restoreOptions: { + gap: 8, + }, + restoreOption: { + paddingVertical: 16, + paddingHorizontal: 16, + backgroundColor: colors.cardOverlay, + borderRadius: 12, + borderWidth: 1, + borderColor: colors.border, + }, + pressed: { + opacity: 0.7, + }, + restoreOptionText: { + ...Typography.bodyLarge, + color: colors.text, + textAlign: 'center', + }, + }); diff --git a/app/(pin)/_layout.tsx b/app/(pin)/_layout.tsx index 81c3b741..8fa97430 100644 --- a/app/(pin)/_layout.tsx +++ b/app/(pin)/_layout.tsx @@ -1,12 +1,13 @@ import { Stack } from 'expo-router'; -import { DfxColors } from '@/theme'; +import { useColors } from '@/theme'; export default function PinLayout() { + const colors = useColors(); return ( diff --git a/app/(pin)/verify.tsx b/app/(pin)/verify.tsx index 64d00181..2531f55b 100644 --- a/app/(pin)/verify.tsx +++ b/app/(pin)/verify.tsx @@ -1,240 +1,15 @@ -import { useCallback, useEffect, useState } from 'react'; -import { Pressable, StyleSheet, Text, View } from 'react-native'; -import { useRouter } from 'expo-router'; -import * as Haptics from 'expo-haptics'; -import { useWalletManager, useWdkApp } from '@tetherto/wdk-react-native-core'; -import { ScreenContainer } from '@/components'; -import { useAuthStore } from '@/store'; -import { DfxColors, Typography } from '@/theme'; - -const MAX_ATTEMPTS = 5; - -export default function VerifyPinScreen() { - const router = useRouter(); - const { verifyPin, setAuthenticated, authenticateBiometric, biometricEnabled } = useAuthStore(); - const { unlock } = useWalletManager(); - const { state } = useWdkApp(); - const [pin, setPinValue] = useState(''); - const [error, setError] = useState(false); - const [attempts, setAttempts] = useState(0); - - const goToDashboard = useCallback(() => { - router.replace('/(auth)/(tabs)/dashboard'); - }, [router]); - - const unlockWallet = useCallback(async () => { - try { - await unlock('default'); - } catch { - // WdkAppProvider exposes the error; user can retry from settings. - } - }, [unlock]); - - const tryBiometric = useCallback(async () => { - try { - const success = await authenticateBiometric(); - if (success) { - void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); - setAuthenticated(true); - await unlockWallet(); - } - } catch (err) { - console.warn('verify: biometric authentication failed', err); - } - }, [authenticateBiometric, setAuthenticated, unlockWallet]); - - useEffect(() => { - if (biometricEnabled) { - void tryBiometric(); - } - }, [biometricEnabled, tryBiometric]); - - useEffect(() => { - if (state.status === 'READY') { - goToDashboard(); - } - }, [state.status, goToDashboard]); - - const handleDigit = (digit: string) => { - setError(false); - const newPin = pin + digit; - if (newPin.length > 6) return; - setPinValue(newPin); - - if (newPin.length === 6) { - void checkPin(newPin); - } - }; - - const checkPin = async (pinValue: string) => { - try { - const isValid = await verifyPin(pinValue); - if (isValid) { - void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); - setAuthenticated(true); - await unlockWallet(); - return; - } - } catch (err) { - console.warn('verify: PIN verification threw', err); - // Fall through to the error path so the user sees the same UI feedback - // as a wrong PIN; the alternative would be a silent crash. - } - void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error); - setError(true); - setAttempts((a) => a + 1); - setPinValue(''); - }; - - const handleDelete = () => { - setError(false); - setPinValue(pin.slice(0, -1)); - }; - - const isLocked = attempts >= MAX_ATTEMPTS; - - return ( - - - Enter PIN - - {isLocked ? ( - - Too many failed attempts. Please restart the app. - - ) : ( - <> - {error && ( - - Incorrect PIN. {MAX_ATTEMPTS - attempts} attempts remaining. - - )} - - - {Array.from({ length: 6 }).map((_, i) => ( - - ))} - - - - {['1', '2', '3', '4', '5', '6', '7', '8', '9', '', '0', 'del'].map((key) => { - if (key === '') { - return ; - } - return ( - [styles.numpadKey, pressed && styles.numpadKeyPressed]} - disabled={isLocked} - onPress={() => (key === 'del' ? handleDelete() : handleDigit(key))} - android_ripple={{ - color: DfxColors.surfaceLight, - borderless: false, - radius: 36, - }} - accessibilityRole="button" - accessibilityLabel={key === 'del' ? 'Delete' : key} - > - {key === 'del' ? '\u232B' : key} - - ); - })} - - - {biometricEnabled && ( - - Use Biometric - - )} - - )} - - - ); -} - -const styles = StyleSheet.create({ - content: { - flex: 1, - alignItems: 'center', - paddingVertical: 48, - gap: 24, - }, - title: { - ...Typography.headlineMedium, - color: DfxColors.text, - }, - error: { - ...Typography.bodyMedium, - color: DfxColors.error, - textAlign: 'center', - }, - locked: { - ...Typography.bodyLarge, - color: DfxColors.error, - textAlign: 'center', - paddingHorizontal: 32, - marginTop: 48, - }, - dots: { - flexDirection: 'row', - gap: 16, - marginVertical: 32, - }, - dot: { - width: 16, - height: 16, - borderRadius: 8, - borderWidth: 2, - borderColor: DfxColors.primary, - }, - dotFilled: { - backgroundColor: DfxColors.primary, - }, - dotError: { - borderColor: DfxColors.error, - }, - numpad: { - flexDirection: 'row', - flexWrap: 'wrap', - justifyContent: 'center', - width: 280, - marginTop: 'auto', - }, - numpadKey: { - width: 72, - height: 72, - borderRadius: 36, - margin: 8, - alignItems: 'center', - justifyContent: 'center', - }, - numpadKeyPressed: { - backgroundColor: DfxColors.surfaceLight, - }, - numpadText: { - color: DfxColors.text, - fontSize: 28, - fontWeight: '600', - lineHeight: 32, - textAlign: 'center', - includeFontPadding: false, - }, - biometricButton: { - paddingVertical: 12, - paddingHorizontal: 24, - }, - biometricText: { - ...Typography.bodyMedium, - color: DfxColors.primary, - fontWeight: '600', - }, -}); +import { FEATURES } from '@/config/features'; + +/** + * PIN-unlock route. With `EXPO_PUBLIC_ENABLE_PIN` off the disabled + * stub unlocks the WDK wallet and flips `isAuthenticated` so the + * auth-layout's hard gate resolves immediately, with no PIN entry + * and no biometric prompt. + */ +const VerifyPinScreen = FEATURES.PIN + ? // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/pin/VerifyPinScreenImpl').default as React.ComponentType) + : // eslint-disable-next-line @typescript-eslint/no-require-imports + (require('@/features/pin/VerifyPinDisabled').default as React.ComponentType); + +export default VerifyPinScreen; diff --git a/app/_layout.tsx b/app/_layout.tsx index 1aca466d..e93e5c57 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -1,35 +1,106 @@ import 'react-native-get-random-values'; import 'react-native-url-polyfill/auto'; +import { useEffect } from 'react'; +import { ActivityIndicator, LogBox, StyleSheet, View } from 'react-native'; import { Buffer } from '@craftzdog/react-native-buffer'; import { Stack } from 'expo-router'; import { StatusBar } from 'expo-status-bar'; +import { GestureHandlerRootView } from 'react-native-gesture-handler'; import { WdkAppProvider } from '@tetherto/wdk-react-native-core'; import { bundle } from '../.wdk'; import { ErrorBoundary } from '@/components/ErrorBoundary'; import { OfflineBanner } from '@/components/OfflineBanner'; import { getWdkConfigs } from '@/config/chains'; +import { IS_E2E } from '@/config/e2e'; +import { pricingService } from '@/services/pricing-service'; +import { useAuthStore, useWalletStore } from '@/store'; +import { ThemeProvider, useColors, useThemeStore } from '@/theme'; import '@/i18n'; +LogBox.ignoreLogs([ + /\[AccountService\] callAccountMethod/, + /\[AddressService\] getAddress failed/, + /Failed to fetch balance for /, + /could not coalesce error/, + /bad address checksum/, + /Network ethereum timed out/, + /useMultiAddressLoader failed/, +]); + (globalThis as unknown as { Buffer: typeof Buffer }).Buffer = Buffer; +/** + * Top-level layout. The ThemeProvider sits ABOVE every screen — the + * actual theme-consuming render lives in `ThemedRoot` below so we never + * call `useColors()` outside the provider (which would return the fallback + * light palette instead of the live theme). + */ export default function RootLayout() { return ( - - - - + + + + + + + + + + ); +} + +function ThemedRoot() { + const { isHydrated: authHydrated, hydrate } = useAuthStore(); + const hydrateWallet = useWalletStore((s) => s.hydrate); + const hydrateTheme = useThemeStore((s) => s.hydrate); + const themeHydrated = useThemeStore((s) => s.isHydrated); + const isHydrated = authHydrated && themeHydrated; + const colors = useColors(); + + useEffect(() => { + void hydrate(); + void hydrateWallet(); + void hydrateTheme(); + }, [hydrate, hydrateWallet, hydrateTheme]); + + useEffect(() => { + // The E2E build skips the live-price poller: its setInterval never lets the + // app report "idle" to Detox (and adds nothing to a pixel baseline). + if (IS_E2E) return; + pricingService.startAutoRefresh(60_000); + return () => pricingService.stopAutoRefresh(); + }, []); + + return ( + <> + + + {isHydrated ? ( - - + ) : ( + + + + )} + ); } + +const styles = StyleSheet.create({ + loading: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + }, +}); diff --git a/app/index.tsx b/app/index.tsx index 4b7bb3ef..eb489c8a 100644 --- a/app/index.tsx +++ b/app/index.tsx @@ -1,24 +1,11 @@ -import { useEffect } from 'react'; -import { ActivityIndicator, StyleSheet, View } from 'react-native'; import { Redirect } from 'expo-router'; import { useAuthStore } from '@/store'; -import { DfxColors } from '@/theme'; export default function Index() { - const { isOnboarded, isAuthenticated, isHydrated, hydrate } = useAuthStore(); - - useEffect(() => { - void hydrate(); - }, [hydrate]); - - if (!isHydrated) { - return ( - - - - ); - } + const { isOnboarded, isAuthenticated } = useAuthStore(); + // Hydration happens in the root layout, so by the time this renders the + // auth state is already loaded. if (!isOnboarded) { return ; } @@ -29,12 +16,3 @@ export default function Index() { return ; } - -const styles = StyleSheet.create({ - loading: { - flex: 1, - backgroundColor: DfxColors.background, - alignItems: 'center', - justifyContent: 'center', - }, -}); diff --git a/assets/dashboard-bg-dark.jpg b/assets/dashboard-bg-dark.jpg new file mode 100644 index 00000000..923e7e6c Binary files /dev/null and b/assets/dashboard-bg-dark.jpg differ diff --git a/docs/handbook/de/index.html b/docs/handbook/de/index.html new file mode 100644 index 00000000..95f17b0b --- /dev/null +++ b/docs/handbook/de/index.html @@ -0,0 +1,1043 @@ + + + + + + DFX Wallet — Handbuch & Test-Dokumentation + + + + + + + +
+ + +
+
+

DFX Wallet — Handbuch

+

+ User-Doku und Test-Doku in einem. Jedes Bild auf dieser Seite ist gleichzeitig eine + Visual-Regression-Baseline aus e2e/__baselines__/, die in CI bei jedem PR + pixelgenau verglichen wird. Wenn das Handbuch aktuell aussieht, ist die Live-App es auch + — und umgekehrt. +

+
+ 📱 App: React Native + Expo (iOS & Android) + 📂 Code: + DFXswiss/dfx-wallet + 🧪 MVP-Tests: 7 Maestro-Flows · 9 Detox-Baselines +
+
+ +
+

Single Source of Truth

+

+ Die kanonischen Baseline-Bilder liegen unter + e2e/__baselines__/<name>.png und sind das einzige committed Asset. + Die Bilder, die dieses Handbuch zeigt, sind keine Kopien — die + <img>-Tags zeigen direkt mit relativen Pfaden auf die Baselines. Kein + Drift möglich. +

+

+ Aktualisieren der Baselines erfolgt lokal: Detox auf der Entwicklermaschine laufen + lassen, das PNG unter e2e/__baselines__/ committen. CI lädt Visual-Dumps + nicht mehr als Actions-Artifact hoch. Details in + docs/visual-regression.md. +

+ +
+

+ MVP-Pfad vs. Feature-gated: Die App liefert jede deferred Funktion hinter einem + EXPO_PUBLIC_ENABLE_*-Flag aus, das im MVP-Build standardmäßig aus ist. + Dieses Handbuch zeigt den MVP-Pfad: Welcome → Create-Wallet → SetupPinDisabled-Bridge + → Dashboard → Receive/Send. PIN-Setup, Restore-from-Seed, Legal-Disclaimer, + Hardware-Wallet und Multi-Sig kommen, sobald die jeweiligen Flags shippen — die + Baselines existieren bereits unter setup-pin.png, verify-pin.png, + restore-wallet.png etc., und die Maestro-Flows tragen + feature-*-Tags, die der Workflow-Filter --include-tags mvp + heute ausblendet. +

+
+
+ +
+ + +
+
+
+

01Welcome

+
.maestro/01-welcome.yaml · e2e/visual/onboarding.test.ts
+
+
+ 1 Maestro · 1 Baseline + +
+
+

+ Der allererste Screen nach fresh install. Create with Seed Phrase startet den + einzigen MVP-Onboarding-Pfad — Restore-from-Seed und Passkey-basiertes Onboarding sind + hinter EXPO_PUBLIC_ENABLE_RESTORE bzw. _PASSKEY gegated und + werden im MVP-Build nicht gerendert. +

+ +
+
+
+ welcome + + welcome.tsx + +
+
+ Welcome screen +
+
+ MVP Hero-Background mit Bergpanorama, DFX-Logo, Headline + „Welcome to DFX" und das einzige sichtbare CTA: Create with Seed Phrase. + Der welcome-restore-toggle wäre hier — er rendert nur bei aktiviertem + FEATURES.RESTORE || FEATURES.PASSKEY. +
+
+
+
+ + +
+
+
+

02Wallet erstellen — Seed Phrase

+
.maestro/10-onboarding-create.yaml · e2e/visual/onboarding.test.ts
+
+
+ 1 Maestro · 2 Baselines + +
+
+

+ Tap auf Create with Seed Phrase öffnet den Seed-Reveal-Screen. Der User muss + seine 12-Wort-Mnemonic einsehen, bevor er weitergehen kann — die Continue-CTA + ist disabled bis der Reveal-Button gedrückt wurde. Anschließend springt der Flow im + MVP-Build via SetupPinDisabled-Stub direkt zum Dashboard (kein PIN- oder + Legal-Screen dazwischen). +

+ +
+
+
+ create-wallet + vor reveal +
+
+ Create-Wallet vor Seed-Reveal +
+
+ Default-State: Seed verdeckt, Continue disabled. Tap auf + Reveal seed phrase zeigt die 12 Wörter. +
+
+
+
+ create-wallet-revealed + nach reveal +
+
+ Create-Wallet mit sichtbarer Seed Phrase +
+
+ Die 12 BIP39-Wörter sind sichtbar (Numerierung 1–12), Continue aktiviert. Maestro + tappt direkt Continue, real-User sollte die Phrase aufschreiben und sicher + verwahren. +
+
+
+ +
+

+ WDK-Init nach Continue: der Tether-WDK initialisiert beim ersten Wallet-Setup + jede Chain (Bitcoin SegWit, Taproot, Plasma, Ethereum & L2s, Solana, TON, TRON, + Spark). Auf einem frischen CI-Simulator kann das bis zu 120s dauern — der Maestro-Flow + und der Detox-Test gewähren explizit --withTimeout(120_000). +

+
+
+ + +
+
+
+

03Dashboard

+
+ .maestro/22-dashboard-balance-toggle.yaml · e2e/visual/onboarding.test.ts +
+
+
+ 1 Maestro · 2 Baselines + +
+
+

+ Die Landing-Surface nach Onboarding. Im MVP-Build sind Receive und Send die einzigen + Action-Pills — Portfolio, Pay, Transactions, Settings und Multi-Sig leben hinter ihren + jeweiligen Feature-Flags. Das Augen-Icon neben „Total Wallet Balance" toggelt die + Balance auf vier Bullets (für Public-Privacy beim Demo). +

+ +
+
+
+ dashboard + balance sichtbar +
+
+ Dashboard mit sichtbarem Balance +
+
+ Default-State direkt nach Onboarding: CHF 0.00, Bergpanorama-Background, + Bottom-Pill mit Receive (links) und Send (rechts). +
+
+
+
+ dashboard-balance-hidden + balance versteckt +
+
+ Dashboard mit verstecktem Balance +
+
+ Nach Tap auf das Augen-Icon: CHF ●●●●. State ist nur in-memory, beim + nächsten Re-Mount der Tab-Komponente zurück auf sichtbar. +
+
+
+
+ + +
+
+
+

04Bitcoin empfangen

+
+ .maestro/20-receive.yaml · .maestro/23-receive-chain-switch.yaml · + e2e/visual/onboarding.test.ts +
+
+
+ 2 Maestro · 2 Baselines + +
+
+

+ Zwei Schritte: Asset wählen → QR-Code anzeigen. BTC ist der einzige MVP-Asset mit + mehreren Chains (SegWit und EVM/Wrapped); die Stablecoins (CHF, EUR, USD) shippen nur + auf Ethereum, der Chain-Selector ist dort versteckt. Taproot- und Lightning-Layer sind + hinter EXPO_PUBLIC_ENABLE_DFX_BACKEND gegated. +

+ +
+
+
+ receive + asset-step +
+
+ Receive — Asset-Auswahl +
+
+ Vier Asset-Karten in fixierter Reihenfolge: BTC, CHF, EUR, USD. Tap öffnet den + QR-Step. Header trägt den Standard-Back-Button (zurück zum Dashboard). +
+
+
+
+ receive-qr-step + BTC SegWit +
+
+ Receive — QR-Code für BTC SegWit +
+
+ Selected-Asset-Pill (BTC) oben, Chain-Bar mit SegWit / EVM, + QR-Code für die abgeleitete Adresse, kopierbarer Address-Text, Copy-CTA. Tap auf + die Pill bringt zurück zur Asset-Liste. +
+
+
+
+ + +
+
+
+

05Bitcoin senden

+
+ .maestro/21-send.yaml · .maestro/24-send-chain-switch.yaml · + e2e/visual/onboarding.test.ts +
+
+
+ 2 Maestro · 2 Baselines + +
+
+

+ Drei Schritte hat der echte Send-Flow: Asset → Input (Empfänger + Amount + Network-Fee) + → Confirm. Die MVP-E2E-Suite stoppt am Input-Step — der Confirm-Button auf der + Bestätigungsseite ruft handleSend() auf und broadcastet eine echte + Transaktion, das gehört nicht in einen Smoke-Test. Die Recipient-/Amount-Validierung + (mind. 26 Zeichen, > 0 für Continue) ist hingegen ohne Tx-Risiko testbar. +

+ +
+
+
+ send + asset-step +
+
+ Send — Asset-Auswahl +
+
+ Asset-Liste wie bei Receive (BTC, CHF, EUR, USD). BTC im Send-Flow läuft + ausschließlich über Spark/Lightning — andere Bitcoin-Layer sind hinter + Feature-Flags gegated. Die Stablecoin-Sends bieten vier Chains. +
+
+
+
+ send-input-step + BTC Spark +
+
+ Send — Input-Step für BTC +
+
+ Selected-Asset-Pill, Adress-Input mit Scan-Button, Amount-Input, disabled + Continue-CTA bis Input gültig ist. BTC hat nur einen Chain (Spark), daher kein + Chain-Selector. +
+
+
+ +
+

+ Confirm wird nie getappt: beide Maestro- und der Detox-Flow assertieren den + send-confirm-button nur auf Sichtbarkeit. Ein Klick würde + handleSend() aufrufen und auf Testnet eine echte Transaktion broadcasten. + Die Recipient-/Amount-Validation, Fee-Estimate-Loading und Cancel-Round-Trip sind + separat in einem zukünftigen Test mit gemocktem WDK-Signer abgedeckt. +

+
+
+ + +
+

Abdeckung & Triage

+

+ Die MVP-Coverage deckt den Onboarding-Pfad und die zwei Wallet-Hauptaktionen (Receive, + Send) End-to-End ab. Feature-gated Pfade haben bereits Baselines und Maestro-Flows, + werden aber bis zum Shipping der jeweiligen Flags vom CI-Workflow ausgeblendet. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BereichStatusFlagsMaestroDetox
Welcome & Create-Wallet (MVP)grün01-welcome, 10-onboarding-create3 Baselines
Dashboard & Balance-Togglegrün22-dashboard-balance-toggle2 Baselines
Receive (Asset + Chain)grün20-receive, 23-receive-chain-switch2 Baselines
Send (Asset + Input + Chain)grün21-send, 24-send-chain-switch2 Baselines
PIN-Setup & Legal-DisclaimergatedPIN, LEGAL11-onboarding-create-pin-legal, 13-pin-unlockBaselines vorhanden, Tests describe.skip
Restore-from-SeedgatedRESTORE02-welcome-restore-toggle, 12-onboarding-restoreBaselines vorhanden
Confirm/Send-Transaktionoffenbraucht gemockten WDK-Signer
Hardware-Wallet (BitBox02)offenHARDWARE_WALLETMaestro kann BLE/USB nicht treiben
Multi-SigoffenMULTISIG
+ +

Wie Baselines aktualisiert werden

+

+ Wenn eine intendierte UI-Änderung eine Baseline brechen würde: +

+
    +
  1. Lokal: rm e2e/__baselines__/<name>.png, dann npm run e2e:test:ios. jest-image-snapshot schreibt die neue Baseline.
  2. +
  3. PR pushen. Der Visual-Regression-Run vergleicht gegen die committed Baseline; ein Fail ist kein Download-Pfad — die neue PNG kommt nur aus dem lokalen Lauf in Schritt 1.
  4. +
+

+ Details zum Workflow-Trigger (das needs-visual-Label, Nightly-Cron) sowie + zu Detox-Pitfalls wie der strikten toBeVisible-Heuristik (>75% des + Elements müssen sichtbar sein) stehen in + docs/visual-regression.md. Maestro-Konvention, Tag-System und CI-Setup in + docs/maestro.md. +

+
+
+
+ + diff --git a/docs/handbook/index.html b/docs/handbook/index.html new file mode 100644 index 00000000..9375b57b --- /dev/null +++ b/docs/handbook/index.html @@ -0,0 +1,149 @@ + + + + + + DFX Wallet — Handbook & Test Documentation + + + + + + + +
+
+ DFX Wallet · Handbook +
+

User guide & test documentation

+ +

English version coming soon

+

+ The DFX Wallet handbook currently exists in German only. Each screen on the German page is + backed by a committed visual-regression baseline from e2e/__baselines__/, so + even without translation the screenshots speak for themselves. +

+

+ Until the English translation lands, please use the German page or read the source + directly: +

+

+ docs/maestro.md + — Maestro E2E test guide (MVP vs feature-gated tags, Android KVM runner setup, CI + triggers). +
+ docs/visual-regression.md + — Detox visual regression workflow (baseline updates, `toBeVisible` heuristic, the + `needs-visual` label). +

+ + → Go to DE handbook +
+ + diff --git a/docs/maestro.md b/docs/maestro.md index 0739d5a6..f8a3b261 100644 --- a/docs/maestro.md +++ b/docs/maestro.md @@ -34,10 +34,11 @@ npm run e2e:maestro:ios npm run e2e:maestro:android ``` -Both scripts run every flow under `.maestro/`. To run a single flow: +Both scripts run every MVP flow under `.maestro/` (see [MVP vs feature-gated flows](#mvp-vs-feature-gated-flows) below). To run a single flow: ```bash -maestro test .maestro/01-welcome.yaml +maestro test --env APP_ID=wallet.dfx.swiss .maestro/01-welcome.yaml # iOS +maestro test --env APP_ID=swiss.dfx.wallet .maestro/01-welcome.yaml # Android ``` To debug interactively: @@ -59,6 +60,23 @@ EXPO_PUBLIC_ETH_RPC_URL=... # ETH testnet RPC Set these before `npx expo run:ios` / `npx expo run:android` so the resulting binary points at testnet infrastructure. +### `appId: ${APP_ID}` and platform-specific bundle IDs + +The iOS bundle id is `wallet.dfx.swiss`, the Android package id is `swiss.dfx.wallet`. Every flow uses `appId: ${APP_ID}` and the workflow passes the platform-specific value at run time: + +```yaml +appId: ${APP_ID} +name: 01-welcome +``` + +```yaml +# .github/workflows/maestro-e2e.yml +maestro --platform ios test --env APP_ID=wallet.dfx.swiss .maestro/ +maestro --platform android test --env APP_ID=swiss.dfx.wallet .maestro/ +``` + +Do not hard-code one of the two ids — the flow will fail on the other platform with `Failed to get app binary directory for bundle `. + ## testID Convention Flows use stable `testID` selectors (`id:` in YAML) — text-based selectors are avoided so flows are i18n-proof. Convention: @@ -78,7 +96,31 @@ Examples: - `dashboard-screen` - `dashboard-action-send` -Container elements (the screen root) carry the `-screen` ID; interactive elements append a verb-noun (`-button`, `-toggle`, `-input`, `-checkbox`, `-key-N`). +Container elements (the screen root) carry the `-screen` ID; interactive elements append a verb-noun (`-button`, `-toggle`, `-input`, `-checkbox`, `-key-N`). Iterable lists use the item key as a suffix: `receive-asset-btc`, `send-chain-arbitrum`, `pin-key-1`. + +## MVP vs feature-gated flows + +Every flow is tagged so the workflow can opt into the slice that matches the build under test: + +- `mvp` — runs against the default-off feature-flag build that ships today +- `feature-restore`, `feature-pin`, `feature-legal`, `feature-passkey`, … — gated; only meaningful when the corresponding `EXPO_PUBLIC_ENABLE_*` is `true` at build time + +```yaml +appId: ${APP_ID} +name: 11-onboarding-create-pin-legal +tags: + - onboarding + - feature-pin + - feature-legal +``` + +The CI workflow filters with `--include-tags mvp` so only the unflagged paths fire today: + +```yaml +maestro --platform ios test --include-tags mvp --env APP_ID=wallet.dfx.swiss .maestro/ +``` + +Drop the `--include-tags` filter as each feature ships. Locally, omit the flag to run everything (gated flows will fail against the MVP build — that's expected, run them against a build with the matching feature enabled). ## Flow Naming @@ -86,35 +128,77 @@ Container elements (the screen root) carry the `-screen` ID; interactive --.yaml ``` -- `NN` = two-digit prefix; smoke flows start at `01-`, feature flows at `10-` +- `NN` = two-digit prefix; smoke onboarding flows start at `01`-`09`, gated onboarding variants at `10`-`19`, dashboard navigation flows at `20`+ - `area` = onboarding, pin, send, receive, dashboard, kyc, hardware - `scenario` = short kebab-case description -Current flows: +### Current flows + +MVP (run by `--include-tags mvp` in CI): + +- `01-welcome.yaml` — smoke: welcome screen renders with the create-wallet button +- `10-onboarding-create.yaml` — fresh install → create wallet → reveal seed → continue → `SetupPinDisabled` redirect → dashboard +- `20-receive.yaml` — onboarding → Receive (asset list) → tap BTC → QR step → back to asset list +- `21-send.yaml` — onboarding → Send (asset list) → tap BTC → input step → back to asset list +- `22-dashboard-balance-toggle.yaml` — onboarding → dashboard → toggle eye icon (visible → hidden → visible) +- `23-receive-chain-switch.yaml` — onboarding → Receive → BTC chain bar (SegWit ⇄ EVM); CHF has no chain bar (single chain) +- `24-send-chain-switch.yaml` — onboarding → Send → CHF chain bar (Ethereum / Arbitrum / Polygon / Base); BTC has no chain bar (single chain) + +Feature-gated (run by removing `--include-tags mvp` against a build with all flags on): -- `01-welcome.yaml` — smoke: app launches, welcome screen renders -- `10-onboarding-create.yaml` — full create-wallet onboarding through to dashboard -- `11-onboarding-restore.yaml` — restore-from-seed onboarding through to dashboard (uses `${TEST_MNEMONIC}` env var, default is the standard `test test … junk` BIP39 mnemonic) -- `12-pin-unlock.yaml` — onboard, cold-restart the app, exercise the wrong-PIN error path, then unlock with the correct PIN +- `02-welcome-restore-toggle.yaml` — `feature-restore`: welcome-restore-toggle assertion (only rendered when RESTORE or PASSKEY is on) +- `11-onboarding-create-pin-legal.yaml` — `feature-pin` + `feature-legal`: full PIN-setup and legal-disclaimer chain through to the fully-featured dashboard +- `12-onboarding-restore.yaml` — `feature-restore` + `feature-pin` + `feature-legal`: enter a BIP39 mnemonic and walk through to the dashboard +- `13-pin-unlock.yaml` — `feature-pin` + `feature-legal`: onboard, cold-restart, exercise the wrong-PIN error path, unlock with the correct PIN ## Limitations -- **Hardware Wallet flows**: Maestro cannot drive physical BitBox02 devices or BLE pairing dialogs. Hardware-wallet tests must run against the mock provider in `src/services/hardware-wallet/`. +- **Hardware Wallet flows**: Maestro cannot drive physical BitBox02 devices or BLE pairing dialogs. Hardware-wallet tests must run against the mock provider in `src/features/hardware-wallet/`. - **Biometrics**: Face ID / Fingerprint prompts are scriptable on simulators (`xcrun simctl ... biometric` / `adb emu finger touch`) but require an explicit step in the flow. - **Passkeys**: WebAuthn / Passkey ceremonies cannot be fully automated on simulators yet — gate passkey-dependent flows behind a feature flag for E2E builds. +### Keyboard handling across platforms + +The two soft keyboards behave differently and the Maestro CLI exposes that asymmetry: + +| Action | iOS | Android | +| --------------------- | --------------------------- | --------------------------- | +| `tapOn: "return"` | ✅ taps the return key | ❌ no "return" text element | +| `hideKeyboard` | ❌ fails on custom TextInputs | ✅ works | + +The MVP send flow (`21-send.yaml`) deliberately stops at the input step rather than typing into the recipient/amount inputs and pressing Continue: every keyboard-dismissal primitive fails on one of the two platforms. Confirm-flow coverage lives in the Detox visual suite ([docs/visual-regression.md](visual-regression.md)) where the keyboard is controllable programmatically. + +Tests that absolutely have to type into an input (currently only the gated `12-onboarding-restore.yaml`) use `hideKeyboard` — iOS happens to accept it on the restore mnemonic input. + ## CI -`.github/workflows/maestro-e2e.yml` runs the full suite on iOS Simulator and Android Emulator. +`.github/workflows/maestro-e2e.yml` runs the MVP suite (`--include-tags mvp`) on iOS Simulator and Android Emulator. + +### Runners + +- **iOS Simulator** → `macos-latest`. Builds via `npx expo run:ios --configuration Release --no-bundler`. +- **Android Emulator** → `ubuntu-latest` with `/dev/kvm` enabled. Builds via `./gradlew :app:assembleRelease` and runs the AVD via [`reactivecircus/android-emulator-runner`](https://github.com/ReactiveCircus/android-emulator-runner). + +**Why Linux for Android?** GitHub's `macos-latest` runners disable Hypervisor.framework, so both `x86_64` (via Rosetta) and `arm64-v8a` (via HVF) AVDs fail to boot with `HVF error: HV_UNSUPPORTED`. Linux runners expose `/dev/kvm`; the workflow grants user-level access via a `udev` rule and the emulator drops into native KVM acceleration: + +```yaml +- name: Enable KVM + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm +``` + +The release Gradle build gets `-Xmx4096m -XX:MaxMetaspaceSize=1024m` so it fits the smaller Linux runner heap. -Triggers: +### Triggers - `pull_request` against `develop` — non-draft PRs only, skipped on doc-only changes (`paths-ignore: '**/*.md', 'docs/**'`). Marking a draft PR as ready-for-review fires the workflow. - `workflow_dispatch` — manual run for any branch. Concurrent runs on the same PR cancel each other (`concurrency: cancel-in-progress: true`), so rebases don't pile up macOS minutes. -Build-time configuration: +### Build-time configuration - Public values (DFX API URL, WDK indexer URL, chain RPCs) live in the committed `.env.testnet` at the repo root. Edit that file when the testnet endpoints land. - Only the WDK indexer API key is treated as a secret. Set it as a repo **secret** named `E2E_WDK_INDEXER_API_KEY` — the workflow injects it via `env:` so it overrides whatever's in `.env.testnet`. diff --git a/docs/security/roadmap.md b/docs/security/roadmap.md index 343dcbf3..0d297d38 100644 --- a/docs/security/roadmap.md +++ b/docs/security/roadmap.md @@ -34,7 +34,7 @@ makes later phases possible. None of it requires design or product input. ### P0.3 — Test coverage gate - [ ] Add Jest coverage thresholds (`global: 60%`, `src/services/**: 70%`, - `src/services/hardware-wallet/**: 90%`). + `src/features/hardware-wallet/**: 90%`). - [ ] Wire `npm test -- --coverage` into CI as its own job. - **Acceptance**: CI fails if a PR drops coverage below the gate; baseline documented in this file. @@ -140,7 +140,7 @@ ship per-screen or per-flow. backoff. After N (e.g. 10) failures: wipe `expo-secure-store`, `IS_ONBOARDED`, encrypted seed, and reset to onboarding. - [ ] UI shows remaining attempts and lockout time. -- **Acceptance**: dedicated test in `src/services/pin/` covers backoff +- **Acceptance**: dedicated test in `src/services/pin.ts` covers backoff schedule and wipe trigger; manual test confirms recovery flow. ### P1.4 — Biometric re-auth before signing @@ -347,8 +347,8 @@ phase if a structural change is needed. ### Reviews -Any PR touching `src/services/hardware-wallet/`, `src/services/wallet/`, -`src/services/dfx/`, `src/services/pin/`, `src/services/biometric/`, or +Any PR touching `src/features/hardware-wallet/`, `src/services/wallet/`, +`src/features/dfx-backend/`, `src/services/pin.ts`, `src/features/biometric/`, or secure storage requires a security-conscious review (one of the maintainers tagged for security). Document this requirement in `CODEOWNERS` once the file exists. diff --git a/docs/visual-regression.md b/docs/visual-regression.md new file mode 100644 index 00000000..01fa4aff --- /dev/null +++ b/docs/visual-regression.md @@ -0,0 +1,216 @@ +# Visual Regression Tests + +Pixel-by-pixel screenshot comparison for DFX Wallet using [Detox](https://wix.github.io/Detox/) and [jest-image-snapshot](https://github.com/americanexpress/jest-image-snapshot). Test sources live in `e2e/visual/*.test.ts`, baselines in `e2e/__baselines__/*.png`. + +## Baseline coverage gate + +A visual-regression suite is only as honest as the set of screens it actually snapshots — a green run that silently skips half the app reads as "appearance verified" when it is not. `e2e/visual-coverage.json` is the source of truth that closes that gap: **every** route under `app/` must be classified as exactly one of + +| Status | Meaning | Required fields | +| ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | +| `baselined` | Has a committed PNG and a matching `expectScreenToMatchBaseline()` call | `baselines: []` (optionally `pendingBaselines: []` for feature-variant captures in flight) | +| `exempt` | A documented engineering reason it can't be pixel-baselined (redirect, external WebView content, OS-browser launcher, dynamic `[param]` detail) | `category` (from `exemptCategories`) + `reason` | +| `pending` | Owes a baseline; not yet captured | `tracking` (issue/PR) + `reason` | + +`scripts/check-visual-coverage.mjs` (CI job `visual-coverage`, dependency-free `node`) enforces it fail-closed: + +- Route table on disk **==** manifest, both directions — a new screen with no entry fails the build, exactly like a missing README matrix row. +- Every `baselines` name has both a matcher call **and** a committed PNG; every `pendingBaselines` name has a call but no PNG yet (in flight, not silently missing). +- No orphan matcher calls, no orphan committed PNGs. + +The gate also `--self-test`s its own logic against synthetic fixtures so a refactor of the checker can't quietly stop catching regressions. + +### Ratchet to 100% + +This is the appearance-side sibling of the [coverage floors](../scripts/check-coverage-floor.mjs). Today the manifest reports route accountability at 100% (every screen classified) with baseline pixel-coverage ratcheting up as `pending` entries are captured. Drive a `pending` entry to `baselined` by adding the `expectScreenToMatchBaseline()` call (see [Adding a new screenshot](#adding-a-new-screenshot)) and committing the captured PNG — **never** reclassify a real screen as `exempt` to inflate the number; exemptions are reviewed. Once `pending` is empty, lock it in: + +```bash +node scripts/check-visual-coverage.mjs --strict # fails if any pending remains +``` + +## Why Detox + jest-image-snapshot + +- Catches visual regressions the [Maestro flows](maestro.md) cannot — colour drift, layout shifts, missing assets, font rendering, etc. +- Runs the same iOS Simulator build Maestro does, so a green Maestro pass + a clean visual run together cover both behaviour and appearance. +- Snapshot diffs are written to local `e2e/__diffs__/` on failure, so reviewing a regression is a one-glance comparison. + +iOS only — Detox on macOS-based runners is stable; the Android equivalent is on the roadmap once Maestro's Android coverage stabilises. + +## Test layout + +``` +e2e/ +├── __baselines__/ # committed PNG ground truth +│ ├── welcome.png +│ ├── dashboard.png +│ └── … +├── __diffs__/ # written on failure (gitignored) +├── jest.config.js # Detox/jest config +├── utils/ +│ ├── launch.ts # launchAndWaitForWelcome / launchWithExistingState +│ ├── pin.ts # enterPin helper +│ └── screenshot.ts # expectScreenToMatchBaseline (the matcher) +└── visual/ + └── onboarding.test.ts # the actual `describe` blocks +``` + +`expectScreenToMatchBaseline(name)` is the only matcher the test files use: + +```ts +await element(by.id('welcome-create-wallet-button')).tap(); +await waitFor(element(by.id('create-wallet-screen'))) + .toBeVisible() + .withTimeout(30_000); +await expectScreenToMatchBaseline('create-wallet'); +``` + +It writes the screenshot to `e2e/__baselines__/create-wallet.png` on first run and compares against it on every subsequent run with a 1% pixel-difference tolerance. + +## Running locally + +```bash +# One-time install +brew install applesimutils +npx detox build-framework-cache + +# Build + run +npm run e2e:build:ios +npm run e2e:test:ios +``` + +The build uses the `ios.release` Detox configuration in `.detoxrc.js` (which mirrors the Maestro release build). Same `.env.testnet` setup as the Maestro suite — see [docs/maestro.md](maestro.md#test-configuration). + +To update a baseline locally after an intentional UI change: + +```bash +# Delete the stale baseline, run again, the matcher writes a new one +rm e2e/__baselines__/dashboard.png +npm run e2e:test:ios +``` + +Then commit the new PNG. + +## Feature-gated `describe` blocks + +The visual suite is split into MVP and feature-gated `describe` blocks via the same `EXPO_PUBLIC_ENABLE_*` flags the production build reads: + +```ts +const featureOn = (envVar: string): boolean => process.env[envVar] === 'true'; +const enableRestore = featureOn('EXPO_PUBLIC_ENABLE_RESTORE'); +const enablePin = featureOn('EXPO_PUBLIC_ENABLE_PIN'); +const enableLegal = featureOn('EXPO_PUBLIC_ENABLE_LEGAL'); + +const describePinLegal = enablePin && enableLegal ? describe : describe.skip; + +describePinLegal('Create wallet flow with PIN + legal', () => { + // … tests that only make sense when both features are on +}); +``` + +A build with the feature off skips the block instead of running it against the `*Disabled` stub. The MVP `describe`s — Welcome, Create-wallet-MVP, Dashboard-navigation-MVP — stay unconditional and end at the dashboard via the `SetupPinDisabled` redirect. + +## Adding a new screenshot + +1. Add a new `it` block that taps to the screen and calls `expectScreenToMatchBaseline('your-name')`. +2. Capture the baseline locally (see [Running locally](#running-locally)); CI will not write a missing baseline. +3. Inspect the PNG under `e2e/__diffs__/` or the local Detox `artifacts/` tree: + ```bash + ls e2e/__diffs__ e2e/__baselines__ + ``` +4. Find your screenshot under the local Detox artifacts directory named after the test. +5. Inspect the PNG — make sure it captures the state you actually want to baseline (not an error screen, not a half-loaded WDK, etc.). +6. Copy it into `e2e/__baselines__/your-name.png` and commit. +7. Push and re-trigger the visual workflow (see [Triggering visual regression](#triggering-visual-regression) below). + +## Pitfalls + +### Missing-baseline behaviour in CI + +`jest-image-snapshot` refuses to write new snapshots when `process.env.CI` is set (GitHub Actions sets it automatically). A missing baseline therefore fails the test with: + +``` +New snapshot was not written. The update flag must be explicitly passed to write a new snapshot. +``` + +This is by design — it prevents merging a green run that only passes because it silently wrote the baseline. Adding a baseline is a local capture (see [Adding a new screenshot](#adding-a-new-screenshot)), not a CI download pass. + +### Detox `toBeVisible` is strict (>75% on screen) + +Detox treats `toBeVisible` as "more than 75% of the element is on screen". A view that lives below a `ScrollView` or behind a safe-area inset can sit off-screen and time out the matcher even though it is in the view tree: + +```ts +// ❌ receive-qr is inside the scroll view, may be partially clipped +await waitFor(element(by.id('receive-qr'))) + .toBeVisible() + .withTimeout(30_000); + +// ✅ receive-selected-asset-pill is the topmost element on the QR step, +// always fully visible, sufficient signal that the step transition fired +await waitFor(element(by.id('receive-selected-asset-pill'))) + .toBeVisible() + .withTimeout(30_000); +``` + +Pick top-of-screen anchors (header back buttons, the topmost card in a list, the selected-asset pill) over wrapper Views or content sitting deeper in a scroll view. + +### `disableSynchronization` + back navigation + +`launchAndWaitForWelcome` disables Detox synchronization (the WDK keeps the main queue permanently busy with background work). With synchronization off, Detox does not wait for animations and React-Navigation transitions to settle. The next `tap` after a back-navigation can fire before the destination screen is laid out: + +```ts +// ✅ Add a pause() after every back-nav before the next test's first interaction +await element(by.id('receive-screen-back')).tap(); +await waitFor(element(by.id('dashboard-balance-toggle'))) + .toBeVisible() + .withTimeout(30_000); +await pause(); +``` + +### State carry-over between `describe` blocks + +The Create-wallet onboarding runs the WDK's chain init, which can take 90s+ on a fresh install. Re-onboarding for every `describe` block doubles the wall-clock cost, so the existing suite relies on state carry-over: the dashboard left by `Create wallet flow (MVP)` is the entry point for `Dashboard navigation (MVP)`, the onboarded keychain left by `Create wallet flow with PIN + legal` is the entry point for `PIN unlock`: + +```ts +// Continues from the Create-wallet-MVP block above without a fresh +// launch — re-onboarding doubles the WDK init cost (~120s). +describe('Dashboard navigation (MVP)', () => { + it('shows receive screen (asset list)', async () => { + await element(by.id('dashboard-action-receive')).tap(); + // … + }); +}); +``` + +This is fragile: a failure in the preceding block leaves the next one starting from an unexpected state. Keep the assertions inside each `it` defensive (always `waitFor` before interacting) and document the carry-over with a comment so the next maintainer doesn't add an accidental `beforeAll(launchAndWaitForWelcome)`. + +## CI + +`.github/workflows/visual-regression.yml` runs the suite on `macos-latest`. + +### Triggering visual regression + +Since [#149](https://github.com/DFXswiss/dfx-wallet/pull/149) the workflow no longer fires on every `synchronize` push — visual runs are minutes-expensive on macOS runners and most pushes don't change rendering. Triggers: + +- `pull_request` events of type `opened`, `reopened`, `ready_for_review`, `labeled` (not `synchronize`) +- `workflow_dispatch` — manual run on any branch +- Nightly schedule (`cron: '0 3 * * *'`) — drift detection on `develop` + +To re-trigger after a push: + +```bash +# Toggle the needs-visual label to fire the `labeled` event +gh pr edit --remove-label needs-visual && gh pr edit --add-label needs-visual +``` + +### Artifacts + +On failure those trees stay on the runner and are not uploaded. A local Detox run writes the actual screenshot for each test under a directory named after the test: + +``` +detox-artifacts/ios.release.Z/ +├── ✓ Visual Regression Welcome screen matches baseline/welcome.png +├── ✗ Visual Regression Dashboard navigation (MVP) hides the balance via the eye toggle/dashboard-balance-hidden.png +└── … +``` + +The `✗`-prefixed directories are the ones you copy into `e2e/__baselines__/` when [adding a new screenshot](#adding-a-new-screenshot). diff --git a/e2e/__baselines__/create-passkey.png b/e2e/__baselines__/create-passkey.png new file mode 100644 index 00000000..f31e8a06 Binary files /dev/null and b/e2e/__baselines__/create-passkey.png differ diff --git a/e2e/__baselines__/dashboard-balance-hidden.png b/e2e/__baselines__/dashboard-balance-hidden.png new file mode 100644 index 00000000..abd63411 Binary files /dev/null and b/e2e/__baselines__/dashboard-balance-hidden.png differ diff --git a/e2e/__baselines__/hardware-connect.png b/e2e/__baselines__/hardware-connect.png new file mode 100644 index 00000000..48f039a9 Binary files /dev/null and b/e2e/__baselines__/hardware-connect.png differ diff --git a/e2e/__baselines__/multi-sig-setup.png b/e2e/__baselines__/multi-sig-setup.png new file mode 100644 index 00000000..89d9e206 Binary files /dev/null and b/e2e/__baselines__/multi-sig-setup.png differ diff --git a/e2e/__baselines__/multi-sig.png b/e2e/__baselines__/multi-sig.png new file mode 100644 index 00000000..539a0954 Binary files /dev/null and b/e2e/__baselines__/multi-sig.png differ diff --git a/e2e/__baselines__/receive-qr-step.png b/e2e/__baselines__/receive-qr-step.png new file mode 100644 index 00000000..704227fc Binary files /dev/null and b/e2e/__baselines__/receive-qr-step.png differ diff --git a/e2e/__baselines__/receive.png b/e2e/__baselines__/receive.png new file mode 100644 index 00000000..e9142485 Binary files /dev/null and b/e2e/__baselines__/receive.png differ diff --git a/e2e/__baselines__/restore-passkey.png b/e2e/__baselines__/restore-passkey.png new file mode 100644 index 00000000..8d99fca9 Binary files /dev/null and b/e2e/__baselines__/restore-passkey.png differ diff --git a/e2e/__baselines__/seed-export.png b/e2e/__baselines__/seed-export.png new file mode 100644 index 00000000..2db8fae7 Binary files /dev/null and b/e2e/__baselines__/seed-export.png differ diff --git a/e2e/__baselines__/send-input-step.png b/e2e/__baselines__/send-input-step.png new file mode 100644 index 00000000..e3e6deaf Binary files /dev/null and b/e2e/__baselines__/send-input-step.png differ diff --git a/e2e/__baselines__/send.png b/e2e/__baselines__/send.png new file mode 100644 index 00000000..29cf82d1 Binary files /dev/null and b/e2e/__baselines__/send.png differ diff --git a/e2e/__baselines__/settings.png b/e2e/__baselines__/settings.png new file mode 100644 index 00000000..f56ee4cc Binary files /dev/null and b/e2e/__baselines__/settings.png differ diff --git a/e2e/jest.config.js b/e2e/jest.config.js index 123bef1c..1ed52370 100644 --- a/e2e/jest.config.js +++ b/e2e/jest.config.js @@ -2,7 +2,9 @@ module.exports = { rootDir: '..', testMatch: ['/e2e/**/*.test.ts'], - testTimeout: 120_000, + // The full-variant onboard (WDK chain init) can take ~3-4 min on a cold + // GitHub macOS runner; keep the per-test ceiling well above that. + testTimeout: 600_000, maxWorkers: 1, globalSetup: 'detox/runners/jest/globalSetup', globalTeardown: 'detox/runners/jest/globalTeardown', diff --git a/e2e/utils/screenshot.ts b/e2e/utils/screenshot.ts index 61ad307e..08274120 100644 --- a/e2e/utils/screenshot.ts +++ b/e2e/utils/screenshot.ts @@ -32,9 +32,9 @@ export async function expectScreenToMatchBaseline(name: string): Promise { customSnapshotsDir: BASELINES_DIR, customSnapshotIdentifier: name, customDiffDir: DIFF_DIR, - // Allow 0.05% pixel difference to absorb anti-aliasing and font rendering - // variations across macOS / Xcode versions. - failureThreshold: 0.05, + // Allow 1% pixel difference to absorb anti-aliasing, font rendering, + // and GPU differences across local machines and CI runners. + failureThreshold: 1, failureThresholdType: 'percent', }); } diff --git a/e2e/visual-coverage.json b/e2e/visual-coverage.json new file mode 100644 index 00000000..f8c3219f --- /dev/null +++ b/e2e/visual-coverage.json @@ -0,0 +1,208 @@ +{ + "_comment": [ + "Visual-baseline coverage manifest — the source of truth for which screens", + "are pixel-baselined, which are exempt (and why), and which are still owed a", + "baseline. Enforced by scripts/check-visual-coverage.mjs (CI job", + "`visual-coverage`).", + "", + "Why this exists: a visual-regression suite that quietly skips screens gives", + "false confidence — a green run only means the screens someone remembered to", + "add are unchanged. This manifest forces every route under app/ to be", + "accounted for: a screen is either `baselined`, `exempt` with a documented", + "engineering reason, or `pending` with a tracking reference. A new screen", + "that is none of those fails the build, exactly like the README feature", + "matrix (scripts/check-feature-matrix.mjs) and the coverage floors.", + "", + "Ratchet protocol: drive `pending` entries to `baselined` by adding the", + "`expectScreenToMatchBaseline(...)` call (see docs/visual-regression.md", + "'Adding a new screenshot') and committing the captured PNG. Never move a", + "screen to `exempt` just to make the count go up — exemptions are reviewed.", + "Once `pending` is empty, flip the job to --strict to lock 100% in.", + "", + "Route keys are paths relative to app/ (matching the README matrix", + "shorthand). Names in `baselines`/`pendingBaselines` are the identifiers", + "passed to expectScreenToMatchBaseline() and the PNG file stem under", + "e2e/__baselines__/." + ], + "exemptCategories": { + "redirect": "Route renders only an expo-router ; it has no visual surface of its own (its destinations are baselined separately).", + "external-content": "Route renders arbitrary remote content inside a WebView; there is no deterministic golden image to diff against.", + "external-launcher": "Route hands off to the OS browser or share sheet and renders no durable in-app surface of its own.", + "dynamic-detail": "Route is rendered entirely from a [param]; a meaningful pixel baseline needs a frozen data fixture and is tracked as a fixture-backed follow-up rather than a blank-state snapshot." + }, + "routes": { + "(onboarding)/welcome.tsx": { + "status": "baselined", + "baselines": ["welcome", "welcome-restore-expanded"] + }, + "(onboarding)/create-wallet.tsx": { + "status": "baselined", + "baselines": ["create-wallet", "create-wallet-revealed"] + }, + "(onboarding)/setup-pin.tsx": { + "status": "baselined", + "baselines": ["setup-pin", "setup-pin-confirm"] + }, + "(onboarding)/legal-disclaimer.tsx": { + "status": "baselined", + "baselines": ["legal-disclaimer"] + }, + "(onboarding)/restore-wallet.tsx": { + "status": "baselined", + "baselines": ["restore-wallet", "restore-wallet-filled"] + }, + "(pin)/verify.tsx": { + "status": "baselined", + "baselines": ["verify-pin", "verify-pin-error"] + }, + "(auth)/(tabs)/dashboard.tsx": { + "status": "baselined", + "baselines": ["dashboard", "dashboard-balance-hidden", "pin-unlock-dashboard"], + "pendingBaselines": ["dashboard-with-pin-legal"], + "note": "dashboard-with-pin-legal is asserted only in the PIN+legal feature-variant run; its PNG is captured by that variant and not yet committed." + }, + "(auth)/receive/index.tsx": { + "status": "baselined", + "baselines": ["receive", "receive-qr-step"] + }, + "(auth)/send/index.tsx": { + "status": "baselined", + "baselines": ["send", "send-input-step"] + }, + + "index.tsx": { + "status": "exempt", + "category": "redirect", + "reason": "Entry route resolves auth state and returns only to welcome / verify / dashboard, all of which are baselined." + }, + "(auth)/webview.tsx": { + "status": "exempt", + "category": "external-content", + "reason": "Loads external URLs (KYC iframe, payment hand-off) inside a behind the safe-url allow-list; remote content has no stable golden." + }, + "(auth)/legal/index.tsx": { + "status": "exempt", + "category": "external-launcher", + "reason": "Hands a list of legal-document URLs to the OS browser via Linking; the screen renders no durable in-app surface." + }, + "(auth)/portfolio/[symbol].tsx": { + "status": "exempt", + "category": "dynamic-detail", + "reason": "Asset-detail view rendered entirely from the :symbol param and live price data; a stable baseline needs a frozen pricing fixture (tracked)." + }, + "(auth)/transaction-history/[id].tsx": { + "status": "exempt", + "category": "dynamic-detail", + "reason": "Transaction-detail view rendered entirely from the :id param; a stable baseline needs a frozen transaction fixture (tracked)." + }, + "(auth)/linked-wallet/[address].tsx": { + "status": "exempt", + "category": "dynamic-detail", + "reason": "Linked-wallet detail rendered entirely from the :address param; a stable baseline needs a frozen wallet fixture (tracked)." + }, + + "(onboarding)/create-passkey.tsx": { + "status": "baselined", + "baselines": ["create-passkey"] + }, + "(onboarding)/restore-passkey.tsx": { + "status": "baselined", + "baselines": ["restore-passkey"] + }, + "(onboarding)/verify-seed.tsx": { + "status": "pending", + "tracking": "DFXswiss/dfx-wallet#186", + "reason": "Seed-verification onboarding step; needs the generated-mnemonic state from create-wallet carried into the visual flow." + }, + "(auth)/(tabs)/settings.tsx": { + "status": "baselined", + "baselines": ["settings"] + }, + "(auth)/wallets/index.tsx": { + "status": "pending", + "tracking": "DFXswiss/dfx-wallet#186", + "reason": "DFX-wallets list is backend-driven (fetches /v1/v2/user); against the testnet build with no live DFX API it renders an error state, not a meaningful baseline. Capture once the mocked DFX backend lands." + }, + "(auth)/portfolio/index.tsx": { + "status": "pending", + "tracking": "DFXswiss/dfx-wallet#186", + "reason": "Portfolio overview; needs onboarded state plus a frozen balance fixture for a stable baseline." + }, + "(auth)/portfolio/manage.tsx": { + "status": "pending", + "tracking": "DFXswiss/dfx-wallet#186", + "reason": "Asset-management screen; needs onboarded state plus the asset-list fixture." + }, + "(auth)/buy/index.tsx": { + "status": "pending", + "tracking": "DFXswiss/dfx-wallet#186", + "reason": "DFX buy flow; needs onboarded state and a mocked DFX backend response before a deterministic baseline." + }, + "(auth)/sell/index.tsx": { + "status": "pending", + "tracking": "DFXswiss/dfx-wallet#186", + "reason": "DFX sell flow; needs onboarded state and a mocked DFX backend response before a deterministic baseline." + }, + "(auth)/kyc/index.tsx": { + "status": "pending", + "tracking": "DFXswiss/dfx-wallet#186", + "reason": "KYC entry; needs onboarded state and a mocked DFX KYC-status response before a deterministic baseline." + }, + "(auth)/pay/index.tsx": { + "status": "pending", + "tracking": "DFXswiss/dfx-wallet#186", + "reason": "Pay landing; needs onboarded state — capture once a pay-screen testID anchor is added." + }, + "(auth)/pay/opencryptopay.tsx": { + "status": "pending", + "tracking": "DFXswiss/dfx-wallet#186", + "reason": "OpenCryptoPay quote/invoice screen; needs onboarded state and a mocked OpenCryptoPay provider response before a deterministic baseline." + }, + "(auth)/multi-sig/index.tsx": { + "status": "baselined", + "baselines": ["multi-sig"] + }, + "(auth)/multi-sig/setup.tsx": { + "status": "baselined", + "baselines": ["multi-sig-setup"] + }, + "(auth)/contact/index.tsx": { + "status": "pending", + "tracking": "DFXswiss/dfx-wallet#186", + "reason": "DFX contact screen; needs onboarded state with the DFX backend feature on." + }, + "(auth)/support/index.tsx": { + "status": "pending", + "tracking": "DFXswiss/dfx-wallet#186", + "reason": "DFX support screen; needs onboarded state with the DFX backend feature on." + }, + "(auth)/email/index.tsx": { + "status": "pending", + "tracking": "DFXswiss/dfx-wallet#186", + "reason": "DFX email screen; needs onboarded state with the DFX backend feature on." + }, + "(auth)/dfx-login/index.tsx": { + "status": "pending", + "tracking": "DFXswiss/dfx-wallet#186", + "reason": "DFX e-mail login; needs onboarded state with the DFX backend feature on." + }, + "(auth)/tax-report/index.tsx": { + "status": "pending", + "tracking": "DFXswiss/dfx-wallet#186", + "reason": "Tax-report screen; needs onboarded state and a mocked DFX transaction list before a deterministic baseline." + }, + "(auth)/hardware-connect/index.tsx": { + "status": "baselined", + "baselines": ["hardware-connect"] + }, + "(auth)/seed-export.tsx": { + "status": "baselined", + "baselines": ["seed-export"] + }, + "(auth)/transaction-history/index.tsx": { + "status": "pending", + "tracking": "DFXswiss/dfx-wallet#186", + "reason": "Transaction-history list; needs onboarded state and a frozen transaction fixture for a stable baseline." + } + } +} diff --git a/e2e/visual/authenticated.test.ts b/e2e/visual/authenticated.test.ts new file mode 100644 index 00000000..e2defe90 --- /dev/null +++ b/e2e/visual/authenticated.test.ts @@ -0,0 +1,192 @@ +import { by, device, element, waitFor } from 'detox'; +import { expectScreenToMatchBaseline } from '../utils/screenshot'; +import { launchAndWaitForWelcome } from '../utils/launch'; + +// Small delay for UI transitions when synchronization is disabled. +const pause = (ms = 1_000) => new Promise((r) => setTimeout(r, ms)); + +/** + * Full-variant visual suite. + * + * The MVP visual run (onboarding.test.ts, on the default `.env.testnet` build) + * builds with every EXPO_PUBLIC_ENABLE_* flag unset, so the authenticated, + * feature-gated screens resolve to their `*Disabled` stubs and can never be + * snapshotted there. This suite is captured against a build with every flag on + * (the `full` matrix leg of .github/workflows/visual-regression.yml), so each + * screen resolves to its real implementation. + * + * Baseline names here are disjoint from the MVP suite's, so the two share + * e2e/__baselines__/ without clobbering each other — enforced by + * scripts/check-visual-coverage.mjs. + * + * Navigation strategy: create one E2E wallet and reach the dashboard, then + * walk forward into each authenticated screen and back, all with Detox + * synchronization disabled — exactly like the green "Dashboard navigation" + * block in onboarding.test.ts. We do NOT cold-restart + PIN-unlock per screen: + * once a real WDK wallet exists its worklet keeps the JS thread permanently + * busy, so the app never reports "idle"; `device.launchApp()` re-enables + * synchronization on every new instance and then blocks forever waiting for an + * idle that never comes. + * Driving with explicit `waitFor` + `pause()` while staying sync-disabled is + * the only thing that works once the wallet is live (see docs/visual-regression.md). + */ + +async function onboardToDashboard(): Promise { + await launchAndWaitForWelcome(); + await element(by.id('welcome-create-wallet-button')).tap(); + await waitFor(element(by.id('create-wallet-screen'))) + .toBeVisible() + .withTimeout(60_000); + // The continue button is gated behind revealing (acknowledging) the seed. + await element(by.id('create-wallet-reveal-button')).tap(); + await pause(2_000); + await element(by.id('create-wallet-continue-button')).tap(); + // Visual builds use the feature-complete screen implementations but bypass + // the PIN/legal consent flow. Those behaviours are covered by unit/Maestro; + // this suite needs a deterministic authenticated wallet only so it can + // compare the downstream screens. SetupPinDisabled marks onboarding complete + // and routes here after WDK wallet creation finishes. + await waitFor(element(by.id('dashboard-screen'))) + .toBeVisible() + .withTimeout(300_000); +} + +async function openSettings(): Promise { + await element(by.id('dashboard-menu-button')).tap(); + // `settings-user-data` is the topmost settings row — a stable, always-visible + // anchor for the screen transition (the screen has no root testID). + await waitFor(element(by.id('settings-user-data'))) + .toBeVisible() + .withTimeout(60_000); + await pause(); +} + +describe('Visual Regression (full variant)', () => { + // Passkey onboarding screens delete + recreate state on launch, so they run + // first — before the wallet the authenticated blocks depend on exists. + describe('Passkey onboarding screens', () => { + beforeAll(async () => { + await launchAndWaitForWelcome(); + }); + + it('shows create-passkey screen', async () => { + await element(by.id('welcome-create-passkey-button')).tap(); + await waitFor(element(by.id('create-passkey-screen'))) + .toBeVisible() + .withTimeout(60_000); + await pause(); + await expectScreenToMatchBaseline('create-passkey'); + }); + }); + + describe('Restore-passkey onboarding screen', () => { + beforeAll(async () => { + await launchAndWaitForWelcome(); + }); + + it('shows restore-passkey screen', async () => { + // Restore options are collapsed behind the toggle by default. + await element(by.id('welcome-restore-toggle')).tap(); + await pause(); + await element(by.id('welcome-restore-passkey-button')).tap(); + await waitFor(element(by.id('restore-passkey-screen'))) + .toBeVisible() + .withTimeout(60_000); + await pause(); + await expectScreenToMatchBaseline('restore-passkey'); + }); + }); + + // Onboard the wallet the authenticated screens below reuse. Every block + // after this one navigates from the state this leaves behind (the dashboard), + // without a fresh launch — see the navigation-strategy note in the header. + describe('Onboard E2E wallet', () => { + it('reaches the dashboard', async () => { + await onboardToDashboard(); + }); + }); + + // Authenticated screens, captured by navigating forward/back from the + // onboarded dashboard. Tests run in declaration order and carry the app's + // navigation state from one to the next, mirroring the MVP suite's + // "Dashboard navigation" block. + describe('Authenticated screens', () => { + beforeAll(async () => { + // With a live WDK wallet the worklet keeps the JS + // thread permanently busy, so we must turn synchronization back off + // before navigating — otherwise every waitFor blocks on an "idle" the + // app never reaches (the relaunch design hit the same wall, forever). + await device.disableSynchronization(); + }); + + // --- Multi-sig (reached from the dashboard shield button) --- + it('shows the multi-sig manage screen', async () => { + await element(by.id('dashboard-shield-button')).tap(); + await waitFor(element(by.id('multi-sig-manage'))) + .toBeVisible() + .withTimeout(60_000); + await pause(); + await expectScreenToMatchBaseline('multi-sig'); + }); + + it('shows the multi-sig setup screen', async () => { + await element(by.id('multi-sig-setup-cta')).tap(); + await waitFor(element(by.id('multi-sig'))) + .toBeVisible() + .withTimeout(60_000); + await pause(); + await expectScreenToMatchBaseline('multi-sig-setup'); + }); + + it('returns to the dashboard from multi-sig', async () => { + // setup (intro step) → manage → dashboard, one back tap each. + await element(by.id('multi-sig-back')).tap(); + await waitFor(element(by.id('multi-sig-manage'))) + .toBeVisible() + .withTimeout(60_000); + await pause(); + await element(by.id('multi-sig-manage-back')).tap(); + await waitFor(element(by.id('dashboard-screen'))) + .toBeVisible() + .withTimeout(60_000); + await pause(); + }); + + // --- Settings and its sub-screens (reached from the dashboard menu) --- + it('shows the settings screen', async () => { + await openSettings(); + await expectScreenToMatchBaseline('settings'); + }); + + // NOTE: the DFX-wallets screen is backend-driven (it fetches /v1/v2/user); + // against the testnet build with no live DFX API it renders an error state, + // which is not a meaningful baseline. It stays `pending` in the manifest + // until the mocked DFX backend lands. Same constraint as buy/sell/kyc/etc. + + it('shows the seed-export screen', async () => { + await element(by.id('settings-seed')).tap(); + await waitFor(element(by.id('seed-export-screen'))) + .toBeVisible() + .withTimeout(60_000); + await pause(); + await expectScreenToMatchBaseline('seed-export'); + }); + + it('returns to settings from seed-export', async () => { + await element(by.id('seed-export-back')).tap(); + await waitFor(element(by.id('settings-user-data'))) + .toBeVisible() + .withTimeout(60_000); + await pause(); + }); + + it('shows the hardware-connect screen', async () => { + await element(by.id('settings-hardware-wallet')).tap(); + await waitFor(element(by.id('hardware-connect-screen'))) + .toBeVisible() + .withTimeout(60_000); + await pause(); + await expectScreenToMatchBaseline('hardware-connect'); + }); + }); +}); diff --git a/e2e/visual/onboarding.test.ts b/e2e/visual/onboarding.test.ts index 0fd9fafe..0517975e 100644 --- a/e2e/visual/onboarding.test.ts +++ b/e2e/visual/onboarding.test.ts @@ -1,12 +1,28 @@ import { by, element, waitFor } from 'detox'; import { expectScreenToMatchBaseline } from '../utils/screenshot'; -import { launchAndWaitForWelcome } from '../utils/launch'; +import { launchAndWaitForWelcome, launchWithExistingState } from '../utils/launch'; import { enterPin } from '../utils/pin'; // Small delay for UI transitions when synchronization is disabled. const pause = (ms = 1_000) => new Promise((r) => setTimeout(r, ms)); -describe('Onboarding', () => { +// Each gated describe-block reads the same EXPO_PUBLIC_ENABLE_* string +// the production build resolves through `src/config/features.ts`, so a +// build with the feature off skips its block entirely and a build with +// the feature on runs against the real screen (not the Disabled stub). +const featureOn = (envVar: string): boolean => process.env[envVar] === 'true'; +const enableRestore = featureOn('EXPO_PUBLIC_ENABLE_RESTORE'); +const enablePasskey = featureOn('EXPO_PUBLIC_ENABLE_PASSKEY'); +const enablePin = featureOn('EXPO_PUBLIC_ENABLE_PIN'); +const enableLegal = featureOn('EXPO_PUBLIC_ENABLE_LEGAL'); + +const describeRestoreToggle = enableRestore || enablePasskey ? describe : describe.skip; +const describePinLegal = enablePin && enableLegal ? describe : describe.skip; +const describePin = enablePin ? describe : describe.skip; +const describeRestoreFlow = + (enableRestore || enablePasskey) && enablePin && enableLegal ? describe : describe.skip; + +describe('Visual Regression', () => { describe('Welcome screen', () => { beforeAll(async () => { await launchAndWaitForWelcome(); @@ -15,6 +31,12 @@ describe('Onboarding', () => { it('matches baseline', async () => { await expectScreenToMatchBaseline('welcome'); }); + }); + + describeRestoreToggle('Welcome screen with restore toggle', () => { + beforeAll(async () => { + await launchAndWaitForWelcome(); + }); it('matches baseline with restore options visible', async () => { await element(by.id('welcome-restore-toggle')).tap(); @@ -23,7 +45,140 @@ describe('Onboarding', () => { }); }); - describe('Create wallet flow', () => { + describe('Create wallet flow (MVP)', () => { + beforeAll(async () => { + await launchAndWaitForWelcome(); + }); + + it('shows create wallet screen', async () => { + await element(by.id('welcome-create-wallet-button')).tap(); + await waitFor(element(by.id('create-wallet-screen'))) + .toBeVisible() + .withTimeout(30_000); + await expectScreenToMatchBaseline('create-wallet'); + }); + + it('shows revealed seed phrase', async () => { + await element(by.id('create-wallet-reveal-button')).tap(); + await pause(2_000); + await expectScreenToMatchBaseline('create-wallet-revealed'); + }); + + it('shows dashboard via the disabled-stub redirect', async () => { + // With EXPO_PUBLIC_ENABLE_PIN + EXPO_PUBLIC_ENABLE_LEGAL off, + // SetupPinDisabled marks the wallet onboarded + authenticated + // and replaces the PIN screen with a `router.replace('/(auth)/(tabs)/dashboard')`, + // so "continue" jumps straight to the dashboard. WDK's + // restoreWallet() initialises all chain wallets in between which + // can take 30s+ — bitcoin, taproot and plasma each open their own + // worker. + await element(by.id('create-wallet-continue-button')).tap(); + await waitFor(element(by.id('dashboard-screen'))) + .toBeVisible() + .withTimeout(120_000); + await expectScreenToMatchBaseline('dashboard'); + }); + }); + + // Continues from the Create-wallet-MVP block above without a fresh + // launch — re-onboarding doubles the WDK init cost (~120s) and the + // existing "PIN unlock" block below already relies on the same + // describe-to-describe state carry-over. + describe('Dashboard navigation (MVP)', () => { + it('hides the balance via the eye toggle', async () => { + // dashboard-screen is in view from the Create-wallet describe above. + await element(by.id('dashboard-balance-toggle')).tap(); + await waitFor(element(by.id('dashboard-balance-hidden'))) + .toBeVisible() + .withTimeout(30_000); + await pause(); + await expectScreenToMatchBaseline('dashboard-balance-hidden'); + }); + + it('restores the balance via the eye toggle', async () => { + await element(by.id('dashboard-balance-toggle')).tap(); + await waitFor(element(by.id('dashboard-balance-value'))) + .toBeVisible() + .withTimeout(30_000); + }); + + it('shows receive screen (asset list)', async () => { + await element(by.id('dashboard-action-receive')).tap(); + await waitFor(element(by.id('receive-screen'))) + .toBeVisible() + .withTimeout(30_000); + await pause(); + await expectScreenToMatchBaseline('receive'); + }); + + it('shows receive QR step after picking BTC', async () => { + await element(by.id('receive-asset-btc')).tap(); + // The selected-asset pill is the topmost element on the QR step + // — sitting just under the header — so it's the most reliable + // visibility anchor. Detox's `toBeVisible` is strict (>75% of + // the element on screen); the QR container can sit far enough + // down on a tall iPhone that it's only partially in view, so + // wait on the pill and then `pause()` for layout to settle + // before screenshotting. + await waitFor(element(by.id('receive-selected-asset-pill'))) + .toBeVisible() + .withTimeout(30_000); + await pause(2_000); + await expectScreenToMatchBaseline('receive-qr-step'); + }); + + it('returns to the receive asset list', async () => { + await element(by.id('receive-selected-asset-pill')).tap(); + // After the pill tap the screen re-mounts the asset-step body; + // wait on the top BTC card (visible, anchored near the top of + // the scroll view) rather than the wrapper View, which can sit + // outside Detox's strict viewport heuristic. + await waitFor(element(by.id('receive-asset-btc'))) + .toBeVisible() + .withTimeout(30_000); + await pause(); + }); + + it('returns to the dashboard from receive', async () => { + await element(by.id('receive-screen-back')).tap(); + await waitFor(element(by.id('dashboard-balance-toggle'))) + .toBeVisible() + .withTimeout(30_000); + await pause(); + }); + + it('shows send screen (asset list)', async () => { + await element(by.id('dashboard-action-send')).tap(); + // Asset cards are the top content on the Send screen — they're + // a more reliable visibility anchor than the header View, which + // sits behind the safe-area inset on tall iPhones. + await waitFor(element(by.id('send-asset-btc'))) + .toBeVisible() + .withTimeout(30_000); + await pause(); + await expectScreenToMatchBaseline('send'); + }); + + it('shows send input step after picking BTC', async () => { + await element(by.id('send-asset-btc')).tap(); + // Same trick as receive-qr-step: the selected-asset pill is the + // anchor near the top of the screen, the inputs are below. + await waitFor(element(by.id('send-selected-asset-pill'))) + .toBeVisible() + .withTimeout(30_000); + await pause(2_000); + await expectScreenToMatchBaseline('send-input-step'); + }); + + it('returns to the send asset list', async () => { + await element(by.id('send-selected-asset-pill')).tap(); + await waitFor(element(by.id('send-asset-btc'))) + .toBeVisible() + .withTimeout(30_000); + }); + }); + + describePinLegal('Create wallet flow with PIN + legal', () => { beforeAll(async () => { await launchAndWaitForWelcome(); }); @@ -32,7 +187,7 @@ describe('Onboarding', () => { await element(by.id('welcome-create-wallet-button')).tap(); await waitFor(element(by.id('create-wallet-screen'))) .toBeVisible() - .withTimeout(10_000); + .withTimeout(30_000); await expectScreenToMatchBaseline('create-wallet'); }); @@ -44,9 +199,11 @@ describe('Onboarding', () => { it('shows setup PIN screen', async () => { await element(by.id('create-wallet-continue-button')).tap(); + // WDK restoreWallet() initializes all chain wallets which can + // take over 30s, especially with bitcoin + taproot + plasma. await waitFor(element(by.id('setup-pin-screen'))) .toBeVisible() - .withTimeout(15_000); + .withTimeout(120_000); await expectScreenToMatchBaseline('setup-pin'); }); @@ -54,7 +211,7 @@ describe('Onboarding', () => { await enterPin('111111'); await waitFor(element(by.id('setup-pin-confirm-screen'))) .toBeVisible() - .withTimeout(5_000); + .withTimeout(30_000); await expectScreenToMatchBaseline('setup-pin-confirm'); }); @@ -62,7 +219,7 @@ describe('Onboarding', () => { await enterPin('111111'); await waitFor(element(by.id('legal-disclaimer-screen'))) .toBeVisible() - .withTimeout(5_000); + .withTimeout(30_000); await expectScreenToMatchBaseline('legal-disclaimer'); }); @@ -71,12 +228,42 @@ describe('Onboarding', () => { await element(by.id('legal-continue-button')).tap(); await waitFor(element(by.id('dashboard-screen'))) .toBeVisible() - .withTimeout(10_000); - await expectScreenToMatchBaseline('dashboard'); + .withTimeout(30_000); + await expectScreenToMatchBaseline('dashboard-with-pin-legal'); + }); + }); + + // PIN unlock reuses the onboarded state from the create wallet flow above. + // Running this in a separate test file fails because the WDK's second + // restoreWallet() call hangs on CI — likely due to stale WDK state that + // survives app reinstall. + describePin('PIN unlock', () => { + it('shows verify PIN screen after cold restart', async () => { + await launchWithExistingState(); + await waitFor(element(by.id('verify-pin-screen'))) + .toBeVisible() + .withTimeout(30_000); + await expectScreenToMatchBaseline('verify-pin'); + }); + + it('shows error state on wrong PIN', async () => { + await enterPin('222222'); + await waitFor(element(by.id('verify-pin-error'))) + .toBeVisible() + .withTimeout(30_000); + await expectScreenToMatchBaseline('verify-pin-error'); + }); + + it('reaches dashboard after correct PIN', async () => { + await enterPin('111111'); + await waitFor(element(by.id('dashboard-screen'))) + .toBeVisible() + .withTimeout(30_000); + await expectScreenToMatchBaseline('pin-unlock-dashboard'); }); }); - describe('Restore wallet flow', () => { + describeRestoreFlow('Restore wallet flow', () => { beforeAll(async () => { await launchAndWaitForWelcome(); }); @@ -87,7 +274,7 @@ describe('Onboarding', () => { await element(by.id('welcome-restore-seed-button')).tap(); await waitFor(element(by.id('restore-wallet-screen'))) .toBeVisible() - .withTimeout(15_000); + .withTimeout(30_000); await expectScreenToMatchBaseline('restore-wallet'); }); @@ -100,10 +287,5 @@ describe('Onboarding', () => { await pause(); await expectScreenToMatchBaseline('restore-wallet-filled'); }); - - // Setup PIN after restore is visually identical to the create-wallet - // flow's setup-pin baseline. That screen is already covered above. - // The continue-button tap is skipped here because it requires scrolling - // within a Fabric ScrollView which hits a known Detox visibility bug. }); }); diff --git a/e2e/visual/pin-unlock.test.ts b/e2e/visual/pin-unlock.test.ts deleted file mode 100644 index 9efd79fb..00000000 --- a/e2e/visual/pin-unlock.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { by, element, waitFor } from 'detox'; -import { expectScreenToMatchBaseline } from '../utils/screenshot'; -import { launchAndWaitForWelcome, launchWithExistingState } from '../utils/launch'; -import { enterPin } from '../utils/pin'; - -describe('PIN unlock', () => { - beforeAll(async () => { - // Complete onboarding first so the app has a stored PIN. - await launchAndWaitForWelcome(); - - await element(by.id('welcome-create-wallet-button')).tap(); - await waitFor(element(by.id('create-wallet-screen'))) - .toBeVisible() - .withTimeout(5_000); - - await element(by.id('create-wallet-reveal-button')).tap(); - // Wait for seed words to render - await new Promise((r) => setTimeout(r, 2_000)); - await element(by.id('create-wallet-continue-button')).tap(); - await waitFor(element(by.id('setup-pin-screen'))) - .toBeVisible() - .withTimeout(15_000); - - // Enter + confirm PIN (111111) - await enterPin('111111'); - await waitFor(element(by.id('setup-pin-confirm-screen'))) - .toBeVisible() - .withTimeout(5_000); - await enterPin('111111'); - - // Legal disclaimer - await waitFor(element(by.id('legal-disclaimer-screen'))) - .toBeVisible() - .withTimeout(5_000); - await element(by.id('legal-accept-checkbox')).tap(); - await element(by.id('legal-continue-button')).tap(); - await waitFor(element(by.id('dashboard-screen'))) - .toBeVisible() - .withTimeout(10_000); - }); - - it('shows verify PIN screen after cold restart', async () => { - await launchWithExistingState(); - await waitFor(element(by.id('verify-pin-screen'))) - .toBeVisible() - .withTimeout(30_000); - await expectScreenToMatchBaseline('verify-pin'); - }); - - it('shows error state on wrong PIN', async () => { - await enterPin('222222'); - await waitFor(element(by.id('verify-pin-error'))) - .toBeVisible() - .withTimeout(5_000); - await expectScreenToMatchBaseline('verify-pin-error'); - }); - - it('reaches dashboard after correct PIN', async () => { - await enterPin('111111'); - await waitFor(element(by.id('dashboard-screen'))) - .toBeVisible() - .withTimeout(10_000); - await expectScreenToMatchBaseline('pin-unlock-dashboard'); - }); -}); diff --git a/eslint.config.js b/eslint.config.js index 6d16a186..ecf40aec 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -41,7 +41,11 @@ module.exports = defineConfig([ 'error', { tolerance: 4.5, - ignoreContent: [], + ignoreContent: [ + // BIP-173 reference address — public test vector used as a + // deterministic fixture in test/helpers/fake-bitbox.ts. + 'bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq', + ], }, ], }, @@ -73,6 +77,23 @@ module.exports = defineConfig([ 'security/detect-object-injection': 'off', }, }, + { + // CI gate scripts (ESM). They print status to stdout by design, and their + // fs paths are repo-relative constants / CI-provided argv — not user input + // reaching the app, which is what detect-non-literal-fs-filename targets. + files: ['scripts/**/*.mjs'], + languageOptions: { + sourceType: 'module', + globals: { + process: 'readonly', + console: 'readonly', + }, + }, + rules: { + 'no-console': 'off', + 'security/detect-non-literal-fs-filename': 'off', + }, + }, { files: ['scripts/**/*.js', 'eslint.config.js'], languageOptions: { diff --git a/jest.config.js b/jest.config.js index a51923b3..6c24df25 100644 --- a/jest.config.js +++ b/jest.config.js @@ -26,6 +26,37 @@ const sharedNameMapper = { }; module.exports = { + // Coverage scope is the logic surface only: services + stores. Screens and + // feature UI are owned by component tests, visual regression and Maestro — + // forcing line coverage on JSX produces useless render tests, not safety. + // The floor is enforced by scripts/check-coverage-floor.mjs against the + // committed .coverage-floor-lines file (see that script for the ratchet + // protocol). + collectCoverageFrom: [ + 'src/services/**/*.{ts,tsx}', + 'src/store/**/*.{ts,tsx}', + 'src/features/**/services/**/*.{ts,tsx}', + 'src/hooks/**/*.{ts,tsx}', + // Security-critical feature logic that lives outside a `services/` folder + // but must still be measured (and is pinned in .coverage-floors.json). + 'src/features/biometric/biometric.ts', + // Portfolio logic + screens (full-area coverage). + 'src/features/portfolio/useTotalPortfolioFiatFull.ts', + 'src/features/portfolio/useEnabledChains.ts', + 'src/features/portfolio/PortfolioScreenImpl.tsx', + 'src/features/portfolio/PortfolioAssetDetailScreenImpl.tsx', + 'src/features/portfolio/PortfolioManageScreenImpl.tsx', + // Settings logic + screens (full-area coverage). + 'src/features/settings/SettingsScreenImpl.tsx', + 'src/features/settings/SeedExportScreenImpl.tsx', + // Multi-Sig logic + screens (full-area coverage). + 'src/features/multi-sig/store.ts', + 'src/features/multi-sig/MultiSigSetupScreenImpl.tsx', + 'src/features/multi-sig/MultiSigManageScreenImpl.tsx', + '!**/*.d.ts', + '!**/types.ts', + ], + coverageReporters: ['json-summary', 'lcov', 'text-summary'], projects: [ { displayName: 'unit', @@ -60,8 +91,19 @@ module.exports = { preset: 'jest-expo', transform: sharedTransform, testMatch: ['/test/components/**/*.test.tsx'], + // Same global flag setup as the unit project: pin every + // EXPO_PUBLIC_ENABLE_* to "true" before any feature wrapper loads, + // so `FEATURES.X` resolves to the real implementation in the + // components project's screen tests as well. + setupFiles: ['/test/setup-globals.ts'], moduleNameMapper: { ...sharedNameMapper, + // The WDK package ships TypeScript source on npm and Jest's transform + // chain does not handle `export type {…}` inside node_modules without + // help. The local mock under `test/__mocks__/wdk.ts` exposes the + // surface our hooks touch (BaseAsset, useAccount, useRefreshBalance, + // …) without dragging in the Bare worklet. + '^@tetherto/wdk-react-native-core$': '/test/__mocks__/wdk.ts', }, // jest-expo's defaults already cover react-native; add overrides for // wallet-specific dependencies that should not run their native bridge diff --git a/modules/bitbox-hid/android/build/.transforms/cdd325ea68c64d8ca8de309d75e27330/results.bin b/modules/bitbox-hid/android/build/.transforms/cdd325ea68c64d8ca8de309d75e27330/results.bin new file mode 100644 index 00000000..0d259ddc --- /dev/null +++ b/modules/bitbox-hid/android/build/.transforms/cdd325ea68c64d8ca8de309d75e27330/results.bin @@ -0,0 +1 @@ +o/classes diff --git a/modules/bitbox-hid/android/build/.transforms/cdd325ea68c64d8ca8de309d75e27330/transformed/classes/classes_dex/classes.dex b/modules/bitbox-hid/android/build/.transforms/cdd325ea68c64d8ca8de309d75e27330/transformed/classes/classes_dex/classes.dex new file mode 100644 index 00000000..20bfa97e Binary files /dev/null and b/modules/bitbox-hid/android/build/.transforms/cdd325ea68c64d8ca8de309d75e27330/transformed/classes/classes_dex/classes.dex differ diff --git a/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/results.bin b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/results.bin new file mode 100644 index 00000000..e1640c91 --- /dev/null +++ b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/results.bin @@ -0,0 +1 @@ +o/bundleLibRuntimeToDirRelease diff --git a/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$Companion.dex b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$Companion.dex new file mode 100644 index 00000000..37ce641f Binary files /dev/null and b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$Companion.dex differ diff --git a/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$1.dex b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$1.dex new file mode 100644 index 00000000..c4cac651 Binary files /dev/null and b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$1.dex differ diff --git a/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$2.dex b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$2.dex new file mode 100644 index 00000000..680a52df Binary files /dev/null and b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$2.dex differ diff --git a/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$3.dex b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$3.dex new file mode 100644 index 00000000..5f5ad5df Binary files /dev/null and b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$3.dex differ diff --git a/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$4.dex b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$4.dex new file mode 100644 index 00000000..e486266d Binary files /dev/null and b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$4.dex differ diff --git a/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$5.dex b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$5.dex new file mode 100644 index 00000000..596d0e6d Binary files /dev/null and b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$5.dex differ diff --git a/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$6.dex b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$6.dex new file mode 100644 index 00000000..493beb0f Binary files /dev/null and b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$6.dex differ diff --git a/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$7.dex b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$7.dex new file mode 100644 index 00000000..88cc9d25 Binary files /dev/null and b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$7.dex differ diff --git a/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$8.dex b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$8.dex new file mode 100644 index 00000000..83d37c89 Binary files /dev/null and b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$8.dex differ diff --git a/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$9.dex b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$9.dex new file mode 100644 index 00000000..c551f170 Binary files /dev/null and b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunction$9.dex differ diff --git a/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunctionWithoutArgs$1.dex b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunctionWithoutArgs$1.dex new file mode 100644 index 00000000..b4c05daa Binary files /dev/null and b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunctionWithoutArgs$1.dex differ diff --git a/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunctionWithoutArgs$2.dex b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunctionWithoutArgs$2.dex new file mode 100644 index 00000000..71d8a1ac Binary files /dev/null and b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$AsyncFunctionWithoutArgs$2.dex differ diff --git a/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$FunctionWithoutArgs$1.dex b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$FunctionWithoutArgs$1.dex new file mode 100644 index 00000000..ebe5b375 Binary files /dev/null and b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$FunctionWithoutArgs$1.dex differ diff --git a/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$OnCreate$1.dex b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$OnCreate$1.dex new file mode 100644 index 00000000..1fd4359b Binary files /dev/null and b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$OnCreate$1.dex differ diff --git a/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$OnDestroy$1.dex b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$OnDestroy$1.dex new file mode 100644 index 00000000..06f14660 Binary files /dev/null and b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule$definition$lambda$12$$inlined$OnDestroy$1.dex differ diff --git a/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule.dex b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule.dex new file mode 100644 index 00000000..3328feb4 Binary files /dev/null and b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BitboxHidModule.dex differ diff --git a/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BuildConfig.dex b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BuildConfig.dex new file mode 100644 index 00000000..26d98a1d Binary files /dev/null and b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/swiss/dfx/wallet/bitbox/BuildConfig.dex differ diff --git a/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/desugar_graph.bin b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/desugar_graph.bin new file mode 100644 index 00000000..601f245f Binary files /dev/null and b/modules/bitbox-hid/android/build/.transforms/ff6b53a55a09a2868f6e42f2b31b7a2f/transformed/bundleLibRuntimeToDirRelease/desugar_graph.bin differ diff --git a/modules/bitbox-hid/android/build/generated/source/buildConfig/release/swiss/dfx/wallet/bitbox/BuildConfig.java b/modules/bitbox-hid/android/build/generated/source/buildConfig/release/swiss/dfx/wallet/bitbox/BuildConfig.java new file mode 100644 index 00000000..3c53a351 --- /dev/null +++ b/modules/bitbox-hid/android/build/generated/source/buildConfig/release/swiss/dfx/wallet/bitbox/BuildConfig.java @@ -0,0 +1,10 @@ +/** + * Automatically generated file. DO NOT MODIFY + */ +package swiss.dfx.wallet.bitbox; + +public final class BuildConfig { + public static final boolean DEBUG = false; + public static final String LIBRARY_PACKAGE_NAME = "swiss.dfx.wallet.bitbox"; + public static final String BUILD_TYPE = "release"; +} diff --git a/modules/bitbox-hid/android/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/AndroidManifest.xml b/modules/bitbox-hid/android/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/AndroidManifest.xml new file mode 100644 index 00000000..686b1fc0 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/AndroidManifest.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/output-metadata.json b/modules/bitbox-hid/android/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/output-metadata.json new file mode 100644 index 00000000..e5f11c7c --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/aapt_friendly_merged_manifests/release/processReleaseManifest/aapt/output-metadata.json @@ -0,0 +1,18 @@ +{ + "version": 3, + "artifactType": { + "type": "AAPT_FRIENDLY_MERGED_MANIFESTS", + "kind": "Directory" + }, + "applicationId": "swiss.dfx.wallet.bitbox", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "outputFile": "AndroidManifest.xml" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/aar_main_jar/release/syncReleaseLibJars/classes.jar b/modules/bitbox-hid/android/build/intermediates/aar_main_jar/release/syncReleaseLibJars/classes.jar new file mode 100644 index 00000000..93c987b8 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/aar_main_jar/release/syncReleaseLibJars/classes.jar differ diff --git a/modules/bitbox-hid/android/build/intermediates/aar_metadata/release/writeReleaseAarMetadata/aar-metadata.properties b/modules/bitbox-hid/android/build/intermediates/aar_metadata/release/writeReleaseAarMetadata/aar-metadata.properties new file mode 100644 index 00000000..1211b1ef --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/aar_metadata/release/writeReleaseAarMetadata/aar-metadata.properties @@ -0,0 +1,6 @@ +aarFormatVersion=1.0 +aarMetadataVersion=1.0 +minCompileSdk=1 +minCompileSdkExtension=0 +minAndroidGradlePluginVersion=1.0.0 +coreLibraryDesugaringEnabled=false diff --git a/modules/bitbox-hid/android/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json b/modules/bitbox-hid/android/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/annotations_typedef_file/release/extractReleaseAnnotations/typedefs.txt b/modules/bitbox-hid/android/build/intermediates/annotations_typedef_file/release/extractReleaseAnnotations/typedefs.txt new file mode 100644 index 00000000..e69de29b diff --git a/modules/bitbox-hid/android/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar b/modules/bitbox-hid/android/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar new file mode 100644 index 00000000..5e85eff7 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar differ diff --git a/modules/bitbox-hid/android/build/intermediates/compile_r_class_jar/release/generateReleaseRFile/R.jar b/modules/bitbox-hid/android/build/intermediates/compile_r_class_jar/release/generateReleaseRFile/R.jar new file mode 100644 index 00000000..1a065a9f Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/compile_r_class_jar/release/generateReleaseRFile/R.jar differ diff --git a/modules/bitbox-hid/android/build/intermediates/compile_symbol_list/release/generateReleaseRFile/R.txt b/modules/bitbox-hid/android/build/intermediates/compile_symbol_list/release/generateReleaseRFile/R.txt new file mode 100644 index 00000000..711e0afb --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/compile_symbol_list/release/generateReleaseRFile/R.txt @@ -0,0 +1 @@ +int xml usb_device_filter 0x0 diff --git a/modules/bitbox-hid/android/build/intermediates/compiled_local_resources/release/compileReleaseLibraryResources/out/xml_usb_device_filter.xml.flat b/modules/bitbox-hid/android/build/intermediates/compiled_local_resources/release/compileReleaseLibraryResources/out/xml_usb_device_filter.xml.flat new file mode 100644 index 00000000..929d2cdc Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/compiled_local_resources/release/compileReleaseLibraryResources/out/xml_usb_device_filter.xml.flat differ diff --git a/modules/bitbox-hid/android/build/intermediates/default_proguard_files/global/proguard-android-optimize.txt-8.11.0 b/modules/bitbox-hid/android/build/intermediates/default_proguard_files/global/proguard-android-optimize.txt-8.11.0 new file mode 100644 index 00000000..5a3e3a56 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/default_proguard_files/global/proguard-android-optimize.txt-8.11.0 @@ -0,0 +1,89 @@ +# This is a configuration file for ProGuard. +# http://proguard.sourceforge.net/index.html#manual/usage.html +# +# Starting with version 2.2 of the Android plugin for Gradle, this file is distributed together with +# the plugin and unpacked at build-time. The files in $ANDROID_HOME are no longer maintained and +# will be ignored by new version of the Android plugin for Gradle. + +# Optimizations: If you don't want to optimize, use the proguard-android.txt configuration file +# instead of this one, which turns off the optimization flags. +-allowaccessmodification + +# Preserve some attributes that may be required for reflection. +-keepattributes AnnotationDefault, + EnclosingMethod, + InnerClasses, + RuntimeVisibleAnnotations, + RuntimeVisibleParameterAnnotations, + RuntimeVisibleTypeAnnotations, + Signature + +-keep public class com.google.vending.licensing.ILicensingService +-keep public class com.android.vending.licensing.ILicensingService +-keep public class com.google.android.vending.licensing.ILicensingService +-dontnote com.android.vending.licensing.ILicensingService +-dontnote com.google.vending.licensing.ILicensingService +-dontnote com.google.android.vending.licensing.ILicensingService + +# For native methods, see https://www.guardsquare.com/manual/configuration/examples#native +-keepclasseswithmembernames,includedescriptorclasses class * { + native ; +} + +# Keep setters in Views so that animations can still work. +-keepclassmembers public class * extends android.view.View { + void set*(***); + *** get*(); +} + +# We want to keep methods in Activity that could be used in the XML attribute onClick. +-keepclassmembers class * extends android.app.Activity { + public void *(android.view.View); +} + +# For enumeration classes, see https://www.guardsquare.com/manual/configuration/examples#enumerations +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keepclassmembers class * implements android.os.Parcelable { + public static final ** CREATOR; +} + +# Preserve annotated Javascript interface methods. +-keepclassmembers class * { + @android.webkit.JavascriptInterface ; +} + +# The support libraries contains references to newer platform versions. +# Don't warn about those in case this app is linking against an older +# platform version. We know about them, and they are safe. +-dontnote android.support.** +-dontnote androidx.** +-dontwarn android.support.** +-dontwarn androidx.** + +# Understand the @Keep support annotation. +-keep class android.support.annotation.Keep + +-keep @android.support.annotation.Keep class * {*;} + +-keepclasseswithmembers class * { + @android.support.annotation.Keep ; +} + +-keepclasseswithmembers class * { + @android.support.annotation.Keep ; +} + +-keepclasseswithmembers class * { + @android.support.annotation.Keep (...); +} + +# These classes are duplicated between android.jar and org.apache.http.legacy.jar. +-dontnote org.apache.http.** +-dontnote android.net.http.** + +# These classes are duplicated between android.jar and core-lambda-stubs.jar. +-dontnote java.lang.invoke.** diff --git a/modules/bitbox-hid/android/build/intermediates/default_proguard_files/global/proguard-android.txt-8.11.0 b/modules/bitbox-hid/android/build/intermediates/default_proguard_files/global/proguard-android.txt-8.11.0 new file mode 100644 index 00000000..6f7e4ef6 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/default_proguard_files/global/proguard-android.txt-8.11.0 @@ -0,0 +1,95 @@ +# This is a configuration file for ProGuard. +# http://proguard.sourceforge.net/index.html#manual/usage.html +# +# Starting with version 2.2 of the Android plugin for Gradle, this file is distributed together with +# the plugin and unpacked at build-time. The files in $ANDROID_HOME are no longer maintained and +# will be ignored by new version of the Android plugin for Gradle. + +# Optimization is turned off by default. Dex does not like code run +# through the ProGuard optimize steps (and performs some +# of these optimizations on its own). +# Note that if you want to enable optimization, you cannot just +# include optimization flags in your own project configuration file; +# instead you will need to point to the +# "proguard-android-optimize.txt" file instead of this one from your +# project.properties file. +-dontoptimize + +# Preserve some attributes that may be required for reflection. +-keepattributes AnnotationDefault, + EnclosingMethod, + InnerClasses, + RuntimeVisibleAnnotations, + RuntimeVisibleParameterAnnotations, + RuntimeVisibleTypeAnnotations, + Signature + +-keep public class com.google.vending.licensing.ILicensingService +-keep public class com.android.vending.licensing.ILicensingService +-keep public class com.google.android.vending.licensing.ILicensingService +-dontnote com.android.vending.licensing.ILicensingService +-dontnote com.google.vending.licensing.ILicensingService +-dontnote com.google.android.vending.licensing.ILicensingService + +# For native methods, see https://www.guardsquare.com/manual/configuration/examples#native +-keepclasseswithmembernames,includedescriptorclasses class * { + native ; +} + +# Keep setters in Views so that animations can still work. +-keepclassmembers public class * extends android.view.View { + void set*(***); + *** get*(); +} + +# We want to keep methods in Activity that could be used in the XML attribute onClick. +-keepclassmembers class * extends android.app.Activity { + public void *(android.view.View); +} + +# For enumeration classes, see https://www.guardsquare.com/manual/configuration/examples#enumerations +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keepclassmembers class * implements android.os.Parcelable { + public static final ** CREATOR; +} + +# Preserve annotated Javascript interface methods. +-keepclassmembers class * { + @android.webkit.JavascriptInterface ; +} + +# The support libraries contains references to newer platform versions. +# Don't warn about those in case this app is linking against an older +# platform version. We know about them, and they are safe. +-dontnote android.support.** +-dontnote androidx.** +-dontwarn android.support.** +-dontwarn androidx.** + +# Understand the @Keep support annotation. +-keep class android.support.annotation.Keep + +-keep @android.support.annotation.Keep class * {*;} + +-keepclasseswithmembers class * { + @android.support.annotation.Keep ; +} + +-keepclasseswithmembers class * { + @android.support.annotation.Keep ; +} + +-keepclasseswithmembers class * { + @android.support.annotation.Keep (...); +} + +# These classes are duplicated between android.jar and org.apache.http.legacy.jar. +-dontnote org.apache.http.** +-dontnote android.net.http.** + +# These classes are duplicated between android.jar and core-lambda-stubs.jar. +-dontnote java.lang.invoke.** diff --git a/modules/bitbox-hid/android/build/intermediates/default_proguard_files/global/proguard-defaults.txt-8.11.0 b/modules/bitbox-hid/android/build/intermediates/default_proguard_files/global/proguard-defaults.txt-8.11.0 new file mode 100644 index 00000000..7bbb2285 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/default_proguard_files/global/proguard-defaults.txt-8.11.0 @@ -0,0 +1,89 @@ +# This is a configuration file for ProGuard. +# http://proguard.sourceforge.net/index.html#manual/usage.html +# +# Starting with version 2.2 of the Android plugin for Gradle, this file is distributed together with +# the plugin and unpacked at build-time. The files in $ANDROID_HOME are no longer maintained and +# will be ignored by new version of the Android plugin for Gradle. + +# Optimizations can be turned on and off in the 'postProcessing' DSL block. +# The configuration below is applied if optimizations are enabled. +-allowaccessmodification + +# Preserve some attributes that may be required for reflection. +-keepattributes AnnotationDefault, + EnclosingMethod, + InnerClasses, + RuntimeVisibleAnnotations, + RuntimeVisibleParameterAnnotations, + RuntimeVisibleTypeAnnotations, + Signature + +-keep public class com.google.vending.licensing.ILicensingService +-keep public class com.android.vending.licensing.ILicensingService +-keep public class com.google.android.vending.licensing.ILicensingService +-dontnote com.android.vending.licensing.ILicensingService +-dontnote com.google.vending.licensing.ILicensingService +-dontnote com.google.android.vending.licensing.ILicensingService + +# For native methods, see https://www.guardsquare.com/manual/configuration/examples#native +-keepclasseswithmembernames,includedescriptorclasses class * { + native ; +} + +# Keep setters in Views so that animations can still work. +-keepclassmembers public class * extends android.view.View { + void set*(***); + *** get*(); +} + +# We want to keep methods in Activity that could be used in the XML attribute onClick. +-keepclassmembers class * extends android.app.Activity { + public void *(android.view.View); +} + +# For enumeration classes, see https://www.guardsquare.com/manual/configuration/examples#enumerations +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keepclassmembers class * implements android.os.Parcelable { + public static final ** CREATOR; +} + +# Preserve annotated Javascript interface methods. +-keepclassmembers class * { + @android.webkit.JavascriptInterface ; +} + +# The support libraries contains references to newer platform versions. +# Don't warn about those in case this app is linking against an older +# platform version. We know about them, and they are safe. +-dontnote android.support.** +-dontnote androidx.** +-dontwarn android.support.** +-dontwarn androidx.** + +# Understand the @Keep support annotation. +-keep class android.support.annotation.Keep + +-keep @android.support.annotation.Keep class * {*;} + +-keepclasseswithmembers class * { + @android.support.annotation.Keep ; +} + +-keepclasseswithmembers class * { + @android.support.annotation.Keep ; +} + +-keepclasseswithmembers class * { + @android.support.annotation.Keep (...); +} + +# These classes are duplicated between android.jar and org.apache.http.legacy.jar. +-dontnote org.apache.http.** +-dontnote android.net.http.** + +# These classes are duplicated between android.jar and core-lambda-stubs.jar. +-dontnote java.lang.invoke.** diff --git a/modules/bitbox-hid/android/build/intermediates/full_jar/release/createFullJarRelease/full.jar b/modules/bitbox-hid/android/build/intermediates/full_jar/release/createFullJarRelease/full.jar new file mode 100644 index 00000000..d1875135 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/full_jar/release/createFullJarRelease/full.jar differ diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/lintVitalAnalyzeRelease/module.xml b/modules/bitbox-hid/android/build/intermediates/incremental/lintVitalAnalyzeRelease/module.xml new file mode 100644 index 00000000..532c11e2 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/lintVitalAnalyzeRelease/module.xml @@ -0,0 +1,18 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/lintVitalAnalyzeRelease/release-artifact-dependencies.xml b/modules/bitbox-hid/android/build/intermediates/incremental/lintVitalAnalyzeRelease/release-artifact-dependencies.xml new file mode 100644 index 00000000..fc529ce0 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/lintVitalAnalyzeRelease/release-artifact-dependencies.xml @@ -0,0 +1,293 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/lintVitalAnalyzeRelease/release-artifact-libraries.xml b/modules/bitbox-hid/android/build/intermediates/incremental/lintVitalAnalyzeRelease/release-artifact-libraries.xml new file mode 100644 index 00000000..c38589aa --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/lintVitalAnalyzeRelease/release-artifact-libraries.xml @@ -0,0 +1,804 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/lintVitalAnalyzeRelease/release.xml b/modules/bitbox-hid/android/build/intermediates/incremental/lintVitalAnalyzeRelease/release.xml new file mode 100644 index 00000000..3d3f7321 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/lintVitalAnalyzeRelease/release.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/mergeReleaseAssets/merger.xml b/modules/bitbox-hid/android/build/intermediates/incremental/mergeReleaseAssets/merger.xml new file mode 100644 index 00000000..1c8a8322 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/mergeReleaseAssets/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml b/modules/bitbox-hid/android/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml new file mode 100644 index 00000000..828e8d25 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/mergeReleaseJniLibFolders/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/mergeReleaseShaders/merger.xml b/modules/bitbox-hid/android/build/intermediates/incremental/mergeReleaseShaders/merger.xml new file mode 100644 index 00000000..1fb9cf9b --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/mergeReleaseShaders/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release-mergeJavaRes/merge-state b/modules/bitbox-hid/android/build/intermediates/incremental/release-mergeJavaRes/merge-state new file mode 100644 index 00000000..1b19e094 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/incremental/release-mergeJavaRes/merge-state differ diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/compile-file-map.properties b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/compile-file-map.properties new file mode 100644 index 00000000..f68f3157 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/compile-file-map.properties @@ -0,0 +1,401 @@ +#Wed May 06 23:46:35 CEST 2026 +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-ldrtl-mdpi-v17/abc_spinner_mtrl_am_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-mdpi-v17/abc_spinner_mtrl_am_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/btn_checkbox_checked_to_unchecked_mtrl_animation.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_checkbox_checked_to_unchecked_mtrl_animation.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color/abc_search_url_text.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_search_url_text.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_list_selector_background_transition_holo_dark.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_list_selector_background_transition_holo_dark.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/anim/catalyst_slide_down.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_slide_down.xml +swiss.dfx.wallet.bitbox.bitbox-hid-autofill-1.1.0-23\:/layout/autofill_inline_suggestion.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/autofill_inline_suggestion.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_000.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_000.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_textfield_default_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_default_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-ldpi-v4/ic_call_decline.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_decline.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_seekbar_tick_mark_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_seekbar_tick_mark_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-anydpi-v21/ic_call_decline.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_decline.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/interpolator/btn_radio_to_on_mtrl_animation_interpolator_0.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_radio_to_on_mtrl_animation_interpolator_0.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_015.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_015.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/abc_popup_enter.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_popup_enter.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xhdpi-v4/ic_call_answer.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_answer.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_list_menu_item_layout.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_list_menu_item_layout.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_000.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_000.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/btn_radio_to_off_mtrl_dot_group_animation.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_dot_group_animation.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_tab_indicator_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_tab_indicator_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-mdpi-v4/ic_call_answer.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_answer.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-fragment-1.5.4-5\:/animator/fragment_open_exit.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_open_exit.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_scrubber_control_off_mtrl_alpha.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_control_off_mtrl_alpha.png +swiss.dfx.wallet.bitbox.bitbox-hid-fragment-1.5.4-5\:/animator/fragment_open_enter.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_open_enter.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_search_view.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_search_view.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color-v23/abc_tint_btn_checkable.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_btn_checkable.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_select_dialog_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_select_dialog_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_seekbar_track_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_seekbar_track_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_activity_chooser_view_list_item.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_activity_chooser_view_list_item.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/btn_radio_to_on_mtrl_ring_outer_path_animation.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_ring_outer_path_animation.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/abc_grow_fade_in_from_bottom.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_grow_fade_in_from_bottom.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_015.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_015.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/abc_slide_out_top.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_out_top.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color-v23/abc_tint_seek_thumb.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_seek_thumb.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-mdpi-v4/ic_call_decline_low.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_decline_low.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_activity_chooser_view.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_activity_chooser_view.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_list_selector_disabled_holo_dark.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_selector_disabled_holo_dark.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_btn_check_material_anim.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_check_material_anim.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/btn_radio_to_off_mtrl_ring_outer_animation.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_ring_outer_animation.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/anim/catalyst_fade_in.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_fade_in.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-v21/abc_edit_text_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_edit_text_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/abc_slide_in_top.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_in_top.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_list_focused_holo.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_focused_holo.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color/abc_primary_text_material_light.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_material_light.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/layout-v21/notification_template_icon_group.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_template_icon_group.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_ic_menu_copy_mtrl_am_alpha.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_copy_mtrl_am_alpha.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout-v26/abc_screen_toolbar.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v26/abc_screen_toolbar.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color/abc_secondary_text_material_light.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_secondary_text_material_light.xml +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/anim/catalyst_fade_out.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_fade_out.xml +swiss.dfx.wallet.bitbox.bitbox-hid-fragment-1.5.4-5\:/animator/fragment_close_exit.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_close_exit.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color/switch_thumb_material_dark.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/switch_thumb_material_dark.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_list_pressed_holo_dark.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_pressed_holo_dark.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-hdpi-v4/ic_call_decline_low.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_decline_low.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_action_bar_up_container.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_action_bar_up_container.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_light.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_light.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/btn_radio_on_to_off_mtrl_animation.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_radio_on_to_off_mtrl_animation.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_tab_indicator_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_tab_indicator_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_ratingbar_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ratingbar_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xhdpi-v4/notify_panel_notification_icon_bg.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notify_panel_notification_icon_bg.png +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/layout/redbox_item_title.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/redbox_item_title.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/support_simple_spinner_dropdown_item.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/support_simple_spinner_dropdown_item.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_ratingbar_small_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ratingbar_small_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/interpolator/btn_radio_to_off_mtrl_animation_interpolator_0.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_radio_to_off_mtrl_animation_interpolator_0.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-anydpi-v21/ic_call_answer_video_low.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_answer_video_low.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/test_level_drawable.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/test_level_drawable.xml +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/drawable-xxhdpi-v4/ic_resume.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_resume.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/abc_slide_in_bottom.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_in_bottom.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-hdpi-v4/ic_call_answer_video.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer_video.png +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/layout/redbox_view.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/redbox_view.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_015.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_015.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color/abc_primary_text_disable_only_material_light.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_disable_only_material_light.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-hdpi-v4/ic_call_answer_low.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer_low.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-anydpi-v21/ic_call_answer_low.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_answer_low.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xxxhdpi-v4/ic_call_answer_low.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_answer_low.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_textfield_default_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_textfield_default_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-resources-1.7.0-7\:/drawable/abc_vector_test.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_vector_test.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_list_focused_holo.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_focused_holo.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_screen_content_include.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_screen_content_include.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_0.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_0.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_text_select_handle_left_mtrl.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_left_mtrl.png +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/layout/fps_view.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/fps_view.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_list_pressed_holo_light.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_pressed_holo_light.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color/abc_hint_foreground_material_light.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_hint_foreground_material_light.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xxhdpi-v4/ic_call_answer_video_low.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_video_low.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_list_selector_disabled_holo_light.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_selector_disabled_holo_light.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_ic_voice_search_api_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_voice_search_api_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color-v23/abc_btn_colored_borderless_text_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_btn_colored_borderless_text_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_list_focused_holo.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_focused_holo.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xxhdpi-v4/ic_call_decline_low.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_decline_low.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color-v23/abc_tint_default.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_default.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_text_select_handle_right_mtrl.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_right_mtrl.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xhdpi-v4/notification_bg_low_pressed.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_low_pressed.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color/abc_background_cache_hint_selector_material_dark.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_background_cache_hint_selector_material_dark.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xhdpi-v4/notification_bg_normal.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_normal.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_ic_arrow_drop_right_black_24dp.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_arrow_drop_right_black_24dp.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color/abc_hint_foreground_material_dark.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_hint_foreground_material_dark.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_popup_background_mtrl_mult.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_popup_background_mtrl_mult.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-mdpi-v4/notification_bg_low_pressed.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notification_bg_low_pressed.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/btn_radio_off_to_on_mtrl_animation.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_radio_off_to_on_mtrl_animation.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_btn_radio_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_radio_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/drawable/paused_in_debugger_background.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/paused_in_debugger_background.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_textfield_activated_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_activated_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/layout/custom_dialog.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/custom_dialog.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_list_selector_disabled_holo_dark.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_selector_disabled_holo_dark.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_item_background_holo_dark.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_item_background_holo_dark.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-mdpi-v4/notification_bg_normal_pressed.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notification_bg_normal_pressed.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_list_longpressed_holo.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_longpressed_holo.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_list_divider_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_divider_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xhdpi-v4/ic_call_answer_video.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_answer_video.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-mdpi-v4/ic_call_decline.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_decline.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_list_pressed_holo_dark.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_pressed_holo_dark.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xhdpi-v4/ic_call_decline.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_decline.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_ic_menu_paste_mtrl_am_alpha.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_paste_mtrl_am_alpha.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_switch_track_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_switch_track_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-v21/abc_btn_colored_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_btn_colored_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_ic_search_api_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_search_api_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color/abc_background_cache_hint_selector_material_light.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_background_cache_hint_selector_material_light.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-hdpi-v4/notify_panel_notification_icon_bg.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notify_panel_notification_icon_bg.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_list_menu_item_checkbox.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_list_menu_item_checkbox.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_list_longpressed_holo.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_longpressed_holo.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-anydpi-v21/ic_call_answer.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_answer.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color-v23/abc_tint_edittext.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_edittext.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-mdpi-v4/ic_call_answer_video.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_answer_video.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_alert_dialog_button_bar_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_alert_dialog_button_bar_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_action_mode_bar.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_action_mode_bar.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color/abc_primary_text_material_dark.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_material_dark.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_btn_default_mtrl_shape.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_default_mtrl_shape.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/layout/ime_secondary_split_test_activity.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/ime_secondary_split_test_activity.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable/notification_bg.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/notification_bg.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_textfield_search_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_textfield_search_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/layout/alert_title_layout.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/alert_title_layout.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/btn_checkbox_to_checked_box_inner_merged_animation.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_box_inner_merged_animation.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_ic_menu_cut_mtrl_alpha.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_cut_mtrl_alpha.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_action_menu_item_layout.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_action_menu_item_layout.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_tooltip.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_tooltip.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xhdpi-v4/ic_call_decline_low.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_decline_low.png +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/drawable/paused_in_debugger_dialog_background.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/paused_in_debugger_dialog_background.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-ldpi-v4/ic_call_answer_video.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_answer_video.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_spinner_mtrl_am_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_spinner_mtrl_am_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/btn_checkbox_to_unchecked_box_inner_merged_animation.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_box_inner_merged_animation.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/layout-v21/notification_action_tombstone.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_action_tombstone.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xxhdpi-v4/ic_call_answer_low.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_low.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/layout/notification_template_part_chronometer.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/notification_template_part_chronometer.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_000.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_000.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-fragment-1.5.4-5\:/animator/fragment_fade_enter.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_fade_enter.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_ic_menu_selectall_mtrl_alpha.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_selectall_mtrl_alpha.xml +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/drawable-mdpi-v4/ic_resume.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_resume.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xxhdpi-v4/ic_call_decline.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_decline.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_textfield_default_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_default_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/anim/catalyst_push_up_in.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_push_up_in.xml +swiss.dfx.wallet.bitbox.bitbox-hid-fragment-1.5.4-5\:/anim-v21/fragment_fast_out_extra_slow_in.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim-v21/fragment_fast_out_extra_slow_in.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-mdpi-v4/notification_bg_normal.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notification_bg_normal.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_list_menu_item_radio.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_list_menu_item_radio.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_cascading_menu_item_layout.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_cascading_menu_item_layout.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xhdpi-v4/notification_bg_normal_pressed.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_normal_pressed.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/xml/rn_dev_preferences.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/xml/rn_dev_preferences.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-hdpi-v4/notification_bg_low_normal.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_bg_low_normal.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/btn_checkbox_to_checked_icon_null_animation.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_icon_null_animation.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_0.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_0.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_list_divider_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_divider_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/btn_checkbox_unchecked_mtrl.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_checkbox_unchecked_mtrl.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-mdpi-v4/notification_bg_low_normal.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notification_bg_low_normal.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_000.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_000.png +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/drawable-xhdpi-v4/ic_resume.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_resume.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/tooltip_frame_light.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/tooltip_frame_light.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_screen_simple_overlay_action_mode.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_screen_simple_overlay_action_mode.xml +swiss.dfx.wallet.bitbox.bitbox-hid-main-29\:/xml/usb_device_filter.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/xml/usb_device_filter.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-hdpi-v4/ic_call_answer.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-anydpi-v21/ic_call_decline_low.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_decline_low.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_015.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_015.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_list_divider_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_divider_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_alert_dialog_title_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_alert_dialog_title_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/btn_checkbox_to_checked_box_outer_merged_animation.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_box_outer_merged_animation.xml +swiss.dfx.wallet.bitbox.bitbox-hid-fragment-1.5.4-5\:/animator/fragment_fade_exit.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_fade_exit.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-ldrtl-xxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_015.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_015.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_list_focused_holo.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_focused_holo.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/btn_radio_to_on_mtrl_dot_group_animation.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_dot_group_animation.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/btn_radio_on_mtrl.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_radio_on_mtrl.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-mdpi-v4/notify_panel_notification_icon_bg.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notify_panel_notification_icon_bg.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_list_selector_disabled_holo_light.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_selector_disabled_holo_light.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_dialog_title_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_dialog_title_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/select_dialog_item_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/select_dialog_item_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/abc_tooltip_enter.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_tooltip_enter.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/btn_checkbox_to_unchecked_check_path_merged_animation.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_check_path_merged_animation.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/btn_radio_to_on_mtrl_ring_outer_animation.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_ring_outer_animation.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_list_longpressed_holo.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_longpressed_holo.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/drawable-hdpi-v4/ic_resume.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_resume.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_list_pressed_holo_dark.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_pressed_holo_dark.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_list_selector_disabled_holo_light.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_selector_disabled_holo_light.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_list_selector_background_transition_holo_light.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_list_selector_background_transition_holo_light.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_btn_borderless_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_borderless_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_ic_go_search_api_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_go_search_api_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_ic_ab_back_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_ab_back_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_btn_check_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_check_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-hdpi-v4/ic_call_answer_video_low.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer_video_low.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_star_black_48dp.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_star_black_48dp.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color/abc_secondary_text_material_dark.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_secondary_text_material_dark.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/abc_fade_out.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_fade_out.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xxxhdpi-v4/ic_call_decline.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_decline.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_000.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_000.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_btn_radio_material_anim.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_radio_material_anim.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/btn_checkbox_checked_mtrl.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_checkbox_checked_mtrl.xml +swiss.dfx.wallet.bitbox.bitbox-hid-autofill-1.1.0-23\:/drawable-v29/autofill_inline_suggestion_chip_background.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v29/autofill_inline_suggestion_chip_background.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable/notification_icon_background.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/notification_icon_background.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_spinner_textfield_background_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_spinner_textfield_background_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-watch-v20/abc_dialog_material_background.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-watch-v20/abc_dialog_material_background.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/btn_checkbox_unchecked_to_checked_mtrl_animation.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_checkbox_unchecked_to_checked_mtrl_animation.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-fragment-1.5.4-5\:/animator/fragment_close_enter.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_close_enter.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xxhdpi-v4/ic_call_answer.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_switch_track_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_switch_track_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_switch_thumb_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_switch_thumb_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xhdpi-v4/ic_call_answer_low.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_answer_low.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_star_half_black_48dp.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_star_half_black_48dp.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_popup_background_mtrl_mult.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_popup_background_mtrl_mult.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_expanded_menu_layout.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_expanded_menu_layout.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_switch_track_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_switch_track_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_000.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_000.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_list_pressed_holo_light.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_pressed_holo_light.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_text_cursor_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_text_cursor_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_list_selector_disabled_holo_dark.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_selector_disabled_holo_dark.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-ldpi-v4/ic_call_answer_video_low.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_answer_video_low.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-hdpi-v4/notification_bg_normal.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_bg_normal.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_list_pressed_holo_light.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_pressed_holo_light.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_scrubber_track_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_track_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_alert_dialog_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_alert_dialog_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_item_background_holo_light.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_item_background_holo_light.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_text_select_handle_left_mtrl.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_text_select_handle_left_mtrl.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_scrubber_track_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_track_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_popup_background_mtrl_mult.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_popup_background_mtrl_mult.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/anim/catalyst_slide_up.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_slide_up.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_ic_menu_overflow_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_overflow_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color-v23/abc_btn_colored_text_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_btn_colored_text_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_cab_background_top_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_cab_background_top_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_ic_menu_share_mtrl_alpha.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_share_mtrl_alpha.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_action_bar_title_item.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_action_bar_title_item.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_015.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_015.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/layout/ime_base_split_test_activity.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/ime_base_split_test_activity.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_cab_background_internal_bg.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_cab_background_internal_bg.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-hdpi-v4/notification_oversize_large_icon_bg.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_oversize_large_icon_bg.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable/notification_bg_low.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/notification_bg_low.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xhdpi-v4/notification_bg_low_normal.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_low_normal.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-ldpi-v4/ic_call_answer.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_answer.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-ldpi-v4/ic_call_decline_low.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_decline_low.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-v23/abc_control_background_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v23/abc_control_background_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_search_dropdown_item_icons_2line.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_search_dropdown_item_icons_2line.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xhdpi-v4/ic_call_answer_video_low.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_answer_video_low.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_list_pressed_holo_dark.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_pressed_holo_dark.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_seekbar_thumb_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_seekbar_thumb_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_list_longpressed_holo.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_longpressed_holo.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/layout-v21/notification_template_custom_big.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_template_custom_big.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/btn_radio_off_mtrl.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_radio_off_mtrl.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_action_mode_close_item_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_action_mode_close_item_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-ldrtl-xxxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xxxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/select_dialog_multichoice_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/select_dialog_multichoice_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_015.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_015.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_screen_simple.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_screen_simple.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_popup_background_mtrl_mult.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_popup_background_mtrl_mult.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_action_menu_layout.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_action_menu_layout.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color/switch_thumb_material_light.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/switch_thumb_material_light.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable/notification_tile_bg.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/notification_tile_bg.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_textfield_activated_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_textfield_activated_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/abc_fade_in.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_fade_in.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-ldrtl-hdpi-v17/abc_spinner_mtrl_am_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-hdpi-v17/abc_spinner_mtrl_am_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xxxhdpi-v4/ic_call_answer_video_low.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_answer_video_low.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xxxhdpi-v4/ic_call_answer_video.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_answer_video.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout-watch-v20/abc_alert_dialog_title_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-watch-v20/abc_alert_dialog_title_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_000.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_000.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxxhdpi-v4/abc_switch_track_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_switch_track_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/abc_slide_out_bottom.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_out_bottom.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_000.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_000.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_cab_background_top_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_cab_background_top_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-hdpi-v4/notification_bg_low_pressed.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_bg_low_pressed.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_list_selector_holo_dark.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_list_selector_holo_dark.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/btn_radio_to_off_mtrl_ring_outer_path_animation.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_ring_outer_path_animation.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-mdpi-v4/ic_call_answer_video_low.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_answer_video_low.png +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/layout/paused_in_debugger_view.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/paused_in_debugger_view.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/btn_checkbox_to_unchecked_icon_null_animation.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_icon_null_animation.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/interpolator/fast_out_slow_in.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/fast_out_slow_in.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_list_selector_holo_light.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_list_selector_holo_light.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/tooltip_frame_dark.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/tooltip_frame_dark.xml +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/layout/redbox_item_frame.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/redbox_item_frame.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-v21/abc_action_bar_item_background_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_action_bar_item_background_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/layout/dev_loading_view.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/dev_loading_view.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_cab_background_top_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_cab_background_top_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color-v23/abc_tint_spinner.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_spinner.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_015.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_015.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_textfield_default_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_textfield_default_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout-watch-v20/abc_alert_dialog_button_bar_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-watch-v20/abc_alert_dialog_button_bar_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_list_pressed_holo_light.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_pressed_holo_light.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_text_select_handle_right_mtrl.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_text_select_handle_right_mtrl.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_dark.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_dark.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_ratingbar_indicator_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ratingbar_indicator_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_tab_indicator_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_tab_indicator_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color/abc_primary_text_disable_only_material_dark.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_disable_only_material_dark.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_switch_track_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_switch_track_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xxxhdpi-v4/ic_call_decline_low.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_decline_low.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-anydpi-v21/ic_call_answer_video.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_answer_video.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-mdpi-v4/ic_call_answer_low.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_answer_low.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-v21/notification_action_background.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/notification_action_background.xml +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/drawable/ripple_effect.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/ripple_effect.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/abc_popup_exit.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_popup_exit.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color-v23/abc_tint_switch_track.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_switch_track.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/drawable/redbox_top_border_background.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/redbox_top_border_background.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xxhdpi-v4/ic_call_answer_video.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_video.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-xxxhdpi-v4/ic_call_answer.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_answer.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/select_dialog_singlechoice_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/select_dialog_singlechoice_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/layout/notification_template_part_time.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/notification_template_part_time.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable/abc_ic_clear_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_clear_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/abc_shrink_fade_out_from_bottom.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_shrink_fade_out_from_bottom.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-v21/abc_dialog_material_background.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_dialog_material_background.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_popup_menu_item_layout.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_popup_menu_item_layout.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/color-v23/abc_color_highlight_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_color_highlight_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/drawable-xxxhdpi-v4/ic_resume.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_resume.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/anim/abc_tooltip_exit.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_tooltip_exit.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_list_divider_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_divider_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-ldrtl-xhdpi-v17/abc_spinner_mtrl_am_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xhdpi-v17/abc_spinner_mtrl_am_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-v21/abc_list_divider_material.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_list_divider_material.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-hdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_spinner_mtrl_am_alpha.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_spinner_mtrl_am_alpha.9.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_list_menu_item_icon.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_list_menu_item_icon.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-hdpi-v4/ic_call_decline.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_decline.png +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png +swiss.dfx.wallet.bitbox.bitbox-hid-react-android-0.81.5-release-21\:/anim/catalyst_push_up_out.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_push_up_out.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/layout/abc_popup_menu_header_item_layout.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/abc_popup_menu_header_item_layout.xml +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/layout-v21/notification_action.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_action.xml +swiss.dfx.wallet.bitbox.bitbox-hid-appcompat-1.7.0-12\:/drawable-mdpi-v4/abc_scrubber_control_off_mtrl_alpha.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_control_off_mtrl_alpha.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-ldpi-v4/ic_call_answer_low.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_answer_low.png +swiss.dfx.wallet.bitbox.bitbox-hid-core-1.13.1-10\:/drawable-hdpi-v4/notification_bg_normal_pressed.9.png=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_bg_normal_pressed.9.png diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-af/values-af.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-af/values-af.xml new file mode 100644 index 00000000..8c83e6c7 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-af/values-af.xml @@ -0,0 +1,64 @@ + + + "Gaan na tuisskerm" + "Gaan op" + "Nog opsies" + "Klaar" + "Sien alles" + "Kies \'n program" + "AF" + "AAN" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Funksie+" + "Meta+" + "Shift+" + "spasiebalk" + "Simbool+" + "Kieslys+" + "Soek …" + "Vee navraag uit" + "Soektognavraag" + "Soek" + "Dien navraag in" + "Stemsoektog" + "Deel met" + "Deel met %s" + "Vou in" + Opletnota + "Antwoord" + "Video" + "Wys af" + "Lui af" + "Inkomende oproep" + "Oproep aan die gang" + "Keur tans \'n inkomende oproep" + Kombinasiekassie + Opskrif + Prent + Knoppie, prent + Skakel + Kieslys + Kieslysbalk + Kieslysitem + Vorderingbalk + Radiogroep + Oortjie + Rolleesbalk + "Soek" + Tolknoppie + besig + is ingevou + is uitgevou + is gemeng + af + aan + ontkies + "999+" + Opsomming + Oortjielys + Afteller + Nutsbalk + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-am/values-am.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-am/values-am.xml new file mode 100644 index 00000000..0bc89dd1 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-am/values-am.xml @@ -0,0 +1,39 @@ + + + "መነሻ ዳስስ" + "ወደ ላይ ያስሱ" + "ተጨማሪ አማራጮች" + "ተከናውኗል" + "ሁሉንም ይመልከቱ" + "አንድ መተግበሪያ ይምረጡ" + "አጥፋ" + "አብራ" + "Alt+" + "Ctrl+" + "ሰርዝ" + "enter" + "Function+" + "Meta+" + "Shift+" + "ክፍተት" + "Sym+" + "Menu+" + "ይፈልጉ…" + "መጠይቅ አጽዳ" + "የፍለጋ መጠይቅ" + "ፍለጋ" + "መጠይቅ አስገባ" + "የድምጽ ፍለጋ" + "አጋራ በ" + "ለ%s አጋራ" + "ሰብስብ" + "መልስ" + "ቪዲዮ" + "አትቀበል" + "ስልኩን ዝጋ" + "ገቢ ጥሪ" + "እየተካሄደ ያለ ጥሪ" + "ገቢ ጥሪ ማጣራት" + "ፍለጋ" + "999+" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ar/values-ar.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ar/values-ar.xml new file mode 100644 index 00000000..8b6d3524 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ar/values-ar.xml @@ -0,0 +1,64 @@ + + + "التوجه إلى المنزل" + "التنقل إلى أعلى" + "خيارات أكثر" + "تم" + "عرض الكل" + "اختيار تطبيق" + "إيقاف" + "مفعّلة" + "Alt+" + "Ctrl+" + "حذف" + "enter" + "Function+" + "Meta+" + "Shift+" + "فضاء" + "Sym+" + "القائمة+" + "بحث…" + "محو طلب البحث" + "طلب بحث" + "البحث" + "إرسال طلب البحث" + "بحث صوتي" + "مشاركة مع" + "مشاركة مع %s" + "تصغير" + تنبيه + "ردّ" + "فيديو" + "رفض" + "قطع الاتصال" + "مكالمة واردة" + "مكالمة جارية" + "يتم فحص المكالمة الواردة" + مربع تحرير وسرد + العنوان + صورة + زر، صورة + رابط + القائمة + شريط القائمة + عنصر القائمة + شريط التقدم + مجموعة أزرار اختيار + علامة التبويب + شريط التمرير + "البحث" + زر زيادة ونقصان + مشغول + مطوي + موسع + مختلط + إيقاف تشغيل + تشغيل + غير محدَد + "999+" + ملخص + قائمة علامات التبويب + مؤقِت + شريط الأدوات + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-as/values-as.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-as/values-as.xml new file mode 100644 index 00000000..ba5e31c9 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-as/values-as.xml @@ -0,0 +1,39 @@ + + + "গৃহ পৃষ্ঠালৈ যাওক" + "ওপৰলৈ যাওক" + "অধিক বিকল্প" + "সম্পন্ন হ’ল" + "আটাইবোৰ চাওক" + "কোনো এপ্ বাছনি কৰক" + "অফ" + "অন" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Function+" + "Meta+" + "Shift+" + "space" + "Sym+" + "Menu+" + "সন্ধান কৰক…" + "সন্ধান কৰা প্ৰশ্ন মচক" + "সন্ধান কৰা প্ৰশ্ন" + "সন্ধান কৰক" + "প্ৰশ্ন দাখিল কৰক" + "কণ্ঠধ্বনিৰ দ্বাৰা সন্ধান" + "ইয়াৰ জৰিয়তে শ্বেয়াৰ কৰক" + "%sৰ জৰিয়তে শ্বেয়াৰ কৰক" + "সংকোচন কৰক" + "উত্তৰ দিয়ক" + "ভিডিঅ’" + "প্ৰত্যাখ্যান কৰক" + "কল কাটি দিয়ক" + "অন্তৰ্গামী কল" + "চলি থকা কল" + "এটা অন্তৰ্গামী কলৰ পৰীক্ষা কৰি থকা হৈছে" + "সন্ধান" + "৯৯৯+" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-az/values-az.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-az/values-az.xml new file mode 100644 index 00000000..61b86088 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-az/values-az.xml @@ -0,0 +1,46 @@ + + + "Əsas səhifəyə keçin" + "Yuxarı keçin" + "Digər seçimlər" + "Hazırdır" + "Hamısına baxın" + "Tətbiq seçin" + "DEAKTİV" + "AKTİV" + "Alt+" + "Ctrl+" + "silin" + "daxil olun" + "Funksiya+" + "Meta+" + "Shift+" + "space" + "Sym+" + "Menyu+" + "Axtarış..." + "Sorğunu silin" + "Axtarış sorğusu" + "Axtarın" + "Sorğunu göndərin" + "Səsli axtarış" + "Paylaşın" + "%s ilə paylaşın" + "Yığcamlaşdırın" + "Cavab verin" + "Video" + "İmtina edin" + "Dəstəyi asın" + "Gələn zəng" + "Davam edən zəng" + "Gələn zəng göstərilir" + Kombo siyahısı + Şəkil + Düymə, şəkil + Keçid + Menyu + "Axtarın" + deaktiv + aktivdir + "999+" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-b+sr+Latn/values-b+sr+Latn.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-b+sr+Latn/values-b+sr+Latn.xml new file mode 100644 index 00000000..4d886df8 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-b+sr+Latn/values-b+sr+Latn.xml @@ -0,0 +1,39 @@ + + + "Idite na početnu" + "Idite nagore" + "Još opcija" + "Gotovo" + "Prikaži sve" + "Izaberite aplikaciju" + "ISKLJUČENO" + "UKLJUČENO" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Function+" + "Meta+" + "Shift+" + "taster za razmak" + "Sym+" + "Menu+" + "Pretražite…" + "Obrišite upit" + "Pretražite upit" + "Pretražite" + "Pošaljite upit" + "Glasovna pretraga" + "Delite pomoću" + "Delite pomoću aplikacije %s" + "Skupi" + "Odgovori" + "Video" + "Odbij" + "Prekini vezu" + "Dolazni poziv" + "Poziv je u toku" + "Proverava se dolazni poziv" + "Pretražite" + "999+" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-be/values-be.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-be/values-be.xml new file mode 100644 index 00000000..a197c818 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-be/values-be.xml @@ -0,0 +1,44 @@ + + + "Перайсці на галоўную старонку" + "Перайсці ўверх" + "Дадатковыя параметры" + "Гатова" + "Паказаць усе" + "Выберыце праграму" + "ВЫКЛ." + "УКЛ." + "Alt +" + "Ctrl +" + "Delete" + "Enter" + "Fn +" + "Meta +" + "Shift +" + "Прабел" + "Sym +" + "Меню +" + "Пошук…" + "Выдаліць запыт" + "Пошукавы запыт" + "Пошук" + "Адправіць запыт" + "Галасавы пошук" + "Абагуліць праз" + "Абагуліць праз праграму \"%s\"" + "Згарнуць" + "Адказаць" + "Відэа" + "Адхіліць" + "Завяршыць" + "Уваходны выклік" + "Бягучы выклік" + "Фільтраванне ўваходнага выкліку" + Камбінаваны спіс + Відарыс + Кнопка, відарыс + Спасылка + Меню + "Пошук" + "999+" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-bg/values-bg.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-bg/values-bg.xml new file mode 100644 index 00000000..bb57f716 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-bg/values-bg.xml @@ -0,0 +1,64 @@ + + + "Навигиране към началния екран" + "Навигиране нагоре" + "Още опции" + "Готово" + "Преглед на всички" + "Изберете приложение" + "ИЗКЛ." + "ВКЛ." + "Alt+" + "Ctrl+" + "delete" + "enter" + "Function+" + "Meta+" + "Shift+" + "клавиша за интервал" + "Sym+" + "Menu+" + "Търсете…" + "Изчистване на заявката" + "Заявка за търсене" + "Търсене" + "Изпращане на заявката" + "Гласово търсене" + "Споделяне със:" + "Споделяне със: %s" + "Свиване" + Сигнал + "Отговор" + "Видеообаждане" + "Отхвърляне" + "Затваряне" + "Входящо обаждане" + "Текущо обаждане" + "Преглежда се входящо обаждане" + Комбинирана кутия + Заглавие + Изображение + Бутон, изображение + Връзка + Меню + Лента с менюта + Елемент от меню + Лента за напредък + Радио група + Раздел + Лента за превъртане + "Търсене" + Бутон за завъртане + заето + свито + разширено + смесено + изключено + включено + неизбрано + "999+" + Обобщение + Списък с раздели + Таймер + Лента с инструменти + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-bn/values-bn.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-bn/values-bn.xml new file mode 100644 index 00000000..924eeca0 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-bn/values-bn.xml @@ -0,0 +1,64 @@ + + + "হোমে নেভিগেট করুন" + "উপরে নেভিগেট করুন" + "আরও বিকল্প" + "হয়ে গেছে" + "সবগুলি দেখুন" + "একটি অ্যাপ বেছে নিন" + "বন্ধ আছে" + "চালু করুন" + "Alt+" + "Ctrl+" + "মুছুন" + "enter" + "Function+" + "Meta+" + "Shift+" + "space" + "Sym+" + "Menu+" + "সার্চ করুন…" + "কোয়েরি মুছে ফেলুন" + "সার্চ কোয়েরি" + "সার্চ করুন" + "কোয়েরি জমা দিন" + "ভয়েস সার্চ করুন" + "শেয়ার করুন" + "%s-এর সাথে শেয়ার করুন" + "সঙ্কুচিত করুন" + অ্যালার্ট + "উত্তর দিন" + "ভিডিও" + "বাতিল করুন" + "কল কেটে দিন" + "ইনকামিং কল" + "চালু থাকা কল" + "ইনকামিং কল স্ক্রিনিং করা হচ্ছে" + কম্বো বক্স + শিরোনাম + ইমেজ + বোতাম, ছবি + লিঙ্ক + মেনু + মেনু বার + মেনু আইটেম + প্রোগ্রেস বার + রেডিও গ্রুপ + ট্যাব + স্ক্রোল বার + "সার্চ করুন" + স্পিন বোতাম + ব্যস্ত + ছোট করা হয়েছে + বাড়ানো হয়েছে + মিশ্র + বন্ধ আছে + চালু আছে + আনসিলেক্ট করা হয়েছে + "৯৯৯+" + সারসংক্ষেপ + ট্যাব লিস্ট + টাইমার + টুল বার + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-bs/values-bs.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-bs/values-bs.xml new file mode 100644 index 00000000..9c7f5dfb --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-bs/values-bs.xml @@ -0,0 +1,39 @@ + + + "Vratite se na početnu stranicu" + "Idi gore" + "Više opcija" + "Gotovo" + "Prikaži sve" + "Odaberite aplikaciju" + "ISKLJUČENO" + "UKLJUČENO" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Function+" + "Meta+" + "Shift+" + "razmak" + "Sym+" + "Menu+" + "Pretražite..." + "Obriši upit" + "Pretraži upit" + "Pretraživanje" + "Pošalji upit" + "Glasovno pretraživanje" + "Dijeli sa" + "Dijeli putem aplikacije %s" + "Suzi" + "Odgovori" + "Video" + "Odbaci" + "Prekini vezu" + "Dolazni poziv" + "Poziv u toku" + "Filtriranje dolaznog poziva" + "Pretražite" + "999+" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ca/values-ca.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ca/values-ca.xml new file mode 100644 index 00000000..afdf0d04 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ca/values-ca.xml @@ -0,0 +1,39 @@ + + + "Navega fins a la pàgina d\'inici" + "Navega cap amunt" + "Més opcions" + "Fet" + "Mostra-ho tot" + "Selecciona una aplicació" + "DESACTIVA" + "ACTIVA" + "Alt+" + "Ctrl+" + "Supr" + "Retorn" + "Funció+" + "Meta+" + "Maj+" + "Espai" + "Sym+" + "Menú+" + "Cerca…" + "Esborra la consulta" + "Consulta de cerca" + "Cerca" + "Envia la consulta" + "Cerca per veu" + "Comparteix amb" + "Comparteix amb %s" + "Replega" + "Respon" + "Vídeo" + "Rebutja" + "Penja" + "Trucada entrant" + "Trucada en curs" + "S\'està filtrant una trucada entrant" + "Cerca" + "999+" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-cs/values-cs.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-cs/values-cs.xml new file mode 100644 index 00000000..2a50d5eb --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-cs/values-cs.xml @@ -0,0 +1,64 @@ + + + "Přejít na plochu" + "Přejít nahoru" + "Další možnosti" + "Hotovo" + "Zobrazit vše" + "Vybrat aplikaci" + "VYP" + "ZAP" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Fn+" + "Meta+" + "Shift+" + "mezerník" + "Sym+" + "Menu+" + "Vyhledat…" + "Smazat dotaz" + "Dotaz pro vyhledávání" + "Hledat" + "Odeslat dotaz" + "Hlasové vyhledávání" + "Sdílet s" + "Sdílet s aplikací %s" + "Sbalit" + Výstraha + "Přijmout" + "Video" + "Odmítnout" + "Zavěsit" + "Příchozí hovor" + "Probíhající hovor" + "Prověřování příchozího hovoru" + Kombinované pole + Nadpis + Obrázek + Tlačítko, obrázek + Odkaz + Nabídka + Panel nabídky + Položka nabídky + Ukazatel postupu + Skupina přepínačů + Karta + Posuvník + "Hledat" + Číselník + zaneprázdněno + sbaleno + rozbaleno + oboje + vyp + zap + nevybráno + "999+" + Přehled + Seznam karet + Časovač + Panel nástrojů + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-da/values-da.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-da/values-da.xml new file mode 100644 index 00000000..e1c5f1cf --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-da/values-da.xml @@ -0,0 +1,61 @@ + + + "Find hjem" + "Gå op" + "Flere valgmuligheder" + "Udfør" + "Se alle" + "Vælg en app" + "FRA" + "TIL" + "Alt+" + "Ctrl+" + "slet" + "enter" + "Fn+" + "Meta+" + "Shift+" + "mellemrum" + "Sym+" + "Menu+" + "Søg…" + "Ryd forespørgsel" + "Søgeforespørgsel" + "Søg" + "Indsend forespørgsel" + "Talesøgning" + "Del med" + "Del med %s" + "Skjul" + Underretning + "Besvar" + "Video" + "Afvis" + "Læg på" + "Indgående opkald" + "Igangværende opkald" + "Et indgående opkald screenes" + Kombinationsboks + Overskrift + Billede + Knap, billede + Menulinje + Menupunkt + Statuslinje + Radiogruppe + Fane + Rullelinje + "Søg" + Snurreknap + optaget + skjult + udvidet + blandet + fra + til + fravalgt + "999+" + Oversigt + Liste over faner + Værktøjslinje + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-de/values-de.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-de/values-de.xml new file mode 100644 index 00000000..0fd7db91 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-de/values-de.xml @@ -0,0 +1,61 @@ + + + "Zur Startseite" + "Nach oben" + "Weitere Optionen" + "Fertig" + "Alle anzeigen" + "App auswählen" + "AUS" + "AN" + "Alt +" + "Strg +" + "Löschen" + "Eingabetaste" + "Funktionstaste +" + "Meta-Taste +" + "Umschalttaste +" + "Leertaste" + "Sym-Taste +" + "Menütaste +" + "Suchen…" + "Suchanfrage löschen" + "Suchanfrage" + "Suche" + "Anfrage senden" + "Sprachsuche" + "Teilen mit" + "Mit %s teilen" + "Minimieren" + Warnhinweis + "Annehmen" + "Video" + "Ablehnen" + "Auflegen" + "Eingehender Anruf" + "Aktueller Anruf" + "Filter für eingehenden Anruf" + Kombinationsfeld + Überschrift + Bild + Button, Bild + Menü + Menüleiste + Menüpunkt + Statusanzeige + Gruppe von Buttons + Scroll-Leiste + "Suche" + Auswahl-Button + in Gebrauch + ausgeblendet + eingeblendet + gemischt + aus + ein + nicht ausgewählt + "999+" + Übersicht + Tab-Liste + Symbolleiste + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-el/values-el.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-el/values-el.xml new file mode 100644 index 00000000..cc572e87 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-el/values-el.xml @@ -0,0 +1,64 @@ + + + "Πλοήγηση στην αρχική σελίδα" + "Πλοήγηση προς τα επάνω" + "Περισσότερες επιλογές" + "Τέλος" + "Εμφάνιση όλων" + "Επιλέξτε μια εφαρμογή" + "ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ" + "ΕΝΕΡΓΟΠΟΙΗΣΗ" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Function+" + "Meta+" + "Shift+" + "διάστημα" + "Sym+" + "Menu+" + "Αναζήτηση…" + "Διαγραφή ερωτήματος" + "Ερώτημα αναζήτησης" + "Αναζήτηση" + "Υποβολή ερωτήματος" + "Φωνητική αναζήτηση" + "Κοινοποίηση σε" + "Κοινοποίηση στην εφαρμογή %s" + "Σύμπτυξη" + Ειδοποίηση + "Απάντηση" + "Βίντεο" + "Απόρριψη" + "Τερματισμός" + "Εισερχόμενη κλήση" + "Κλήση σε εξέλιξη" + "Διαλογή εισερχόμενης κλήσης" + Συνδυαστικό κουτάκι + Επικεφαλίδα + Εικόνα + Κουμπί, εικόνα + Σύνδεσμος + Μενού + Γραμμή μενού + Στοιχείο μενού + Γραμμή προόδου + Ομάδα κουμπιών επιλογής + Καρτέλα + Γραμμή κύλισης + "Αναζήτηση" + Κουμπί περιστροφής + απασχολημένος/η + συμπτυγμένο + διευρυμένο + συνδυασμός + όχι + ναι + μη επιλεγμένα + "999+" + Σύνοψη + Λίστα καρτελών + Χρονόμετρο + Γραμμή εργαλείων + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rAU/values-en-rAU.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rAU/values-en-rAU.xml new file mode 100644 index 00000000..f6ff55dd --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rAU/values-en-rAU.xml @@ -0,0 +1,39 @@ + + + "Navigate home" + "Navigate up" + "More options" + "Done" + "See all" + "Choose an app" + "OFF" + "ON" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Function+" + "Meta+" + "Shift+" + "space" + "Sym+" + "Menu+" + "Search…" + "Clear query" + "Search query" + "Search" + "Submit query" + "Voice search" + "Share with" + "Share with %s" + "Collapse" + "Answer" + "Video" + "Decline" + "Hang up" + "Incoming call" + "On-going call" + "Screening an incoming call" + "Search" + "999+" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rCA/values-en-rCA.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rCA/values-en-rCA.xml new file mode 100644 index 00000000..bc83d64a --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rCA/values-en-rCA.xml @@ -0,0 +1,39 @@ + + + "Navigate home" + "Navigate up" + "More options" + "Done" + "See all" + "Choose an app" + "OFF" + "ON" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Function+" + "Meta+" + "Shift+" + "space" + "Sym+" + "Menu+" + "Search…" + "Clear query" + "Search query" + "Search" + "Submit query" + "Voice search" + "Share with" + "Share with %s" + "Collapse" + "Answer" + "Video" + "Decline" + "Hang Up" + "Incoming call" + "Ongoing call" + "Screening an incoming call" + "Search" + "999+" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rGB/values-en-rGB.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rGB/values-en-rGB.xml new file mode 100644 index 00000000..fc67be8f --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rGB/values-en-rGB.xml @@ -0,0 +1,49 @@ + + + "Navigate home" + "Navigate up" + "More options" + "Done" + "See all" + "Choose an app" + "OFF" + "ON" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Function+" + "Meta+" + "Shift+" + "space" + "Sym+" + "Menu+" + "Search…" + "Clear query" + "Search query" + "Search" + "Submit query" + "Voice search" + "Share with" + "Share with %s" + "Collapse" + "Answer" + "Video" + "Decline" + "Hang up" + "Incoming call" + "On-going call" + "Screening an incoming call" + Combo box + Button, image + Menu bar + Menu item + Progress bar + Radio group + Scroll bar + "Search" + Spin button + "999+" + Tab list + Tool bar + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rIN/values-en-rIN.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rIN/values-en-rIN.xml new file mode 100644 index 00000000..f6ff55dd --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rIN/values-en-rIN.xml @@ -0,0 +1,39 @@ + + + "Navigate home" + "Navigate up" + "More options" + "Done" + "See all" + "Choose an app" + "OFF" + "ON" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Function+" + "Meta+" + "Shift+" + "space" + "Sym+" + "Menu+" + "Search…" + "Clear query" + "Search query" + "Search" + "Submit query" + "Voice search" + "Share with" + "Share with %s" + "Collapse" + "Answer" + "Video" + "Decline" + "Hang up" + "Incoming call" + "On-going call" + "Screening an incoming call" + "Search" + "999+" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rXC/values-en-rXC.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rXC/values-en-rXC.xml new file mode 100644 index 00000000..27a3d536 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-en-rXC/values-en-rXC.xml @@ -0,0 +1,39 @@ + + + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‏‎‎‎‏‎‎‏‎‎‏‎‏‎‎‎‎‏‏‎‏‎‏‏‎‎‏‎‎‎‏‎‏‎‏‏‏‎‏‎‎‎‎‏‏‎‏‏‏‏‏‏‎‎Navigate home‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‎‎‏‏‎‎‎‏‏‏‏‎‏‎‎‎‎‏‏‎‏‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‏‎‏‎‎‎‎‏‏‏‎‎‎‎‎Navigate up‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‎‎‏‎‎‎‎‏‎‎‎‏‎‏‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‎‎‎‎‏‎‎‏‎‏‏‏‏‏‎‏‎‎‏‎More options‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‏‏‏‏‎‎‎‎‎‎‎‎‎‎‏‏‎‏‏‏‎‎‏‏‎‏‎‎‏‏‏‎‎‎‎‏‎‎‎‏‏‏‎‎‏‎‎‎‏‎‎‎‎‎Done‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‏‏‎‏‏‏‎‎‎‎‏‏‏‎‎‏‎‎‎‎‏‏‏‎‏‏‎‏‎‏‎‏‎‎‎‎‏‎See all‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‎‎‎‏‏‏‎‎‏‏‎‎‏‎‏‎‎‏‏‎‏‏‎‏‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‎‎‎‎‎‎‎‎Choose an app‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‎‎‎‏‎‎‎‏‏‏‎‏‏‎‎‏‏‎‏‏‎‏‎‎‎‎‎‏‏‎‏‎‏‏‎‏‏‏‎‎‏‎‎‏‏‎‎‏‏‏‎‏‏‎OFF‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‏‎‎‏‎‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‏‎‎‎‎‎‎‎‏‎‎‎‎‏‎‎‎‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‎ON‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‎‎‏‏‎‏‎‏‏‎‎‎‎‎‎‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‎‏‎‏‎‎‏‏‎‎‏‏‏‏‎‏‎‎Alt+‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‏‎‎‎‎‎‏‎‏‎‏‎‎‏‏‏‏‎‎‏‎‎‎‏‎‎‏‎‏‎‎‎‎‎‏‎‏‎‎‏‎‏‎‏‎‏‎‎Ctrl+‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‎‏‎‎‎‎‏‎‎‏‎‏‏‎‏‏‎‏‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‎‏‏‏‎‏‏‏‏‏‏‎‎‎‎‏‏‏‎‏‎‎‎delete‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‎‏‎‏‏‏‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‏‏‎‏‏‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‎‎‏‏‎enter‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‎‏‏‎‏‎‏‎‎‎‎‎‏‏‏‏‎‎‎‎‎‏‏‎‎‎‏‏‎‎‏‎‎‏‏‎‎‏‎‎‏‎‎‎‏‏‎‎‏‎‎‎‏‏‏‎Function+‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‎‏‎‏‏‎‏‏‎‏‏‏‎‎‎‏‎‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‎‎‏‎‎‎‎‎‏‎‏‎‎‏‎‎‏‏‏‏‏‏‎‎Meta+‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‎‏‏‎‏‎‏‏‎‎‎‎‎‏‏‎‎‎‎‏‎‎‎‏‏‎‎‎‎‎‎‎‎‎‎‏‏‎‏‎‎‏‎‎‎‏‏‎‎‎‎‏‏‎Shift+‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‎‎‎‏‏‎‎‏‎‎‎‏‏‎‏‎‎‎‎‏‎‏‏‎‎space‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‎‎‏‎‏‏‎‏‏‏‎‏‏‏‎‏‏‎‏‎‎‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‎‎‏‎‎‎‏‎‎‏‏‎‏‏‏‎‎Sym+‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎‏‏‏‎‎‎‎‎‎‏‏‏‎‏‏‏‏‎‎‎‎‎‏‎‎‎‏‎‏‏‏‏‎‏‎‏‏‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‎‎Menu+‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‎‏‎‎‎‎‎‏‏‏‎‏‏‏‎‏‏‎‏‎‎‎‏‎‎‎‏‏‏‏‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‎‎‎Search…‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‏‎‏‎‏‏‎‏‎‏‎‎‎‏‎‎‏‏‏‏‎‎‎‏‎‏‎‎‎‎‎‏‏‎‏‏‎‎‏‎‏‏‎‎‎‏‎‏‏‏‎‎‏‏‎Clear query‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‎‎‎‎‎‎‏‎‏‎‎‏‏‏‎‏‏‎‏‎‎‎‏‏‎‎‎‎‎‎‏‏‎‎‏‏‎‏‏‎‏‏‎Search query‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‏‎‏‏‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‏‏‎‎‎‎‎‎‎‎‎‏‏‎‏‎‏‏‏‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‎Search‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‎‎‎‎‏‎‎‏‏‏‏‎‎‎‎‏‎‏‏‎‏‎‏‎‏‎‏‏‎‏‏‏‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‏‏‏‎Submit query‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‏‏‎‏‏‎‏‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‏‎‏‎‎‎‎‏‎‎‎‏‎‎‏‎‏‏‏‎Voice search‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‎‏‏‎‏‎‎‏‏‎‎‏‎‎‏‎‎‏‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‏‎‏‏‏‏‎‏‏‎‏‏‏‎Share with‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‏‏‎‎‎‏‏‎‏‏‏‎‎‏‎‏‎‎‏‎‏‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‏‏‏‎‎‎‎‏‏‏‎‎‎Share with ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‏‎‎‏‏‎‏‏‏‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‎‎‏‎‎‎‏‏‎‏‎‎‏‎‎Collapse‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‎‏‏‏‎‏‏‎‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎‏‎‏‎‏‏‎‎‏‎‎‏‏‏‏‎‎‏‎‏‎‏‎‎‎‎‎‏‎‏‎‎‎Answer‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‎‏‏‏‎‎‎‏‎‎‎‏‎‏‎‏‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎‏‎‏‎‏‎‎‏‏‎‏‎‎‏‎‎‎‎‎‎Video‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‏‎‎‎‏‏‎‎‎‎‏‎‎‏‏‏‎‏‎‎‏‏‎‎‎‎‏‎‎‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‎‎‎‎‏‎‎‏‎‎Decline‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‏‎‏‎‎‎‎‏‎‎‏‎‏‎‏‏‏‎‏‎‎‏‏‎‎‎‎‎‎‏‏‎‏‏‎‎‏‏‏‏‎‎‎‎‎‎‎‎‎‏‎‏‏‏‎Hang Up‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‎‎‎‏‎‎‏‎‏‎‎‎‎‏‎‎‎‎‏‎‏‏‎‎‎‏‏‏‎‏‏‎‎‎‏‎‎‎‏‏‎‏‎‎‎‏‎‏‏‎‏‏‏‎Incoming call‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‎‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‎‎‏‏‏‏‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‎‎‏‎‏‏‏‏‏‎‎Ongoing call‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‎‏‏‎‏‎‎‎‏‏‏‎‎‏‎‎‏‎‏‎‎‎‏‏‎‎‏‎‎‎‏‏‏‎‎‏‎‏‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‎‎‎Screening an incoming call‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‎‏‏‏‎‏‏‏‏‏‎‎‎‎‏‎‏‏‎‎‎‏‎‏‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‏‎‏‏‎‎‏‎‏‎‏‏‎‎‎Search‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‏‏‏‏‎‎‏‎‎‏‏‎‏‎‏‏‎‎‏‎‏‏‎‎‎‏‎‎‎‎‎‎‎‏‎‎‎‎‏‎‏‎‏‎‎‎‎‏‎‎‎‎‎‎999+‎‏‎‎‏‎" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-es-rES/values-es-rES.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-es-rES/values-es-rES.xml new file mode 100644 index 00000000..b860671d --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-es-rES/values-es-rES.xml @@ -0,0 +1,28 @@ + + + Alerta + Cuadro combinado + Encabezado + Imagen + Botón, imagen + Enlace + Menú + Barra de menú + Elemento del menú + Barra de progreso + Grupo de botones de radio + Pestaña + Barra de desplazamiento + Botón de selección + ocupado + contraído + ampliado + mezclado + desactivado + activado + sin seleccionar + Resumen + Lista de pestañas + Temporizador + Barra de herramientas + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-es-rUS/values-es-rUS.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-es-rUS/values-es-rUS.xml new file mode 100644 index 00000000..4a76e9d4 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-es-rUS/values-es-rUS.xml @@ -0,0 +1,39 @@ + + + "Navegar a la página principal" + "Navegar hacia arriba" + "Más opciones" + "Listo" + "Ver todas" + "Elegir una app" + "DESACTIVAR" + "ACTIVAR" + "Alt+" + "Ctrl+" + "borrar" + "intro" + "Función+" + "Meta+" + "Mayúscula+" + "espacio" + "Sym+" + "Menú+" + "Buscar…" + "Borrar consulta" + "Búsqueda" + "Buscar" + "Enviar consulta" + "Búsqueda por voz" + "Compartir con" + "Compartir con %s" + "Contraer" + "Responder" + "Video" + "Rechazar" + "Colgar" + "Llamada entrante" + "Llamada en curso" + "Filtrando una llamada entrante" + "Buscar" + "999+" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-es/values-es.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-es/values-es.xml new file mode 100644 index 00000000..2a5b2f34 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-es/values-es.xml @@ -0,0 +1,64 @@ + + + "Ir a inicio" + "Desplazarse hacia arriba" + "Más opciones" + "Hecho" + "Ver todo" + "Seleccionar una aplicación" + "DESACTIVADO" + "ACTIVADO" + "Alt +" + "Ctrl +" + "Suprimir" + "Intro" + "Función +" + "Meta +" + "Mayús +" + "Espacio" + "Sym +" + "Menú +" + "Buscar…" + "Borrar consulta" + "Consulta de búsqueda" + "Buscar" + "Enviar consulta" + "Búsqueda por voz" + "Compartir con" + "Compartir con %s" + "Ocultar" + Alerta + "Responder" + "Vídeo" + "Rechazar" + "Colgar" + "Llamada entrante" + "Llamada en curso" + "Filtrando una llamada entrante" + Cuadro combinado + Encabezado + Imagen + Botón, imagen + Enlace + Menú + Barra de menús + Elemento de menú + Barra de progreso + Grupo de botones de opción + Pestaña + Barra de desplazamiento + "Buscar" + Botón de número + ocupado + contraído + expandido + mixto + desactivado + activado + no seleccionado + "999+" + Resumen + Lista de pestañas + Temporizador + Barra de herramientas + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-et/values-et.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-et/values-et.xml new file mode 100644 index 00000000..08410eb9 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-et/values-et.xml @@ -0,0 +1,63 @@ + + + "Liigu avalehele" + "Liigu üles" + "Rohkem valikuid" + "Valmis" + "Kuva kõik" + "Valige rakendus" + "VÄLJAS" + "SEES" + "Alt +" + "Ctrl +" + "kustuta" + "sisestusklahv" + "Funktsiooniklahv +" + "Meta +" + "Tõstuklahv +" + "tühik" + "Sym +" + "Menüü +" + "Otsige …" + "Päringu tühistamine" + "Otsingupäring" + "Otsing" + "Päringu esitamine" + "Häälotsing" + "Jaga:" + "Jagamine rakendusega %s" + "Ahendamine" + Hoiatus + "Vasta" + "Video" + "Keeldu" + "Lõpeta kõne" + "Sissetulev kõne" + "Käimasolev kõne" + "Sissetuleva kõne filtreerimine" + Liitboks + Pealkiri + Pilt + Nupp, pilt + Menüü + Menüüriba + Menüü-üksus + Edenemisriba + Raadionuppude grupp + Vahekaart + Kerimisriba + "Otsing" + Pööramisnupp + hõivatud + ahendatud + laiendatud + miksitud + väljas + sees + valimata + "999+" + Kokkuvõte + Vahekaartide loend + Taimer + Tööriistariba + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-eu/values-eu.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-eu/values-eu.xml new file mode 100644 index 00000000..810605e0 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-eu/values-eu.xml @@ -0,0 +1,39 @@ + + + "Joan orri nagusira" + "Joan gora" + "Aukera gehiago" + "Eginda" + "Ikusi guztiak" + "Aukeratu aplikazio bat" + "DESAKTIBATU" + "AKTIBATU" + "Alt +" + "Ktrl +" + "ezabatu" + "sartu" + "Funtzioa +" + "Meta +" + "Maius +" + "zuriunea" + "Sym +" + "Menua +" + "Bilatu…" + "Garbitu kontsulta" + "Bilaketa-kontsulta" + "Bilatu" + "Bidali kontsulta" + "Ahozko bilaketa" + "Partekatu honekin" + "Partekatu %s aplikazioarekin" + "Tolestu" + "Erantzun" + "Bideoa" + "Baztertu" + "Amaitu deia" + "Sarrerako deia" + "Deia abian da" + "Sarrerako dei bat bistaratzen" + "Bilatu" + "999+" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fa/values-fa.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fa/values-fa.xml new file mode 100644 index 00000000..aa363e87 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fa/values-fa.xml @@ -0,0 +1,64 @@ + + + "پیمایش به صفحه اصلی" + "رفتن به بالا" + "گزینه‌های بیشتر" + "تمام" + "دیدن همه" + "انتخاب برنامه" + "خاموش" + "روشن" + "‎Alt+‎" + "‎Ctrl+‎" + "حذف" + "enter" + "‎Function+‎" + "‎Meta+‎" + "‎Shift+‎" + "فاصله" + "‎Sym+‎" + "منو+" + "جستجو…‏" + "پاک کردن پُرسمان" + "درخواست جستجو" + "جستجو" + "ارسال پُرسمان" + "جستجوی گفتاری" + "هم‌رسانی با" + "هم‌رسانی با %s" + "کوچک کردن" + هشدار + "پاسخ دادن" + "ویدیو" + "رد کردن" + "قطع تماس" + "تماس ورودی" + "تماس درحال انجام" + "درحال غربال کردن تماس ورودی" + جعبه گفتگو + سر‌صفحه + تصویر + دکمه، تصویر + پیوند + منو + نوار منو + مورد منو + نوار پیشرفت + گروه رادیویی + برگه + نوار پیمایش + "جستجو" + دکمه چرخش + مشغول + کوچک‌شده + بزرگ‌شده + ترکیب‌شده + خاموش + روشن + لغو انتخاب شد + "999+" + خلاصه + فهرست برگه + زمان‌سنج + نوار ابزار + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fi/values-fi.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fi/values-fi.xml new file mode 100644 index 00000000..c29ad023 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fi/values-fi.xml @@ -0,0 +1,64 @@ + + + "Siirry etusivulle" + "Siirry ylös" + "Lisäasetukset" + "Valmis" + "Näytä kaikki" + "Valitse sovellus" + "POIS PÄÄLTÄ" + "PÄÄLLÄ" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Fn+" + "Meta+" + "Vaihto+" + "välilyönti" + "Sym+" + "Valikko+" + "Haku…" + "Tyhjennä kysely" + "Hakukysely" + "Haku" + "Lähetä kysely" + "Puhehaku" + "Jaa…" + "Jaa: %s" + "Tiivistä" + Hälytys + "Vastaa" + "Video" + "Hylkää" + "Lopeta puhelu" + "Saapuva puhelu" + "Käynnissä oleva puhelu" + "Seulotaan saapuvaa puhelua" + Yhdistelmäruutu + Otsikko + Kuva + Painike, kuva + Linkki + Valikko + Valikkopalkki + Valikkokohde + Edistymispalkki + Valintanappiryhmä + Välilehti + Vierityspalkki + "Haku" + Pyörityspainike + varattu + pienennetty + laajennettu + yhdistetty + ei käytössä + käytössä + ei valittu + "999+" + Yhteenveto + Välilehtilista + Ajastin + Työkalupalkki + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fr-rCA/values-fr-rCA.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fr-rCA/values-fr-rCA.xml new file mode 100644 index 00000000..bb36e2e0 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fr-rCA/values-fr-rCA.xml @@ -0,0 +1,62 @@ + + + "Revenir à l\'accueil" + "Revenir en arrière" + "Autres options" + "Terminé" + "Tout afficher" + "Sélectionner une application" + "DÉSACTIVER" + "ACTIVER" + "Alt+" + "Ctrl+" + "supprimer" + "entrée" + "Fonction+" + "Méta+" + "Maj+" + "espace" + "Sym+" + "Menu+" + "Rechercher…" + "Effacer la requête" + "Requête de recherche" + "Rechercher" + "Envoyer la requête" + "Recherche vocale" + "Partager avec" + "Partager avec %s" + "Réduire" + Alerte + "Répondre" + "Vidéo" + "Refuser" + "Raccrocher" + "Appel entrant" + "Appel en cours" + "Filtrer un appel entrant" + Zone combinée + Titre + Bouton, image + Lien + Barre de menu + Option de menu + Barre de progression + Groupe de boutons radio + Onglet + Barre de déroulement + "Rechercher" + Bouton compteur circulaire + en cours de traitement + réduit + agrandi + à double état + désactivé + activé + désélectionné + "999+" + Résumé + Liste des onglets + Minuterie + Barre d’outils + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fr/values-fr.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fr/values-fr.xml new file mode 100644 index 00000000..17dfc07e --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-fr/values-fr.xml @@ -0,0 +1,62 @@ + + + "Revenir à l\'accueil" + "Revenir en haut de la page" + "Autres options" + "OK" + "Tout afficher" + "Sélectionner une application" + "NON" + "OUI" + "Alt+" + "Ctrl+" + "supprimer" + "entrée" + "Fonction+" + "Méta+" + "Maj+" + "espace" + "Sym+" + "Menu+" + "Rechercher…" + "Effacer la requête" + "Requête de recherche" + "Rechercher" + "Envoyer la requête" + "Recherche vocale" + "Partager avec" + "Partager avec %s" + "Réduire" + Alerte + "Répondre" + "Vidéo" + "Refuser" + "Raccrocher" + "Appel entrant" + "Appel en cours" + "Filtrage d\'un appel entrant" + Liste déroulante + Titre + Bouton, image + Lien + Barre de menu + Élément du menu + Barre de progression + Groupe de boutons radio + Onglet + Barre de défilement + "Rechercher" + Toupie + opération en cours + réduit + agrandi + mixte + désactivé + activé + désélectionné(s) + "999+" + Récapitulatif + Liste d’onglets + Minuteur + Barre d’outils + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-gl/values-gl.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-gl/values-gl.xml new file mode 100644 index 00000000..25d4cff2 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-gl/values-gl.xml @@ -0,0 +1,39 @@ + + + "Vai ao inicio" + "Vai cara arriba" + "Máis opcións" + "Feito" + "Ver todo" + "Selecciona unha aplicación" + "DESACTIVADO" + "ACTIVADO" + "Alt +" + "Ctrl +" + "eliminar" + "intro" + "Función +" + "Meta +" + "Maiús +" + "espazo" + "Sym +" + "Menú +" + "Busca…" + "Borra a consulta" + "Busca a consulta" + "Realiza buscas" + "Envía a consulta" + "Busca por voz" + "Comparte contido con" + "Comparte contido coa aplicación %s" + "Contrae" + "Contestar" + "Vídeo" + "Rexeitar" + "Colgar" + "Chamada entrante" + "Chamada en curso" + "Filtrando chamada entrante" + "Buscar" + ">999" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-gu/values-gu.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-gu/values-gu.xml new file mode 100644 index 00000000..9651b05e --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-gu/values-gu.xml @@ -0,0 +1,64 @@ + + + "ઘરનો રસ્તો બતાવો" + "ઉપર નૅવિગેટ કરો" + "વધુ વિકલ્પો" + "થઈ ગયું" + "બધી જુઓ" + "ઍપ્લિકેશન પસંદ કરો" + "બંધ" + "ચાલુ" + "Alt+" + "Ctrl+" + "delete" + "Enter" + "Function+" + "Meta+" + "Shift+" + "space" + "Sym+" + "Menu+" + "શોધો…" + "ક્વેરી સાફ કરો" + "શોધ ક્વેરી" + "શોધો" + "ક્વેરી સબમિટ કરો" + "વૉઇસ શોધ" + "આની સાથે શેર કરો" + "%sની સાથે શેર કરો" + "સંકુચિત કરો" + એલર્ટ + "જવાબ" + "વીડિયો" + "નકારો" + "સમાપ્ત કરો" + "ઇનકમિંગ કૉલ" + "ચાલુ કૉલ" + "ઇનકમિંગ કૉલનું સ્ક્રીનિંગ થાય છે" + કોમ્બો બોક્સ + શીર્ષક + ફોટો + બટન, ફોટો + લિંક + મેનૂ + મેનૂ બાર + મેનૂ આઇટમ + પ્રગતિ બાર + રેડિયો ગ્રૂપ + ટેબ + સ્ક્રોલ બાર + "શોધો" + સ્પિન બટન + વ્યસ્ત + નાનું + વિસ્તૃત + મિક્સ કરેલ + બંધ + ચાલુ + પસંદગીમાંથી કાઢી નાખ્યું + "999+" + સારાંશ + ટેબ લિસ્ટ + ટાઇમર + ટૂલ બાર + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-h720dp-v13/values-h720dp-v13.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-h720dp-v13/values-h720dp-v13.xml new file mode 100644 index 00000000..e38bb90b --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-h720dp-v13/values-h720dp-v13.xml @@ -0,0 +1,4 @@ + + + 54dip + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hdpi-v4/values-hdpi-v4.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hdpi-v4/values-hdpi-v4.xml new file mode 100644 index 00000000..d5a138ef --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hdpi-v4/values-hdpi-v4.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hi/values-hi.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hi/values-hi.xml new file mode 100644 index 00000000..b3a5d66b --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hi/values-hi.xml @@ -0,0 +1,64 @@ + + + "होम पेज पर जाएं" + "वापस जाएं" + "ज़्यादा विकल्प" + "हो गया" + "सभी देखें" + "कोई ऐप्लिकेशन चुनें" + "बंद" + "चालू" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Function+" + "Meta+" + "Shift+" + "space" + "Sym+" + "Menu+" + "खोजें…" + "क्‍वेरी हटाएं" + "सर्च क्वेरी" + "खोजें" + "क्वेरी सबमिट करें" + "बोलकर खोजें" + "इससे शेयर करें:" + "%s से शेयर करें" + "छोटा करें" + अलर्ट + "जवाब दें" + "वीडियो" + "अस्वीकार करें" + "कॉल काटें" + "आने वाला (इनकमिंग) कॉल" + "पहले से जारी कॉल" + "इनकमिंग कॉल को स्क्रीन किया जा रहा है" + कॉम्बो बॉक्स + शीर्षक + फ़ोटो + बटन, फ़ोटो + लिंक + मेनू + मेनू बार + मेनू आइटम + प्रोग्रेस बार + रेडियो ग्रुप + टैब + स्क्रॉल बार + "खोजें" + स्पिन बटन + व्यस्त + छोटा किया गया + बड़ा किया गया + मिक्स + बंद है + चालू है + नहीं चुने गए + "999+" + सारांश + टैब लिस्ट + टाइमर + टूल बार + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hr/values-hr.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hr/values-hr.xml new file mode 100644 index 00000000..541b6ce6 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hr/values-hr.xml @@ -0,0 +1,64 @@ + + + "Idi na početnu" + "Natrag" + "Više opcija" + "Gotovo" + "Prikaži sve" + "Odabir aplikacije" + "ISKLJUČENO" + "UKLJUČENO" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Function+" + "Meta+" + "Shift+" + "svemir" + "Sym+" + "Menu+" + "Pretražite…" + "Izbriši upit" + "Upit za pretraživanje" + "Pretraži" + "Pošalji upit" + "Glasovno pretraživanje" + "Dijeli s" + "Dijeli putem aplikacije %s" + "Sažmi" + Upozorenje + "Odgovori" + "Videozapis" + "Odbij" + "Prekini" + "Dolazni poziv" + "Poziv u tijeku" + "Filtriranje dolaznog poziva" + Kombinirani okvir + Zaglavlje + Slika + Gumb, slika + Veza + Izbornik + Traka izbornika + Stavka izbornika + Traka napretka + Grupa izbornih gumba + Kartica + Traka za pomicanje + "Pretraži" + Gumb za vrtnju + zauzeto + sažeto + prošireno + mješovito + isključeno + uključeno + poništen odabir + "999+" + Sažetak + Popis kartica + Mjerač vremena + Traka s alatima + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hu/values-hu.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hu/values-hu.xml new file mode 100644 index 00000000..7adae074 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hu/values-hu.xml @@ -0,0 +1,64 @@ + + + "Ugrás a főoldalra" + "Fel" + "További lehetőségek" + "Kész" + "Az összes megtekintése" + "Válasszon alkalmazást" + "KI" + "BE" + "Alt+" + "Ctrl+" + "Delete" + "Enter" + "Function+" + "Meta+" + "Shift+" + "Szóköz" + "Sym+" + "Menu+" + "Keresés…" + "Lekérdezés törlése" + "Keresési lekérdezés" + "Keresés" + "Lekérdezés küldése" + "Hangalapú keresés" + "Megosztás a következővel:" + "Megosztás a következő alkalmazással: %s" + "Összecsukás" + Figyelmeztetés + "Fogadás" + "Videó" + "Elutasítás" + "Befejezés" + "Bejövő hívás" + "Hívás folyamatban" + "Bejövő hívás szűrése" + Kombinált lista + Címsor + Kép + Gomb, kép + Hivatkozás + Menü + Menüsor + Menüelem + Folyamatjelző + Választógomb-csoport + Lapfül + Görgetősáv + "Keresés" + Forgó gomb + elfoglalt + összecsukva + kibontva + vegyes + ki + be + nincs kiválasztva + "999+" + Összegzés + Lapfülek listája + Időmérő + Eszköztár + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hy/values-hy.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hy/values-hy.xml new file mode 100644 index 00000000..d6f31a2b --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-hy/values-hy.xml @@ -0,0 +1,46 @@ + + + "Անցնել գլխավոր էջ" + "Անցնել վերև" + "Այլ ընտրանքներ" + "Պատրաստ է" + "Տեսնել բոլորը" + "Ընտրել հավելված" + "ԱՆՋԱՏԵԼ" + "ՄԻԱՑՆԵԼ" + "Alt+" + "Ctrl+" + "Delete" + "Enter" + "Function+" + "Meta+" + "Shift+" + "բացատ" + "Sym+" + "Menu+" + "Որոնում…" + "Ջնջել հարցումը" + "Որոնման հարցում" + "Որոնել" + "Ուղարկել հարցումը" + "Ձայնային որոնում" + "Կիսվել…" + "Կիսվել %s հավելվածի միջոցով" + "Ծալել" + "Պատասխանել" + "Տեսազանգ" + "Մերժել" + "Ավարտել" + "Մուտքային զանգ" + "Ընթացիկ զանգ" + "Մուտքային զանգի զտում" + Կոմբո արկղ + Նկար + Կոճակ, նկար + Հղում + Ընտրացանկ + "Որոնել" + անջատած + միացրած + "999+" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-in/values-in.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-in/values-in.xml new file mode 100644 index 00000000..eda1ec74 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-in/values-in.xml @@ -0,0 +1,39 @@ + + + "Tunjukkan jalan ke rumah" + "Kembali ke atas" + "Opsi lainnya" + "Selesai" + "Lihat semua" + "Pilih aplikasi" + "NONAKTIF" + "AKTIF" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Function+" + "Meta+" + "Shift+" + "spasi" + "Sym+" + "Menu+" + "Telusuri..." + "Hapus kueri" + "Telusuri kueri" + "Telusuri" + "Kirim kueri" + "Penelusuran suara" + "Bagikan dengan" + "Bagikan dengan %s" + "Ciutkan" + "Jawab" + "Video" + "Tolak" + "Tutup" + "Panggilan masuk" + "Panggilan sedang berlangsung" + "Menyaring panggilan masuk" + "Telusuri" + "999+" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-is/values-is.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-is/values-is.xml new file mode 100644 index 00000000..e44b25f1 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-is/values-is.xml @@ -0,0 +1,39 @@ + + + "Fara heim" + "Fara upp" + "Fleiri valkostir" + "Lokið" + "Sjá allt" + "Veldu forrit" + "SLÖKKT" + "KVEIKT" + "Alt+" + "Ctrl+" + "eyða" + "enter" + "Aðgerðarlykill+" + "Meta+" + "Shift+" + "bilslá" + "Sym+" + "Valmynd+" + "Leita…" + "Hreinsa fyrirspurn" + "Leitarfyrirspurn" + "Leit" + "Senda fyrirspurn" + "Raddleit" + "Deila með" + "Deila með %s" + "Minnka" + "Svara" + "Myndsímtal" + "Hafna" + "Leggja á" + "Símtal berst" + "Símtal í gangi" + "Síar símtal sem berst" + "Leit" + "999+" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-it/values-it.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-it/values-it.xml new file mode 100644 index 00000000..2f39d498 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-it/values-it.xml @@ -0,0 +1,60 @@ + + + "Portami a casa" + "Torna indietro" + "Altre opzioni" + "Fine" + "Mostra tutto" + "Scelta di un\'app" + "OFF" + "ON" + "ALT +" + "CTRL +" + "CANC" + "INVIO" + "FUNZIONE +" + "META +" + "MAIUSC +" + "SPAZIO" + "SYM +" + "MENU +" + "Cerca…" + "Cancella query" + "Query di ricerca" + "Cerca" + "Invia query" + "Ricerca vocale" + "Condividi con" + "Condividi tramite %s" + "Comprimi" + Avviso + "Rispondi" + "Video" + "Rifiuta" + "Riaggancia" + "Chiamata in arrivo" + "Chiamata in corso" + "Applicazione filtro a chiamata in arrivo" + Casella combinata + Titolo + Immagine + Pulsante, Immagine + Barra dei menu + Elemento del menu + Barra di avanzamento + Gruppo radio + Barra di scorrimento + "Cerca" + Pulsante girevole + occupato + chiuso + aperto + misto + no + + non selezionato + "999+" + Riepilogo + Lista delle tab + Barra degli strumenti + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-iw/values-iw.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-iw/values-iw.xml new file mode 100644 index 00000000..83b32395 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-iw/values-iw.xml @@ -0,0 +1,64 @@ + + + "ניווט לדף הבית" + "ניווט למעלה" + "עוד אפשרויות" + "סיום" + "הצגת הכול" + "בחירת אפליקציה" + "כבוי" + "מופעל" + "Alt+" + "Ctrl+‎" + "מחיקה" + "Enter" + "Function+" + "Meta+" + "Shift+" + "רווח" + "Sym+" + "תפריט+" + "חיפוש…" + "מחיקת השאילתה" + "שאילתת חיפוש" + "חיפוש" + "שליחת שאילתה" + "חיפוש קולי" + "שיתוף עם" + "שיתוף עם %s" + "כיווץ" + התראה + "מענה" + "וידאו" + "דחייה" + "ניתוק" + "שיחה נכנסת" + "שיחה פעילה" + "סינון שיחה נכנסת" + תיבה משולבת + כותרת + תמונה + לחצן, תמונה + קישור + תפריט + סרגל תפריטים + פריט בתפריט + סרגל התקדמות + קבוצת רדיו + לשונית + סרגל גלילה + "חיפוש" + לחצן מסתובב + תפוס + מצומצם + מורחב + משולב + כבוי + מופעל + הבחירה בוטלה + "999+" + סיכום + רשימת לשוניות + טיימר + סרגל כלים + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ja/values-ja.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ja/values-ja.xml new file mode 100644 index 00000000..1720ce46 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ja/values-ja.xml @@ -0,0 +1,64 @@ + + + "ホームに戻る" + "前に戻る" + "その他のオプション" + "完了" + "すべて表示" + "アプリの選択" + "OFF" + "ON" + "Alt+" + "Ctrl+" + "Delete" + "Enter" + "Function+" + "Meta+" + "Shift+" + "Space" + "Sym+" + "Menu+" + "検索…" + "検索キーワードを削除" + "検索キーワード" + "検索" + "検索キーワードを送信" + "音声検索" + "共有" + "%sと共有" + "折りたたむ" + アラート + "応答" + "ビデオ" + "拒否" + "通話終了" + "着信" + "通話中" + "着信をスクリーニング中" + コンボボックス + 見出し + 画像 + ボタン、画像 + リンク + メニュー + メニューバー + メニューアイテム + 進行状況バー + ラジオグループ + タブ + スクロールバー + "検索" + スピンボタン + 作業中 + 縮小中 + 展開中 + 混合 + オフ + オン + 未選択 + "999+" + 概要 + タブリスト + タイマー + ツールバー + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ka/values-ka.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ka/values-ka.xml new file mode 100644 index 00000000..f7c95978 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ka/values-ka.xml @@ -0,0 +1,63 @@ + + + "მთავარზე გადასვლა" + "ზემოთ გადასვლა" + "სხვა ვარიანტები" + "მზადაა" + "ყველას ნახვა" + "აირჩიეთ აპი" + "გამორთვა" + "ჩართვა" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Function+" + "Meta+" + "Shift+" + "შორისი" + "Sym+" + "Menu+" + "ძიება…" + "მოთხოვნის გასუფთავება" + "მოთხოვნის ძიება" + "ძიება" + "მოთხოვნის გადაგზავნა" + "ხმოვანი ძიება" + "გაზიარება:" + "%s-ით გაზიარება" + "ჩაკეცვა" + გაფრთხილება + "პასუხი" + "ვიდეო" + "უარყოფა" + "გათიშვა" + "შემომავალი ზარი" + "მიმდინარე ზარი" + "შემომავალი ზარების გაცხრილვა" + სათაური + გამოსახულება + ღილაკი, გამოსახულება + ბმული + მენიუ + მენიუს ზოლი + მენიუს ერთეული + პროგრესის ზოლი + რადიო ჯგუფი + ჩანართი + გადაადგილების პანელი + "ძიება" + დატრიალების ღილაკი + დაკავებული + აკეცილი + გაშლილი + შერეული + გამორთულია + ჩართული + აურჩეველი + "999+" + შეჯამება + ჩანართების სია + ტაიმერი + ხელსაწყოების ზოლი + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-kk/values-kk.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-kk/values-kk.xml new file mode 100644 index 00000000..22f84163 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-kk/values-kk.xml @@ -0,0 +1,46 @@ + + + "Негізгі бетке өту" + "Жоғары қарай өту" + "Басқа опциялар" + "Дайын" + "Барлығын көру" + "Қолданбаны таңдау" + "ӨШІРУ" + "ҚОСУ" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Function+" + "Meta+" + "Shift+" + "бос орын" + "Sym+" + "Menu+" + "Іздеу…" + "Сұрауды өшіру" + "Іздеу сұрауы" + "Іздеу" + "Сұрауды жіберу" + "Дауыспен іздеу" + "Бөлісу" + "%s қолданбасымен бөлісу" + "Жию" + "Жауап" + "Бейне" + "Қабылдамау" + "Тұтқаны қою" + "Кіріс қоңырау" + "Қоңырау" + "Келген қоңырауды сүзу" + Біріктірілген тізім + Кескін + Түйме, кескін + Сілтеме + Мәзір + "Іздеу" + өшірулі + қосулы + "999+" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-km/values-km.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-km/values-km.xml new file mode 100644 index 00000000..51f675eb --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-km/values-km.xml @@ -0,0 +1,64 @@ + + + "​ទៅទំព័រដើម" + "រំកិលឡើងលើ" + "ជម្រើសច្រើនទៀត" + "រួចរាល់" + "មើលទាំងអស់" + "ជ្រើសរើស​កម្មវិធី​​" + "បិទ" + "បើក" + "Alt+" + "Ctrl+" + "លុប" + "enter" + "Function+" + "Meta+" + "Shift+" + "space" + "Sym+" + "Menu+" + "ស្វែងរក…" + "សម្អាត​សំណួរ" + "ស្វែងរកសំណួរ​" + "ស្វែងរក" + "ដាក់បញ្ជូន​សំណួរ" + "ស្វែងរក​តាម​សំឡេង" + "ចែករំលែក​ជា​មួយ" + "ចែក​រំលែក​ជា​មួយ %s" + "បង្រួម" + ជូន​ដំណឹង + "ឆ្លើយ" + "វីដេអូ" + "បដិសេធ" + "ដាក់​ចុះ" + "ការ​ហៅ​ចូល" + "ការ​ហៅដែលកំពុងដំណើរការ" + "កំពុងពិនិត្យការ​ហៅ​ចូល" + ប្រអប់បញ្ចូលគ្នា + ចំណងជើង + រូបភាព + ប៊ូតុង, រូបភាព + តំណ + ម៉ឺនុយ + របារម៉ឺនុយ + ធាតុម៉ឺនុយ + របារ​ដំណើរការ + ក្រុមវិទ្យុ + ផ្ទាំង + របាររំកិល + "ស្វែងរក" + ប៊ូតុង​បង្វិល + ជាប់រវល់ + បានបង្រួម + បានពង្រីក + បានលាយ + បិទ + បើក + បាបនដោះការជ្រើសរើស + "999+" + សេចក្ដីសង្ខេប + បញ្ជីថេប + មុខងារកំណត់ម៉ោង + របារ​ឧបករណ៍ + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-kn/values-kn.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-kn/values-kn.xml new file mode 100644 index 00000000..9a6da465 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-kn/values-kn.xml @@ -0,0 +1,64 @@ + + + "ಹೋಮ್‌ಗೆ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ" + "ಮೇಲಕ್ಕೆ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ" + "ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು" + "ಆಯಿತು" + "ಎಲ್ಲವನ್ನೂ ನೋಡಿ" + "ಆ್ಯಪ್‌ವೊಂದನ್ನು ಆಯ್ಕೆಮಾಡಿ" + "ಆಫ್" + "ಆನ್" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Function+" + "Meta+" + "Shift+" + "space" + "Sym+" + "Menu+" + "ಹುಡುಕಿ…" + "ಪ್ರಶ್ನೆಯನ್ನು ತೆರವುಗೊಳಿಸಿ" + "ಪ್ರಶ್ನೆಯನ್ನು ಹುಡುಕಿ" + "ಹುಡುಕಿ" + "ಪ್ರಶ್ನೆಯನ್ನು ಸಲ್ಲಿಸಿ" + "ಧ್ವನಿ ಹುಡುಕಾಟ" + "ಇವರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ" + "%s ನೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ" + "ಕುಗ್ಗಿಸಿ" + ಎಚ್ಚರಿಕೆ + "ಉತ್ತರಿಸಿ" + "ವೀಡಿಯೊ" + "ನಿರಾಕರಿಸಿ" + "ಕರೆ ಕೊನೆಗೊಳಿಸಿ" + "ಒಳಬರುವ ಕರೆ" + "ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಕರೆ" + "ಒಳಬರುವ ಕರೆಯನ್ನು ಸ್ಕ್ರೀನ್ ಮಾಡಲಾಗುತ್ತಿದೆ" + ಕೊಂಬೊ ಬಾಕ್ಸ್ + ಶಿರೋಲೇಖ + ಚಿತ್ರ + ಬಟನ್, ಚಿತ್ರ + ಲಿಂಕ್ + ಮೆನು + ಮೆನು ಬಾರ್ + ಮೆನು ಐಟಂ + ಪ್ರೋಗ್ರೆಸ್ ಬಾರ್ + ರೇಡಿಯೋ ಗುಂಪು + ಟ್ಯಾಬ್ + ಸ್ಕ್ರಾಲ್ ಬಾರ್ + "ಹುಡುಕಿ" + ಸ್ಪಿನ್ ಬಟನ್ + ಕಾರ್ಯನಿರತ + ಮುಚ್ಚಿದೆ + ವಿಸ್ತರಿಸಲಾಗಿದೆ + ಬಗೆಬಗೆಯ + ಆಫ್ + ಆನ್ + ಆಯ್ಕೆ ರದ್ದುಮಾಡಲಾಗಿದೆ + "999+" + ಸಾರಾಂಶ + ಟ್ಯಾಬ್ ಪಟ್ಟಿ + ಟೈಮರ್ + ಟೂಲ್ ಬಾರ್ + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ko/values-ko.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ko/values-ko.xml new file mode 100644 index 00000000..f7c8b573 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ko/values-ko.xml @@ -0,0 +1,64 @@ + + + "홈으로 이동" + "위로 이동" + "추가 옵션" + "완료" + "전체 보기" + "앱 선택" + "사용 중지" + "사용" + "Alt+" + "Ctrl+" + "Delete" + "Enter" + "Function+" + "Meta+" + "Shift+" + "스페이스바" + "Sym+" + "Menu+" + "검색..." + "검색어 삭제" + "검색어" + "검색" + "검색어 보내기" + "음성 검색" + "공유 대상:" + "%s과(와) 공유" + "접기" + 알림 + "통화" + "동영상" + "거절" + "전화 끊기" + "수신 전화" + "진행 중인 통화" + "수신 전화 검사 중" + 콤보 상자 + 제목 + 이미지 + 버튼, 이미지 + 링크 + 메뉴 + 메뉴 표시줄 + 메뉴 항목 + 진행률 표시줄 + 라디오 그룹 + + 스크롤 바 + "검색" + 회전 버튼 + 처리 중 + 숨겨짐 + 확대됨 + 혼합 + 해제 + 설정 + 선택되지 않음 + "999+" + 요약 + 탭 리스트 + 타이머 + 도구 표시줄 + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ky/values-ky.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ky/values-ky.xml new file mode 100644 index 00000000..6ce27ab9 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-ky/values-ky.xml @@ -0,0 +1,46 @@ + + + "Башкы бетке чабыттоо" + "Мурунку экранга өтүү" + "Дагы параметрлер" + "Бүттү" + "Баарын көрүү" + "Колдонмо тандоо" + "ӨЧҮК" + "КҮЙҮК" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Function+" + "Meta+" + "Shift+" + "боштук" + "Sym+" + "Menu+" + "Издөө…" + "Сурамды өчүрүү" + "Изделген сурам" + "Издөө" + "Сурам тапшыруу" + "Айтып издөө" + "Төмөнкү менен бөлүшүү" + "%s аркылуу бөлүшүү" + "Жыйыштыруу" + "Жооп берүү" + "Видео" + "Четке кагуу" + "Чалууну бүтүрүү" + "Кирүүчү чалуу" + "Учурдагы чалуу" + "Кирүүчү чалууну иргөө" + Айкалыштырылган тизме + Сүрөт + Баскыч, сүрөт + Шилтеме + Меню + "Издөө" + өчүк + күйүк + "999+" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-land/values-land.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-land/values-land.xml new file mode 100644 index 00000000..a12899f9 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-land/values-land.xml @@ -0,0 +1,6 @@ + + + 48dp + 12dp + 14dp + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-large-v4/values-large-v4.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-large-v4/values-large-v4.xml new file mode 100644 index 00000000..cc236ebd --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-large-v4/values-large-v4.xml @@ -0,0 +1,12 @@ + + + 440dp + 60% + 90% + 60% + 90% + 55% + 80% + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v17/values-v17.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v17/values-v17.xml new file mode 100644 index 00000000..f85a197a --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v17/values-v17.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v18/values-v18.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v18/values-v18.xml new file mode 100644 index 00000000..7dad77f9 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v18/values-v18.xml @@ -0,0 +1,4 @@ + + + 0px + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v21/values-v21.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v21/values-v21.xml new file mode 100644 index 00000000..9ee03e11 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v21/values-v21.xml @@ -0,0 +1,277 @@ + + + @color/androidx_core_secondary_text_default_material_light + 0dp + 0dp + 12dp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v22/values-v22.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v22/values-v22.xml new file mode 100644 index 00000000..1ad118ee --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v22/values-v22.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v23/values-v23.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v23/values-v23.xml new file mode 100644 index 00000000..edb25cd2 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v23/values-v23.xml @@ -0,0 +1,51 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v24/values-v24.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v24/values-v24.xml new file mode 100644 index 00000000..f9b3c08d --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v24/values-v24.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v26/values-v26.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v26/values-v26.xml new file mode 100644 index 00000000..4c306675 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-v26/values-v26.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-vi/values-vi.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-vi/values-vi.xml new file mode 100644 index 00000000..765c4bdc --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-vi/values-vi.xml @@ -0,0 +1,62 @@ + + + "Chỉ đường về nhà" + "Di chuyển lên" + "Tùy chọn khác" + "Xong" + "Xem tất cả" + "Chọn một ứng dụng" + "TẮT" + "BẬT" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Function+" + "Meta+" + "Shift+" + "space" + "Sym+" + "Menu+" + "Tìm kiếm…" + "Xóa truy vấn" + "Truy vấn tìm kiếm" + "Tìm kiếm" + "Gửi truy vấn" + "Tìm kiếm bằng giọng nói" + "Chia sẻ với" + "Chia sẻ với %s" + "Thu gọn" + Thông báo + "Trả lời" + "Video" + "Từ chối" + "Kết thúc" + "Cuộc gọi đến" + "Cuộc gọi đang thực hiện" + "Đang sàng lọc cuộc gọi đến" + Ô lựa chọn + Tiêu đề + Hình ảnh + Nút, Hình ảnh + Liên kết + Thanh menu + Mục trong menu + Thanh tiến độ + Nhóm nút radio + Thanh cuộn + "Tìm kiếm" + Nút quay + bận + đã thu gọn + đã mở rộng + kết hợp + đang tắt + đang bật + không được chọn + "999+" + Tóm tắt + Danh sách tab + Bộ hẹn giờ + Thanh công cụ + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-watch-v20/values-watch-v20.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-watch-v20/values-watch-v20.xml new file mode 100644 index 00000000..2d85812e --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-watch-v20/values-watch-v20.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-watch-v21/values-watch-v21.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-watch-v21/values-watch-v21.xml new file mode 100644 index 00000000..deecc9e8 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-watch-v21/values-watch-v21.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-xlarge-v4/values-xlarge-v4.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-xlarge-v4/values-xlarge-v4.xml new file mode 100644 index 00000000..b499d2cf --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-xlarge-v4/values-xlarge-v4.xml @@ -0,0 +1,9 @@ + + + 60% + 90% + 50% + 70% + 45% + 72% + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-zh-rCN/values-zh-rCN.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-zh-rCN/values-zh-rCN.xml new file mode 100644 index 00000000..437cdf32 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-zh-rCN/values-zh-rCN.xml @@ -0,0 +1,64 @@ + + + "转到首页" + "转到上一层级" + "更多选项" + "完成" + "查看全部" + "选择应用" + "关闭" + "开启" + "Alt+" + "Ctrl+" + "Delete 键" + "Enter 键" + "Fn+" + "Meta+" + "Shift+" + "空格键" + "Sym+" + "Menu+" + "搜索…" + "清除查询" + "搜索查询" + "搜索" + "提交查询" + "语音搜索" + "分享对象" + "与%s分享" + "收起" + 提醒 + "接听" + "视频通话" + "拒接" + "挂断" + "来电" + "正在通话" + "正在过滤来电" + 组合框 + 标题 + 图片 + 按钮,图片 + 链接 + 菜单 + 菜单栏 + 菜单项目 + 进度条 + 单选组 + 选项卡 + 滚动条 + "搜索" + 旋转按钮 + 忙碌中 + 已收起 + 已展开 + 混合 + 关闭 + 开启 + 未选中 + "999+" + 摘要 + 选项卡列表 + 倒计时 + 工具栏 + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-zh-rHK/values-zh-rHK.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-zh-rHK/values-zh-rHK.xml new file mode 100644 index 00000000..123802d4 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-zh-rHK/values-zh-rHK.xml @@ -0,0 +1,64 @@ + + + "瀏覽主頁" + "向上瀏覽" + "更多選項" + "完成" + "查看全部" + "選擇應用程式" + "關閉" + "開啟" + "Alt +" + "Ctrl +" + "刪除" + "Enter 鍵" + "Fn +" + "Meta +" + "Shift +" + "空白鍵" + "Sym +" + "Menu +" + "搜尋…" + "清除查詢" + "搜尋查詢" + "搜尋" + "提交查詢" + "語音搜尋" + "分享對象" + "使用「%s」分享" + "收合" + 提醒 + "接聽" + "視像" + "拒接" + "掛斷" + "來電" + "通話中" + "正在過濾來電" + 下拉式方塊 + 標題 + 圖像 + 圖像,按鈕 + 連結 + 選單 + 選單列 + 選單項目 + 進度列 + 選項按鈕群組 + 分頁 + 捲軸 + "搜尋" + 微調按鈕 + 忙碌中 + 已收合 + 已展開 + 混合 + 關閉 + 開啟 + 已取消選取 + "999+" + 摘要 + 分頁清單 + 計時器 + 工具列 + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-zh-rTW/values-zh-rTW.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-zh-rTW/values-zh-rTW.xml new file mode 100644 index 00000000..860078a7 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-zh-rTW/values-zh-rTW.xml @@ -0,0 +1,64 @@ + + + "瀏覽首頁" + "向上瀏覽" + "更多選項" + "完成" + "查看全部" + "選擇應用程式" + "關閉" + "開啟" + "Alt +" + "Ctrl +" + "Delete 鍵" + "Enter 鍵" + "Fn +" + "Meta +" + "Shift +" + "空格鍵" + "Sym +" + "Menu +" + "搜尋…" + "清除查詢" + "搜尋查詢" + "搜尋" + "提交查詢" + "語音搜尋" + "分享對象" + "與「%s」分享" + "收合" + 提醒 + "接聽" + "視訊" + "拒接" + "掛斷" + "來電" + "通話中" + "正在過濾來電" + 下拉式方塊 + 標題 + 圖像 + 圖像,按鈕 + 連結 + 功能表 + 功能表列 + 功能表項目 + 進度列 + 選項按鈕群組 + 頁籤 + 捲軸 + "搜尋" + 微調按鈕 + 忙碌中 + 已收合 + 已展開 + 混合 + 關閉 + 開啟 + 已取消選取 + "999+" + 摘要 + 頁籤清單 + 計時器 + 工具列 + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-zu/values-zu.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-zu/values-zu.xml new file mode 100644 index 00000000..3fbbb9d3 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values-zu/values-zu.xml @@ -0,0 +1,39 @@ + + + "Zulazulela ekhaya" + "Zulazulela phezulu" + "Ezinye izinketho" + "Kwenziwe" + "Buka konke" + "Khetha insiza" + "VALA" + "VULA" + "Alt+" + "Ctrl+" + "delete" + "enter" + "Function+" + "Meta+" + "Shift+" + "space" + "Sym+" + "Imenyu+" + "Sesha…" + "Sula inkinga" + "Sesha umbuzo" + "Sesha" + "Thumela umbuzo" + "Ukusesha ngezwi" + "Yabelana no" + "Yabelana ne-%s" + "Goqa" + "Phendula" + "Ividiyo" + "Yenqaba" + "Vala Ucingo" + "Ikholi engenayo" + "Ikholi eqhubekayo" + "Ukuveza ikholi engenayo" + "Sesha" + "999+" + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values/values.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values/values.xml new file mode 100644 index 00000000..843fa103 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values/values.xml @@ -0,0 +1,3589 @@ + + + + + + + + true + true + #ff000000 + #ffffffff + #7fa87f + @android:color/black + @android:color/black + @color/material_deep_teal_200 + @color/material_deep_teal_500 + #1f000000 + #8a000000 + @color/material_grey_800 + @android:color/white + @color/material_grey_850 + @color/material_grey_50 + #80ffffff + #80000000 + @color/bright_foreground_material_light + @color/bright_foreground_material_dark + @android:color/white + @android:color/black + #ff5a595b + #ffd6d7d7 + #1d873b + #d93025 + #ffffffff + #eecc0000 + #80bebebe + #80323232 + #ffbebebe + #ff323232 + #ff7043 + #ff5722 + @android:color/white + @android:color/black + #6680cbc4 + #66009688 + #ff37474f + #ff263238 + #ff21272b + #ff80cbc4 + #ff008577 + #fff5f5f5 + #ffe0e0e0 + #fffafafa + #ff757575 + #ff424242 + #ff303030 + #ff212121 + #ffffffff + #ff9e9e9e + @android:color/black + @color/material_grey_600 + @color/material_grey_900 + @color/material_grey_100 + #ffffffff + #de000000 + #4Dffffff + #39000000 + #33ffffff + #1f000000 + #b3ffffff + #8a000000 + #36ffffff + #24000000 + #ff616161 + #ffbdbdbd + #ffbdbdbd + #fff1f1f1 + #e6616161 + #e6FFFFFF + 16dp + 72dp + 56dp + 0dp + 0dp + 4dp + 16dp + 10dp + 6dp + 48dp + 180dp + 5dp + -3dp + 48dp + 48dp + 36dp + 48dp + 48dp + @dimen/abc_control_inset_material + 6dp + 8dp + @dimen/abc_control_padding_material + 720dp + 320dp + 2dp + 4dp + 4dp + 2dp + 80% + 100% + 320dp + 320dp + 8dp + 8dp + 65% + 95% + 24dp + 18dp + 8dp + 0.30 + 0.26 + 32dip + 8dip + 8dip + 7dp + 4dp + 10dp + 16dp + 80dp + 64dp + 48dp + @dimen/abc_action_bar_content_inset_material + 296dp + 4dp + 48dip + 320dip + 2dp + 2dp + 20dp + 48dp + 36dp + 16dp + 3dp + 14sp + 14sp + 14sp + 12sp + 34sp + 45sp + 56sp + 112sp + 24sp + 22sp + 18sp + 14sp + 16sp + 14sp + 16sp + 16dp + 20sp + 20dp + 20dp + 4dp + 6dp + 8dp + 4dp + 2dp + 320dp + 320dp + 0.30 + 0.26 + 0.26 + 0.20 + 0.12 + 0.50 + 0.38 + 0.70 + 0.54 + 32dp + 13sp + 12dp + 8dp + 64dp + 64dp + 10dp + @dimen/notification_content_margin_start + 16dp + 4dp + 3dp + 24dp + 13sp + 10dp + 5dp + 2dp + 16dp + 8dp + 8dp + 96dp + 6.5dp + 0dp + 16dp + #3333B5E5 + #0cffffff + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 220 + 150 + 127 + 150 + 8081 + 999 + Navigate home + Navigate up + More options + Done + See all + Choose an app + OFF + ON + Alt+ + Ctrl+ + delete + enter + Function+ + Meta+ + Shift+ + space + Sym+ + Menu+ + Search… + Clear query + Search query + Search + Submit query + Voice search + Share with + Share with %s + Collapse + Alert + androidx.startup + Answer + Video + Decline + Hang Up + Incoming call + Ongoing call + Screening an incoming call + Change Bundle Location + Apply Changes + Cancel + 127.0.0.1:8081 + Provide a custom bundler address and port: + You can connect either via USB (localhost - default) or Wifi. If you connect via USB and running with a physical device, make sure you:\n 1. Connect your device via USB\n 2. Set the bundle location to `localhost:8081`\n 3. Run this command in your terminal:\n      `%1$s` + Copy\n + Connecting to debugger... + Failed to connect to debugger! + Open DevTools + Connect to the bundler to debug JavaScript + React Native Dev Menu (%1$s) + Running %1$s + Dismiss\n(ESC) + Capture Heap + Enable Fast Refresh + Disabling Fast Refresh because it requires a development bundle. + Switching to development bundle in order to enable Fast Refresh. + Disable Fast Refresh + Toggle Element Inspector + Loading from %1$s… + Failed to open DevTools. Please check that the dev server is running and reload the app. + Show Perf Monitor + Hide Perf Monitor + Reload + Reload\n(R,\u00A0R) + Failed to load bundle. Try restarting the bundler or reconnecting your device. + Report + Toggle Sampling Profiler + Settings + Debug Settings + Combo Box + Heading + Image + Button, Image + Link + Menu + Menu Bar + Menu Item + Progress Bar + Radio Group + localhost + Tab + Scroll Bar + Search + Spin Button + busy + collapsed + expanded + mixed + off + on + unselected + 999+ + Summary + Tab List + Timer + Tool Bar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merger.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merger.xml new file mode 100644 index 00000000..aa75e2b4 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/mergeReleaseResources/merger.xml @@ -0,0 +1,4447 @@ + +androidx.startup@color/androidx_core_secondary_text_default_material_light0dp0dp12dp"Răspunde""Video""Respinge""Închide""Apel primit""Apel în desfășurare""Se filtrează un apel primit""999+""పికప్ చేయండి""వీడియో కాల్""కట్ చేయండి""ముగించండి""ఇన్‌కమింగ్ కాల్""కాల్ కొనసాగుతోంది""ఇన్‌కమింగ్ కాల్‌ను స్క్రీన్ చేయండి""999+""Ответить""Видео""Отклонить""Завершить""Входящий вызов""Текущий вызов""Фильтрация входящего вызова"">999""Sagutin""Video""Tanggihan""Ibaba""Papasok na tawag""Kasalukuyang tawag""Nagsi-screen ng papasok na tawag""999+""接聽""視訊""拒接""掛斷""來電""通話中""正在過濾來電""999+""Rispondi""Video""Rifiuta""Riaggancia""Chiamata in arrivo""Chiamata in corso""Applicazione filtro a chiamata in arrivo""999+""Respon""Vídeo""Rebutja""Penja""Trucada entrant""Trucada en curs""S\'està filtrant una trucada entrant""999+""Svara""Myndsímtal""Hafna""Leggja á""Símtal berst""Símtal í gangi""Síar símtal sem berst""999+""Přijmout""Video""Odmítnout""Zavěsit""Příchozí hovor""Probíhající hovor""Prověřování příchozího hovoru""999+""接听""视频通话""拒接""挂断""来电""正在通话""正在过滤来电""999+""Jawab""Video""Tolak""Tutup""Panggilan masuk""Panggilan sedang berlangsung""Menyaring panggilan masuk""999+""応答""ビデオ""拒否""通話終了""着信""通話中""着信をスクリーニング中""999+""Απάντηση""Βίντεο""Απόρριψη""Τερματισμός""Εισερχόμενη κλήση""Κλήση σε εξέλιξη""Διαλογή εισερχόμενης κλήσης""999+""Atbildēt""Video""Noraidīt""Pārtraukt""Ienākošais zvans""Pašreizējais zvans""Ienākošā zvana filtrēšana""999+""Besvar""Video""Afvis""Læg på""Indgående opkald""Igangværende opkald""Et indgående opkald screenes""999+""उत्तर द्या""व्हिडिओ""नकार द्या""कॉल बंद करा""इनकमिंग कॉल""सुरू असलेला कॉल""इनकमिंग कॉल स्क्रीन करत आहे""९९९+""Жауап""Бейне""Қабылдамау""Тұтқаны қою""Кіріс қоңырау""Қоңырау""Келген қоңырауды сүзу""999+""Жооп берүү""Видео""Четке кагуу""Чалууну бүтүрүү""Кирүүчү чалуу""Учурдагы чалуу""Кирүүчү чалууну иргөө""999+""જવાબ""વીડિયો""નકારો""સમાપ્ત કરો""ઇનકમિંગ કૉલ""ચાલુ કૉલ""ઇનકમિંગ કૉલનું સ્ક્રીનિંગ થાય છે""999+""Answer""Video""Decline""Hang Up""Incoming call""Ongoing call""Screening an incoming call""999+""Хариулах""Видео""Татгалзах""Таслах""Ирсэн дуудлага""Дуудлага хийгдэж байна""Ирсэн дуудлагыг харуулж байна""999+""Answer""Video""Decline""Hang up""Incoming call""On-going call""Screening an incoming call""999+""Jawab""Video""Tolak""Tamatkan Panggilan""Panggilan masuk""Panggilan sedang berlangsung""Menyaring panggilan masuk""999+""接聽""視像""拒接""掛斷""來電""通話中""正在過濾來電""999+""ឆ្លើយ""វីដេអូ""បដិសេធ""ដាក់​ចុះ""ការ​ហៅ​ចូល""ការ​ហៅដែលកំពុងដំណើរការ""កំពុងពិនិត្យការ​ហៅ​ចូល""999+""Atender""Vídeo""Recusar""Desligar""Chamada recebida""Chamada em andamento""Filtrando uma ligação recebida""999+""Պատասխանել""Տեսազանգ""Մերժել""Ավարտել""Մուտքային զանգ""Ընթացիկ զանգ""Մուտքային զանգի զտում""999+""መልስ""ቪዲዮ""አትቀበል""ስልኩን ዝጋ""ገቢ ጥሪ""እየተካሄደ ያለ ጥሪ""ገቢ ጥሪ ማጣራት""999+""Адказаць""Відэа""Адхіліць""Завяршыць""Уваходны выклік""Бягучы выклік""Фільтраванне ўваходнага выкліку""999+"#1f000000#8a000000#1d873b#d93025#ffffffff#ff9e9e9e4dp6dp8dp4dp2dp320dp320dp32dp13sp12dp8dp64dp64dp10dp@dimen/notification_content_margin_start16dp4dp3dp24dp13sp10dp5dp#3333B5E5#0cffffff999AnswerVideoDeclineHang UpIncoming callOngoing callScreening an incoming call999+ + + + + + + + + + + + + + 24dp80dp64dp8dp8dp580dp16dp20dp"Navighează la ecranul de pornire""Navighează în sus""Mai multe opțiuni""Gata""Afișează tot""Alege o aplicație""DEZACTIVAT""ACTIVAT""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""space""Sym+""Meniu+""Caută…""Șterge interogarea""Termen de căutare""Caută""Trimite interogarea""Căutare vocală""Trimite la""Trimite folosind %s""Restrânge""Caută""హోమ్‌కు నావిగేట్ చేస్తుంది""పైకి నావిగేట్ చేస్తుంది""మరిన్ని ఆప్షన్‌లు""పూర్తయింది""అన్నీ చూడండి""యాప్‌ను ఎంచుకోండి""ఆఫ్""ఆన్""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""స్పేస్""Sym+""Menu+""సెర్చ్ చేయండి…""ప్రశ్నను తీసివేస్తుంది""సెర్చ్ క్వెరీ""సెర్చ్""ప్రశ్నని సమర్పిస్తుంది""వాయిస్ సెర్చ్""వీరితో షేర్ చేస్తుంది""%sతో షేర్ చేస్తుంది""కుదిస్తుంది""సెర్చ్"0px"Перейти на главный экран""Перейти вверх""Ещё""Готово""Показать все""Выберите приложение""ВЫКЛ""ВКЛ""Alt +""Ctrl +""Delete""Ввод""Fn +""Meta +""Shift +""Пробел""Sym +""Меню +""Введите запрос""Удалить запрос""Поисковый запрос""Поиск""Отправить запрос""Голосовой поиск""Поделиться с помощью""Поделиться с помощью %s""Свернуть""Поиск""Mag-navigate sa home""Mag-navigate pataas""Higit pang opsyon""Tapos na""Tingnan lahat""Pumili ng app""I-OFF""I-ON""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""space""Sym+""Menu+""Maghanap…""I-clear ang query""Query sa paghahanap""Maghanap""Isumite ang query""Paghahanap gamit ang boses""Ibahagi sa/kay""Ibahagi gamit ang %s""I-collapse""Maghanap""瀏覽首頁""向上瀏覽""更多選項""完成""查看全部""選擇應用程式""關閉""開啟""Alt +""Ctrl +""Delete 鍵""Enter 鍵""Fn +""Meta +""Shift +""空格鍵""Sym +""Menu +""搜尋…""清除查詢""搜尋查詢""搜尋""提交查詢""語音搜尋""分享對象""與「%s」分享""收合""搜尋""Portami a casa""Torna indietro""Altre opzioni""Fine""Mostra tutto""Scelta di un\'app""OFF""ON""ALT +""CTRL +""CANC""INVIO""FUNZIONE +""META +""MAIUSC +""SPAZIO""SYM +""MENU +""Cerca…""Cancella query""Query di ricerca""Cerca""Invia query""Ricerca vocale""Condividi con""Condividi tramite %s""Comprimi""Cerca""Navega fins a la pàgina d\'inici""Navega cap amunt""Més opcions""Fet""Mostra-ho tot""Selecciona una aplicació""DESACTIVA""ACTIVA""Alt+""Ctrl+""Supr""Retorn""Funció+""Meta+""Maj+""Espai""Sym+""Menú+""Cerca…""Esborra la consulta""Consulta de cerca""Cerca""Envia la consulta""Cerca per veu""Comparteix amb""Comparteix amb %s""Replega""Cerca""Fara heim""Fara upp""Fleiri valkostir""Lokið""Sjá allt""Veldu forrit""SLÖKKT""KVEIKT""Alt+""Ctrl+""eyða""enter""Aðgerðarlykill+""Meta+""Shift+""bilslá""Sym+""Valmynd+""Leita…""Hreinsa fyrirspurn""Leitarfyrirspurn""Leit""Senda fyrirspurn""Raddleit""Deila með""Deila með %s""Minnka""Leit""Přejít na plochu""Přejít nahoru""Další možnosti""Hotovo""Zobrazit vše""Vybrat aplikaci""VYP""ZAP""Alt+""Ctrl+""delete""enter""Fn+""Meta+""Shift+""mezerník""Sym+""Menu+""Vyhledat…""Smazat dotaz""Dotaz pro vyhledávání""Hledat""Odeslat dotaz""Hlasové vyhledávání""Sdílet s""Sdílet s aplikací %s""Sbalit""Hledat""转到首页""转到上一层级""更多选项""完成""查看全部""选择应用""关闭""开启""Alt+""Ctrl+""Delete 键""Enter 键""Fn+""Meta+""Shift+""空格键""Sym+""Menu+""搜索…""清除查询""搜索查询""搜索""提交查询""语音搜索""分享对象""与%s分享""收起""搜索""Tunjukkan jalan ke rumah""Kembali ke atas""Opsi lainnya""Selesai""Lihat semua""Pilih aplikasi""NONAKTIF""AKTIF""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""spasi""Sym+""Menu+""Telusuri...""Hapus kueri""Telusuri kueri""Telusuri""Kirim kueri""Penelusuran suara""Bagikan dengan""Bagikan dengan %s""Ciutkan""Telusuri""ホームに戻る""前に戻る""その他のオプション""完了""すべて表示""アプリの選択""OFF""ON""Alt+""Ctrl+""Delete""Enter""Function+""Meta+""Shift+""Space""Sym+""Menu+""検索…""検索キーワードを削除""検索キーワード""検索""検索キーワードを送信""音声検索""共有""%sと共有""折りたたむ""検索""Πλοήγηση στην αρχική σελίδα""Πλοήγηση προς τα επάνω""Περισσότερες επιλογές""Τέλος""Εμφάνιση όλων""Επιλέξτε μια εφαρμογή""ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ""ΕΝΕΡΓΟΠΟΙΗΣΗ""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""διάστημα""Sym+""Menu+""Αναζήτηση…""Διαγραφή ερωτήματος""Ερώτημα αναζήτησης""Αναζήτηση""Υποβολή ερωτήματος""Φωνητική αναζήτηση""Κοινοποίηση σε""Κοινοποίηση στην εφαρμογή %s""Σύμπτυξη""Αναζήτηση""นำทางไปหน้าแรก""กลับ""ตัวเลือกอื่น""เสร็จ""ดูทั้งหมด""เลือกแอป""ปิด""เปิด""Alt+""Ctrl+""ลบ""Enter""Function+""Meta+""Shift+""Space""Sym+""เมนู+""ค้นหา…""ล้างคำค้นหา""คำค้นหา""ค้นหา""ส่งคำค้นหา""ค้นหาด้วยเสียง""แชร์กับ""แชร์ทาง %s""ยุบ""ค้นหา""پیمایش به صفحه اصلی""رفتن به بالا""گزینه‌های بیشتر""تمام""دیدن همه""انتخاب برنامه""خاموش""روشن""‎Alt+‎""‎Ctrl+‎""حذف""enter""‎Function+‎""‎Meta+‎""‎Shift+‎""فاصله""‎Sym+‎""منو+""جستجو…‏""پاک کردن پُرسمان""درخواست جستجو""جستجو""ارسال پُرسمان""جستجوی گفتاری""هم‌رسانی با""هم‌رسانی با %s""کوچک کردن""جستجو""Eiti į pagrindinį puslapį""Naršyti aukštyn""Daugiau parinkčių""Atlikta""Žr. viską""Pasirinkite programą""IŠJUNGTI""ĮJUNGTI""„Alt“ +""„Ctrl“ +""„delete“""„enter“""„Function“ +""„Meta“ +""„Shift“ +""„space“""„Sym“ +""„Menu“ +""Ieškoti…""Išvalyti užklausą""Paieškos užklausa""Ieškoti""Pateikti užklausą""Paieška balsu""Bendrinti su""Bendrinti naudojant programą „%s“""Sutraukti""Ieškoti""ହୋମକୁ ନେଭିଗେଟ କରନ୍ତୁ""ଉପରକୁ ନେଭିଗେଟ୍ କରନ୍ତୁ""ଅଧିକ ବିକଳ୍ପ""ହୋଇଗଲା""ସବୁ ଦେଖନ୍ତୁ""ଗୋଟିଏ ଆପ୍‍ ବାଛନ୍ତୁ""ବନ୍ଦ""ଚାଲୁ ଅଛି""Alt+""Ctrl+""ଡିଲିଟ କରନ୍ତୁ""ଏଣ୍ଟର୍""Function+""Meta+""Shift+""ସ୍ପେସ୍‍""Sym+""ମେନୁ""ସର୍ଚ୍ଚ କରନ୍ତୁ…""କ୍ୱେରୀ ଖାଲି କରନ୍ତୁ""ସର୍ଚ୍ଚ କ୍ୱେରୀ""ସର୍ଚ୍ଚ କରନ୍ତୁ""କ୍ୱେରୀ ଦାଖଲ କରନ୍ତୁ""ଭଏସ ସର୍ଚ୍ଚ""ଏହାଙ୍କ ସହ ସେୟାର୍‌ କରନ୍ତୁ""%s ସହ ସେୟାର୍‍ କରନ୍ତୁ""ସଂକୁଚିତ କରନ୍ତୁ""ସର୍ଚ୍ଚ କରନ୍ତୁ""Joan orri nagusira""Joan gora""Aukera gehiago""Eginda""Ikusi guztiak""Aukeratu aplikazio bat""DESAKTIBATU""AKTIBATU""Alt +""Ktrl +""ezabatu""sartu""Funtzioa +""Meta +""Maius +""zuriunea""Sym +""Menua +""Bilatu…""Garbitu kontsulta""Bilaketa-kontsulta""Bilatu""Bidali kontsulta""Ahozko bilaketa""Partekatu honekin""Partekatu %s aplikazioarekin""Tolestu""Bilatu""ກັບໄປໜ້າຫຼັກ""ເລື່ອນຂຶ້ນເທິງ""ຕົວເລືອກເພີ່ມເຕີມ""ແລ້ວໆ""ເບິ່ງທັງໝົດ""ເລືອກແອັບ""ປິດ""ເປີດ""Alt+""Ctrl+""ລຶບ""enter""Function+""Meta+""Shift+""ຍະຫວ່າງ""Sym+""Menu+""ຊອກຫາ…""ລຶບຂໍ້ຄວາມຊອກຫາ""ຄຳສຳລັບຄົ້ນຫາ""ຊອກຫາ""ສົ່ງຂໍ້ມູນ""ຊອກຫາດ້ວຍສຽງ""ແບ່ງປັນກັບ""ແບ່ງປັນດ້ວຍ %s""ຫຍໍ້ລົງ""ຊອກຫາ""ניווט לדף הבית""ניווט למעלה""עוד אפשרויות""סיום""הצגת הכול""בחירת אפליקציה""כבוי""מופעל""Alt+""Ctrl+‎""מחיקה""Enter""Function+""Meta+""Shift+""רווח""Sym+""תפריט+""חיפוש…""מחיקת השאילתה""שאילתת חיפוש""חיפוש""שליחת שאילתה""חיפוש קולי""שיתוף עם""שיתוף עם %s""כיווץ""חיפוש""Navigate home""Navigate up""More options""Done""See all""Choose an app""OFF""ON""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""space""Sym+""Menu+""Search…""Clear query""Search query""Search""Submit query""Voice search""Share with""Share with %s""Collapse""Search""Siirry etusivulle""Siirry ylös""Lisäasetukset""Valmis""Näytä kaikki""Valitse sovellus""POIS PÄÄLTÄ""PÄÄLLÄ""Alt+""Ctrl+""delete""enter""Fn+""Meta+""Vaihto+""välilyönti""Sym+""Valikko+""Haku…""Tyhjennä kysely""Hakukysely""Haku""Lähetä kysely""Puhehaku""Jaa…""Jaa: %s""Tiivistä""Haku"AlerteZone combinéeTitreBouton, imageLienBarre de menuOption de menuBarre de progressionGroupe de boutons radioOngletBarre de déroulementBouton compteur circulaireen cours de traitementréduitagrandià double étatdésactivéactivédésélectionnéRésuméListe des ongletsMinuterieBarre d’outilsPole kombiNagłówekObrazPrzycisk, obrazPasek menuPozycja menuPasek postępuGrupa przycisków radiowychKartaPasek przewijaniaPrzycisk kręceniazajętezwinięterozwiniętemieszanewył.wł.nie wybranoPodsumowanieLista kartCzasomierzPasek narzędziThông báoÔ lựa chọnTiêu đềHình ảnhNút, Hình ảnhLiên kếtThanh menuMục trong menuThanh tiến độNhóm nút radioThanh cuộnNút quaybậnđã thu gọnđã mở rộngkết hợpđang tắtđang bậtkhông được chọnTóm tắtDanh sách tabBộ hẹn giờThanh công cụSinjalizimKuti kombinimiTitullImazhButon, imazhLidhjaMenyShiriti i menysëArtikull i menysëShiriti i ProgresitGrupi i RadiosSkedëShiriti i lëvizjesButoni i rrotullimitI zënëpalosurzgjeruarpërzierjoaktivaktivei pazgjedhurPërmbledhjaLista e skedaveKohëmatësiShiriti i mjeteveAviseringKombinationsrutaRubrikBildKnapp, bildLänkMenyMenyfältMenyobjektFörloppsfältRadiogruppFlikBläddringslistRotationsknappupptagenminimeradutökadblandadavavmarkeradSammanfattningFliklistaVerktygsfältOpozoriloKombinirano poljeNaslovSlikaGumb, slikaPovezavaMeniMeniElement v menijuČrta napredkaRadio skupinaZavihekDrsnikVrtljivi gumbzasedenostrnjenorazširjenmešanoizključenovklopljenoneizbranoPovzetekSeznam z zavihkiČasovnikVrstica z orodjiUpozornenieKombinované poleNadpisObrázokTlačidlo, obrázokOdkazPonukaLišta s ponukouPoložka ponukyIndikátor postupuSkupina tlačidiel na výberTabulátorLišta na posúvanieOtočné tlačidloobsadenézbalenérozbalenézmiešanévypnutézapnuténevybranéSúhrnZoznam karietČasovačPanel s nástrojmiالرٹکومبو باکسسرخیتصویربٹن، تصویرلنکمینیومینیو بارمینیو آئٹمپیشرفت کی بارریڈیو گروپٹیبسکرول بارگھمانے کا بٹنمصروفسکیڑا گیاتوسیع کیا گیاامتزاجآف ہےآن ہےغیر منتخب کردہخلاصہٹیب کی لسٹٹائمرٹول بارArifaKisanduku cha ComboKichwaPichaKitufe, PichaKiungoMenyuUpau wa MenyuKipengee cha MenyuUpau wa HatuaKundi la RedioKichupoMwambaa wa KubiringizaKitufe cha KuzungushashughuliniimekunjwaimepanuliwamchanganyikoimezimwaimewashwahaijateuliwaMuhtasariOrodha ya KichupoKipima mudaUpau wa ZanaAvisoCaixa de combinaçãoTítuloImagemBotão, ImagemLigaçãoBarra do menuItem do menuBarra de progressoGrupo de opçõesSeparadorBarra de deslocamentoBotão giratórioocupadofechadoexpandidomistodesativadoativadonão selecionadoResumoLista de separadoresTemporizadorBarra de ferramentasUyarıKarma KutuBaşlıkGörselDüğme, GörselBağlantıMenüMenü ÇubuğuMenü Seçeneğiİlerleme ÇubuğuRadyo GrubuSekmeKaydırma ÇubuğuDöndürme Düğmesimeşguldaraltılmışgenişletilmişkarışıkkapalıaçıkseçili değilÖzetSekme ListesiZamanlayıcıAraç Çubuğuநினைவூட்டல்காம்போ பெட்டிதலைப்புபடம்பொத்தான், படம்இணைப்புமெனுமெனு பட்டிமெனு பொருள்போக்கு பட்டிரேடியோ குழுபிரிவுஉருட்டுப்பட்டிஸ்பின் பட்டன்பணிமிகுதிசுருக்கப்பட்டதுவிரிவாக்கப்பட்டதுகலந்துள்ளதுஆஃப்ஆன்தேர்வுநீக்கப்பட்டதுசுருக்கம்பிரிவுப் பட்டியல்டைமர்கருவிப்பட்டிการแจ้งเตือนกล่องคอมโบส่วนหัวรูปภาพปุ่ม, รูปภาพลิงก์เมนูแถบเมนูรายการในเมนูแถบความคืบหน้ากลุ่มปุ่มตัวเลือกแท็บแถบเลื่อนปุ่มเพิ่ม/ลดไม่ว่างยุบแล้วขยายแล้วผสมกันปิดอยู่เปิดอยู่ไม่ได้เลือกสรุปรายการแท็บตัวจับเวลาแถบเครื่องมือهشدارجعبه گفتگوسر‌صفحهتصویردکمه، تصویرپیوندمنونوار منومورد منونوار پیشرفتگروه رادیوییبرگهنوار پیمایشدکمه چرخشمشغولکوچک‌شدهبزرگ‌شدهترکیب‌شدهخاموشروشنلغو انتخاب شدخلاصهفهرست برگهزمان‌سنجنوار ابزارĮspėjimasSudėtinis laukelisAntraštėVaizdasMygtukas, vaizdasNuorodaMeniuMeniu juostaMeniu elementasEigos juostaAkučių grupėSkirtukasSlinkimo juostaSukimo mygtukasnaudojamasutrauktaišskleistamišrusišjungtaįjungtapasirinkimas atšauktasSuvestinėSkirtukų sąrašasLaikmatisĮrankių juostaກ່ອງຄອມໂບຮູບພາບປຸ່ມ, ຮູບພາບລິ້ງເມນູປິດເປີດהתראהתיבה משולבתכותרתתמונהלחצן, תמונהקישורתפריטסרגל תפריטיםפריט בתפריטסרגל התקדמותקבוצת רדיולשוניתסרגל גלילהלחצן מסתובבתפוסמצומצםמורחבמשולבכבוימופעלהבחירה בוטלהסיכוםרשימת לשוניותטיימרסרגל כליםCombo boxButton, imageMenu barMenu itemProgress barRadio groupScroll barSpin buttonTab listTool barHälytysYhdistelmäruutuOtsikkoKuvaPainike, kuvaLinkkiValikkoValikkopalkkiValikkokohdeEdistymispalkkiValintanappiryhmäVälilehtiVierityspalkkiPyörityspainikevarattupienennettylaajennettuyhdistettyei käytössäkäytössäei valittuYhteenvetoVälilehtilistaAjastinTyökalupalkkiAlerteListe déroulanteTitreBouton, imageLienBarre de menuÉlément du menuBarre de progressionGroupe de boutons radioOngletBarre de défilementToupieopération en coursréduitagrandimixtedésactivéactivédésélectionné(s)RécapitulatifListe d’ongletsMinuteurBarre d’outilsAlertaCuadro combinadoEncabezadoImagenBotón, imagenEnlaceMenúBarra de menúsElemento de menúBarra de progresoGrupo de botones de opciónPestañaBarra de desplazamientoBotón de númeroocupadocontraídoexpandidomixtodesactivadoactivadono seleccionadoResumenLista de pestañasTemporizadorBarra de herramientasHoiatusLiitboksPealkiriPiltNupp, piltMenüüMenüüribaMenüü-üksusEdenemisribaRaadionuppude gruppVahekaartKerimisribaPööramisnupphõivatudahendatudlaiendatudmiksitudväljasseesvalimataKokkuvõteVahekaartide loendTaimerTööriistaribaUpozorenjeKombinirani okvirZaglavljeSlikaGumb, slikaVezaIzbornikTraka izbornikaStavka izbornikaTraka napretkaGrupa izbornih gumbaKarticaTraka za pomicanjeGumb za vrtnjuzauzetosažetoproširenomješovitoisključenouključenoponišten odabirSažetakPopis karticaMjerač vremenaTraka s alatimaFigyelmeztetésKombinált listaCímsorKépGomb, képHivatkozásMenüMenüsorMenüelemFolyamatjelzőVálasztógomb-csoportLapfülGörgetősávForgó gombelfoglaltösszecsukvakibontvavegyeskibenincs kiválasztvaÖsszegzésLapfülek listájaIdőmérőEszköztárWaarschuwingCombivakKopAfbeeldingKnop, afbeeldingMenubalkMenu-itemVoortgangsbalkKeuzegroepTabbladScrollbalkDraaiknopbezigsamengevouwenuitgevouwengemengduitaangedeselecteerdSamenvattingLijst met tabbladenWerkbalkСигналКомбинирана кутияЗаглавиеИзображениеБутон, изображениеВръзкаМенюЛента с менютаЕлемент от менюЛента за напредъкРадио групаРазделЛента за превъртанеБутон за завъртанезаетосвиторазширеносмесеноизключеновключенонеизбраноОбобщениеСписък с разделиТаймерЛента с инструментиঅ্যালার্টকম্বো বক্সশিরোনামইমেজবোতাম, ছবিলিঙ্কমেনুমেনু বারমেনু আইটেমপ্রোগ্রেস বাররেডিও গ্রুপট্যাবস্ক্রোল বারস্পিন বোতামব্যস্তছোট করা হয়েছেবাড়ানো হয়েছেমিশ্রবন্ধ আছেচালু আছেআনসিলেক্ট করা হয়েছেসারসংক্ষেপট্যাব লিস্টটাইমারটুল বারकम्बो बक्सफोटोबटन, फोटोलिङ्कमेनुअफअनOpletnotaKombinasiekassieOpskrifPrentKnoppie, prentSkakelKieslysKieslysbalkKieslysitemVorderingbalkRadiogroepOortjieRolleesbalkTolknoppiebesigis ingevouis uitgevouis gemengafaanontkiesOpsommingOortjielysAftellerNutsbalkअलर्टकॉम्बो बॉक्सशीर्षकफ़ोटोबटन, फ़ोटोलिंकमेनूमेनू बारमेनू आइटमप्रोग्रेस बाररेडियो ग्रुपटैबस्क्रॉल बारस्पिन बटनव्यस्तछोटा किया गयाबड़ा किया गयामिक्सबंद हैचालू हैनहीं चुने गएसारांशटैब लिस्टटाइमरटूल बारგაფრთხილებასათაურიგამოსახულებაღილაკი, გამოსახულებაბმულიმენიუმენიუს ზოლიმენიუს ერთეულიპროგრესის ზოლირადიო ჯგუფიჩანართიგადაადგილების პანელიდატრიალების ღილაკიდაკავებულიაკეცილიგაშლილიშერეულიგამორთულიაჩართულიაურჩეველიშეჯამებაჩანართების სიატაიმერიხელსაწყოების ზოლიWarnhinweisKombinationsfeldÜberschriftBildButton, BildMenüMenüleisteMenüpunktStatusanzeigeGruppe von ButtonsScroll-LeisteAuswahl-Buttonin Gebrauchausgeblendeteingeblendetgemischtauseinnicht ausgewähltÜbersichtTab-ListeSymbolleisteKombo siyahısıŞəkilDüymə, şəkilKeçidMenyudeaktivaktivdir알림콤보 상자제목이미지버튼, 이미지링크메뉴메뉴 표시줄메뉴 항목진행률 표시줄라디오 그룹스크롤 바회전 버튼처리 중숨겨짐확대됨혼합해제설정선택되지 않음요약탭 리스트타이머도구 표시줄അലേർട്ട്കോംബോ ബോക്‌സ്തലക്കെട്ട്ചിത്രംബട്ടൺ, ചിത്രംലിങ്ക്മെനുമെനു ബാർമെനു ഇനംപുരോഗതി ബാർറേഡിയോ ഗ്രൂപ്പ്ടാബ്സ്‌ക്രോൾ ബാർകറക്കുക ബട്ടൺതിരക്കിലാണ്ചുരുക്കിവിപുലീകരിച്ചുമിശ്രിതംഓഫാണ്ഓണാണ്തിരഞ്ഞെടുത്തത് മാറ്റിസംഗ്രഹംടാബ് ലിസ്‌റ്റ്ടൈമർടൂൾ ബാർПредупредувањеКомбинирано полеЗаглавиеСликаКопче, сликаВрскаМениМени лентаПроизвод на мениЛента за напредокРадио групаКартичкаЛента за лизгањеКопче за вртењезафатенособранопроширеномешаноисклученовклученоизборот е поништенРезимеСписок со картичкиТајмерЛента со алаткиಎಚ್ಚರಿಕೆಕೊಂಬೊ ಬಾಕ್ಸ್ಶಿರೋಲೇಖಚಿತ್ರಬಟನ್, ಚಿತ್ರಲಿಂಕ್ಮೆನುಮೆನು ಬಾರ್ಮೆನು ಐಟಂಪ್ರೋಗ್ರೆಸ್ ಬಾರ್ರೇಡಿಯೋ ಗುಂಪುಟ್ಯಾಬ್ಸ್ಕ್ರಾಲ್ ಬಾರ್ಸ್ಪಿನ್ ಬಟನ್ಕಾರ್ಯನಿರತಮುಚ್ಚಿದೆವಿಸ್ತರಿಸಲಾಗಿದೆಬಗೆಬಗೆಯಆಫ್ಆನ್ಆಯ್ಕೆ ರದ್ದುಮಾಡಲಾಗಿದೆಸಾರಾಂಶಟ್ಯಾಬ್ ಪಟ್ಟಿಟೈಮರ್ಟೂಲ್ ಬಾರ್သတိပေးချက်ရွေးရန်အကွက်ခေါင်းစီးဓာတ်ပုံခလုတ်၊ ဓာတ်ပုံလင့်ခ်မီနူးမီနူး ဘားတန်းမီနူး အကြောင်းအရာပြီးစီးမှုပြ ဘားတန်းရေဒီယိုအုပ်စုတက်ဘ်ရွှေ့ဆွဲကြည့်ရန် ဘားတန်းလှည့်ရန် ခလုတ်လုပ်ဆောင်နေဆဲခေါက်သိမ်းထားပါတယ်ချဲ့ထားပြီးရောစပ်ထားပြီးပိတ်ဖွင့်ရွေးမထားပါအနှစ်ချုပ်တက်ဘ်စာရင်းအချိန်တိုင်းစက်ကိရိယာ ဘားတန်းتنبيهمربع تحرير وسردالعنوانصورةزر، صورةرابطالقائمةشريط القائمةعنصر القائمةشريط التقدممجموعة أزرار اختيارعلامة التبويبشريط التمريرزر زيادة ونقصانمشغولمطويموسعمختلطإيقاف تشغيلتشغيلغير محدَدملخصقائمة علامات التبويبمؤقِتشريط الأدواتAlertaCaixa de combinaçãoTítuloImagemBotão, imagemLinkMenuBarra do menuItem do menuBarra de progressoBotão de grupo de opçõesAbaBarra de rolamentoBotão de rotaçãoocupadorecolhidoexpandidomistodesativadoativadodesmarcadosResumoLista de abasTemporizadorBarra de ferramentasСповіщенняКомбінований списокЗаголовокЗображенняКнопка, зображенняПосиланняМенюРядок менюОб\'єкт менюІндикатор прогресуГрупа перемикачівВкладкаПрокручуванняКнопка обертаннязайнятозгорнуторозгорнутозмішаноВимк.Увімк.не вибраноЗведенняСписок вкладокТаймерПанель інструментівОбавештењеКомбиновано пољеЗаглављеСликаДугме, сликаВезаМениТрака са менијемСтавка из менијаТрака са напреткомГрупа за радиоКартицаТрака за померањеДугме за окретањезаузетоскупљенопроширеномешаноискљученоукљученоизбор опозванРезимеЛиста картицаТајмерТрака са алаткамаਸੁਚੇਤਨਾਕੋਂਬੋ ਬਾਕਸਸਿਰਲੇਖਚਿੱਤਰਬਟਨ, ਚਿੱਤਰਲਿੰਕਮੀਨੂਮੀਨੂ ਬਾਰਮੀਨੂ ਆਈਟਮਪ੍ਰੋਗਰੈੱਸ ਬਾਰਰਡੀਓ ਗਰੁੱਪਟੈਬਸਕ੍ਰੋਲ ਬਾਰ\'ਘੁੰਮਾਓ\' ਬਟਨਵਿਅਸਤਸਮੇਟਿਆ ਗਿਆਵਿਸਤਾਰ ਕੀਤਾ ਗਿਆਮਿਕਸਡਬੰਦਚਾਲੂਚੋਣ ਹਟਾਈ ਗਈਸਾਰਟੈਬ ਸੂਚੀਟਾਈਮਰਟੂਲ ਬਾਰඇඟවීමසංයුක්ත පෙට්ටියසිරස්තලයරූපය‍බොත්තම, රූපයසබැඳියමෙනුවමෙනු තීරුව‍මෙනු අයිතමයප්‍රගති තීරුවගුවන්විදුලි සමූහයටැබයඅනුචලන තීරුවවේගයෙන් කරකවන බොත්තමකාර්යබහුලයිහකුළන ලදීවිහිදුවන ලදිමිශ්‍ර කළඅක්‍රියයික්‍රියාත්මකයිතේරීම ඉවත් කරන ලදසාරාංශයටැබ ලැයිස්තුවකාල ගණකයමෙවලම් තීරුව + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/packageReleaseResources/compile-file-map.properties b/modules/bitbox-hid/android/build/intermediates/incremental/release/packageReleaseResources/compile-file-map.properties new file mode 100644 index 00000000..63f89a18 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/packageReleaseResources/compile-file-map.properties @@ -0,0 +1,2 @@ +#Wed May 06 23:43:41 CEST 2026 +swiss.dfx.wallet.bitbox.bitbox-hid-main-5\:/xml/usb_device_filter.xml=/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/build/intermediates/packaged_res/release/packageReleaseResources/xml/usb_device_filter.xml diff --git a/modules/bitbox-hid/android/build/intermediates/incremental/release/packageReleaseResources/merger.xml b/modules/bitbox-hid/android/build/intermediates/incremental/release/packageReleaseResources/merger.xml new file mode 100644 index 00000000..1c35bda1 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/incremental/release/packageReleaseResources/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/java_res/release/processReleaseJavaRes/out/META-INF/bitbox-hid_release.kotlin_module b/modules/bitbox-hid/android/build/intermediates/java_res/release/processReleaseJavaRes/out/META-INF/bitbox-hid_release.kotlin_module new file mode 100644 index 00000000..9dbc290d Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/java_res/release/processReleaseJavaRes/out/META-INF/bitbox-hid_release.kotlin_module differ diff --git a/modules/bitbox-hid/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/swiss/dfx/wallet/bitbox/BuildConfig.class b/modules/bitbox-hid/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/swiss/dfx/wallet/bitbox/BuildConfig.class new file mode 100644 index 00000000..42d96cc5 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/swiss/dfx/wallet/bitbox/BuildConfig.class differ diff --git a/modules/bitbox-hid/android/build/intermediates/lint-cache/lintVitalAnalyzeRelease/lint-cache-version.txt b/modules/bitbox-hid/android/build/intermediates/lint-cache/lintVitalAnalyzeRelease/lint-cache-version.txt new file mode 100644 index 00000000..f34882bb --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/lint-cache/lintVitalAnalyzeRelease/lint-cache-version.txt @@ -0,0 +1 @@ +Cache for Android Lint31.11.0 diff --git a/modules/bitbox-hid/android/build/intermediates/lint_model/release/generateReleaseLintModel/module.xml b/modules/bitbox-hid/android/build/intermediates/lint_model/release/generateReleaseLintModel/module.xml new file mode 100644 index 00000000..532c11e2 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/lint_model/release/generateReleaseLintModel/module.xml @@ -0,0 +1,18 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/lint_model/release/generateReleaseLintModel/release-artifact-dependencies.xml b/modules/bitbox-hid/android/build/intermediates/lint_model/release/generateReleaseLintModel/release-artifact-dependencies.xml new file mode 100644 index 00000000..7935c731 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/lint_model/release/generateReleaseLintModel/release-artifact-dependencies.xml @@ -0,0 +1,293 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/lint_model/release/generateReleaseLintModel/release-artifact-libraries.xml b/modules/bitbox-hid/android/build/intermediates/lint_model/release/generateReleaseLintModel/release-artifact-libraries.xml new file mode 100644 index 00000000..b459e525 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/lint_model/release/generateReleaseLintModel/release-artifact-libraries.xml @@ -0,0 +1,794 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/lint_model/release/generateReleaseLintModel/release.xml b/modules/bitbox-hid/android/build/intermediates/lint_model/release/generateReleaseLintModel/release.xml new file mode 100644 index 00000000..9a3f77c3 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/lint_model/release/generateReleaseLintModel/release.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/lint_model_metadata/release/writeReleaseLintModelMetadata/lint-model-metadata.properties b/modules/bitbox-hid/android/build/intermediates/lint_model_metadata/release/writeReleaseLintModelMetadata/lint-model-metadata.properties new file mode 100644 index 00000000..d895a41d --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/lint_model_metadata/release/writeReleaseLintModelMetadata/lint-model-metadata.properties @@ -0,0 +1,3 @@ +mavenArtifactId=bitbox-hid +mavenGroupId=swiss.dfx.wallet.bitbox +mavenVersion=0.1.0 \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/lint_vital_lint_model/release/generateReleaseLintVitalModel/module.xml b/modules/bitbox-hid/android/build/intermediates/lint_vital_lint_model/release/generateReleaseLintVitalModel/module.xml new file mode 100644 index 00000000..532c11e2 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/lint_vital_lint_model/release/generateReleaseLintVitalModel/module.xml @@ -0,0 +1,18 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/lint_vital_lint_model/release/generateReleaseLintVitalModel/release-artifact-dependencies.xml b/modules/bitbox-hid/android/build/intermediates/lint_vital_lint_model/release/generateReleaseLintVitalModel/release-artifact-dependencies.xml new file mode 100644 index 00000000..7935c731 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/lint_vital_lint_model/release/generateReleaseLintVitalModel/release-artifact-dependencies.xml @@ -0,0 +1,293 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/lint_vital_lint_model/release/generateReleaseLintVitalModel/release-artifact-libraries.xml b/modules/bitbox-hid/android/build/intermediates/lint_vital_lint_model/release/generateReleaseLintVitalModel/release-artifact-libraries.xml new file mode 100644 index 00000000..b459e525 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/lint_vital_lint_model/release/generateReleaseLintVitalModel/release-artifact-libraries.xml @@ -0,0 +1,794 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/lint_vital_lint_model/release/generateReleaseLintVitalModel/release.xml b/modules/bitbox-hid/android/build/intermediates/lint_vital_lint_model/release/generateReleaseLintVitalModel/release.xml new file mode 100644 index 00000000..6eba894f --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/lint_vital_lint_model/release/generateReleaseLintVitalModel/release.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/lint_vital_partial_results/release/lintVitalAnalyzeRelease/out/lint-resources.xml b/modules/bitbox-hid/android/build/intermediates/lint_vital_partial_results/release/lintVitalAnalyzeRelease/out/lint-resources.xml new file mode 100644 index 00000000..6ee41659 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/lint_vital_partial_results/release/lintVitalAnalyzeRelease/out/lint-resources.xml @@ -0,0 +1 @@ +http://schemas.android.com/apk/res-auto;;${\:bitbox-hid*release*MAIN*sourceProvider*0*resDir*0}/xml/usb_device_filter.xml,+xml:usb_device_filter,0,F; \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/local_aar_for_lint/release/out.aar b/modules/bitbox-hid/android/build/intermediates/local_aar_for_lint/release/out.aar new file mode 100644 index 00000000..742492ea Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/local_aar_for_lint/release/out.aar differ diff --git a/modules/bitbox-hid/android/build/intermediates/local_only_symbol_list/release/parseReleaseLocalResources/R-def.txt b/modules/bitbox-hid/android/build/intermediates/local_only_symbol_list/release/parseReleaseLocalResources/R-def.txt new file mode 100644 index 00000000..e9fac189 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/local_only_symbol_list/release/parseReleaseLocalResources/R-def.txt @@ -0,0 +1,3 @@ +R_DEF: Internal format may change without notice +local +xml usb_device_filter diff --git a/modules/bitbox-hid/android/build/intermediates/manifest_merge_blame_file/release/processReleaseManifest/manifest-merger-blame-release-report.txt b/modules/bitbox-hid/android/build/intermediates/manifest_merge_blame_file/release/processReleaseManifest/manifest-merger-blame-release-report.txt new file mode 100644 index 00000000..7d9af9c7 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/manifest_merge_blame_file/release/processReleaseManifest/manifest-merger-blame-release-report.txt @@ -0,0 +1,14 @@ +1 +2 +4 +5 +6 +7 /Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/src/main/AndroidManifest.xml:2:3-85 +8 android:name="android.hardware.usb.host" +8-->/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/src/main/AndroidManifest.xml:2:17-57 +9 android:required="false" /> +9-->/Users/me/Documents/GitHub/dfx/dfx-wallet/modules/bitbox-hid/android/src/main/AndroidManifest.xml:2:58-82 +10 +11 diff --git a/modules/bitbox-hid/android/build/intermediates/merged_java_res/release/mergeReleaseJavaResource/feature-bitbox-hid.jar b/modules/bitbox-hid/android/build/intermediates/merged_java_res/release/mergeReleaseJavaResource/feature-bitbox-hid.jar new file mode 100644 index 00000000..408d336d Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_java_res/release/mergeReleaseJavaResource/feature-bitbox-hid.jar differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_manifest/release/processReleaseManifest/AndroidManifest.xml b/modules/bitbox-hid/android/build/intermediates/merged_manifest/release/processReleaseManifest/AndroidManifest.xml new file mode 100644 index 00000000..686b1fc0 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_manifest/release/processReleaseManifest/AndroidManifest.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim-v21/fragment_fast_out_extra_slow_in.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim-v21/fragment_fast_out_extra_slow_in.xml new file mode 100644 index 00000000..97b9de9c --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim-v21/fragment_fast_out_extra_slow_in.xml @@ -0,0 +1,19 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_fade_in.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_fade_in.xml new file mode 100644 index 00000000..da7ee295 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_fade_in.xml @@ -0,0 +1,20 @@ + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_fade_out.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_fade_out.xml new file mode 100644 index 00000000..c81b39a9 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_fade_out.xml @@ -0,0 +1,20 @@ + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_grow_fade_in_from_bottom.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_grow_fade_in_from_bottom.xml new file mode 100644 index 00000000..79d02d44 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_grow_fade_in_from_bottom.xml @@ -0,0 +1,30 @@ + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_popup_enter.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_popup_enter.xml new file mode 100644 index 00000000..91664da1 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_popup_enter.xml @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_popup_exit.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_popup_exit.xml new file mode 100644 index 00000000..db7e8073 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_popup_exit.xml @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_shrink_fade_out_from_bottom.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_shrink_fade_out_from_bottom.xml new file mode 100644 index 00000000..9a23cd20 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_shrink_fade_out_from_bottom.xml @@ -0,0 +1,27 @@ + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_in_bottom.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_in_bottom.xml new file mode 100644 index 00000000..1afa8feb --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_in_bottom.xml @@ -0,0 +1,19 @@ + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_in_top.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_in_top.xml new file mode 100644 index 00000000..ab824f2e --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_in_top.xml @@ -0,0 +1,19 @@ + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_out_bottom.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_out_bottom.xml new file mode 100644 index 00000000..b309fe89 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_out_bottom.xml @@ -0,0 +1,19 @@ + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_out_top.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_out_top.xml new file mode 100644 index 00000000..e84d1c7f --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_slide_out_top.xml @@ -0,0 +1,19 @@ + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_tooltip_enter.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_tooltip_enter.xml new file mode 100644 index 00000000..134d9d7e --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_tooltip_enter.xml @@ -0,0 +1,21 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_tooltip_exit.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_tooltip_exit.xml new file mode 100644 index 00000000..67f6af80 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/abc_tooltip_exit.xml @@ -0,0 +1,21 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_box_inner_merged_animation.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_box_inner_merged_animation.xml new file mode 100644 index 00000000..8d892c16 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_box_inner_merged_animation.xml @@ -0,0 +1,40 @@ + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_box_outer_merged_animation.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_box_outer_merged_animation.xml new file mode 100644 index 00000000..57fc3657 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_box_outer_merged_animation.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_icon_null_animation.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_icon_null_animation.xml new file mode 100644 index 00000000..a6ef0642 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_checked_icon_null_animation.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_box_inner_merged_animation.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_box_inner_merged_animation.xml new file mode 100644 index 00000000..0f13aafd --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_box_inner_merged_animation.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_check_path_merged_animation.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_check_path_merged_animation.xml new file mode 100644 index 00000000..188e7067 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_check_path_merged_animation.xml @@ -0,0 +1,40 @@ + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_icon_null_animation.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_icon_null_animation.xml new file mode 100644 index 00000000..8b63d01a --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_checkbox_to_unchecked_icon_null_animation.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_dot_group_animation.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_dot_group_animation.xml new file mode 100644 index 00000000..22bb8452 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_dot_group_animation.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_ring_outer_animation.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_ring_outer_animation.xml new file mode 100644 index 00000000..51154c1b --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_ring_outer_animation.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_ring_outer_path_animation.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_ring_outer_path_animation.xml new file mode 100644 index 00000000..c889ae69 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_off_mtrl_ring_outer_path_animation.xml @@ -0,0 +1,42 @@ + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_dot_group_animation.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_dot_group_animation.xml new file mode 100644 index 00000000..f0b9d7d3 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_dot_group_animation.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_ring_outer_animation.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_ring_outer_animation.xml new file mode 100644 index 00000000..3269f8bd --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_ring_outer_animation.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_ring_outer_path_animation.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_ring_outer_path_animation.xml new file mode 100644 index 00000000..02158350 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/btn_radio_to_on_mtrl_ring_outer_path_animation.xml @@ -0,0 +1,42 @@ + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_fade_in.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_fade_in.xml new file mode 100644 index 00000000..7fe329fd --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_fade_in.xml @@ -0,0 +1,7 @@ + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_fade_out.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_fade_out.xml new file mode 100644 index 00000000..4919eda8 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_fade_out.xml @@ -0,0 +1,7 @@ + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_push_up_in.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_push_up_in.xml new file mode 100644 index 00000000..aef91bc5 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_push_up_in.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_push_up_out.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_push_up_out.xml new file mode 100644 index 00000000..790e2758 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_push_up_out.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_slide_down.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_slide_down.xml new file mode 100644 index 00000000..01876e5e --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_slide_down.xml @@ -0,0 +1,6 @@ + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_slide_up.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_slide_up.xml new file mode 100644 index 00000000..6c96f698 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/anim/catalyst_slide_up.xml @@ -0,0 +1,6 @@ + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_close_enter.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_close_enter.xml new file mode 100644 index 00000000..1408ac6f --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_close_enter.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_close_exit.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_close_exit.xml new file mode 100644 index 00000000..4c50d204 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_close_exit.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_fade_enter.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_fade_enter.xml new file mode 100644 index 00000000..b948a228 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_fade_enter.xml @@ -0,0 +1,21 @@ + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_fade_exit.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_fade_exit.xml new file mode 100644 index 00000000..841049dd --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_fade_exit.xml @@ -0,0 +1,21 @@ + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_open_enter.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_open_enter.xml new file mode 100644 index 00000000..01bd5c07 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_open_enter.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_open_exit.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_open_exit.xml new file mode 100644 index 00000000..dc27998f --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/animator/fragment_open_exit.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_btn_colored_borderless_text_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_btn_colored_borderless_text_material.xml new file mode 100644 index 00000000..468b155d --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_btn_colored_borderless_text_material.xml @@ -0,0 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_btn_colored_text_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_btn_colored_text_material.xml new file mode 100644 index 00000000..74170d61 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_btn_colored_text_material.xml @@ -0,0 +1,23 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_color_highlight_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_color_highlight_material.xml new file mode 100644 index 00000000..8d536118 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_color_highlight_material.xml @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_btn_checkable.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_btn_checkable.xml new file mode 100644 index 00000000..e82eff48 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_btn_checkable.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_default.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_default.xml new file mode 100644 index 00000000..abe38804 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_default.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_edittext.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_edittext.xml new file mode 100644 index 00000000..0e05e07d --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_edittext.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_seek_thumb.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_seek_thumb.xml new file mode 100644 index 00000000..4fc9626f --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_seek_thumb.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_spinner.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_spinner.xml new file mode 100644 index 00000000..0e05e07d --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_spinner.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_switch_track.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_switch_track.xml new file mode 100644 index 00000000..e663772e --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color-v23/abc_tint_switch_track.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_background_cache_hint_selector_material_dark.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_background_cache_hint_selector_material_dark.xml new file mode 100644 index 00000000..e0160766 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_background_cache_hint_selector_material_dark.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_background_cache_hint_selector_material_light.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_background_cache_hint_selector_material_light.xml new file mode 100644 index 00000000..290faf1a --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_background_cache_hint_selector_material_light.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_hint_foreground_material_dark.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_hint_foreground_material_dark.xml new file mode 100644 index 00000000..fe868721 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_hint_foreground_material_dark.xml @@ -0,0 +1,24 @@ + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_hint_foreground_material_light.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_hint_foreground_material_light.xml new file mode 100644 index 00000000..1bef5afe --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_hint_foreground_material_light.xml @@ -0,0 +1,24 @@ + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_disable_only_material_dark.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_disable_only_material_dark.xml new file mode 100644 index 00000000..724c2557 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_disable_only_material_dark.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_disable_only_material_light.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_disable_only_material_light.xml new file mode 100644 index 00000000..7395e680 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_disable_only_material_light.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_material_dark.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_material_dark.xml new file mode 100644 index 00000000..7d66d02d --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_material_dark.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_material_light.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_material_light.xml new file mode 100644 index 00000000..105b643d --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_primary_text_material_light.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_search_url_text.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_search_url_text.xml new file mode 100644 index 00000000..0631d5d4 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_search_url_text.xml @@ -0,0 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_secondary_text_material_dark.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_secondary_text_material_dark.xml new file mode 100644 index 00000000..6399b1d0 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_secondary_text_material_dark.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_secondary_text_material_light.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_secondary_text_material_light.xml new file mode 100644 index 00000000..87c015a4 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/abc_secondary_text_material_light.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/switch_thumb_material_dark.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/switch_thumb_material_dark.xml new file mode 100644 index 00000000..6153382c --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/switch_thumb_material_dark.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/switch_thumb_material_light.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/switch_thumb_material_light.xml new file mode 100644 index 00000000..94d71148 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/color/switch_thumb_material_light.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_answer.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_answer.xml new file mode 100644 index 00000000..da8a42f5 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_answer.xml @@ -0,0 +1,36 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_answer_low.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_answer_low.xml new file mode 100644 index 00000000..89e62a58 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_answer_low.xml @@ -0,0 +1,33 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_answer_video.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_answer_video.xml new file mode 100644 index 00000000..243ca3c7 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_answer_video.xml @@ -0,0 +1,29 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_answer_video_low.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_answer_video_low.xml new file mode 100644 index 00000000..24b69420 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_answer_video_low.xml @@ -0,0 +1,26 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_decline.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_decline.xml new file mode 100644 index 00000000..be9593cb --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_decline.xml @@ -0,0 +1,38 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_decline_low.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_decline_low.xml new file mode 100644 index 00000000..990af5fd --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-anydpi-v21/ic_call_decline_low.xml @@ -0,0 +1,35 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png new file mode 100644 index 00000000..4d9f861f Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_000.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_000.png new file mode 100644 index 00000000..99110085 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_000.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_015.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_015.png new file mode 100644 index 00000000..69ff9dde Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_015.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_000.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_000.png new file mode 100644 index 00000000..9218981b Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_000.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_015.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_015.png new file mode 100644 index 00000000..a5885763 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_015.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png new file mode 100644 index 00000000..4657a25f Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png new file mode 100644 index 00000000..3fd617bf Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_cab_background_top_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_cab_background_top_mtrl_alpha.9.png new file mode 100644 index 00000000..22643982 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_cab_background_top_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png new file mode 100644 index 00000000..65ccd8f4 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_divider_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_divider_mtrl_alpha.9.png new file mode 100644 index 00000000..c2264a89 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_divider_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_focused_holo.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_focused_holo.9.png new file mode 100644 index 00000000..c09ec90e Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_focused_holo.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_longpressed_holo.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_longpressed_holo.9.png new file mode 100644 index 00000000..62fbd2cb Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_longpressed_holo.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_pressed_holo_dark.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_pressed_holo_dark.9.png new file mode 100644 index 00000000..2f6ef916 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_pressed_holo_dark.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_pressed_holo_light.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_pressed_holo_light.9.png new file mode 100644 index 00000000..863ce95f Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_pressed_holo_light.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_selector_disabled_holo_dark.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_selector_disabled_holo_dark.9.png new file mode 100644 index 00000000..b6d46777 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_selector_disabled_holo_dark.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_selector_disabled_holo_light.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_selector_disabled_holo_light.9.png new file mode 100644 index 00000000..60081db8 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_list_selector_disabled_holo_light.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png new file mode 100644 index 00000000..abb52c97 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_popup_background_mtrl_mult.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_popup_background_mtrl_mult.9.png new file mode 100644 index 00000000..9d8451aa Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_popup_background_mtrl_mult.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_control_off_mtrl_alpha.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_control_off_mtrl_alpha.png new file mode 100644 index 00000000..d8d6d7f6 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_control_off_mtrl_alpha.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png new file mode 100644 index 00000000..30c1c1e5 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png new file mode 100644 index 00000000..1f1cdadb Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png new file mode 100644 index 00000000..ffb0096f Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_track_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_track_mtrl_alpha.9.png new file mode 100644 index 00000000..e54950e9 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_scrubber_track_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.png new file mode 100644 index 00000000..0da5b1d1 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_switch_track_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_switch_track_mtrl_alpha.9.png new file mode 100644 index 00000000..f8063b23 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_switch_track_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_tab_indicator_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_tab_indicator_mtrl_alpha.9.png new file mode 100644 index 00000000..4b0b10a7 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_tab_indicator_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_left_mtrl.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_left_mtrl.png new file mode 100644 index 00000000..d3556a81 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_left_mtrl.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl.png new file mode 100644 index 00000000..183c9ace Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_right_mtrl.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_right_mtrl.png new file mode 100644 index 00000000..9b67079a Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_text_select_handle_right_mtrl.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_activated_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_activated_mtrl_alpha.9.png new file mode 100644 index 00000000..5b13bc17 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_activated_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_default_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_default_mtrl_alpha.9.png new file mode 100644 index 00000000..5440b1a4 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_default_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png new file mode 100644 index 00000000..05d6920b Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png new file mode 100644 index 00000000..6282df4e Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer.png new file mode 100644 index 00000000..7aca1a1a Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer_low.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer_low.png new file mode 100644 index 00000000..7aca1a1a Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer_low.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer_video.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer_video.png new file mode 100644 index 00000000..8eafb01b Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer_video.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer_video_low.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer_video_low.png new file mode 100644 index 00000000..8eafb01b Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_answer_video_low.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_decline.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_decline.png new file mode 100644 index 00000000..4d9cfdc5 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_decline.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_decline_low.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_decline_low.png new file mode 100644 index 00000000..4d9cfdc5 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_call_decline_low.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_resume.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_resume.png new file mode 100644 index 00000000..e76d9252 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/ic_resume.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_bg_low_normal.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_bg_low_normal.9.png new file mode 100644 index 00000000..af91f5e6 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_bg_low_normal.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_bg_low_pressed.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_bg_low_pressed.9.png new file mode 100644 index 00000000..1602ab87 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_bg_low_pressed.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_bg_normal.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_bg_normal.9.png new file mode 100644 index 00000000..6ebed8bf Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_bg_normal.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_bg_normal_pressed.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_bg_normal_pressed.9.png new file mode 100644 index 00000000..6193822d Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_bg_normal_pressed.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_oversize_large_icon_bg.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_oversize_large_icon_bg.png new file mode 100644 index 00000000..383433d5 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notification_oversize_large_icon_bg.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notify_panel_notification_icon_bg.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notify_panel_notification_icon_bg.png new file mode 100644 index 00000000..6f37a22d Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-hdpi-v4/notify_panel_notification_icon_bg.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_answer.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_answer.png new file mode 100644 index 00000000..ad1fefce Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_answer.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_answer_low.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_answer_low.png new file mode 100644 index 00000000..ad1fefce Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_answer_low.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_answer_video.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_answer_video.png new file mode 100644 index 00000000..0242aa7e Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_answer_video.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_answer_video_low.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_answer_video_low.png new file mode 100644 index 00000000..0242aa7e Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_answer_video_low.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_decline.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_decline.png new file mode 100644 index 00000000..3d1f4216 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_decline.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_decline_low.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_decline_low.png new file mode 100644 index 00000000..3d1f4216 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldpi-v4/ic_call_decline_low.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-hdpi-v17/abc_spinner_mtrl_am_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-hdpi-v17/abc_spinner_mtrl_am_alpha.9.png new file mode 100644 index 00000000..ddbec8b1 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-hdpi-v17/abc_spinner_mtrl_am_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-mdpi-v17/abc_spinner_mtrl_am_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-mdpi-v17/abc_spinner_mtrl_am_alpha.9.png new file mode 100644 index 00000000..c888ee05 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-mdpi-v17/abc_spinner_mtrl_am_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xhdpi-v17/abc_spinner_mtrl_am_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xhdpi-v17/abc_spinner_mtrl_am_alpha.9.png new file mode 100644 index 00000000..588161e6 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xhdpi-v17/abc_spinner_mtrl_am_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png new file mode 100644 index 00000000..7cf976d2 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xxxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xxxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png new file mode 100644 index 00000000..4c0f0b38 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-ldrtl-xxxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png new file mode 100644 index 00000000..fa0ed8fe Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_000.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_000.png new file mode 100644 index 00000000..7a9fcbcb Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_000.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_015.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_015.png new file mode 100644 index 00000000..8e6c2717 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_015.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_000.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_000.png new file mode 100644 index 00000000..9f0d2c82 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_000.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_015.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_015.png new file mode 100644 index 00000000..6e18d40d Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_015.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png new file mode 100644 index 00000000..d0a41a51 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png new file mode 100644 index 00000000..bebb1e21 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_cab_background_top_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_cab_background_top_mtrl_alpha.9.png new file mode 100644 index 00000000..038e0008 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_cab_background_top_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png new file mode 100644 index 00000000..6086f9c3 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_divider_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_divider_mtrl_alpha.9.png new file mode 100644 index 00000000..c2264a89 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_divider_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_focused_holo.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_focused_holo.9.png new file mode 100644 index 00000000..addb54a2 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_focused_holo.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_longpressed_holo.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_longpressed_holo.9.png new file mode 100644 index 00000000..5fcd5b20 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_longpressed_holo.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_pressed_holo_dark.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_pressed_holo_dark.9.png new file mode 100644 index 00000000..251b9891 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_pressed_holo_dark.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_pressed_holo_light.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_pressed_holo_light.9.png new file mode 100644 index 00000000..01efec04 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_pressed_holo_light.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_selector_disabled_holo_dark.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_selector_disabled_holo_dark.9.png new file mode 100644 index 00000000..f1d1b617 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_selector_disabled_holo_dark.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_selector_disabled_holo_light.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_selector_disabled_holo_light.9.png new file mode 100644 index 00000000..10851f6c Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_list_selector_disabled_holo_light.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png new file mode 100644 index 00000000..15c1ebb5 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_popup_background_mtrl_mult.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_popup_background_mtrl_mult.9.png new file mode 100644 index 00000000..5f55cd55 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_popup_background_mtrl_mult.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_control_off_mtrl_alpha.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_control_off_mtrl_alpha.png new file mode 100644 index 00000000..1bff7fa3 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_control_off_mtrl_alpha.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png new file mode 100644 index 00000000..9280f829 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png new file mode 100644 index 00000000..21bffc64 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png new file mode 100644 index 00000000..88781298 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_track_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_track_mtrl_alpha.9.png new file mode 100644 index 00000000..869c8b08 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_scrubber_track_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_spinner_mtrl_am_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_spinner_mtrl_am_alpha.9.png new file mode 100644 index 00000000..ed75cb81 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_spinner_mtrl_am_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_switch_track_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_switch_track_mtrl_alpha.9.png new file mode 100644 index 00000000..ab8460f5 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_switch_track_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_tab_indicator_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_tab_indicator_mtrl_alpha.9.png new file mode 100644 index 00000000..12b0a79c Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_tab_indicator_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_text_select_handle_left_mtrl.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_text_select_handle_left_mtrl.png new file mode 100644 index 00000000..e243fd8f Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_text_select_handle_left_mtrl.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl.png new file mode 100644 index 00000000..55b8b363 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_text_select_handle_right_mtrl.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_text_select_handle_right_mtrl.png new file mode 100644 index 00000000..e6eff09e Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_text_select_handle_right_mtrl.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_textfield_activated_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_textfield_activated_mtrl_alpha.9.png new file mode 100644 index 00000000..3ffa2519 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_textfield_activated_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_textfield_default_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_textfield_default_mtrl_alpha.9.png new file mode 100644 index 00000000..5d7ad2f1 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_textfield_default_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png new file mode 100644 index 00000000..0c766f30 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png new file mode 100644 index 00000000..4f66d7ad Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_answer.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_answer.png new file mode 100644 index 00000000..1b1d00b6 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_answer.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_answer_low.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_answer_low.png new file mode 100644 index 00000000..1b1d00b6 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_answer_low.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_answer_video.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_answer_video.png new file mode 100644 index 00000000..64aacd7a Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_answer_video.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_answer_video_low.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_answer_video_low.png new file mode 100644 index 00000000..64aacd7a Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_answer_video_low.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_decline.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_decline.png new file mode 100644 index 00000000..a72e0780 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_decline.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_decline_low.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_decline_low.png new file mode 100644 index 00000000..a72e0780 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_call_decline_low.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_resume.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_resume.png new file mode 100644 index 00000000..f0100879 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/ic_resume.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notification_bg_low_normal.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notification_bg_low_normal.9.png new file mode 100644 index 00000000..62de9d76 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notification_bg_low_normal.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notification_bg_low_pressed.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notification_bg_low_pressed.9.png new file mode 100644 index 00000000..eaabd931 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notification_bg_low_pressed.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notification_bg_normal.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notification_bg_normal.9.png new file mode 100644 index 00000000..aa239b35 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notification_bg_normal.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notification_bg_normal_pressed.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notification_bg_normal_pressed.9.png new file mode 100644 index 00000000..62d8622b Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notification_bg_normal_pressed.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notify_panel_notification_icon_bg.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notify_panel_notification_icon_bg.png new file mode 100644 index 00000000..c286875a Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-mdpi-v4/notify_panel_notification_icon_bg.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_action_bar_item_background_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_action_bar_item_background_material.xml new file mode 100644 index 00000000..595c56c6 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_action_bar_item_background_material.xml @@ -0,0 +1,18 @@ + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_btn_colored_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_btn_colored_material.xml new file mode 100644 index 00000000..10251aad --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_btn_colored_material.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_dialog_material_background.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_dialog_material_background.xml new file mode 100644 index 00000000..7ef438bb --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_dialog_material_background.xml @@ -0,0 +1,26 @@ + + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_edit_text_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_edit_text_material.xml new file mode 100644 index 00000000..d98b0085 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_edit_text_material.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_list_divider_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_list_divider_material.xml new file mode 100644 index 00000000..5ed2121d --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/abc_list_divider_material.xml @@ -0,0 +1,24 @@ + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/notification_action_background.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/notification_action_background.xml new file mode 100644 index 00000000..a9ea90ae --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v21/notification_action_background.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v23/abc_control_background_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v23/abc_control_background_material.xml new file mode 100644 index 00000000..0b540390 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v23/abc_control_background_material.xml @@ -0,0 +1,19 @@ + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v29/autofill_inline_suggestion_chip_background.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v29/autofill_inline_suggestion_chip_background.xml new file mode 100644 index 00000000..9637062d --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-v29/autofill_inline_suggestion_chip_background.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-watch-v20/abc_dialog_material_background.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-watch-v20/abc_dialog_material_background.xml new file mode 100644 index 00000000..242761b3 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-watch-v20/abc_dialog_material_background.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png new file mode 100644 index 00000000..6284eaaa Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_000.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_000.png new file mode 100644 index 00000000..49025208 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_000.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_015.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_015.png new file mode 100644 index 00000000..59a683ab Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_015.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_000.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_000.png new file mode 100644 index 00000000..03bf49cc Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_000.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_015.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_015.png new file mode 100644 index 00000000..342323b4 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_015.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png new file mode 100644 index 00000000..1d29f9a6 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png new file mode 100644 index 00000000..92b43ba0 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png new file mode 100644 index 00000000..600178a9 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png new file mode 100644 index 00000000..ca303fd6 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_divider_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_divider_mtrl_alpha.9.png new file mode 100644 index 00000000..c2264a89 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_divider_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_focused_holo.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_focused_holo.9.png new file mode 100644 index 00000000..67c25aef Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_focused_holo.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_longpressed_holo.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_longpressed_holo.9.png new file mode 100644 index 00000000..17c34a1a Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_longpressed_holo.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_pressed_holo_dark.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_pressed_holo_dark.9.png new file mode 100644 index 00000000..988548a1 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_pressed_holo_dark.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_pressed_holo_light.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_pressed_holo_light.9.png new file mode 100644 index 00000000..15fcf6a3 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_pressed_holo_light.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_selector_disabled_holo_dark.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_selector_disabled_holo_dark.9.png new file mode 100644 index 00000000..65275b38 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_selector_disabled_holo_dark.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_selector_disabled_holo_light.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_selector_disabled_holo_light.9.png new file mode 100644 index 00000000..ee95ed4e Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_list_selector_disabled_holo_light.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png new file mode 100644 index 00000000..99cf6de8 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_popup_background_mtrl_mult.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_popup_background_mtrl_mult.9.png new file mode 100644 index 00000000..d8cc7d3c Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_popup_background_mtrl_mult.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png new file mode 100644 index 00000000..c08ec90f Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png new file mode 100644 index 00000000..0486af19 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png new file mode 100644 index 00000000..20079d8c Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png new file mode 100644 index 00000000..fb4e42aa Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png new file mode 100644 index 00000000..44b9a147 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_spinner_mtrl_am_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_spinner_mtrl_am_alpha.9.png new file mode 100644 index 00000000..bcf6b7f0 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_spinner_mtrl_am_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_switch_track_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_switch_track_mtrl_alpha.9.png new file mode 100644 index 00000000..7c56175a Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_switch_track_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png new file mode 100644 index 00000000..2242d2f9 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl.png new file mode 100644 index 00000000..529d5504 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl.png new file mode 100644 index 00000000..1f8cc88c Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl.png new file mode 100644 index 00000000..6c8f6a43 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png new file mode 100644 index 00000000..8ff3a830 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_textfield_default_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_textfield_default_mtrl_alpha.9.png new file mode 100644 index 00000000..e7e693a7 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_textfield_default_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png new file mode 100644 index 00000000..819171ad Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png new file mode 100644 index 00000000..4def8c8f Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_answer.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_answer.png new file mode 100644 index 00000000..1e29937b Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_answer.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_answer_low.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_answer_low.png new file mode 100644 index 00000000..1e29937b Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_answer_low.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_answer_video.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_answer_video.png new file mode 100644 index 00000000..cbad0c4f Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_answer_video.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_answer_video_low.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_answer_video_low.png new file mode 100644 index 00000000..cbad0c4f Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_answer_video_low.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_decline.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_decline.png new file mode 100644 index 00000000..8edb3fcf Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_decline.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_decline_low.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_decline_low.png new file mode 100644 index 00000000..8edb3fcf Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_call_decline_low.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_resume.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_resume.png new file mode 100644 index 00000000..5d03ade4 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/ic_resume.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_low_normal.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_low_normal.9.png new file mode 100644 index 00000000..8c884dec Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_low_normal.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_low_pressed.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_low_pressed.9.png new file mode 100644 index 00000000..32e00bef Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_low_pressed.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_normal.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_normal.9.png new file mode 100644 index 00000000..bdf477ba Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_normal.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_normal_pressed.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_normal_pressed.9.png new file mode 100644 index 00000000..5c4da744 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notification_bg_normal_pressed.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notify_panel_notification_icon_bg.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notify_panel_notification_icon_bg.png new file mode 100644 index 00000000..9128e62b Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xhdpi-v4/notify_panel_notification_icon_bg.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png new file mode 100644 index 00000000..4eae28fd Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_000.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_000.png new file mode 100644 index 00000000..d934b60d Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_000.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_015.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_015.png new file mode 100644 index 00000000..8c82ec3d Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_015.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png new file mode 100644 index 00000000..8fc0a9b8 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png new file mode 100644 index 00000000..3038d70f Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png new file mode 100644 index 00000000..c079867b Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png new file mode 100644 index 00000000..3b9dc7c1 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png new file mode 100644 index 00000000..f6d2f329 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png new file mode 100644 index 00000000..fe826b7c Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_divider_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_divider_mtrl_alpha.9.png new file mode 100644 index 00000000..987b2bc2 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_divider_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_focused_holo.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_focused_holo.9.png new file mode 100644 index 00000000..8b050e85 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_focused_holo.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_longpressed_holo.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_longpressed_holo.9.png new file mode 100644 index 00000000..00e370a1 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_longpressed_holo.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_pressed_holo_dark.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_pressed_holo_dark.9.png new file mode 100644 index 00000000..719c7b5e Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_pressed_holo_dark.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_pressed_holo_light.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_pressed_holo_light.9.png new file mode 100644 index 00000000..75bd5803 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_pressed_holo_light.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_dark.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_dark.9.png new file mode 100644 index 00000000..4f3b147a Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_dark.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_light.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_light.9.png new file mode 100644 index 00000000..224a0815 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_light.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png new file mode 100644 index 00000000..b5ceeac0 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_popup_background_mtrl_mult.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_popup_background_mtrl_mult.9.png new file mode 100644 index 00000000..4727a7d6 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_popup_background_mtrl_mult.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png new file mode 100644 index 00000000..4657815e Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png new file mode 100644 index 00000000..4aa0a344 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png new file mode 100644 index 00000000..6178c45c Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png new file mode 100644 index 00000000..3d9b9610 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png new file mode 100644 index 00000000..56a69df1 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png new file mode 100644 index 00000000..79240008 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_switch_track_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_switch_track_mtrl_alpha.9.png new file mode 100644 index 00000000..ba5abaad Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_switch_track_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png new file mode 100644 index 00000000..eeb74c86 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl.png new file mode 100644 index 00000000..d6a87904 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl.png new file mode 100644 index 00000000..de001850 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl.png new file mode 100644 index 00000000..d186a5bb Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png new file mode 100644 index 00000000..4d3d3a4d Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_default_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_default_mtrl_alpha.9.png new file mode 100644 index 00000000..c5acb84f Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_default_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png new file mode 100644 index 00000000..30328ae1 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png new file mode 100644 index 00000000..bc21142c Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer.png new file mode 100644 index 00000000..949da2b9 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_low.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_low.png new file mode 100644 index 00000000..949da2b9 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_low.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_video.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_video.png new file mode 100644 index 00000000..35e3bc82 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_video.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_video_low.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_video_low.png new file mode 100644 index 00000000..35e3bc82 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_answer_video_low.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_decline.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_decline.png new file mode 100644 index 00000000..15aeec01 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_decline.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_decline_low.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_decline_low.png new file mode 100644 index 00000000..15aeec01 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_call_decline_low.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_resume.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_resume.png new file mode 100644 index 00000000..732b8f46 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxhdpi-v4/ic_resume.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_000.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_000.png new file mode 100644 index 00000000..e40fa4e1 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_000.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_015.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_015.png new file mode 100644 index 00000000..4e18de21 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_015.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png new file mode 100644 index 00000000..5fa32665 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png new file mode 100644 index 00000000..c11cb2ec Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png new file mode 100644 index 00000000..639e6cb4 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png new file mode 100644 index 00000000..355d5b77 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png new file mode 100644 index 00000000..7dfaf7cf Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png new file mode 100644 index 00000000..fe8f2e40 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png new file mode 100644 index 00000000..752cb579 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_switch_track_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_switch_track_mtrl_alpha.9.png new file mode 100644 index 00000000..40255c3e Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_switch_track_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png new file mode 100644 index 00000000..0210ad17 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl.png new file mode 100644 index 00000000..565f0b29 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl.png new file mode 100644 index 00000000..894c7342 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_answer.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_answer.png new file mode 100644 index 00000000..5c060f61 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_answer.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_answer_low.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_answer_low.png new file mode 100644 index 00000000..5c060f61 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_answer_low.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_answer_video.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_answer_video.png new file mode 100644 index 00000000..4e0e0de1 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_answer_video.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_answer_video_low.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_answer_video_low.png new file mode 100644 index 00000000..4e0e0de1 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_answer_video_low.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_decline.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_decline.png new file mode 100644 index 00000000..c6b5be3c Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_decline.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_decline_low.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_decline_low.png new file mode 100644 index 00000000..c6b5be3c Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_call_decline_low.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_resume.png b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_resume.png new file mode 100644 index 00000000..6f48a9b9 Binary files /dev/null and b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable-xxxhdpi-v4/ic_resume.png differ diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_borderless_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_borderless_material.xml new file mode 100644 index 00000000..f3894600 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_borderless_material.xml @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_check_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_check_material.xml new file mode 100644 index 00000000..f6e938fe --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_check_material.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_check_material_anim.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_check_material_anim.xml new file mode 100644 index 00000000..ce7a9682 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_check_material_anim.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_default_mtrl_shape.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_default_mtrl_shape.xml new file mode 100644 index 00000000..c50d4b10 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_default_mtrl_shape.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_radio_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_radio_material.xml new file mode 100644 index 00000000..6e9f9cf3 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_radio_material.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_radio_material_anim.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_radio_material_anim.xml new file mode 100644 index 00000000..64cebc28 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_btn_radio_material_anim.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_cab_background_internal_bg.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_cab_background_internal_bg.xml new file mode 100644 index 00000000..9faf60ac --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_cab_background_internal_bg.xml @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_cab_background_top_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_cab_background_top_material.xml new file mode 100644 index 00000000..0922395a --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_cab_background_top_material.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_ab_back_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_ab_back_material.xml new file mode 100644 index 00000000..5a895239 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_ab_back_material.xml @@ -0,0 +1,27 @@ + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_arrow_drop_right_black_24dp.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_arrow_drop_right_black_24dp.xml new file mode 100644 index 00000000..68547eb7 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_arrow_drop_right_black_24dp.xml @@ -0,0 +1,33 @@ + + + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_clear_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_clear_material.xml new file mode 100644 index 00000000..e6d106b7 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_clear_material.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_go_search_api_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_go_search_api_material.xml new file mode 100644 index 00000000..0c881191 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_go_search_api_material.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_copy_mtrl_am_alpha.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_copy_mtrl_am_alpha.xml new file mode 100644 index 00000000..60ebf765 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_copy_mtrl_am_alpha.xml @@ -0,0 +1,21 @@ + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_cut_mtrl_alpha.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_cut_mtrl_alpha.xml new file mode 100644 index 00000000..592bd60c --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_cut_mtrl_alpha.xml @@ -0,0 +1,21 @@ + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_overflow_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_overflow_material.xml new file mode 100644 index 00000000..1420edd7 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_overflow_material.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_paste_mtrl_am_alpha.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_paste_mtrl_am_alpha.xml new file mode 100644 index 00000000..54043744 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_paste_mtrl_am_alpha.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_selectall_mtrl_alpha.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_selectall_mtrl_alpha.xml new file mode 100644 index 00000000..d0de4ae6 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_selectall_mtrl_alpha.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_share_mtrl_alpha.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_share_mtrl_alpha.xml new file mode 100644 index 00000000..597a1b3c --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_menu_share_mtrl_alpha.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_search_api_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_search_api_material.xml new file mode 100644 index 00000000..b4cba347 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_search_api_material.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_voice_search_api_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_voice_search_api_material.xml new file mode 100644 index 00000000..143db558 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ic_voice_search_api_material.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_item_background_holo_dark.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_item_background_holo_dark.xml new file mode 100644 index 00000000..72162c22 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_item_background_holo_dark.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_item_background_holo_light.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_item_background_holo_light.xml new file mode 100644 index 00000000..1c180b2e --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_item_background_holo_light.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_list_selector_background_transition_holo_dark.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_list_selector_background_transition_holo_dark.xml new file mode 100644 index 00000000..0add58c8 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_list_selector_background_transition_holo_dark.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_list_selector_background_transition_holo_light.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_list_selector_background_transition_holo_light.xml new file mode 100644 index 00000000..0c1d3e67 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_list_selector_background_transition_holo_light.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_list_selector_holo_dark.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_list_selector_holo_dark.xml new file mode 100644 index 00000000..1fb5fc45 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_list_selector_holo_dark.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_list_selector_holo_light.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_list_selector_holo_light.xml new file mode 100644 index 00000000..8d240472 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_list_selector_holo_light.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ratingbar_indicator_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ratingbar_indicator_material.xml new file mode 100644 index 00000000..97ba1de0 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ratingbar_indicator_material.xml @@ -0,0 +1,18 @@ + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ratingbar_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ratingbar_material.xml new file mode 100644 index 00000000..97ba1de0 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ratingbar_material.xml @@ -0,0 +1,18 @@ + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ratingbar_small_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ratingbar_small_material.xml new file mode 100644 index 00000000..97ba1de0 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_ratingbar_small_material.xml @@ -0,0 +1,18 @@ + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_seekbar_thumb_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_seekbar_thumb_material.xml new file mode 100644 index 00000000..7fea83bc --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_seekbar_thumb_material.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_seekbar_tick_mark_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_seekbar_tick_mark_material.xml new file mode 100644 index 00000000..e2d86c97 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_seekbar_tick_mark_material.xml @@ -0,0 +1,22 @@ + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_seekbar_track_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_seekbar_track_material.xml new file mode 100644 index 00000000..e68ac03e --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_seekbar_track_material.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_spinner_textfield_background_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_spinner_textfield_background_material.xml new file mode 100644 index 00000000..d0f46a80 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_spinner_textfield_background_material.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_star_black_48dp.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_star_black_48dp.xml new file mode 100644 index 00000000..4f380aa4 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_star_black_48dp.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_star_half_black_48dp.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_star_half_black_48dp.xml new file mode 100644 index 00000000..ba1dc575 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_star_half_black_48dp.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_switch_thumb_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_switch_thumb_material.xml new file mode 100644 index 00000000..ee96ec2e --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_switch_thumb_material.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_tab_indicator_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_tab_indicator_material.xml new file mode 100644 index 00000000..1a8de1b6 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_tab_indicator_material.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_text_cursor_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_text_cursor_material.xml new file mode 100644 index 00000000..885670c9 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_text_cursor_material.xml @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_textfield_search_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_textfield_search_material.xml new file mode 100644 index 00000000..08873966 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_textfield_search_material.xml @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_vector_test.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_vector_test.xml new file mode 100644 index 00000000..d5da2cbd --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/abc_vector_test.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_checkbox_checked_mtrl.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_checkbox_checked_mtrl.xml new file mode 100644 index 00000000..464a4504 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_checkbox_checked_mtrl.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_checkbox_checked_to_unchecked_mtrl_animation.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_checkbox_checked_to_unchecked_mtrl_animation.xml new file mode 100644 index 00000000..77d54184 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_checkbox_checked_to_unchecked_mtrl_animation.xml @@ -0,0 +1,32 @@ + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_checkbox_unchecked_mtrl.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_checkbox_unchecked_mtrl.xml new file mode 100644 index 00000000..f21429f9 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_checkbox_unchecked_mtrl.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_checkbox_unchecked_to_checked_mtrl_animation.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_checkbox_unchecked_to_checked_mtrl_animation.xml new file mode 100644 index 00000000..9d309133 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_checkbox_unchecked_to_checked_mtrl_animation.xml @@ -0,0 +1,32 @@ + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_radio_off_mtrl.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_radio_off_mtrl.xml new file mode 100644 index 00000000..170e82d5 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_radio_off_mtrl.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_radio_off_to_on_mtrl_animation.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_radio_off_to_on_mtrl_animation.xml new file mode 100644 index 00000000..84561d06 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_radio_off_to_on_mtrl_animation.xml @@ -0,0 +1,32 @@ + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_radio_on_mtrl.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_radio_on_mtrl.xml new file mode 100644 index 00000000..ce2116ac --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_radio_on_mtrl.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_radio_on_to_off_mtrl_animation.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_radio_on_to_off_mtrl_animation.xml new file mode 100644 index 00000000..2108cf18 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/btn_radio_on_to_off_mtrl_animation.xml @@ -0,0 +1,32 @@ + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/notification_bg.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/notification_bg.xml new file mode 100644 index 00000000..1232b4cb --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/notification_bg.xml @@ -0,0 +1,24 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/notification_bg_low.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/notification_bg_low.xml new file mode 100644 index 00000000..72e58ae7 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/notification_bg_low.xml @@ -0,0 +1,23 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/notification_icon_background.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/notification_icon_background.xml new file mode 100644 index 00000000..490a797e --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/notification_icon_background.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/notification_tile_bg.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/notification_tile_bg.xml new file mode 100644 index 00000000..8eee7ef0 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/notification_tile_bg.xml @@ -0,0 +1,22 @@ + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/paused_in_debugger_background.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/paused_in_debugger_background.xml new file mode 100644 index 00000000..5f1b8809 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/paused_in_debugger_background.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/paused_in_debugger_dialog_background.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/paused_in_debugger_dialog_background.xml new file mode 100644 index 00000000..d6e19679 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/paused_in_debugger_dialog_background.xml @@ -0,0 +1,7 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/redbox_top_border_background.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/redbox_top_border_background.xml new file mode 100644 index 00000000..84ca1460 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/redbox_top_border_background.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/ripple_effect.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/ripple_effect.xml new file mode 100644 index 00000000..a972afdb --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/ripple_effect.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/test_level_drawable.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/test_level_drawable.xml new file mode 100644 index 00000000..41dadfd2 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/test_level_drawable.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/tooltip_frame_dark.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/tooltip_frame_dark.xml new file mode 100644 index 00000000..43c2f996 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/tooltip_frame_dark.xml @@ -0,0 +1,22 @@ + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/tooltip_frame_light.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/tooltip_frame_light.xml new file mode 100644 index 00000000..20966d54 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/drawable/tooltip_frame_light.xml @@ -0,0 +1,22 @@ + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_0.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_0.xml new file mode 100644 index 00000000..3db122b7 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_0.xml @@ -0,0 +1,20 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1.xml new file mode 100644 index 00000000..47f65a09 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1.xml @@ -0,0 +1,20 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_0.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_0.xml new file mode 100644 index 00000000..3db122b7 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_0.xml @@ -0,0 +1,20 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1.xml new file mode 100644 index 00000000..47f65a09 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1.xml @@ -0,0 +1,20 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_radio_to_off_mtrl_animation_interpolator_0.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_radio_to_off_mtrl_animation_interpolator_0.xml new file mode 100644 index 00000000..956d3892 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_radio_to_off_mtrl_animation_interpolator_0.xml @@ -0,0 +1,20 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_radio_to_on_mtrl_animation_interpolator_0.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_radio_to_on_mtrl_animation_interpolator_0.xml new file mode 100644 index 00000000..956d3892 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/btn_radio_to_on_mtrl_animation_interpolator_0.xml @@ -0,0 +1,20 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/fast_out_slow_in.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/fast_out_slow_in.xml new file mode 100644 index 00000000..14950d3b --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/interpolator/fast_out_slow_in.xml @@ -0,0 +1,23 @@ + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_action.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_action.xml new file mode 100644 index 00000000..7199c250 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_action.xml @@ -0,0 +1,41 @@ + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_action_tombstone.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_action_tombstone.xml new file mode 100644 index 00000000..7ef38fa0 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_action_tombstone.xml @@ -0,0 +1,48 @@ + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_template_custom_big.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_template_custom_big.xml new file mode 100644 index 00000000..9e3666e3 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_template_custom_big.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_template_icon_group.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_template_icon_group.xml new file mode 100644 index 00000000..8fadd673 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v21/notification_template_icon_group.xml @@ -0,0 +1,42 @@ + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v26/abc_screen_toolbar.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v26/abc_screen_toolbar.xml new file mode 100644 index 00000000..8d2ea46a --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-v26/abc_screen_toolbar.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + diff --git a/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-watch-v20/abc_alert_dialog_button_bar_material.xml b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-watch-v20/abc_alert_dialog_button_bar_material.xml new file mode 100644 index 00000000..773065d4 --- /dev/null +++ b/modules/bitbox-hid/android/build/intermediates/merged_res/release/mergeReleaseResources/layout-watch-v20/abc_alert_dialog_button_bar_material.xml @@ -0,0 +1,51 @@ + + + + + +