Status pills:
* New Widget.App.StatusChip style bundling the 10dp/4dp padding +
chip_background + label-small text used in 3 places (item_bml_loan,
item_finance_deal, item_profile_header). The 3 layouts now apply
the style instead of repeating 4 attributes each.
* Extract the bindCardStatus card-overlay pill background from inline
GradientDrawable code into a real drawable resource
(card_overlay_pill_bg.xml). PayWithCardFragment.bindCardStatus just
sets a background resource now.
Tabular figures (android:fontFeatureSettings="tnum"):
* Applied to amount TextViews on the highest-traffic surfaces —
transactions list, accounts list, card list, dashboard balance /
credit / blocked / overdue / pending finances totals, and the
account history header (available / balance / blocked).
* Digits become same-width, so right-aligned amounts in a column
line up.
Ripple feedback:
* item_finance_deal, item_bml_loan, item_foreign_limit get
android:clickable="true" android:focusable="true" so their
MaterialCardView roots show the M3 ripple when the adapter
attaches a click listener. All three are clickable from code
but were missing the ripple cue.
Empty-state strings:
* Hardcoded "No recent transfers" / "No transactions found" in
fragment_activities, fragment_transfer_history, and
fragment_account_history moved to strings.xml as
activities_empty / transactions_empty, matching the existing
accounts_empty / contacts_empty / financing_empty pattern.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
409 lines
17 KiB
XML
409 lines
17 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<LinearLayout
|
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
android:layout_width="match_parent"
|
|
android:layout_height="match_parent"
|
|
android:orientation="vertical"
|
|
android:background="?attr/colorSurface">
|
|
|
|
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
|
android:id="@+id/swipeRefresh"
|
|
android:layout_width="match_parent"
|
|
android:layout_height="0dp"
|
|
android:layout_weight="1">
|
|
|
|
<androidx.core.widget.NestedScrollView
|
|
android:layout_width="match_parent"
|
|
android:layout_height="match_parent">
|
|
|
|
<LinearLayout
|
|
android:layout_width="match_parent"
|
|
android:layout_height="wrap_content"
|
|
android:orientation="vertical"
|
|
android:padding="@dimen/screen_margin">
|
|
|
|
<!-- Balance cards row -->
|
|
<LinearLayout
|
|
android:layout_width="match_parent"
|
|
android:layout_height="wrap_content"
|
|
android:orientation="horizontal">
|
|
|
|
<com.google.android.material.card.MaterialCardView
|
|
android:layout_width="0dp"
|
|
android:layout_height="wrap_content"
|
|
android:layout_weight="1"
|
|
android:layout_marginEnd="8dp"
|
|
app:cardElevation="@dimen/card_elevation_raised"
|
|
app:cardCornerRadius="@dimen/card_radius_md">
|
|
|
|
<LinearLayout
|
|
android:layout_width="match_parent"
|
|
android:layout_height="wrap_content"
|
|
android:orientation="vertical"
|
|
android:padding="16dp">
|
|
|
|
<TextView
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:text="@string/balance_mvr"
|
|
android:textAppearance="?attr/textAppearanceLabelSmall"
|
|
android:textColor="?attr/colorOnSurfaceVariant" />
|
|
|
|
<TextView
|
|
android:id="@+id/tvMvrBalance"
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:layout_marginTop="4dp"
|
|
android:text="MVR —"
|
|
android:textAppearance="?attr/textAppearanceTitleMedium"
|
|
android:fontFeatureSettings="tnum" />
|
|
|
|
</LinearLayout>
|
|
|
|
</com.google.android.material.card.MaterialCardView>
|
|
|
|
<com.google.android.material.card.MaterialCardView
|
|
android:layout_width="0dp"
|
|
android:layout_height="wrap_content"
|
|
android:layout_weight="1"
|
|
android:layout_marginStart="8dp"
|
|
app:cardElevation="@dimen/card_elevation_raised"
|
|
app:cardCornerRadius="@dimen/card_radius_md">
|
|
|
|
<LinearLayout
|
|
android:layout_width="match_parent"
|
|
android:layout_height="wrap_content"
|
|
android:orientation="vertical"
|
|
android:padding="16dp">
|
|
|
|
<TextView
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:text="@string/balance_usd"
|
|
android:textAppearance="?attr/textAppearanceLabelSmall"
|
|
android:textColor="?attr/colorOnSurfaceVariant" />
|
|
|
|
<TextView
|
|
android:id="@+id/tvUsdBalance"
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:layout_marginTop="4dp"
|
|
android:text="USD —"
|
|
android:textAppearance="?attr/textAppearanceTitleMedium"
|
|
android:fontFeatureSettings="tnum" />
|
|
|
|
</LinearLayout>
|
|
|
|
</com.google.android.material.card.MaterialCardView>
|
|
|
|
</LinearLayout>
|
|
|
|
<!-- Available Credit row (hidden when no credit cards) -->
|
|
<LinearLayout
|
|
android:id="@+id/rowCreditCards"
|
|
android:layout_width="match_parent"
|
|
android:layout_height="wrap_content"
|
|
android:orientation="horizontal"
|
|
android:layout_marginTop="16dp"
|
|
android:visibility="gone">
|
|
|
|
<com.google.android.material.card.MaterialCardView
|
|
android:id="@+id/cardMvrCredit"
|
|
android:layout_width="0dp"
|
|
android:layout_height="wrap_content"
|
|
android:layout_weight="1"
|
|
android:layout_marginEnd="8dp"
|
|
app:cardElevation="@dimen/card_elevation_raised"
|
|
app:cardCornerRadius="@dimen/card_radius_md">
|
|
|
|
<LinearLayout
|
|
android:layout_width="match_parent"
|
|
android:layout_height="wrap_content"
|
|
android:orientation="vertical"
|
|
android:padding="16dp">
|
|
|
|
<TextView
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:text="@string/balance_mvr_credit"
|
|
android:textAppearance="?attr/textAppearanceLabelSmall"
|
|
android:textColor="?attr/colorOnSurfaceVariant" />
|
|
|
|
<TextView
|
|
android:id="@+id/tvMvrCredit"
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:layout_marginTop="4dp"
|
|
android:text="MVR —"
|
|
android:textAppearance="?attr/textAppearanceTitleMedium"
|
|
android:fontFeatureSettings="tnum" />
|
|
|
|
</LinearLayout>
|
|
|
|
</com.google.android.material.card.MaterialCardView>
|
|
|
|
<com.google.android.material.card.MaterialCardView
|
|
android:id="@+id/cardUsdCredit"
|
|
android:layout_width="0dp"
|
|
android:layout_height="wrap_content"
|
|
android:layout_weight="1"
|
|
android:layout_marginStart="8dp"
|
|
app:cardElevation="@dimen/card_elevation_raised"
|
|
app:cardCornerRadius="@dimen/card_radius_md">
|
|
|
|
<LinearLayout
|
|
android:layout_width="match_parent"
|
|
android:layout_height="wrap_content"
|
|
android:orientation="vertical"
|
|
android:padding="16dp">
|
|
|
|
<TextView
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:text="@string/balance_usd_credit"
|
|
android:textAppearance="?attr/textAppearanceLabelSmall"
|
|
android:textColor="?attr/colorOnSurfaceVariant" />
|
|
|
|
<TextView
|
|
android:id="@+id/tvUsdCredit"
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:layout_marginTop="4dp"
|
|
android:text="USD —"
|
|
android:textAppearance="?attr/textAppearanceTitleMedium"
|
|
android:fontFeatureSettings="tnum" />
|
|
|
|
</LinearLayout>
|
|
|
|
</com.google.android.material.card.MaterialCardView>
|
|
|
|
</LinearLayout>
|
|
|
|
<!-- Attention row: Blocked + Overdue (hidden when nothing applies) -->
|
|
<LinearLayout
|
|
android:id="@+id/rowAttention"
|
|
android:layout_width="match_parent"
|
|
android:layout_height="wrap_content"
|
|
android:orientation="horizontal"
|
|
android:layout_marginTop="16dp"
|
|
android:visibility="gone">
|
|
|
|
<com.google.android.material.card.MaterialCardView
|
|
android:id="@+id/cardBlocked"
|
|
android:layout_width="0dp"
|
|
android:layout_height="wrap_content"
|
|
android:layout_weight="1"
|
|
android:layout_marginEnd="8dp"
|
|
app:cardElevation="@dimen/card_elevation_raised"
|
|
app:cardCornerRadius="@dimen/card_radius_md"
|
|
app:cardBackgroundColor="?attr/colorErrorContainer"
|
|
android:visibility="gone">
|
|
|
|
<LinearLayout
|
|
android:layout_width="match_parent"
|
|
android:layout_height="wrap_content"
|
|
android:orientation="vertical"
|
|
android:padding="16dp">
|
|
|
|
<TextView
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:text="@string/dashboard_blocked"
|
|
android:textAppearance="?attr/textAppearanceLabelSmall"
|
|
android:textColor="?attr/colorOnErrorContainer" />
|
|
|
|
<TextView
|
|
android:id="@+id/tvBlockedTotal"
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:layout_marginTop="4dp"
|
|
android:text="MVR —"
|
|
android:textAppearance="?attr/textAppearanceTitleMedium"
|
|
android:textColor="?attr/colorOnErrorContainer"
|
|
android:fontFeatureSettings="tnum" />
|
|
|
|
<TextView
|
|
android:id="@+id/tvBlockedSecondary"
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:layout_marginTop="2dp"
|
|
android:textAppearance="?attr/textAppearanceLabelSmall"
|
|
android:textColor="?attr/colorOnErrorContainer"
|
|
android:fontFeatureSettings="tnum"
|
|
android:alpha="0.75"
|
|
android:visibility="gone" />
|
|
|
|
</LinearLayout>
|
|
|
|
</com.google.android.material.card.MaterialCardView>
|
|
|
|
<com.google.android.material.card.MaterialCardView
|
|
android:id="@+id/cardOverdue"
|
|
android:layout_width="0dp"
|
|
android:layout_height="wrap_content"
|
|
android:layout_weight="1"
|
|
android:layout_marginStart="8dp"
|
|
app:cardElevation="@dimen/card_elevation_raised"
|
|
app:cardCornerRadius="@dimen/card_radius_md"
|
|
app:cardBackgroundColor="?attr/colorErrorContainer"
|
|
android:clickable="true"
|
|
android:focusable="true"
|
|
android:visibility="gone">
|
|
|
|
<LinearLayout
|
|
android:layout_width="match_parent"
|
|
android:layout_height="wrap_content"
|
|
android:orientation="vertical"
|
|
android:padding="16dp">
|
|
|
|
<TextView
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:text="@string/dashboard_overdue"
|
|
android:textAppearance="?attr/textAppearanceLabelSmall"
|
|
android:textColor="?attr/colorOnErrorContainer" />
|
|
|
|
<TextView
|
|
android:id="@+id/tvOverdueTotal"
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:layout_marginTop="4dp"
|
|
android:text="MVR —"
|
|
android:textAppearance="?attr/textAppearanceTitleMedium"
|
|
android:textColor="?attr/colorOnErrorContainer"
|
|
android:fontFeatureSettings="tnum" />
|
|
|
|
</LinearLayout>
|
|
|
|
</com.google.android.material.card.MaterialCardView>
|
|
|
|
</LinearLayout>
|
|
|
|
<!-- Pending Finances card -->
|
|
<com.google.android.material.card.MaterialCardView
|
|
android:id="@+id/cardPendingFinances"
|
|
android:layout_width="match_parent"
|
|
android:layout_height="wrap_content"
|
|
android:layout_marginTop="16dp"
|
|
app:cardElevation="@dimen/card_elevation_raised"
|
|
app:cardCornerRadius="@dimen/card_radius_md"
|
|
android:clickable="true"
|
|
android:focusable="true">
|
|
|
|
<LinearLayout
|
|
android:layout_width="match_parent"
|
|
android:layout_height="wrap_content"
|
|
android:orientation="vertical"
|
|
android:padding="16dp">
|
|
|
|
<TextView
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:text="@string/dashboard_pending_finances"
|
|
android:textAppearance="?attr/textAppearanceLabelSmall"
|
|
android:textColor="?attr/colorOnSurfaceVariant" />
|
|
|
|
<TextView
|
|
android:id="@+id/tvPendingFinances"
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:layout_marginTop="4dp"
|
|
android:text="MVR —"
|
|
android:textAppearance="?attr/textAppearanceTitleMedium"
|
|
android:fontFeatureSettings="tnum" />
|
|
|
|
</LinearLayout>
|
|
|
|
</com.google.android.material.card.MaterialCardView>
|
|
|
|
<!-- BML foreign limits (populated dynamically) -->
|
|
<LinearLayout
|
|
android:id="@+id/containerForeignLimits"
|
|
android:layout_width="match_parent"
|
|
android:layout_height="wrap_content"
|
|
android:orientation="vertical" />
|
|
|
|
<!-- Card carousel (hidden when no cards loaded) -->
|
|
<LinearLayout
|
|
android:id="@+id/sectionCards"
|
|
android:layout_width="match_parent"
|
|
android:layout_height="wrap_content"
|
|
android:orientation="vertical"
|
|
android:layout_marginTop="16dp"
|
|
android:visibility="gone">
|
|
|
|
<TextView
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:text="@string/nav_pay_with_card"
|
|
android:textAppearance="?attr/textAppearanceLabelMedium"
|
|
android:textColor="?attr/colorOnSurfaceVariant"
|
|
android:layout_marginBottom="8dp"/>
|
|
|
|
<androidx.recyclerview.widget.RecyclerView
|
|
android:id="@+id/rvCards"
|
|
android:layout_width="match_parent"
|
|
android:layout_height="wrap_content"
|
|
android:clipToPadding="false"
|
|
android:paddingEnd="4dp"/>
|
|
|
|
</LinearLayout>
|
|
|
|
</LinearLayout>
|
|
|
|
</androidx.core.widget.NestedScrollView>
|
|
|
|
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
|
|
|
<!-- Quick actions fixed at bottom -->
|
|
<LinearLayout
|
|
android:id="@+id/buttonBar"
|
|
android:layout_width="match_parent"
|
|
android:layout_height="wrap_content"
|
|
android:orientation="vertical"
|
|
android:paddingHorizontal="16dp"
|
|
android:paddingTop="8dp"
|
|
android:paddingBottom="16dp">
|
|
|
|
<TextView
|
|
android:layout_width="wrap_content"
|
|
android:layout_height="wrap_content"
|
|
android:text="@string/dashboard_quick_actions"
|
|
android:textAppearance="?attr/textAppearanceLabelMedium"
|
|
android:textColor="?attr/colorOnSurfaceVariant"
|
|
android:layout_marginBottom="8dp" />
|
|
|
|
<LinearLayout
|
|
android:layout_width="match_parent"
|
|
android:layout_height="wrap_content"
|
|
android:orientation="horizontal">
|
|
|
|
<com.google.android.material.button.MaterialButton
|
|
android:id="@+id/btnQuickAction1"
|
|
style="@style/Widget.Material3.Button.OutlinedButton"
|
|
android:layout_width="0dp"
|
|
android:layout_height="wrap_content"
|
|
android:layout_weight="1"
|
|
android:layout_marginEnd="8dp"
|
|
app:iconGravity="textStart"
|
|
app:iconSize="18dp"
|
|
app:iconPadding="8dp" />
|
|
|
|
<com.google.android.material.button.MaterialButton
|
|
android:id="@+id/btnQuickAction2"
|
|
style="@style/Widget.Material3.Button.OutlinedButton"
|
|
android:layout_width="0dp"
|
|
android:layout_height="wrap_content"
|
|
android:layout_weight="1"
|
|
android:layout_marginStart="8dp"
|
|
app:iconGravity="textStart"
|
|
app:iconSize="18dp"
|
|
app:iconPadding="8dp" />
|
|
|
|
</LinearLayout>
|
|
|
|
</LinearLayout>
|
|
|
|
</LinearLayout>
|