diff --git a/CHANGELOG.md b/CHANGELOG.md index 410a095d6..b0e0beb8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Unreleased - 83 + +- Support for changing the sorting order + ## v2.5.0 - 82 (2021-09-10) - Improved support for screen readers diff --git a/app/src/main/java/protect/card_locker/DBHelper.java b/app/src/main/java/protect/card_locker/DBHelper.java index 591aadeee..7e5fbda18 100644 --- a/app/src/main/java/protect/card_locker/DBHelper.java +++ b/app/src/main/java/protect/card_locker/DBHelper.java @@ -20,7 +20,7 @@ public class DBHelper extends SQLiteOpenHelper { public static final String DATABASE_NAME = "Catima.db"; public static final int ORIGINAL_DATABASE_VERSION = 1; - public static final int DATABASE_VERSION = 10; + public static final int DATABASE_VERSION = 11; public static class LoyaltyCardDbGroups { @@ -44,6 +44,7 @@ public class DBHelper extends SQLiteOpenHelper public static final String BARCODE_ID = "barcodeid"; public static final String BARCODE_TYPE = "barcodetype"; public static final String STAR_STATUS = "starstatus"; + public static final String LAST_USED = "lastused"; } public static class LoyaltyCardDbIdsGroups @@ -53,6 +54,17 @@ public class DBHelper extends SQLiteOpenHelper public static final String groupID = "groupId"; } + public enum LoyaltyCardOrder { + Alpha, + LastUsed, + Expiry + } + + public enum LoyaltyCardOrderDirection { + Ascending, + Descending + } + private Context mContext; public DBHelper(Context context) @@ -83,7 +95,8 @@ public class DBHelper extends SQLiteOpenHelper LoyaltyCardDbIds.CARD_ID + " TEXT not null," + LoyaltyCardDbIds.BARCODE_ID + " TEXT," + LoyaltyCardDbIds.BARCODE_TYPE + " TEXT," + - LoyaltyCardDbIds.STAR_STATUS + " INTEGER DEFAULT '0')"); + LoyaltyCardDbIds.STAR_STATUS + " INTEGER DEFAULT '0'," + + LoyaltyCardDbIds.LAST_USED + " INTEGER DEFAULT '0')"); // create associative table for cards in groups db.execSQL("create table " + LoyaltyCardDbIdsGroups.TABLE + "(" + @@ -250,13 +263,19 @@ public class DBHelper extends SQLiteOpenHelper db.setTransactionSuccessful(); db.endTransaction(); } + + if(oldVersion < 11 && newVersion >= 11) + { + db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE + + " ADD COLUMN " + LoyaltyCardDbIds.LAST_USED + " INTEGER DEFAULT '0'"); + } } public long insertLoyaltyCard(final String store, final String note, final Date expiry, final BigDecimal balance, final Currency balanceType, final String cardId, final String barcodeId, final CatimaBarcode barcodeType, final Integer headerColor, - final int starStatus) + final int starStatus, final Long lastUsed) { SQLiteDatabase db = getWritableDatabase(); ContentValues contentValues = new ContentValues(); @@ -270,14 +289,16 @@ public class DBHelper extends SQLiteOpenHelper contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null); contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus); + contentValues.put(LoyaltyCardDbIds.LAST_USED, lastUsed != null ? lastUsed : Utils.getUnixTime()); return db.insert(LoyaltyCardDbIds.TABLE, null, contentValues); } public long insertLoyaltyCard(final SQLiteDatabase db, final String store, - final String note, final Date expiry, final BigDecimal balance, - final Currency balanceType, final String cardId, - final String barcodeId, final CatimaBarcode barcodeType, - final Integer headerColor, final int starStatus) + final String note, final Date expiry, final BigDecimal balance, + final Currency balanceType, final String cardId, + final String barcodeId, final CatimaBarcode barcodeType, + final Integer headerColor, final int starStatus, + final Long lastUsed) { ContentValues contentValues = new ContentValues(); contentValues.put(LoyaltyCardDbIds.STORE, store); @@ -289,15 +310,17 @@ public class DBHelper extends SQLiteOpenHelper contentValues.put(LoyaltyCardDbIds.BARCODE_ID, barcodeId); contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null); contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); - contentValues.put(LoyaltyCardDbIds.STAR_STATUS,starStatus); + contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus); + contentValues.put(LoyaltyCardDbIds.LAST_USED, lastUsed != null ? lastUsed : Utils.getUnixTime()); return db.insert(LoyaltyCardDbIds.TABLE, null, contentValues); } public long insertLoyaltyCard(final SQLiteDatabase db, final int id, final String store, - final String note, final Date expiry, final BigDecimal balance, - final Currency balanceType, final String cardId, - final String barcodeId, final CatimaBarcode barcodeType, - final Integer headerColor, final int starStatus) + final String note, final Date expiry, final BigDecimal balance, + final Currency balanceType, final String cardId, + final String barcodeId, final CatimaBarcode barcodeType, + final Integer headerColor, final int starStatus, + final Long lastUsed) { ContentValues contentValues = new ContentValues(); contentValues.put(LoyaltyCardDbIds.ID, id); @@ -310,7 +333,8 @@ public class DBHelper extends SQLiteOpenHelper contentValues.put(LoyaltyCardDbIds.BARCODE_ID, barcodeId); contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null); contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); - contentValues.put(LoyaltyCardDbIds.STAR_STATUS,starStatus); + contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus); + contentValues.put(LoyaltyCardDbIds.LAST_USED, lastUsed != null ? lastUsed : Utils.getUnixTime()); return db.insert(LoyaltyCardDbIds.TABLE, null, contentValues); } @@ -347,6 +371,16 @@ public class DBHelper extends SQLiteOpenHelper return (rowsUpdated == 1); } + public boolean updateLoyaltyCardLastUsed(final int id) { + SQLiteDatabase db = getWritableDatabase(); + ContentValues contentValues = new ContentValues(); + contentValues.put(LoyaltyCardDbIds.LAST_USED, System.currentTimeMillis() / 1000); + int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues, + whereAttrs(LoyaltyCardDbIds.ID), + withArgs(id)); + return (rowsUpdated == 1); + } + public LoyaltyCard getLoyaltyCard(final int id) { SQLiteDatabase db = getReadableDatabase(); @@ -475,6 +509,18 @@ public class DBHelper extends SQLiteOpenHelper */ public Cursor getLoyaltyCardCursor(final String filter, Group group) { + return getLoyaltyCardCursor(filter, group, LoyaltyCardOrder.Alpha, LoyaltyCardOrderDirection.Ascending); + } + + /** + * Returns a cursor to all loyalty cards with the filter text in either the store or note in a certain group sorted as requested. + * + * @param filter + * @param group + * @param order + * @return Cursor + */ + public Cursor getLoyaltyCardCursor(final String filter, Group group, LoyaltyCardOrder order, LoyaltyCardOrderDirection direction) { String actualFilter = String.format("%%%s%%", filter); String[] selectionArgs = { actualFilter, actualFilter }; StringBuilder groupFilter = new StringBuilder(); @@ -501,11 +547,16 @@ public class DBHelper extends SQLiteOpenHelper } } + String orderField = getFieldForOrder(order); + return db.rawQuery("select * from " + LoyaltyCardDbIds.TABLE + " WHERE (" + LoyaltyCardDbIds.STORE + " LIKE ? " + " OR " + LoyaltyCardDbIds.NOTE + " LIKE ? )" + groupFilter.toString() + - " ORDER BY " + LoyaltyCardDbIds.STAR_STATUS + " DESC," + LoyaltyCardDbIds.STORE + " COLLATE NOCASE ASC " + + " ORDER BY " + LoyaltyCardDbIds.STAR_STATUS + " DESC, " + + " (CASE WHEN " + orderField + " IS NULL THEN 1 ELSE 0 END), " + + orderField + " COLLATE NOCASE " + getDbDirection(order, direction) + ", " + + LoyaltyCardDbIds.STORE + " COLLATE NOCASE ASC " + limitString, selectionArgs, null); } @@ -737,4 +788,29 @@ public class DBHelper extends SQLiteOpenHelper .map(String::valueOf) .toArray(String[]::new); } + + private String getFieldForOrder(LoyaltyCardOrder order) { + if (order == LoyaltyCardOrder.Alpha) { + return LoyaltyCardDbIds.STORE; + } + + if (order == LoyaltyCardOrder.LastUsed) { + return LoyaltyCardDbIds.LAST_USED; + } + + if (order == LoyaltyCardOrder.Expiry) { + return LoyaltyCardDbIds.EXPIRY; + } + + throw new IllegalArgumentException("Unknown order " + order); + } + + private String getDbDirection(LoyaltyCardOrder order, LoyaltyCardOrderDirection direction) { + if (order == LoyaltyCardOrder.LastUsed) { + // We want the default sorting to put the most recently used first + return direction == LoyaltyCardOrderDirection.Descending ? "ASC" : "DESC"; + } + + return direction == LoyaltyCardOrderDirection.Ascending ? "ASC" : "DESC"; + } } diff --git a/app/src/main/java/protect/card_locker/ImportURIHelper.java b/app/src/main/java/protect/card_locker/ImportURIHelper.java index 3b7e1b9fb..ffe4c21a8 100644 --- a/app/src/main/java/protect/card_locker/ImportURIHelper.java +++ b/app/src/main/java/protect/card_locker/ImportURIHelper.java @@ -122,7 +122,7 @@ public class ImportURIHelper { headerColor = Integer.parseInt(unparsedHeaderColor); } - return new LoyaltyCard(-1, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, 0); + return new LoyaltyCard(-1, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, 0, Utils.getUnixTime()); } catch (NullPointerException | NumberFormatException | UnsupportedEncodingException ex) { throw new InvalidObjectException("Not a valid import URI"); } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCard.java b/app/src/main/java/protect/card_locker/LoyaltyCard.java index a0cc5d09b..165db351f 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCard.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCard.java @@ -4,8 +4,6 @@ import android.database.Cursor; import android.os.Parcel; import android.os.Parcelable; -import com.google.zxing.BarcodeFormat; - import java.math.BigDecimal; import java.util.Currency; import java.util.Date; @@ -31,11 +29,12 @@ public class LoyaltyCard implements Parcelable { public final Integer headerColor; public final int starStatus; + public final long lastUsed; public LoyaltyCard(final int id, final String store, final String note, final Date expiry, final BigDecimal balance, final Currency balanceType, final String cardId, - @Nullable final String barcodeId, @Nullable final CatimaBarcode barcodeType, @Nullable final Integer headerColor, - final int starStatus) + @Nullable final String barcodeId, @Nullable final CatimaBarcode barcodeType, + @Nullable final Integer headerColor, final int starStatus, final long lastUsed) { this.id = id; this.store = store; @@ -48,6 +47,7 @@ public class LoyaltyCard implements Parcelable { this.barcodeType = barcodeType; this.headerColor = headerColor; this.starStatus = starStatus; + this.lastUsed = lastUsed; } protected LoyaltyCard(Parcel in) { @@ -65,6 +65,7 @@ public class LoyaltyCard implements Parcelable { int tmpHeaderColor = in.readInt(); headerColor = tmpHeaderColor != -1 ? tmpHeaderColor : null; starStatus = in.readInt(); + lastUsed = in.readLong(); } @Override @@ -80,6 +81,7 @@ public class LoyaltyCard implements Parcelable { parcel.writeString(barcodeType != null ? barcodeType.name() : ""); parcel.writeInt(headerColor != null ? headerColor : -1); parcel.writeInt(starStatus); + parcel.writeLong(lastUsed); } public static LoyaltyCard toLoyaltyCard(Cursor cursor) @@ -92,6 +94,7 @@ public class LoyaltyCard implements Parcelable { String cardId = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.CARD_ID)); String barcodeId = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_ID)); int starred = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STAR_STATUS)); + long lastUsed = cursor.getLong(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.LAST_USED)); int barcodeTypeColumn = cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_TYPE); int balanceTypeColumn = cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BALANCE_TYPE); @@ -122,7 +125,7 @@ public class LoyaltyCard implements Parcelable { headerColor = cursor.getInt(headerColorColumn); } - return new LoyaltyCard(id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starred); + return new LoyaltyCard(id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starred, lastUsed); } @Override diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java index 2759455b9..e5d70707e 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java @@ -152,7 +152,8 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity (String) (fieldName == LoyaltyCardField.barcodeId ? value : loyaltyCard.barcodeId), (CatimaBarcode) (fieldName == LoyaltyCardField.barcodeType ? value : loyaltyCard.barcodeType), (Integer) (fieldName == LoyaltyCardField.headerColor ? value : loyaltyCard.headerColor), - (int) (fieldName == LoyaltyCardField.starStatus ? value : loyaltyCard.starStatus) + (int) (fieldName == LoyaltyCardField.starStatus ? value : loyaltyCard.starStatus), + Utils.getUnixTime() ); } @@ -549,7 +550,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity setTitle(R.string.addCardTitle); } else { // New card, use default values - tempLoyaltyCard = new LoyaltyCard(-1, "", "", null, new BigDecimal("0"), null, "", null, null, null, 0); + tempLoyaltyCard = new LoyaltyCard(-1, "", "", null, new BigDecimal("0"), null, "", null, null, null, 0, Utils.getUnixTime()); setTitle(R.string.addCardTitle); } } @@ -991,7 +992,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity } else { - loyaltyCardId = (int)db.insertLoyaltyCard(tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor, 0); + loyaltyCardId = (int) db.insertLoyaltyCard(tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor, 0, tempLoyaltyCard.lastUsed); try { Utils.saveCardImage(this, (Bitmap) cardImageFront.getTag(), loyaltyCardId, true); Utils.saveCardImage(this, (Bitmap) cardImageBack.getTag(), loyaltyCardId, false); diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java index 7ecd7308b..6d2ce99f0 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java @@ -581,6 +581,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements } setFullscreen(isFullscreen); + + db.updateLoyaltyCardLastUsed(loyaltyCard.id); } @Override diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index 73fd68e05..28f167e23 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -22,7 +22,9 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.tabs.TabLayout; import java.io.UnsupportedEncodingException; +import java.util.Arrays; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.view.ActionMode; @@ -42,6 +44,9 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard private Menu mMenu; private GestureDetector mGestureDetector; protected String mFilter = ""; + protected Object mGroup = null; + protected DBHelper.LoyaltyCardOrder mOrder = DBHelper.LoyaltyCardOrder.Alpha; + protected DBHelper.LoyaltyCardOrderDirection mOrderDirection = DBHelper.LoyaltyCardOrderDirection.Ascending; protected int selectedTab = 0; private RecyclerView mCardList; private View mHelpText; @@ -141,8 +146,9 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard } TabLayout.Tab tab = ((TabLayout) findViewById(R.id.groups)).getTabAt(selectedTab); + mGroup = tab != null ? tab.getTag() : null; - updateLoyaltyCardList(mFilter, tab != null ? tab.getTag() : null); + updateLoyaltyCardList(); dialog.dismiss(); }); @@ -187,14 +193,15 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard @Override public void onTabSelected(TabLayout.Tab tab) { selectedTab = tab.getPosition(); - updateLoyaltyCardList(mFilter, tab.getTag()); + mGroup = tab.getTag(); + updateLoyaltyCardList(); // Store active tab in Shared Preference to restore next app launch SharedPreferences activeTabPref = getApplicationContext().getSharedPreferences( getString(R.string.sharedpreference_active_tab), Context.MODE_PRIVATE); SharedPreferences.Editor activeTabPrefEditor = activeTabPref.edit(); - activeTabPrefEditor.putInt(getString(R.string.sharedpreference_active_tab), selectedTab); + activeTabPrefEditor.putInt(getString(R.string.sharedpreference_active_tab), tab.getPosition()); activeTabPrefEditor.apply(); } @@ -226,7 +233,8 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard mCardList.setAdapter(mAdapter); registerForContextMenu(mCardList); - updateLoyaltyCardList(mFilter, null); + mGroup = null; + updateLoyaltyCardList(); /* * This was added for Huawei, but Huawei is just too much of a fucking pain. @@ -285,13 +293,20 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard TabLayout groupsTabLayout = findViewById(R.id.groups); updateTabGroups(groupsTabLayout); - // Restore active tab from Shared Preference + // Restore settings from Shared Preference SharedPreferences activeTabPref = getApplicationContext().getSharedPreferences( getString(R.string.sharedpreference_active_tab), Context.MODE_PRIVATE); selectedTab = activeTabPref.getInt(getString(R.string.sharedpreference_active_tab), 0); + SharedPreferences sortPref = getApplicationContext().getSharedPreferences( + getString(R.string.sharedpreference_sort), + Context.MODE_PRIVATE); + try { + mOrder = DBHelper.LoyaltyCardOrder.valueOf(sortPref.getString(getString(R.string.sharedpreference_sort_order), null)); + mOrderDirection = DBHelper.LoyaltyCardOrderDirection.valueOf(sortPref.getString(getString(R.string.sharedpreference_sort_direction), null)); + } catch (IllegalArgumentException | NullPointerException ignored) {} - Object group = null; + mGroup = null; if (groupsTabLayout.getTabCount() != 0) { TabLayout.Tab tab = groupsTabLayout.getTabAt(selectedTab); @@ -301,9 +316,9 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard groupsTabLayout.selectTab(tab); assert tab != null; - group = tab.getTag(); + mGroup = tab.getTag(); } - updateLoyaltyCardList(mFilter, group); + updateLoyaltyCardList(); // End of active tab logic FloatingActionButton addButton = findViewById(R.id.fabAdd); @@ -368,14 +383,13 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard super.onBackPressed(); } - private void updateLoyaltyCardList(String filterText, Object tag) - { + private void updateLoyaltyCardList() { Group group = null; - if (tag != null) { - group = (Group) tag; + if (mGroup != null) { + group = (Group) mGroup; } - mAdapter.swapCursor(mDB.getLoyaltyCardCursor(filterText, group)); + mAdapter.swapCursor(mDB.getLoyaltyCardCursor(mFilter, group, mOrder, mOrderDirection)); if(mDB.getLoyaltyCardCount() > 0) { @@ -391,7 +405,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard } else { - if(!filterText.isEmpty()) { + if(!mFilter.isEmpty()) { // Actual Empty Search Result mNoMatchingCardsText.setVisibility(View.VISIBLE); mNoGroupCardsText.setVisibility(View.GONE); @@ -486,11 +500,9 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard TabLayout groupsTabLayout = findViewById(R.id.groups); TabLayout.Tab currentTab = groupsTabLayout.getTabAt(groupsTabLayout.getSelectedTabPosition()); + mGroup = currentTab != null ? currentTab.getTag() : null; - updateLoyaltyCardList( - mFilter, - currentTab != null ? currentTab.getTag() : null - ); + updateLoyaltyCardList(); return true; } @@ -504,6 +516,40 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard { int id = inputItem.getItemId(); + if (id == R.id.action_sort) + { + TabLayout.Tab tab = ((TabLayout) findViewById(R.id.groups)).getTabAt(selectedTab); + + AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); + builder.setTitle(R.string.sort_by); + + AtomicInteger currentIndex = new AtomicInteger(); + List loyaltyCardOrders = Arrays.asList(DBHelper.LoyaltyCardOrder.values()); + for (int i = 0; i < loyaltyCardOrders.size(); i++) { + if (mOrder == loyaltyCardOrders.get(i)) { + currentIndex.set(i); + break; + } + } + + builder.setSingleChoiceItems(R.array.sort_types_array, currentIndex.get(), (dialog, which) -> currentIndex.set(which)); + builder.setPositiveButton(R.string.sort, (dialog, which) -> { + setSort(loyaltyCardOrders.get(currentIndex.get()), DBHelper.LoyaltyCardOrderDirection.Ascending); + + dialog.dismiss(); + }); + builder.setNeutralButton(R.string.reverse, (dialog, which) -> { + setSort(loyaltyCardOrders.get(currentIndex.get()), DBHelper.LoyaltyCardOrderDirection.Descending); + + dialog.dismiss(); + }); + builder.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss()); + AlertDialog dialog = builder.create(); + dialog.show(); + + return true; + } + if (id == R.id.action_manage_groups) { Intent i = new Intent(getApplicationContext(), ManageGroupsActivity.class); @@ -541,6 +587,24 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard return super.onOptionsItemSelected(inputItem); } + private void setSort(DBHelper.LoyaltyCardOrder order, DBHelper.LoyaltyCardOrderDirection direction) { + // Update values + mOrder = order; + mOrderDirection = direction; + + // Store in Shared Preference to restore next app launch + SharedPreferences sortPref = getApplicationContext().getSharedPreferences( + getString(R.string.sharedpreference_sort), + Context.MODE_PRIVATE); + SharedPreferences.Editor sortPrefEditor = sortPref.edit(); + sortPrefEditor.putString(getString(R.string.sharedpreference_sort_order), order.name()); + sortPrefEditor.putString(getString(R.string.sharedpreference_sort_direction), direction.name()); + sortPrefEditor.apply(); + + // Update card list + updateLoyaltyCardList(); + } + protected static boolean isDarkModeEnabled(Context inputContext) { Configuration config = inputContext.getResources().getConfiguration(); diff --git a/app/src/main/java/protect/card_locker/Utils.java b/app/src/main/java/protect/card_locker/Utils.java index 6c5542acb..25f21575d 100644 --- a/app/src/main/java/protect/card_locker/Utils.java +++ b/app/src/main/java/protect/card_locker/Utils.java @@ -376,4 +376,8 @@ public class Utils { configuration.setLocales(localeList); return context.createConfigurationContext(configuration); } + + static public long getUnixTime() { + return System.currentTimeMillis() / 1000; + } } diff --git a/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java b/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java index 47910b122..4afe49841 100644 --- a/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java +++ b/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java @@ -127,7 +127,8 @@ public class CatimaExporter implements Exporter DBHelper.LoyaltyCardDbIds.BARCODE_ID, DBHelper.LoyaltyCardDbIds.BARCODE_TYPE, DBHelper.LoyaltyCardDbIds.HEADER_COLOR, - DBHelper.LoyaltyCardDbIds.STAR_STATUS); + DBHelper.LoyaltyCardDbIds.STAR_STATUS, + DBHelper.LoyaltyCardDbIds.LAST_USED); Cursor cardCursor = db.getLoyaltyCardCursor(); @@ -145,7 +146,8 @@ public class CatimaExporter implements Exporter card.barcodeId, card.barcodeType != null ? card.barcodeType.name() : "", card.headerColor, - card.starStatus); + card.starStatus, + card.lastUsed); if(Thread.currentThread().isInterrupted()) { diff --git a/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java b/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java index 1b8f9a386..ce1273373 100644 --- a/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java @@ -349,13 +349,21 @@ public class CatimaImporter implements Importer int starStatus = 0; try { starStatus = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.STAR_STATUS, record, false); - } catch (FormatException _e ) { - // This field did not exist in versions 0.278 and before + } catch (FormatException _e) { + // This field did not exist in versions 0.28 and before // We catch this exception so we can still import old backups } if (starStatus != 1) starStatus = 0; - helper.insertLoyaltyCard(database, id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus); + Long lastUsed = 0L; + try { + lastUsed = CSVHelpers.extractLong(DBHelper.LoyaltyCardDbIds.LAST_USED, record, false); + } catch (FormatException _e) { + // This field did not exist in versions 2.5.0 and before + // We catch this exception so we can still import old backups + } + + helper.insertLoyaltyCard(database, id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed); } /** diff --git a/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java b/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java index f2e7e6007..b41983b5f 100644 --- a/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java @@ -23,6 +23,7 @@ import java.text.ParseException; import protect.card_locker.CatimaBarcode; import protect.card_locker.DBHelper; import protect.card_locker.FormatException; +import protect.card_locker.Utils; /** * Class for importing a database from CSV (Comma Separate Values) @@ -135,6 +136,6 @@ public class FidmeImporter implements Importer // TODO: Front and back image - helper.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, starStatus); + helper.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, starStatus, null); } } \ No newline at end of file diff --git a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java index feb491eb0..b3be826d2 100644 --- a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java @@ -175,7 +175,7 @@ public class StocardImporter implements Importer } } - long loyaltyCardInternalId = db.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, 0); + long loyaltyCardInternalId = db.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, 0, null); if (loyaltyCardData.containsKey("frontImage")) { Utils.saveCardImage(context, (Bitmap) loyaltyCardData.get("frontImage"), (int) loyaltyCardInternalId, true); diff --git a/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java b/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java index 2b8531d93..ad38b1b62 100644 --- a/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java @@ -26,6 +26,7 @@ import java.util.TimeZone; import protect.card_locker.CatimaBarcode; import protect.card_locker.DBHelper; import protect.card_locker.FormatException; +import protect.card_locker.Utils; /** * Class for importing a database from CSV (Comma Separate Values) @@ -129,7 +130,7 @@ public class VoucherVaultImporter implements Importer throw new FormatException("Unknown colour type found: " + colorFromJSON); } - db.insertLoyaltyCard(store, "", expiry, balance, balanceType, cardId, null, barcodeType, headerColor, 0); + db.insertLoyaltyCard(store, "", expiry, balance, balanceType, cardId, null, barcodeType, headerColor, 0, Utils.getUnixTime()); } database.setTransactionSuccessful(); diff --git a/app/src/main/res/drawable/ic_baseline_sort_24.xml b/app/src/main/res/drawable/ic_baseline_sort_24.xml new file mode 100644 index 000000000..5c73e7ae8 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_sort_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/menu/main_menu.xml b/app/src/main/res/menu/main_menu.xml index edc9602de..f60a58893 100644 --- a/app/src/main/res/menu/main_menu.xml +++ b/app/src/main/res/menu/main_menu.xml @@ -8,11 +8,16 @@ android:icon="@drawable/ic_search_white" app:actionViewClass="androidx.appcompat.widget.SearchView" app:showAsAction="always|collapseActionView"/> + + app:showAsAction="ifRoom"/> Stocard Voucher Vault + + + @string/sort_by_name + @string/sort_by_most_recently_used + @string/sort_by_expiry + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 003194f04..c8f3a9240 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -124,6 +124,9 @@ sharedpreference_active_tab sharedpreference_privacy_policy_shown + sharedpreference_sort + sharedpreference_sort_order + sharedpreference_sort_direction I want to share a card with you catima.app @@ -239,7 +242,14 @@ grey_theme brown_theme Made possible by: %s + Sort Toggle showing more info Swipe or long press to switch images + Name + Most Recently Used + Expiry + Balance + Reverse + Sort by diff --git a/app/src/test/java/protect/card_locker/DatabaseTest.java b/app/src/test/java/protect/card_locker/DatabaseTest.java index 9846065d7..f2723fa7f 100644 --- a/app/src/test/java/protect/card_locker/DatabaseTest.java +++ b/app/src/test/java/protect/card_locker/DatabaseTest.java @@ -45,7 +45,7 @@ public class DatabaseTest public void addRemoveOneGiftCard() { assertEquals(0, db.getLoyaltyCardCount()); - long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0); + long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null); boolean result = (id != -1); assertTrue(result); assertEquals(1, db.getLoyaltyCardCount()); @@ -72,7 +72,7 @@ public class DatabaseTest @Test public void updateGiftCard() { - long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0); + long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null); boolean result = (id != -1); assertTrue(result); assertEquals(1, db.getLoyaltyCardCount()); @@ -98,7 +98,7 @@ public class DatabaseTest @Test public void updateGiftCardOnlyStar() { - long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0); + long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null); boolean result = (id != -1); assertTrue(result); assertEquals(1, db.getLoyaltyCardCount()); @@ -135,7 +135,7 @@ public class DatabaseTest @Test public void emptyGiftCardValues() { - long id = db.insertLoyaltyCard("", "", null, new BigDecimal("0"), null, "", null, null, null, 0); + long id = db.insertLoyaltyCard("", "", null, new BigDecimal("0"), null, "", null, null, null, 0, null); boolean result = (id != -1); assertTrue(result); assertEquals(1, db.getLoyaltyCardCount()); @@ -164,7 +164,7 @@ public class DatabaseTest for(int index = CARDS_TO_ADD-1; index >= 0; index--) { long id = db.insertLoyaltyCard("store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index, - null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 0); + null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 0, null); boolean result = (id != -1); assertTrue(result); } @@ -210,12 +210,12 @@ public class DatabaseTest { if (index == CARDS_TO_ADD-1) { id = db.insertLoyaltyCard("store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index, - null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 1); + null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 1, null); } else { id = db.insertLoyaltyCard("store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index, - null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 0); + null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 0, null); } boolean result = (id != -1); assertTrue(result); @@ -316,7 +316,7 @@ public class DatabaseTest { // Create card assertEquals(0, db.getLoyaltyCardCount()); - long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0); + long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null); boolean result = (id != -1); assertTrue(result); assertEquals(1, db.getLoyaltyCardCount()); @@ -433,7 +433,7 @@ public class DatabaseTest { // Create card assertEquals(0, db.getLoyaltyCardCount()); - long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0); + long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null); boolean result = (id != -1); assertTrue(result); assertEquals(1, db.getLoyaltyCardCount()); diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index efae94cd1..41374d496 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -91,7 +91,7 @@ public class ImportExportTest { String storeName = String.format("store, \"%4d", index); String note = String.format("note, \"%4d", index); - long id = db.insertLoyaltyCard(storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 0); + long id = db.insertLoyaltyCard(storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 0, null); boolean result = (id != -1); assertTrue(result); } @@ -107,7 +107,7 @@ public class ImportExportTest { String storeName = String.format("store, \"%4d", index); String note = String.format("note, \"%4d", index); - long id = db.insertLoyaltyCard(storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 1); + long id = db.insertLoyaltyCard(storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 1, null); boolean result = (id != -1); assertTrue(result); } @@ -116,7 +116,7 @@ public class ImportExportTest String storeName = String.format("store, \"%4d", index); String note = String.format("note, \"%4d", index); //if index is even - long id = db.insertLoyaltyCard(storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 0); + long id = db.insertLoyaltyCard(storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 0, null); boolean result = (id != -1); assertTrue(result); } @@ -126,7 +126,7 @@ public class ImportExportTest @Test public void addLoyaltyCardsWithExpiryNeverPastTodayFuture() { - long id = db.insertLoyaltyCard("No Expiry", "", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0); + long id = db.insertLoyaltyCard("No Expiry", "", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null); boolean result = (id != -1); assertTrue(result); @@ -142,7 +142,7 @@ public class ImportExportTest assertEquals(Integer.valueOf(0), card.headerColor); assertEquals(0, card.starStatus); - id = db.insertLoyaltyCard("Past", "", new Date((long) 1), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0); + id = db.insertLoyaltyCard("Past", "", new Date((long) 1), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null); result = (id != -1); assertTrue(result); @@ -158,7 +158,7 @@ public class ImportExportTest assertEquals(Integer.valueOf(0), card.headerColor); assertEquals(0, card.starStatus); - id = db.insertLoyaltyCard("Today", "", new Date(), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0); + id = db.insertLoyaltyCard("Today", "", new Date(), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null); result = (id != -1); assertTrue(result); @@ -177,7 +177,7 @@ public class ImportExportTest // This will break after 19 January 2038 // If someone is still maintaining this code base by then: I love you - id = db.insertLoyaltyCard("Future", "", new Date(2147483648000L), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0); + id = db.insertLoyaltyCard("Future", "", new Date(2147483648000L), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null); result = (id != -1); assertTrue(result); @@ -884,7 +884,7 @@ public class ImportExportTest HashMap loyaltyCardBackImages = new HashMap<>(); // Create card 1 - int loyaltyCardId = (int) db.insertLoyaltyCard("Card 1", "Note 1", new Date(1618053234), new BigDecimal("100"), Currency.getInstance("USD"), "1234", "5432", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), 1, 0); + int loyaltyCardId = (int) db.insertLoyaltyCard("Card 1", "Note 1", new Date(1618053234), new BigDecimal("100"), Currency.getInstance("USD"), "1234", "5432", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), 1, 0, null); loyaltyCardHashMap.put(loyaltyCardId, db.getLoyaltyCard(loyaltyCardId)); db.insertGroup("One"); List groups = Arrays.asList(db.getGroup("One")); @@ -896,7 +896,7 @@ public class ImportExportTest loyaltyCardBackImages.put(loyaltyCardId, roundLauncherBitmap); // Create card 2 - loyaltyCardId = (int) db.insertLoyaltyCard("Card 2", "", null, new BigDecimal(0), null, "123456", null, null, 2, 1); + loyaltyCardId = (int) db.insertLoyaltyCard("Card 2", "", null, new BigDecimal(0), null, "123456", null, null, 2, 1, null); loyaltyCardHashMap.put(loyaltyCardId, db.getLoyaltyCard(loyaltyCardId)); // Export everything diff --git a/app/src/test/java/protect/card_locker/ImportURITest.java b/app/src/test/java/protect/card_locker/ImportURITest.java index b3e89909c..d0783d249 100644 --- a/app/src/test/java/protect/card_locker/ImportURITest.java +++ b/app/src/test/java/protect/card_locker/ImportURITest.java @@ -42,7 +42,7 @@ public class ImportURITest { // Generate card Date date = new Date(); - db.insertLoyaltyCard("store", "This note contains evil symbols like & and = that will break the parser if not escaped right $#!%()*+;:á", date, new BigDecimal("100"), null, BarcodeFormat.UPC_E.toString(), BarcodeFormat.UPC_A.toString(), CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), Color.BLACK, 1); + db.insertLoyaltyCard("store", "This note contains evil symbols like & and = that will break the parser if not escaped right $#!%()*+;:á", date, new BigDecimal("100"), null, BarcodeFormat.UPC_E.toString(), BarcodeFormat.UPC_A.toString(), CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), Color.BLACK, 1, null); // Get card LoyaltyCard card = db.getLoyaltyCard(1); @@ -70,7 +70,7 @@ public class ImportURITest { @Test public void ensureNoCrashOnMissingHeaderFields() throws InvalidObjectException, UnsupportedEncodingException { // Generate card - db.insertLoyaltyCard("store", "note", null, new BigDecimal("10.00"), Currency.getInstance("EUR"), BarcodeFormat.UPC_A.toString(), null, CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), null, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("10.00"), Currency.getInstance("EUR"), BarcodeFormat.UPC_A.toString(), null, CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), null, 0, null); // Get card LoyaltyCard card = db.getLoyaltyCard(1); diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java index 4f35bcf12..3944769cb 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java @@ -120,7 +120,7 @@ public class LoyaltyCardCursorAdapterTest @Test public void TestCursorAdapterEmptyNote() { - db.insertLoyaltyCard("store", "", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0); + db.insertLoyaltyCard("store", "", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); LoyaltyCard card = db.getLoyaltyCard(1); Cursor cursor = db.getLoyaltyCardCursor(); @@ -136,7 +136,7 @@ public class LoyaltyCardCursorAdapterTest @Test public void TestCursorAdapterWithNote() { - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); LoyaltyCard card = db.getLoyaltyCard(1); Cursor cursor = db.getLoyaltyCardCursor(); @@ -156,7 +156,7 @@ public class LoyaltyCardCursorAdapterTest Date expiryDate = new Date(); String dateString = DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate); - db.insertLoyaltyCard("store", "note", expiryDate, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", expiryDate, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); LoyaltyCard card = db.getLoyaltyCard(1); Cursor cursor = db.getLoyaltyCardCursor(); @@ -177,9 +177,9 @@ public class LoyaltyCardCursorAdapterTest @Test public void TestCursorAdapterStarring() { - assertNotEquals(-1, db.insertLoyaltyCard("storeA", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0)); - assertNotEquals(-1, db.insertLoyaltyCard("storeB", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1)); - assertNotEquals(-1, db.insertLoyaltyCard("storeC", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1)); + assertNotEquals(-1, db.insertLoyaltyCard("storeA", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null)); + assertNotEquals(-1, db.insertLoyaltyCard("storeB", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null)); + assertNotEquals(-1, db.insertLoyaltyCard("storeC", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null)); assertEquals(3, db.getLoyaltyCardCount()); @@ -220,7 +220,7 @@ public class LoyaltyCardCursorAdapterTest @Test public void TestCursorAdapter0Points() { - db.insertLoyaltyCard("store", "", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0); + db.insertLoyaltyCard("store", "", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); LoyaltyCard card = db.getLoyaltyCard(1); Cursor cursor = db.getLoyaltyCardCursor(); @@ -236,7 +236,7 @@ public class LoyaltyCardCursorAdapterTest @Test public void TestCursorAdapter0EUR() { - db.insertLoyaltyCard("store", "", null, new BigDecimal("0"), Currency.getInstance("EUR"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0); + db.insertLoyaltyCard("store", "", null, new BigDecimal("0"), Currency.getInstance("EUR"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); LoyaltyCard card = db.getLoyaltyCard(1); Cursor cursor = db.getLoyaltyCardCursor(); @@ -252,7 +252,7 @@ public class LoyaltyCardCursorAdapterTest @Test public void TestCursorAdapter100Points() { - db.insertLoyaltyCard("store", "note", null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); LoyaltyCard card = db.getLoyaltyCard(1); Cursor cursor = db.getLoyaltyCardCursor(); @@ -268,7 +268,7 @@ public class LoyaltyCardCursorAdapterTest @Test public void TestCursorAdapter10USD() { - db.insertLoyaltyCard("store", "note", null, new BigDecimal("10.00"), Currency.getInstance("USD"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("10.00"), Currency.getInstance("USD"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); LoyaltyCard card = db.getLoyaltyCard(1); Cursor cursor = db.getLoyaltyCardCursor(); diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java index 62065d859..a7371bdd2 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java @@ -369,7 +369,7 @@ public class LoyaltyCardViewActivityTest DBHelper db = TestHelpers.getEmptyDb(activity); if (!newCard) { - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); } activityController.start(); @@ -612,7 +612,7 @@ public class LoyaltyCardViewActivityTest final Context context = activity.getApplicationContext(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -631,7 +631,7 @@ public class LoyaltyCardViewActivityTest final Context context = activity.getApplicationContext(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -650,7 +650,7 @@ public class LoyaltyCardViewActivityTest final Context context = activity.getApplicationContext(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -674,7 +674,7 @@ public class LoyaltyCardViewActivityTest final Context context = activity.getApplicationContext(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -712,7 +712,7 @@ public class LoyaltyCardViewActivityTest final Context context = activity.getApplicationContext(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -745,7 +745,7 @@ public class LoyaltyCardViewActivityTest final Context context = activity.getApplicationContext(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", new Date(), new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", new Date(), new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -770,7 +770,7 @@ public class LoyaltyCardViewActivityTest final Context context = activity.getApplicationContext(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -821,7 +821,7 @@ public class LoyaltyCardViewActivityTest final Context context = activity.getApplicationContext(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("10.00"), Currency.getInstance("USD"), EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("10.00"), Currency.getInstance("USD"), EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -862,7 +862,7 @@ public class LoyaltyCardViewActivityTest final Context context = activity.getApplicationContext(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -894,7 +894,7 @@ public class LoyaltyCardViewActivityTest final Context context = activity.getApplicationContext(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -928,7 +928,7 @@ public class LoyaltyCardViewActivityTest final Context context = activity.getApplicationContext(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -965,7 +965,7 @@ public class LoyaltyCardViewActivityTest final Context context = activity.getApplicationContext(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -1001,7 +1001,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -1049,7 +1049,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -1069,7 +1069,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null); activityController.start(); activityController.visible(); @@ -1088,7 +1088,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null); activityController.start(); activityController.visible(); @@ -1106,7 +1106,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -1125,7 +1125,7 @@ public class LoyaltyCardViewActivityTest final Context context = activity.getApplicationContext(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -1154,7 +1154,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); final int LARGE_FONT_SIZE = 40; @@ -1191,7 +1191,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = new DBHelper(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(activity); settings.edit() @@ -1228,7 +1228,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity) activityController.get(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); activityController.resume(); @@ -1263,7 +1263,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -1369,7 +1369,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null); activityController.start(); activityController.visible(); diff --git a/app/src/test/java/protect/card_locker/MainActivityTest.java b/app/src/test/java/protect/card_locker/MainActivityTest.java index 8f00865a5..86054a76d 100644 --- a/app/src/test/java/protect/card_locker/MainActivityTest.java +++ b/app/src/test/java/protect/card_locker/MainActivityTest.java @@ -59,8 +59,9 @@ public class MainActivityTest assertNotNull(menu); // The settings, import/export, groups, search and add button should be present - assertEquals(menu.size(), 6); + assertEquals(menu.size(), 7); assertEquals("Search", menu.findItem(R.id.action_search).getTitle().toString()); + assertEquals("Sort", menu.findItem(R.id.action_sort).getTitle().toString()); assertEquals("Groups", menu.findItem(R.id.action_manage_groups).getTitle().toString()); assertEquals("Import/Export", menu.findItem(R.id.action_import_export).getTitle().toString()); assertEquals("Privacy Policy", menu.findItem(R.id.action_privacy_policy).getTitle().toString()); @@ -95,7 +96,7 @@ public class MainActivityTest assertEquals(0, list.getAdapter().getItemCount()); DBHelper db = TestHelpers.getEmptyDb(mainActivity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0); + db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); assertEquals(View.VISIBLE, helpText.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); @@ -130,10 +131,10 @@ public class MainActivityTest assertEquals(0, list.getAdapter().getItemCount()); DBHelper db = TestHelpers.getEmptyDb(mainActivity); - db.insertLoyaltyCard("storeB", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0); - db.insertLoyaltyCard("storeA", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0); - db.insertLoyaltyCard("storeD", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1); - db.insertLoyaltyCard("storeC", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1); + db.insertLoyaltyCard("storeB", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); + db.insertLoyaltyCard("storeA", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); + db.insertLoyaltyCard("storeD", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null); + db.insertLoyaltyCard("storeC", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null); assertEquals(View.VISIBLE, helpText.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); @@ -226,8 +227,8 @@ public class MainActivityTest TabLayout groupTabs = mainActivity.findViewById(R.id.groups); DBHelper db = TestHelpers.getEmptyDb(mainActivity); - db.insertLoyaltyCard("The First Store", "Initial note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0); - db.insertLoyaltyCard("The Second Store", "Secondary note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0); + db.insertLoyaltyCard("The First Store", "Initial note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); + db.insertLoyaltyCard("The Second Store", "Secondary note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); db.insertGroup("Group one"); List groups = new ArrayList<>();