From 888869d5fc991acc4476be6270ff4aa050710b09 Mon Sep 17 00:00:00 2001 From: Matt Van Horn Date: Sat, 4 Jul 2026 13:07:12 -0700 Subject: [PATCH] Merge pull request #3174 from mvanhorn/feat/2742-display-card-id Add option to display card ID in card list --- .../card_locker/LoyaltyCardCursorAdapter.java | 9 ++- .../LoyaltyCardListDisplayOptionsManager.java | 18 +++++ app/src/main/res/drawable/ic_card_id_24dp.xml | 10 +++ .../main/res/layout/loyalty_card_layout.xml | 25 ++++++- app/src/main/res/values/strings.xml | 2 + .../protect/card_locker/MainActivityTest.java | 73 ++++++++++++++++++- 6 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 app/src/main/res/drawable/ic_card_id_24dp.xml diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java index 84968d753..4ad640955 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java @@ -105,6 +105,12 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter + + diff --git a/app/src/main/res/layout/loyalty_card_layout.xml b/app/src/main/res/layout/loyalty_card_layout.xml index 34b745b16..e6f07a52f 100644 --- a/app/src/main/res/layout/loyalty_card_layout.xml +++ b/app/src/main/res/layout/loyalty_card_layout.xml @@ -158,10 +158,31 @@ android:visibility="gone" tools:visibility="visible" app:layout_constraintTop_toBottomOf="@+id/note" - app:layout_constraintBottom_toTopOf="@+id/balance" + app:layout_constraintBottom_toTopOf="@+id/cardId" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"/> + + Show note Show balance Show validity + Show card ID sharedpreference_card_details_show_name_below_thumbnail sharedpreference_card_details_show_note sharedpreference_card_details_show_balance sharedpreference_card_details_show_validity + sharedpreference_card_details_show_card_id sharedpreference_card_details_show_archived_cards Card view Cards overview diff --git a/app/src/test/java/protect/card_locker/MainActivityTest.java b/app/src/test/java/protect/card_locker/MainActivityTest.java index 754360f21..503eac757 100644 --- a/app/src/test/java/protect/card_locker/MainActivityTest.java +++ b/app/src/test/java/protect/card_locker/MainActivityTest.java @@ -20,6 +20,7 @@ import android.widget.TextView; import androidx.appcompat.widget.SearchView; import androidx.recyclerview.widget.RecyclerView; +import androidx.test.core.app.ApplicationProvider; import com.google.android.material.tabs.TabLayout; import com.google.zxing.BarcodeFormat; @@ -116,6 +117,76 @@ public class MainActivityTest { database.close(); } + @Test + public void cardIdHiddenByDefault() { + ActivityController activityController = Robolectric.buildActivity(MainActivity.class).create(); + + Activity mainActivity = (Activity) activityController.get(); + activityController.start(); + activityController.resume(); + activityController.visible(); + + RecyclerView list = mainActivity.findViewById(R.id.list); + + SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase(); + DBHelper.insertLoyaltyCard(database, "store", "", null, null, new BigDecimal("0"), null, "1234567890", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0); + + activityController.pause(); + activityController.resume(); + activityController.visible(); + + assertEquals(1, list.getAdapter().getItemCount()); + + // Make sure there is enough space to render all + list.measure(0, 0); + list.layout(0, 0, 100, 1000); + + // Card ID is hidden by default + TextView cardIdField = list.findViewHolderForAdapterPosition(0).itemView.findViewById(R.id.cardId); + assertEquals(View.GONE, cardIdField.getVisibility()); + + database.close(); + } + + @Test + public void showCardIdDisplayOption() { + // The display option is read in the adapter's constructor (during onCreate), so the + // preference must be set before the activity is built. + SharedPreferences cardDetailsPref = ApplicationProvider.getApplicationContext().getSharedPreferences( + ApplicationProvider.getApplicationContext().getString(R.string.sharedpreference_card_details), + Activity.MODE_PRIVATE); + cardDetailsPref.edit().putBoolean( + ApplicationProvider.getApplicationContext().getString(R.string.sharedpreference_card_details_show_card_id), true).apply(); + + ActivityController activityController = Robolectric.buildActivity(MainActivity.class).create(); + + Activity mainActivity = (Activity) activityController.get(); + activityController.start(); + activityController.resume(); + activityController.visible(); + + RecyclerView list = mainActivity.findViewById(R.id.list); + + SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase(); + DBHelper.insertLoyaltyCard(database, "store", "", null, null, new BigDecimal("0"), null, "1234567890", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0); + + activityController.pause(); + activityController.resume(); + activityController.visible(); + + assertEquals(1, list.getAdapter().getItemCount()); + + // Make sure there is enough space to render all + list.measure(0, 0); + list.layout(0, 0, 100, 1000); + + TextView cardIdField = list.findViewHolderForAdapterPosition(0).itemView.findViewById(R.id.cardId); + assertEquals(View.VISIBLE, cardIdField.getVisibility()); + assertEquals("1234567890", cardIdField.getText().toString()); + + database.close(); + } + @Test public void addFourLoyaltyCardsTwoStarred() // Main screen showing starred cards on top correctly { @@ -510,4 +581,4 @@ public class MainActivityTest { database.close(); } -} \ No newline at end of file +}