diff --git a/app/build.gradle b/app/build.gradle index 0ce6e0aaf..dd244d8cc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,6 +57,9 @@ dependencies { compile "com.vanniktech:vntnumberpickerpreference:1.0.0" testCompile 'junit:junit:4.12' testCompile "org.robolectric:robolectric:4.0.2" + + + } task findbugs(type: FindBugs, dependsOn: 'assembleDebug') { diff --git a/app/src/androidTest/java/protect/card_locker/ApplicationTest.java b/app/src/androidTest/java/protect/card_locker/ApplicationTest.java index 802030b5b..2e3339b0e 100644 --- a/app/src/androidTest/java/protect/card_locker/ApplicationTest.java +++ b/app/src/androidTest/java/protect/card_locker/ApplicationTest.java @@ -12,4 +12,4 @@ public class ApplicationTest extends ApplicationTestCase { super(Application.class); } -} \ No newline at end of file +} diff --git a/app/src/main/java/protect/card_locker/CsvDatabaseExporter.java b/app/src/main/java/protect/card_locker/CsvDatabaseExporter.java index a5aac91f0..681f17304 100644 --- a/app/src/main/java/protect/card_locker/CsvDatabaseExporter.java +++ b/app/src/main/java/protect/card_locker/CsvDatabaseExporter.java @@ -25,7 +25,8 @@ public class CsvDatabaseExporter implements DatabaseExporter DBHelper.LoyaltyCardDbIds.CARD_ID, DBHelper.LoyaltyCardDbIds.HEADER_COLOR, DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR, - DBHelper.LoyaltyCardDbIds.BARCODE_TYPE); + DBHelper.LoyaltyCardDbIds.BARCODE_TYPE, + DBHelper.LoyaltyCardDbIds.STAR_STATUS); Cursor cursor = db.getLoyaltyCardCursor(); @@ -39,7 +40,8 @@ public class CsvDatabaseExporter implements DatabaseExporter card.cardId, card.headerColor, card.headerTextColor, - card.barcodeType); + card.barcodeType, + card.starStatus); if(Thread.currentThread().isInterrupted()) { diff --git a/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java b/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java index 7aa27fe5e..e6641842c 100644 --- a/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java +++ b/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java @@ -142,6 +142,14 @@ public class CsvDatabaseImporter implements DatabaseImporter headerTextColor = extractInt(DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR, record, true); } - helper.insertLoyaltyCard(database, id, store, note, cardId, barcodeType, headerColor, headerTextColor); + int starStatus = 0; + try { + starStatus = extractInt(DBHelper.LoyaltyCardDbIds.STAR_STATUS, record, false); + } catch (FormatException _ ) { + // 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, cardId, barcodeType, headerColor, headerTextColor, starStatus); } } diff --git a/app/src/main/java/protect/card_locker/DBHelper.java b/app/src/main/java/protect/card_locker/DBHelper.java index 3eb49cbda..2bf42a606 100644 --- a/app/src/main/java/protect/card_locker/DBHelper.java +++ b/app/src/main/java/protect/card_locker/DBHelper.java @@ -11,7 +11,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 = 3; + public static final int DATABASE_VERSION = 4; static class LoyaltyCardDbIds { @@ -23,6 +23,7 @@ public class DBHelper extends SQLiteOpenHelper public static final String HEADER_TEXT_COLOR = "headertextcolor"; public static final String CARD_ID = "cardid"; public static final String BARCODE_TYPE = "barcodetype"; + public static final String STAR_STATUS = "starstatus"; } public DBHelper(Context context) @@ -41,7 +42,8 @@ public class DBHelper extends SQLiteOpenHelper LoyaltyCardDbIds.HEADER_COLOR + " INTEGER," + LoyaltyCardDbIds.HEADER_TEXT_COLOR + " INTEGER," + LoyaltyCardDbIds.CARD_ID + " TEXT not null," + - LoyaltyCardDbIds.BARCODE_TYPE + " TEXT not null)"); + LoyaltyCardDbIds.BARCODE_TYPE + " TEXT not null," + + LoyaltyCardDbIds.STAR_STATUS + " INTEGER DEFAULT '0' )"); } @Override @@ -62,11 +64,18 @@ public class DBHelper extends SQLiteOpenHelper db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE + " ADD COLUMN " + LoyaltyCardDbIds.HEADER_TEXT_COLOR + " INTEGER"); } + // Upgrade from version 3 to version 4 + if(oldVersion < 4 && newVersion >= 4) + { + db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE + + " ADD COLUMN " + LoyaltyCardDbIds.STAR_STATUS + " INTEGER DEFAULT '0'"); + + } } public long insertLoyaltyCard(final String store, final String note, final String cardId, final String barcodeType, final Integer headerColor, - final Integer headerTextColor) + final Integer headerTextColor, final int starStatus) { SQLiteDatabase db = getWritableDatabase(); ContentValues contentValues = new ContentValues(); @@ -76,6 +85,7 @@ public class DBHelper extends SQLiteOpenHelper contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType); contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); contentValues.put(LoyaltyCardDbIds.HEADER_TEXT_COLOR, headerTextColor); + contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus); final long newId = db.insert(LoyaltyCardDbIds.TABLE, null, contentValues); return newId; } @@ -83,7 +93,7 @@ public class DBHelper extends SQLiteOpenHelper public boolean insertLoyaltyCard(final SQLiteDatabase db, final int id, final String store, final String note, final String cardId, final String barcodeType, final Integer headerColor, - final Integer headerTextColor) + final Integer headerTextColor, final int starStatus) { ContentValues contentValues = new ContentValues(); contentValues.put(LoyaltyCardDbIds.ID, id); @@ -93,6 +103,7 @@ public class DBHelper extends SQLiteOpenHelper contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType); contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); contentValues.put(LoyaltyCardDbIds.HEADER_TEXT_COLOR, headerTextColor); + contentValues.put(LoyaltyCardDbIds.STAR_STATUS,starStatus); final long newId = db.insert(LoyaltyCardDbIds.TABLE, null, contentValues); return (newId != -1); } @@ -116,6 +127,17 @@ public class DBHelper extends SQLiteOpenHelper return (rowsUpdated == 1); } + public boolean updateLoyaltyCardStarStatus(final int id, final int starStatus) + { + SQLiteDatabase db = getWritableDatabase(); + ContentValues contentValues = new ContentValues(); + contentValues.put(LoyaltyCardDbIds.STAR_STATUS,starStatus); + int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues, + LoyaltyCardDbIds.ID + "=?", + new String[]{Integer.toString(id)}); + return (rowsUpdated == 1); + } + public LoyaltyCard getLoyaltyCard(final int id) { SQLiteDatabase db = getReadableDatabase(); @@ -166,7 +188,7 @@ public class DBHelper extends SQLiteOpenHelper Cursor res = db.rawQuery("select * from " + LoyaltyCardDbIds.TABLE + " WHERE " + LoyaltyCardDbIds.STORE + " LIKE ? " + " OR " + LoyaltyCardDbIds.NOTE + " LIKE ? " + - " ORDER BY " + LoyaltyCardDbIds.STORE + " COLLATE NOCASE ASC", selectionArgs, null); + " ORDER BY " + LoyaltyCardDbIds.STAR_STATUS + " DESC," + LoyaltyCardDbIds.STORE + " COLLATE NOCASE ASC", selectionArgs, null); return res; } diff --git a/app/src/main/java/protect/card_locker/ImportURIHelper.java b/app/src/main/java/protect/card_locker/ImportURIHelper.java index 041d6c31a..0586a3527 100644 --- a/app/src/main/java/protect/card_locker/ImportURIHelper.java +++ b/app/src/main/java/protect/card_locker/ImportURIHelper.java @@ -10,9 +10,12 @@ public class ImportURIHelper { private static final String NOTE = DBHelper.LoyaltyCardDbIds.NOTE; private static final String CARD_ID = DBHelper.LoyaltyCardDbIds.CARD_ID; private static final String BARCODE_TYPE = DBHelper.LoyaltyCardDbIds.BARCODE_TYPE; + private static final String HEADER_COLOR = DBHelper.LoyaltyCardDbIds.HEADER_COLOR; private static final String HEADER_TEXT_COLOR = DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR; + + private final Context context; private final String host; private final String path; @@ -47,6 +50,8 @@ public class ImportURIHelper { String note = uri.getQueryParameter(NOTE); String cardId = uri.getQueryParameter(CARD_ID); String barcodeType = uri.getQueryParameter(BARCODE_TYPE); + if (store == null || note == null || cardId == null || barcodeType == null) throw new InvalidObjectException("Not a valid import URI"); + String unparsedHeaderColor = uri.getQueryParameter(HEADER_COLOR); if(unparsedHeaderColor != null) { @@ -57,7 +62,8 @@ public class ImportURIHelper { { headerTextColor = Integer.parseInt(unparsedHeaderTextColor); } - return new LoyaltyCard(-1, store, note, cardId, barcodeType, headerColor, headerTextColor); + + return new LoyaltyCard(-1, store, note, cardId, barcodeType, headerColor, headerTextColor, 0); } catch (NullPointerException | NumberFormatException ex) { throw new InvalidObjectException("Not a valid import URI"); } @@ -81,7 +87,7 @@ public class ImportURIHelper { { uriBuilder.appendQueryParameter(HEADER_TEXT_COLOR, loyaltyCard.headerTextColor.toString()); } - + //StarStatus will not be exported return uriBuilder.build(); } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCard.java b/app/src/main/java/protect/card_locker/LoyaltyCard.java index 152d15d35..6c21b3a38 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCard.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCard.java @@ -17,8 +17,10 @@ public class LoyaltyCard @Nullable public final Integer headerTextColor; + public final int starStatus; + public LoyaltyCard(final int id, final String store, final String note, final String cardId, - final String barcodeType, final Integer headerColor, final Integer headerTextColor) + final String barcodeType, final Integer headerColor, final Integer headerTextColor,final int starStatus) { this.id = id; this.store = store; @@ -27,6 +29,7 @@ public class LoyaltyCard this.barcodeType = barcodeType; this.headerColor = headerColor; this.headerTextColor = headerTextColor; + this.starStatus = starStatus; } public static LoyaltyCard toLoyaltyCard(Cursor cursor) @@ -36,6 +39,8 @@ public class LoyaltyCard String note = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE)); String cardId = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.CARD_ID)); String barcodeType = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_TYPE)); + int starred = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STAR_STATUS)); + int headerColorColumn = cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.HEADER_COLOR); int headerTextColorColumn = cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR); @@ -53,6 +58,6 @@ public class LoyaltyCard headerTextColor = cursor.getInt(headerTextColorColumn); } - return new LoyaltyCard(id, store, note, cardId, barcodeType, headerColor, headerTextColor); + return new LoyaltyCard(id, store, note, cardId, barcodeType, headerColor, headerTextColor, starred); } } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java index 07f04f9f5..91c6f3881 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java @@ -38,6 +38,7 @@ class LoyaltyCardCursorAdapter extends CursorAdapter ImageView thumbnail = view.findViewById(R.id.thumbnail); TextView storeField = (TextView) view.findViewById(R.id.store); TextView noteField = (TextView) view.findViewById(R.id.note); + ImageView star = view.findViewById(R.id.star); // Extract properties from cursor LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(cursor); @@ -58,6 +59,9 @@ class LoyaltyCardCursorAdapter extends CursorAdapter noteField.setVisibility(View.GONE); } + if (loyaltyCard.starStatus!=0) star.setVisibility(View.VISIBLE); + else star.setVisibility(View.GONE); + int tileLetterFontSize = context.getResources().getDimensionPixelSize(R.dimen.tileLetterFontSize); int pixelSize = context.getResources().getDimensionPixelSize(R.dimen.cardThumbnailSize); diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java index c46504b48..3a36ee7ec 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java @@ -405,13 +405,13 @@ public class LoyaltyCardEditActivity extends AppCompatActivity } if(updateLoyaltyCard) - { + { //update of "starStatus" not necessary, since it cannot be changed in this activity (only in ViewActivity) db.updateLoyaltyCard(loyaltyCardId, store, note, cardId, barcodeType, headingColorValue, headingStoreTextColorValue); Log.i(TAG, "Updated " + loyaltyCardId + " to " + cardId); } else { - loyaltyCardId = (int)db.insertLoyaltyCard(store, note, cardId, barcodeType, headingColorValue, headingStoreTextColorValue); + loyaltyCardId = (int)db.insertLoyaltyCard(store, note, cardId, barcodeType, headingColorValue, headingStoreTextColorValue, 0); } finish(); diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java index 89e878482..06e2423e7 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java @@ -56,6 +56,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity String cardIdString; BarcodeFormat format; + boolean starred; boolean backgroundNeedsDarkIcons; boolean barcodeIsFullscreen = false; ViewGroup.LayoutParams barcodeImageState; @@ -317,11 +318,29 @@ public class LoyaltyCardViewActivity extends AppCompatActivity item.setVisible(false); } + loyaltyCard = db.getLoyaltyCard(loyaltyCardId); + starred = loyaltyCard.starStatus != 0; + menu.findItem(R.id.action_share).setIcon(getIcon(R.drawable.ic_share_white, backgroundNeedsDarkIcons)); return super.onCreateOptionsMenu(menu); } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + super.onPrepareOptionsMenu(menu); + if (starred) { + menu.findItem(R.id.action_star_unstar).setIcon(getIcon(R.drawable.ic_starred_white, backgroundNeedsDarkIcons)); + menu.findItem(R.id.action_star_unstar).setTitle(R.string.unstar); + } + else { + menu.findItem(R.id.action_star_unstar).setIcon(getIcon(R.drawable.ic_unstarred_white, backgroundNeedsDarkIcons)); + menu.findItem(R.id.action_star_unstar).setTitle(R.string.star); + } + return true; + } + @Override public boolean onOptionsItemSelected(MenuItem item) { @@ -348,11 +367,18 @@ public class LoyaltyCardViewActivity extends AppCompatActivity } rotationEnabled = !rotationEnabled; return true; + + case R.id.action_star_unstar: + starred = !starred; + db.updateLoyaltyCardStarStatus(loyaltyCardId, starred ? 1 : 0); + invalidateOptionsMenu(); + return true; } return super.onOptionsItemSelected(item); } + private void setOrientatonLock(MenuItem item, boolean lock) { if(lock) diff --git a/app/src/main/res/drawable-hdpi/ic_starred_white.png b/app/src/main/res/drawable-hdpi/ic_starred_white.png new file mode 100644 index 000000000..8d1595bfc Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_starred_white.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_unstarred_white.png b/app/src/main/res/drawable-hdpi/ic_unstarred_white.png new file mode 100644 index 000000000..0b5f3a650 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_unstarred_white.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_starred_white.png b/app/src/main/res/drawable-mdpi/ic_starred_white.png new file mode 100644 index 000000000..4b83e9972 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_starred_white.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_unstarred_white.png b/app/src/main/res/drawable-mdpi/ic_unstarred_white.png new file mode 100644 index 000000000..0dc507138 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_unstarred_white.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_starred_white.png b/app/src/main/res/drawable-xhdpi/ic_starred_white.png new file mode 100644 index 000000000..4f35df0be Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_starred_white.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_unstarred_white.png b/app/src/main/res/drawable-xhdpi/ic_unstarred_white.png new file mode 100644 index 000000000..8eabc3d50 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_unstarred_white.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_starred_white.png b/app/src/main/res/drawable-xxhdpi/ic_starred_white.png new file mode 100644 index 000000000..3de9cd6a7 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_starred_white.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_unstarred_white.png b/app/src/main/res/drawable-xxhdpi/ic_unstarred_white.png new file mode 100644 index 000000000..d495c468d Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_unstarred_white.png differ diff --git a/app/src/main/res/layout/loyalty_card_layout.xml b/app/src/main/res/layout/loyalty_card_layout.xml index 45ea6587a..9548217cb 100644 --- a/app/src/main/res/layout/loyalty_card_layout.xml +++ b/app/src/main/res/layout/loyalty_card_layout.xml @@ -52,5 +52,12 @@ android:ellipsize="end" android:textSize="@dimen/noteTextSize"/> - + diff --git a/app/src/main/res/menu/card_view_menu.xml b/app/src/main/res/menu/card_view_menu.xml index 3052eb2ae..197a427a2 100644 --- a/app/src/main/res/menu/card_view_menu.xml +++ b/app/src/main/res/menu/card_view_menu.xml @@ -12,4 +12,14 @@ android:icon="@drawable/ic_share_white" android:title="@string/share" app:showAsAction="always"/> + + \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index a5552faa0..2827c7fc5 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -17,6 +17,8 @@ Bestätigen Rotation blockieren Rotation zulassen + Zu den Favoriten hinzufügen + Aus der Favoritenliste entfernen Karte entfernen Bitte bestätigen Sie, dass diese Karte gelöscht werden soll. Ok diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 02aa9d24a..45f15a613 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,6 +14,9 @@ Barcode type This card has no barcode + Add to favorites + Remove from favorites + Cancel Save Capture Card @@ -80,6 +83,7 @@ Card ID copied to clipboard Thumbnail for card + Favorite star Change Store Text Color diff --git a/app/src/test/java/protect/card_locker/DatabaseTest.java b/app/src/test/java/protect/card_locker/DatabaseTest.java index 7bcaaa442..eec0cb64c 100644 --- a/app/src/test/java/protect/card_locker/DatabaseTest.java +++ b/app/src/test/java/protect/card_locker/DatabaseTest.java @@ -40,7 +40,7 @@ public class DatabaseTest public void addRemoveOneGiftCard() { assertEquals(0, db.getLoyaltyCardCount()); - long id = db.insertLoyaltyCard("store", "note", "cardId", BarcodeFormat.UPC_A.toString(), DEFAULT_HEADER_COLOR, DEFAULT_HEADER_TEXT_COLOR); + long id = db.insertLoyaltyCard("store", "note", "cardId", BarcodeFormat.UPC_A.toString(), DEFAULT_HEADER_COLOR, DEFAULT_HEADER_TEXT_COLOR, 0); boolean result = (id != -1); assertTrue(result); assertEquals(1, db.getLoyaltyCardCount()); @@ -50,6 +50,7 @@ public class DatabaseTest assertEquals("store", loyaltyCard.store); assertEquals("note", loyaltyCard.note); assertEquals("cardId", loyaltyCard.cardId); + assertEquals(0, loyaltyCard.starStatus); assertEquals(BarcodeFormat.UPC_A.toString(), loyaltyCard.barcodeType); result = db.deleteLoyaltyCard(1); @@ -61,7 +62,7 @@ public class DatabaseTest @Test public void updateGiftCard() { - long id = db.insertLoyaltyCard("store", "note", "cardId", BarcodeFormat.UPC_A.toString(), DEFAULT_HEADER_COLOR, DEFAULT_HEADER_TEXT_COLOR); + long id = db.insertLoyaltyCard("store", "note", "cardId", BarcodeFormat.UPC_A.toString(), DEFAULT_HEADER_COLOR, DEFAULT_HEADER_TEXT_COLOR,0); boolean result = (id != -1); assertTrue(result); assertEquals(1, db.getLoyaltyCardCount()); @@ -75,9 +76,33 @@ public class DatabaseTest assertEquals("store1", loyaltyCard.store); assertEquals("note1", loyaltyCard.note); assertEquals("cardId1", loyaltyCard.cardId); + assertEquals(0, loyaltyCard.starStatus); assertEquals(BarcodeFormat.AZTEC.toString(), loyaltyCard.barcodeType); } + @Test + public void updateGiftCardOnlyStar() + { + long id = db.insertLoyaltyCard("store", "note", "cardId", BarcodeFormat.UPC_A.toString(), DEFAULT_HEADER_COLOR, DEFAULT_HEADER_TEXT_COLOR,0); + boolean result = (id != -1); + assertTrue(result); + assertEquals(1, db.getLoyaltyCardCount()); + + result = db.updateLoyaltyCardStarStatus(1, 1); + assertTrue(result); + assertEquals(1, db.getLoyaltyCardCount()); + + LoyaltyCard loyaltyCard = db.getLoyaltyCard(1); + assertNotNull(loyaltyCard); + assertEquals("store", loyaltyCard.store); + assertEquals("note", loyaltyCard.note); + assertEquals("cardId", loyaltyCard.cardId); + assertEquals(1, loyaltyCard.starStatus); + assertEquals(BarcodeFormat.UPC_A.toString(), loyaltyCard.barcodeType); + } + + + @Test public void updateMissingGiftCard() { @@ -92,7 +117,7 @@ public class DatabaseTest @Test public void emptyGiftCardValues() { - long id = db.insertLoyaltyCard("", "", "", "", null, null); + long id = db.insertLoyaltyCard("", "", "", "", null, null, 0); boolean result = (id != -1); assertTrue(result); assertEquals(1, db.getLoyaltyCardCount()); @@ -115,7 +140,7 @@ public class DatabaseTest for(int index = CARDS_TO_ADD-1; index >= 0; index--) { long id = db.insertLoyaltyCard("store" + index, "note" + index, "cardId" + index, - BarcodeFormat.UPC_A.toString(), index, index*2); + BarcodeFormat.UPC_A.toString(), index, index*2, 0); boolean result = (id != -1); assertTrue(result); } @@ -136,6 +161,66 @@ public class DatabaseTest assertEquals("cardId"+index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.CARD_ID))); assertEquals("cardId"+index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.CARD_ID))); assertEquals(BarcodeFormat.UPC_A.toString(), cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_TYPE))); + assertEquals(0, cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STAR_STATUS))); + assertEquals(index, cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.HEADER_COLOR))); + assertEquals(index*2, cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR))); + + cursor.moveToNext(); + } + + assertTrue(cursor.isAfterLast()); + } + + @Test + public void giftCardsViaCursorWithOneStarred() //sorting test; stared card should appear first + { + final int CARDS_TO_ADD = 10; + long id; + // Add the gift cards in reverse order and add one with STAR, to ensure + // that they are sorted + for(int index = CARDS_TO_ADD-1; index >= 0; index--) + { + if (index == CARDS_TO_ADD-1) { + id = db.insertLoyaltyCard("store" + index, "note" + index, "cardId" + index, + BarcodeFormat.UPC_A.toString(), index, index*2, 1); + } + + else { + id = db.insertLoyaltyCard("store" + index, "note" + index, "cardId" + index, + BarcodeFormat.UPC_A.toString(), index, index*2, 0); + } + boolean result = (id != -1); + assertTrue(result); + } + + assertEquals(CARDS_TO_ADD, db.getLoyaltyCardCount()); + + Cursor cursor = db.getLoyaltyCardCursor(); + assertNotNull(cursor); + + assertEquals(CARDS_TO_ADD, cursor.getCount()); + + cursor.moveToFirst(); + int index = CARDS_TO_ADD-1 ; + assertEquals("store"+index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE))); + assertEquals("note"+index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE))); + assertEquals("cardId"+index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.CARD_ID))); + assertEquals("cardId"+index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.CARD_ID))); + assertEquals(BarcodeFormat.UPC_A.toString(), cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_TYPE))); + assertEquals(1, cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STAR_STATUS))); + assertEquals(index, cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.HEADER_COLOR))); + assertEquals(index*2, cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR))); + + cursor.moveToNext(); + + for(index = 0; index < CARDS_TO_ADD-1; index++) + { + assertEquals("store"+index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE))); + assertEquals("note"+index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE))); + assertEquals("cardId"+index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.CARD_ID))); + assertEquals("cardId"+index, cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.CARD_ID))); + assertEquals(BarcodeFormat.UPC_A.toString(), cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_TYPE))); + assertEquals(0, cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STAR_STATUS))); assertEquals(index, cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.HEADER_COLOR))); assertEquals(index*2, cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR))); diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index 071eddd3e..d3bcc27d2 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -3,12 +3,10 @@ package protect.card_locker; import android.app.Activity; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; -import android.net.Uri; import android.os.Environment; import com.google.zxing.BarcodeFormat; -import org.apache.tools.ant.filters.StringInputStream; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -25,7 +23,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; -import java.net.URI; import java.nio.charset.StandardCharsets; import java.util.Calendar; @@ -71,7 +68,7 @@ public class ImportExportTest { String storeName = String.format("store, \"%4d", index); String note = String.format("note, \"%4d", index); - long id = db.insertLoyaltyCard(storeName, note, BARCODE_DATA, BARCODE_TYPE, index, index*2); + long id = db.insertLoyaltyCard(storeName, note, BARCODE_DATA, BARCODE_TYPE, index, index*2, 0); boolean result = (id != -1); assertTrue(result); } @@ -79,6 +76,30 @@ public class ImportExportTest assertEquals(cardsToAdd, db.getLoyaltyCardCount()); } + private void addLoyaltyCardsFiveStarred() + { + int cardsToAdd = 9; + // Add in reverse order to test sorting + for(int index = cardsToAdd; index > 4; index--) + { + String storeName = String.format("store, \"%4d", index); + String note = String.format("note, \"%4d", index); + long id = db.insertLoyaltyCard(storeName, note, BARCODE_DATA, BARCODE_TYPE, index, index*2, 1); + boolean result = (id != -1); + assertTrue(result); + } + for(int index = cardsToAdd-5; index > 0; index--) + { + String storeName = String.format("store, \"%4d", index); + String note = String.format("note, \"%4d", index); + //if index is even + long id = db.insertLoyaltyCard(storeName, note, BARCODE_DATA, BARCODE_TYPE, index, index*2, 0); + boolean result = (id != -1); + assertTrue(result); + } + assertEquals(cardsToAdd, db.getLoyaltyCardCount()); + } + /** * Check that all of the cards follow the pattern * specified in addLoyaltyCards(), and are in sequential order @@ -102,12 +123,64 @@ public class ImportExportTest assertEquals(BARCODE_TYPE, card.barcodeType); assertEquals(Integer.valueOf(index), card.headerColor); assertEquals(Integer.valueOf(index*2), card.headerTextColor); + assertEquals(0, card.starStatus); index++; } cursor.close(); } + /** + * Check that all of the cards follow the pattern + * specified in addLoyaltyCardsSomeStarred(), and are in sequential order + * with starred ones first + */ + private void checkLoyaltyCardsFiveStarred() + { + Cursor cursor = db.getLoyaltyCardCursor(); + int index = 5; + + while(index<10) + { + cursor.moveToNext(); + LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cursor); + + String expectedStore = String.format("store, \"%4d", index); + String expectedNote = String.format("note, \"%4d", index); + + assertEquals(expectedStore, card.store); + assertEquals(expectedNote, card.note); + assertEquals(BARCODE_DATA, card.cardId); + assertEquals(BARCODE_TYPE, card.barcodeType); + assertEquals(Integer.valueOf(index), card.headerColor); + assertEquals(Integer.valueOf(index*2), card.headerTextColor); + assertEquals(1, card.starStatus); + + index++; + } + + index = 1; + while(cursor.moveToNext() && index<5) + { + LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cursor); + + String expectedStore = String.format("store, \"%4d", index); + String expectedNote = String.format("note, \"%4d", index); + + assertEquals(expectedStore, card.store); + assertEquals(expectedNote, card.note); + assertEquals(BARCODE_DATA, card.cardId); + assertEquals(BARCODE_TYPE, card.barcodeType); + assertEquals(Integer.valueOf(index), card.headerColor); + assertEquals(Integer.valueOf(index*2), card.headerTextColor); + assertEquals(0, card.starStatus); + + index++; + } + + cursor.close(); + } + /** * Delete the contents of the database */ @@ -155,6 +228,41 @@ public class ImportExportTest } } + @Test + public void multipleCardsExportImportSomeStarred() throws IOException + { + final int NUM_CARDS = 9; + + for(DataFormat format : DataFormat.values()) + { + addLoyaltyCardsFiveStarred(); + + ByteArrayOutputStream outData = new ByteArrayOutputStream(); + OutputStreamWriter outStream = new OutputStreamWriter(outData); + + // Export data to CSV format + boolean result = MultiFormatExporter.exportData(db, outStream, format); + assertTrue(result); + outStream.close(); + + clearDatabase(); + + ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray()); + InputStreamReader inStream = new InputStreamReader(inData); + + // Import the CSV data + result = MultiFormatImporter.importData(db, inStream, DataFormat.CSV); + assertTrue(result); + + assertEquals(NUM_CARDS, db.getLoyaltyCardCount()); + + checkLoyaltyCardsFiveStarred(); + + // Clear the database for the next format under test + clearDatabase(); + } + } + @Test public void importExistingCardsNotReplace() throws IOException { @@ -291,11 +399,13 @@ public class ImportExportTest { String csvText = ""; csvText += DBHelper.LoyaltyCardDbIds.ID + "," + - DBHelper.LoyaltyCardDbIds.STORE + "," + - DBHelper.LoyaltyCardDbIds.NOTE + "," + - DBHelper.LoyaltyCardDbIds.CARD_ID + "," + - DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + "\n"; - csvText += "1,store,note,12345,type"; + DBHelper.LoyaltyCardDbIds.STORE + "," + + DBHelper.LoyaltyCardDbIds.NOTE + "," + + DBHelper.LoyaltyCardDbIds.CARD_ID + "," + + DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + "," + + DBHelper.LoyaltyCardDbIds.STAR_STATUS + "\n"; + + csvText += "1,store,note,12345,type,0"; ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); InputStreamReader inStream = new InputStreamReader(inputStream); @@ -311,6 +421,7 @@ public class ImportExportTest assertEquals("note", card.note); assertEquals("12345", card.cardId); assertEquals("type", card.barcodeType); + assertEquals(0, card.starStatus); assertNull(card.headerColor); assertNull(card.headerTextColor); } @@ -325,8 +436,10 @@ public class ImportExportTest DBHelper.LoyaltyCardDbIds.CARD_ID + "," + DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + "," + DBHelper.LoyaltyCardDbIds.HEADER_COLOR + "," + - DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR + "\n"; - csvText += "1,store,note,12345,type,,"; + DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR + "," + + DBHelper.LoyaltyCardDbIds.STAR_STATUS + "\n"; + + csvText += "1,store,note,12345,type,,,0"; ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); InputStreamReader inStream = new InputStreamReader(inputStream); @@ -342,6 +455,7 @@ public class ImportExportTest assertEquals("note", card.note); assertEquals("12345", card.cardId); assertEquals("type", card.barcodeType); + assertEquals(0, card.starStatus); assertNull(card.headerColor); assertNull(card.headerTextColor); } @@ -356,8 +470,10 @@ public class ImportExportTest DBHelper.LoyaltyCardDbIds.CARD_ID + "," + DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + "," + DBHelper.LoyaltyCardDbIds.HEADER_COLOR + "," + - DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR + "\n"; - csvText += "1,store,note,12345,type,not a number,invalid"; + DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR + "," + + DBHelper.LoyaltyCardDbIds.STAR_STATUS + "\n"; + + csvText += "1,store,note,12345,type,not a number,invalid,0"; ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); InputStreamReader inStream = new InputStreamReader(inputStream); @@ -378,8 +494,10 @@ public class ImportExportTest DBHelper.LoyaltyCardDbIds.CARD_ID + "," + DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + "," + DBHelper.LoyaltyCardDbIds.HEADER_COLOR + "," + - DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR + "\n"; - csvText += "1,store,note,12345,,1,1"; + DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR + "," + + DBHelper.LoyaltyCardDbIds.STAR_STATUS + "\n"; + + csvText += "1,store,note,12345,,1,1,0"; ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); InputStreamReader inStream = new InputStreamReader(inputStream); @@ -395,7 +513,132 @@ public class ImportExportTest assertEquals("note", card.note); assertEquals("12345", card.cardId); assertEquals("", card.barcodeType); + assertEquals(0, card.starStatus); assertEquals(1, (long) card.headerColor); assertEquals(1, (long) card.headerTextColor); } + + @Test + public void importWithStarredField() throws IOException + { + String csvText = ""; + csvText += DBHelper.LoyaltyCardDbIds.ID + "," + + DBHelper.LoyaltyCardDbIds.STORE + "," + + DBHelper.LoyaltyCardDbIds.NOTE + "," + + DBHelper.LoyaltyCardDbIds.CARD_ID + "," + + DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + "," + + DBHelper.LoyaltyCardDbIds.HEADER_COLOR + "," + + DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR + "," + + DBHelper.LoyaltyCardDbIds.STAR_STATUS + "\n"; + + csvText += "1,store,note,12345,type,1,1,1"; + + ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); + InputStreamReader inStream = new InputStreamReader(inputStream); + + // Import the CSV data + boolean result = MultiFormatImporter.importData(db, inStream, DataFormat.CSV); + assertEquals(true, result); + assertEquals(1, db.getLoyaltyCardCount()); + + LoyaltyCard card = db.getLoyaltyCard(1); + + assertEquals("store", card.store); + assertEquals("note", card.note); + assertEquals("12345", card.cardId); + assertEquals("type", card.barcodeType); + assertEquals(1, card.starStatus); + assertEquals(1, (long) card.headerColor); + assertEquals(1, (long) card.headerTextColor); + } + + + + @Test + public void importWithNoStarredField() throws IOException + { + String csvText = ""; + csvText += DBHelper.LoyaltyCardDbIds.ID + "," + + DBHelper.LoyaltyCardDbIds.STORE + "," + + DBHelper.LoyaltyCardDbIds.NOTE + "," + + DBHelper.LoyaltyCardDbIds.CARD_ID + "," + + DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + "," + + DBHelper.LoyaltyCardDbIds.HEADER_COLOR + "," + + DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR + "," + + DBHelper.LoyaltyCardDbIds.STAR_STATUS + "\n"; + + csvText += "1,store,note,12345,type,1,1,"; + + ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); + InputStreamReader inStream = new InputStreamReader(inputStream); + + // Import the CSV data + boolean result = MultiFormatImporter.importData(db, inStream, DataFormat.CSV); + assertEquals(true, result); + assertEquals(1, db.getLoyaltyCardCount()); + + LoyaltyCard card = db.getLoyaltyCard(1); + + assertEquals("store", card.store); + assertEquals("note", card.note); + assertEquals("12345", card.cardId); + assertEquals("type", card.barcodeType); + assertEquals(0, card.starStatus); + assertEquals(1, (long) card.headerColor); + assertEquals(1, (long) card.headerTextColor); + } + + @Test + public void importWithInvalidStarField() throws IOException + { + String csvText = ""; + csvText += DBHelper.LoyaltyCardDbIds.ID + "," + + DBHelper.LoyaltyCardDbIds.STORE + "," + + DBHelper.LoyaltyCardDbIds.NOTE + "," + + DBHelper.LoyaltyCardDbIds.CARD_ID + "," + + DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + "," + + DBHelper.LoyaltyCardDbIds.HEADER_COLOR + "," + + DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR + "," + + DBHelper.LoyaltyCardDbIds.STAR_STATUS + "\n"; + + csvText += "1,store,note,12345,type,1,1,2"; + + ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); + InputStreamReader inStream = new InputStreamReader(inputStream); + + // Import the CSV data + boolean result = MultiFormatImporter.importData(db, inStream, DataFormat.CSV); + assertTrue(result); + assertEquals(1, db.getLoyaltyCardCount()); + + csvText = ""; + csvText += DBHelper.LoyaltyCardDbIds.ID + "," + + DBHelper.LoyaltyCardDbIds.STORE + "," + + DBHelper.LoyaltyCardDbIds.NOTE + "," + + DBHelper.LoyaltyCardDbIds.CARD_ID + "," + + DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + "," + + DBHelper.LoyaltyCardDbIds.HEADER_COLOR + "," + + DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR + "," + + DBHelper.LoyaltyCardDbIds.STAR_STATUS + "\n"; + + csvText += "1,store,note,12345,type,1,1,text"; + + inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); + inStream = new InputStreamReader(inputStream); + + // Import the CSV data + result = MultiFormatImporter.importData(db, inStream, DataFormat.CSV); + assertTrue(result); + assertEquals(1, db.getLoyaltyCardCount()); + + LoyaltyCard card = db.getLoyaltyCard(1); + + assertEquals("store", card.store); + assertEquals("note", card.note); + assertEquals("12345", card.cardId); + assertEquals("type", card.barcodeType); + assertEquals(0, card.starStatus); + assertEquals(1, (long) card.headerColor); + assertEquals(1, (long) card.headerTextColor); + } } diff --git a/app/src/test/java/protect/card_locker/ImportURITest.java b/app/src/test/java/protect/card_locker/ImportURITest.java index d6f6a3438..21df1ecf4 100644 --- a/app/src/test/java/protect/card_locker/ImportURITest.java +++ b/app/src/test/java/protect/card_locker/ImportURITest.java @@ -11,6 +11,7 @@ import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import java.io.InvalidObjectException; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -34,7 +35,7 @@ public class ImportURITest { public void ensureNoDataLoss() throws InvalidObjectException { // Generate card - db.insertLoyaltyCard("store", "note", BarcodeFormat.UPC_A.toString(), LoyaltyCardDbIds.BARCODE_TYPE, Color.BLACK, Color.WHITE); + db.insertLoyaltyCard("store", "note", BarcodeFormat.UPC_A.toString(), LoyaltyCardDbIds.BARCODE_TYPE, Color.BLACK, Color.WHITE, 1); // Get card LoyaltyCard card = db.getLoyaltyCard(1); @@ -52,13 +53,15 @@ public class ImportURITest { assertEquals(card.headerTextColor, parsedCard.headerTextColor); assertEquals(card.note, parsedCard.note); assertEquals(card.store, parsedCard.store); + // No export of starStatus for single cards foreseen therefore 0 will be imported + assertEquals(0, parsedCard.starStatus); } @Test public void ensureNoCrashOnMissingHeaderFields() throws InvalidObjectException { // Generate card - db.insertLoyaltyCard("store", "note", BarcodeFormat.UPC_A.toString(), LoyaltyCardDbIds.BARCODE_TYPE, null, null); + db.insertLoyaltyCard("store", "note", BarcodeFormat.UPC_A.toString(), LoyaltyCardDbIds.BARCODE_TYPE, null, null, 0); // Get card LoyaltyCard card = db.getLoyaltyCard(1); @@ -88,4 +91,36 @@ public class ImportURITest { // Desired behaviour } } + + @Test + public void failToParseBadData() + { + try { + //"stare" instead of store + importURIHelper.parse(Uri.parse("https://brarcher.github.io/loyalty-card-locker/share?stare=store¬e=note&cardid=12345&barcodetype=ITF&headercolor=-416706&headertextcolor=-1")); + assertTrue(false); // Shouldn't get here + } catch(InvalidObjectException ex) { + // Desired behaviour + } + } + + @Test + public void parseAdditionalUnforeseenData() + { + LoyaltyCard parsedCard = null; + try { + parsedCard = importURIHelper.parse(Uri.parse("https://brarcher.github.io/loyalty-card-locker/share?store=store¬e=note&cardid=12345&barcodetype=ITF&headercolor=-416706&headertextcolor=-1¬foreseen=no")); + } catch (InvalidObjectException e) { + e.printStackTrace(); + } + + // Compare everything + assertEquals("ITF", parsedCard.barcodeType); + assertEquals("12345", parsedCard.cardId); + assertEquals("note", parsedCard.note); + assertEquals("store", parsedCard.store); + assertEquals(Integer.valueOf(-416706), parsedCard.headerColor); + assertEquals(Integer.valueOf(-1), parsedCard.headerTextColor); + assertEquals(0, parsedCard.starStatus); + } } diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java index 9b719c895..4955c31b5 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java @@ -6,6 +6,7 @@ import android.database.Cursor; import android.graphics.Color; import android.preference.PreferenceManager; import android.view.View; +import android.widget.ImageView; import android.widget.TextView; import com.google.zxing.BarcodeFormat; @@ -83,7 +84,7 @@ public class LoyaltyCardCursorAdapterTest @Test public void TestCursorAdapterEmptyNote() { - db.insertLoyaltyCard("store", "", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE); + db.insertLoyaltyCard("store", "", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE, 0); LoyaltyCard card = db.getLoyaltyCard(1); Cursor cursor = db.getLoyaltyCardCursor(); @@ -97,7 +98,7 @@ public class LoyaltyCardCursorAdapterTest @Test public void TestCursorAdapterWithNote() { - db.insertLoyaltyCard("store", "note", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE); + db.insertLoyaltyCard("store", "note", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE, 0); LoyaltyCard card = db.getLoyaltyCard(1); Cursor cursor = db.getLoyaltyCardCursor(); @@ -111,7 +112,7 @@ public class LoyaltyCardCursorAdapterTest @Test public void TestCursorAdapterFontSizes() { - db.insertLoyaltyCard("store", "note", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE); + db.insertLoyaltyCard("store", "note", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE, 0); LoyaltyCard card = db.getLoyaltyCard(1); Cursor cursor = db.getLoyaltyCardCursor(); @@ -125,4 +126,29 @@ public class LoyaltyCardCursorAdapterTest view = createView(cursor); checkView(view, card.store, card.note, true); } + + @Test + public void TestCursorAdapterStarring() + { + db.insertLoyaltyCard("storeA", "note", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE, 0); + db.insertLoyaltyCard("storeB", "note", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE, 1); + db.insertLoyaltyCard("storeC", "note", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE, 1); + + + Cursor cursor = db.getLoyaltyCardCursor(); + cursor.moveToFirst(); + View view = createView(cursor); + ImageView star = view.findViewById(R.id.star); + assertEquals(View.VISIBLE, star.getVisibility()); + + cursor.moveToNext(); + view = createView(cursor); + star = view.findViewById(R.id.star); + assertEquals(View.VISIBLE, star.getVisibility()); + + cursor.moveToNext(); + view = createView(cursor); + star = view.findViewById(R.id.star); + assertEquals(View.GONE, star.getVisibility()); + } } diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java index 9d57c1ecd..05041685f 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java @@ -400,7 +400,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = new DBHelper(activity); - db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, Color.BLACK, Color.WHITE); + db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, Color.BLACK, Color.WHITE, 0); activityController.start(); activityController.visible(); @@ -416,7 +416,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = new DBHelper(activity); - db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, Color.BLACK, Color.WHITE); + db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, Color.BLACK, Color.WHITE, 0); activityController.start(); activityController.visible(); @@ -432,7 +432,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = new DBHelper(activity); - db.insertLoyaltyCard("store", "note", EAN_BARCODE_DATA, EAN_BARCODE_TYPE, Color.BLACK, Color.WHITE); + db.insertLoyaltyCard("store", "note", EAN_BARCODE_DATA, EAN_BARCODE_TYPE, Color.BLACK, Color.WHITE, 0); activityController.start(); activityController.visible(); @@ -453,7 +453,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = new DBHelper(activity); - db.insertLoyaltyCard("store", "note", EAN_BARCODE_DATA, EAN_BARCODE_TYPE, Color.BLACK, Color.WHITE); + db.insertLoyaltyCard("store", "note", EAN_BARCODE_DATA, EAN_BARCODE_TYPE, Color.BLACK, Color.WHITE, 0); activityController.start(); activityController.visible(); @@ -479,7 +479,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = new DBHelper(activity); - db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, Color.BLACK, Color.WHITE); + db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, Color.BLACK, Color.WHITE, 0); activityController.start(); activityController.visible(); @@ -488,11 +488,13 @@ public class LoyaltyCardViewActivityTest final Menu menu = shadowOf(activity).getOptionsMenu(); assertTrue(menu != null); - // The share and settings button should be present - assertEquals(menu.size(), 2); + // The share, settings, add and star button should be present + assertEquals(menu.size(), 4); assertEquals("Block Rotation", menu.findItem(R.id.action_lock_unlock).getTitle().toString()); assertEquals("Share", menu.findItem(R.id.action_share).getTitle().toString()); + assertEquals("Edit", menu.findItem(R.id.action_edit).getTitle().toString()); + assertEquals("Add to favorites", menu.findItem(R.id.action_star_unstar).getTitle().toString()); } @Test @@ -522,7 +524,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = new DBHelper(activity); - db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, Color.BLACK, Color.WHITE); + db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, Color.BLACK, Color.WHITE, 0); activityController.start(); activityController.visible(); @@ -540,7 +542,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = new DBHelper(activity); - db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, null, null); + db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, null, null, 0); activityController.start(); activityController.visible(); @@ -558,7 +560,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = new DBHelper(activity); - db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, null, null); + db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, null, null, 0); activityController.start(); activityController.visible(); @@ -575,7 +577,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = new DBHelper(activity); - db.insertLoyaltyCard("store", "note", BARCODE_DATA, "", Color.BLACK, Color.WHITE); + db.insertLoyaltyCard("store", "note", BARCODE_DATA, "", Color.BLACK, Color.WHITE, 0); activityController.start(); activityController.visible(); @@ -592,7 +594,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = new DBHelper(activity); - db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, Color.BLACK, Color.WHITE); + db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, Color.BLACK, Color.WHITE, 0); activityController.start(); activityController.visible(); @@ -619,7 +621,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = new DBHelper(activity); - db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, Color.BLACK, Color.WHITE); + db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, Color.BLACK, Color.WHITE, 0); final int STORE_FONT_SIZE = 50; final int CARD_FONT_SIZE = 40; @@ -661,7 +663,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = new DBHelper(activity); - db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, Color.BLACK, Color.WHITE); + db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, Color.BLACK, Color.WHITE, 0); SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(activity); settings.edit() @@ -689,6 +691,35 @@ public class LoyaltyCardViewActivityTest } } + @Test + public void checkPushStarIcon() + { + ActivityController activityController = createActivityWithLoyaltyCard(false); + + Activity activity = (Activity) activityController.get(); + DBHelper db = new DBHelper(activity); + db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, Color.BLACK, Color.WHITE,0); + activityController.start(); + activityController.visible(); + activityController.resume(); + + assertEquals(false, activity.isFinishing()); + + final Menu menu = shadowOf(activity).getOptionsMenu(); + assertTrue(menu != null); + + // The share, settings, add and star button should be present + assertEquals(menu.size(), 4); + + assertEquals("Add to favorites", menu.findItem(R.id.action_star_unstar).getTitle().toString()); + + shadowOf(activity).clickMenuItem(R.id.action_star_unstar); + assertEquals("Remove from favorites", menu.findItem(R.id.action_star_unstar).getTitle().toString()); + + shadowOf(activity).clickMenuItem(R.id.action_star_unstar); + assertEquals("Add to favorites", menu.findItem(R.id.action_star_unstar).getTitle().toString()); + } + @Test public void checkBarcodeFullscreenWorkflow() { @@ -696,7 +727,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = new DBHelper(activity); - db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, Color.BLACK, Color.WHITE); + db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE, Color.BLACK, Color.WHITE, 0); 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 866cf6742..1a3fb1a21 100644 --- a/app/src/test/java/protect/card_locker/MainActivityTest.java +++ b/app/src/test/java/protect/card_locker/MainActivityTest.java @@ -8,7 +8,6 @@ import android.content.SharedPreferences; import android.database.Cursor; import android.graphics.Color; import android.os.Bundle; -import androidx.appcompat.widget.SearchView; import android.view.Menu; import android.view.View; import android.widget.ListView; @@ -98,7 +97,7 @@ public class MainActivityTest assertEquals(0, list.getCount()); DBHelper db = new DBHelper(mainActivity); - db.insertLoyaltyCard("store", "note", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE); + db.insertLoyaltyCard("store", "note", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE, 0); assertEquals(View.VISIBLE, helpText.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); @@ -116,6 +115,56 @@ public class MainActivityTest assertNotNull(cursor); } + @Test + public void addFourLoyaltyCardsTwoStarred() // Main screen showing starred cards on top correctly + { + ActivityController activityController = Robolectric.buildActivity(MainActivity.class).create(); + + Activity mainActivity = (Activity)activityController.get(); + activityController.start(); + activityController.resume(); + + TextView helpText = mainActivity.findViewById(R.id.helpText); + TextView noMatchingCardsText = mainActivity.findViewById(R.id.noMatchingCardsText); + ListView list = mainActivity.findViewById(R.id.list); + + assertEquals(0, list.getCount()); + + DBHelper db = new DBHelper(mainActivity); + db.insertLoyaltyCard("storeB", "note", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE, 0); + db.insertLoyaltyCard("storeA", "note", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE, 0); + db.insertLoyaltyCard("storeD", "note", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE, 1); + db.insertLoyaltyCard("storeC", "note", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE, 1); + + assertEquals(View.VISIBLE, helpText.getVisibility()); + assertEquals(View.GONE, noMatchingCardsText.getVisibility()); + assertEquals(View.GONE, list.getVisibility()); + + activityController.pause(); + activityController.resume(); + + assertEquals(View.GONE, helpText.getVisibility()); + assertEquals(View.GONE, noMatchingCardsText.getVisibility()); + assertEquals(View.VISIBLE, list.getVisibility()); + + assertEquals(4, list.getAdapter().getCount()); + Cursor cursor = (Cursor)list.getAdapter().getItem(0); + assertNotNull(cursor); + assertEquals("storeC",cursor.getString(cursor.getColumnIndex("store"))); + + cursor = (Cursor)list.getAdapter().getItem(1); + assertNotNull(cursor); + assertEquals("storeD",cursor.getString(cursor.getColumnIndex("store"))); + + cursor = (Cursor)list.getAdapter().getItem(2); + assertNotNull(cursor); + assertEquals("storeA",cursor.getString(cursor.getColumnIndex("store"))); + + cursor = (Cursor)list.getAdapter().getItem(3); + assertNotNull(cursor); + assertEquals("storeB",cursor.getString(cursor.getColumnIndex("store"))); + } + @Test public void testFiltering() { @@ -130,8 +179,8 @@ public class MainActivityTest ListView list = mainActivity.findViewById(R.id.list); DBHelper db = new DBHelper(mainActivity); - db.insertLoyaltyCard("The First Store", "Initial note", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE); - db.insertLoyaltyCard("The Second Store", "Secondary note", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE); + db.insertLoyaltyCard("The First Store", "Initial note", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE, 0); + db.insertLoyaltyCard("The Second Store", "Secondary note", "cardId", BarcodeFormat.UPC_A.toString(), Color.BLACK, Color.WHITE, 0); activityController.pause(); activityController.resume(); diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7495a5e82..9013ee43f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,4 +1,4 @@ -#Wed Jun 27 14:32:00 EDT 2018 +#Sun Jul 19 15:12:56 CEST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME