ui: pass 2 — pill style, tabular figures, ripple feedback, empty strings
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>
This commit is contained in:
@@ -305,12 +305,7 @@ ViewCompat.setOnApplyWindowInsetsListener(binding.contentLayout) { v, insets ->
|
||||
if (statusLabel == null) { tv.visibility = View.GONE; return }
|
||||
tv.visibility = View.VISIBLE
|
||||
tv.text = statusLabel
|
||||
val dp = tv.context.resources.displayMetrics.density
|
||||
tv.background = GradientDrawable().apply {
|
||||
shape = GradientDrawable.RECTANGLE
|
||||
cornerRadius = 12 * dp
|
||||
setColor(0xCC212121.toInt())
|
||||
}
|
||||
tv.setBackgroundResource(R.drawable.card_overlay_pill_bg)
|
||||
}
|
||||
|
||||
fun formatMasked(masked: String): String {
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Translucent dark pill used as a status overlay on card-visual surfaces
|
||||
(item_card_dashboard / _stack / _wallet / _settings_entry). Theme-independent
|
||||
by design: it sits on top of card artwork, not the surface color. -->
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<corners android:radius="12dp" />
|
||||
<solid android:color="#CC212121" />
|
||||
</shape>
|
||||
@@ -53,7 +53,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
android:text="No transactions found"
|
||||
android:text="@string/transactions_empty"
|
||||
android:textAppearance="?attr/textAppearanceBodyMedium"
|
||||
android:textColor="?attr/colorOnSurfaceVariant"
|
||||
android:visibility="gone" />
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
android:text="No recent transfers"
|
||||
android:text="@string/activities_empty"
|
||||
android:textAppearance="?attr/textAppearanceBodyMedium"
|
||||
android:textColor="?attr/colorOnSurfaceVariant"
|
||||
android:visibility="gone" />
|
||||
|
||||
@@ -56,7 +56,8 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="4dp"
|
||||
android:text="MVR —"
|
||||
android:textAppearance="?attr/textAppearanceTitleMedium" />
|
||||
android:textAppearance="?attr/textAppearanceTitleMedium"
|
||||
android:fontFeatureSettings="tnum" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
@@ -89,7 +90,8 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="4dp"
|
||||
android:text="USD —"
|
||||
android:textAppearance="?attr/textAppearanceTitleMedium" />
|
||||
android:textAppearance="?attr/textAppearanceTitleMedium"
|
||||
android:fontFeatureSettings="tnum" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
@@ -134,7 +136,8 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="4dp"
|
||||
android:text="MVR —"
|
||||
android:textAppearance="?attr/textAppearanceTitleMedium" />
|
||||
android:textAppearance="?attr/textAppearanceTitleMedium"
|
||||
android:fontFeatureSettings="tnum" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
@@ -168,7 +171,8 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="4dp"
|
||||
android:text="USD —"
|
||||
android:textAppearance="?attr/textAppearanceTitleMedium" />
|
||||
android:textAppearance="?attr/textAppearanceTitleMedium"
|
||||
android:fontFeatureSettings="tnum" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
@@ -216,7 +220,8 @@
|
||||
android:layout_marginTop="4dp"
|
||||
android:text="MVR —"
|
||||
android:textAppearance="?attr/textAppearanceTitleMedium"
|
||||
android:textColor="?attr/colorOnErrorContainer" />
|
||||
android:textColor="?attr/colorOnErrorContainer"
|
||||
android:fontFeatureSettings="tnum" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvBlockedSecondary"
|
||||
@@ -225,6 +230,7 @@
|
||||
android:layout_marginTop="2dp"
|
||||
android:textAppearance="?attr/textAppearanceLabelSmall"
|
||||
android:textColor="?attr/colorOnErrorContainer"
|
||||
android:fontFeatureSettings="tnum"
|
||||
android:alpha="0.75"
|
||||
android:visibility="gone" />
|
||||
|
||||
@@ -265,7 +271,8 @@
|
||||
android:layout_marginTop="4dp"
|
||||
android:text="MVR —"
|
||||
android:textAppearance="?attr/textAppearanceTitleMedium"
|
||||
android:textColor="?attr/colorOnErrorContainer" />
|
||||
android:textColor="?attr/colorOnErrorContainer"
|
||||
android:fontFeatureSettings="tnum" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
@@ -303,7 +310,8 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="4dp"
|
||||
android:text="MVR —"
|
||||
android:textAppearance="?attr/textAppearanceTitleMedium" />
|
||||
android:textAppearance="?attr/textAppearanceTitleMedium"
|
||||
android:fontFeatureSettings="tnum" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
android:text="No transactions found"
|
||||
android:text="@string/transactions_empty"
|
||||
android:textAppearance="?attr/textAppearanceBodyMedium"
|
||||
android:textColor="?attr/colorOnSurfaceVariant"
|
||||
android:visibility="gone" />
|
||||
|
||||
@@ -70,7 +70,8 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?attr/textAppearanceTitleSmall"
|
||||
android:textColor="?attr/colorOnSurface" />
|
||||
android:textColor="?attr/colorOnSurface"
|
||||
android:fontFeatureSettings="tnum" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvBlocked"
|
||||
@@ -79,6 +80,7 @@
|
||||
android:layout_marginTop="2dp"
|
||||
android:textAppearance="?attr/textAppearanceLabelSmall"
|
||||
android:textColor="?attr/colorError"
|
||||
android:fontFeatureSettings="tnum"
|
||||
android:visibility="gone" />
|
||||
|
||||
<ImageButton
|
||||
|
||||
@@ -114,7 +114,8 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?attr/textAppearanceTitleMedium"
|
||||
android:textColor="?attr/colorOnSurface"
|
||||
android:layout_marginTop="2dp" />
|
||||
android:layout_marginTop="2dp"
|
||||
android:fontFeatureSettings="tnum" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
@@ -137,7 +138,8 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?attr/textAppearanceTitleMedium"
|
||||
android:textColor="?attr/colorOnSurface"
|
||||
android:layout_marginTop="2dp" />
|
||||
android:layout_marginTop="2dp"
|
||||
android:fontFeatureSettings="tnum" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
@@ -162,7 +164,8 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?attr/textAppearanceTitleMedium"
|
||||
android:textColor="?attr/colorError"
|
||||
android:layout_marginTop="2dp" />
|
||||
android:layout_marginTop="2dp"
|
||||
android:fontFeatureSettings="tnum" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="12dp"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
app:cardCornerRadius="@dimen/card_radius_lg"
|
||||
app:cardElevation="@dimen/card_elevation_flat"
|
||||
app:strokeWidth="1dp"
|
||||
@@ -51,11 +53,7 @@
|
||||
android:id="@+id/tvLoanStatus"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingHorizontal="10dp"
|
||||
android:paddingVertical="4dp"
|
||||
android:background="@drawable/chip_background"
|
||||
android:textAppearance="?attr/textAppearanceLabelSmall"
|
||||
android:textColor="?attr/colorOnSecondaryContainer" />
|
||||
style="@style/Widget.App.StatusChip" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
@@ -83,7 +83,8 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?attr/textAppearanceTitleSmall"
|
||||
android:textColor="?attr/colorOnSurface"
|
||||
android:layout_marginTop="6dp" />
|
||||
android:layout_marginTop="6dp"
|
||||
android:fontFeatureSettings="tnum" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/btnTransfer"
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="12dp"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
app:cardCornerRadius="@dimen/card_radius_lg"
|
||||
app:cardElevation="@dimen/card_elevation_flat"
|
||||
app:strokeWidth="1dp"
|
||||
@@ -51,11 +53,7 @@
|
||||
android:id="@+id/tvStatus"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingHorizontal="10dp"
|
||||
android:paddingVertical="4dp"
|
||||
android:background="@drawable/chip_background"
|
||||
android:textAppearance="?attr/textAppearanceLabelSmall"
|
||||
android:textColor="?attr/colorOnSecondaryContainer" />
|
||||
style="@style/Widget.App.StatusChip" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
app:cardElevation="@dimen/card_elevation_raised"
|
||||
app:cardCornerRadius="@dimen/card_radius_md">
|
||||
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
android:id="@+id/tvProfileType"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingHorizontal="10dp"
|
||||
android:paddingVertical="4dp"
|
||||
android:background="@drawable/chip_background"
|
||||
android:textAppearance="?attr/textAppearanceLabelSmall"
|
||||
android:textColor="?attr/colorOnSecondaryContainer" />
|
||||
style="@style/Widget.App.StatusChip" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
@@ -86,6 +86,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?attr/textAppearanceTitleSmall"
|
||||
android:textStyle="bold"
|
||||
android:fontFeatureSettings="tnum"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@id/fvAvatar"
|
||||
app:layout_constraintBottom_toBottomOf="@id/fvAvatar" />
|
||||
|
||||
@@ -255,6 +255,8 @@
|
||||
|
||||
<!-- Accounts -->
|
||||
<string name="accounts_empty">No accounts found</string>
|
||||
<string name="activities_empty">No recent transfers</string>
|
||||
<string name="transactions_empty">No transactions found</string>
|
||||
|
||||
<!-- Contacts -->
|
||||
<string name="contacts_empty">No contacts found</string>
|
||||
|
||||
@@ -1,6 +1,15 @@
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<style name="ShapeAppearance.Circle" parent="ShapeAppearance.Material3.Corner.Full" />
|
||||
|
||||
<!-- Reusable status chip (filled, secondary container). Apply to a TextView via style. -->
|
||||
<style name="Widget.App.StatusChip" parent="">
|
||||
<item name="android:paddingHorizontal">10dp</item>
|
||||
<item name="android:paddingVertical">4dp</item>
|
||||
<item name="android:background">@drawable/chip_background</item>
|
||||
<item name="android:textAppearance">?attr/textAppearanceLabelSmall</item>
|
||||
<item name="android:textColor">?attr/colorOnSecondaryContainer</item>
|
||||
</style>
|
||||
|
||||
<style name="Theme.BasedBank" parent="Theme.Material3.DayNight.NoActionBar">
|
||||
<item name="colorPrimary">@color/seed_primary</item>
|
||||
<item name="colorSecondary">@color/seed_secondary</item>
|
||||
|
||||
Reference in New Issue
Block a user