diff --git a/app/src/main/java/protect/card_locker/DBHelper.java b/app/src/main/java/protect/card_locker/DBHelper.java index 9e51043f2..616dbba96 100644 --- a/app/src/main/java/protect/card_locker/DBHelper.java +++ b/app/src/main/java/protect/card_locker/DBHelper.java @@ -10,13 +10,15 @@ import android.database.sqlite.SQLiteOpenHelper; public class DBHelper extends SQLiteOpenHelper { public static final String DATABASE_NAME = "LoyaltyCards.db"; - public static final int DATABASE_VERSION = 1; + public static final int ORIGINAL_DATABASE_VERSION = 1; + public static final int DATABASE_VERSION = 2; static class LoyaltyCardDbIds { public static final String TABLE = "cards"; public static final String ID = "_id"; public static final String STORE = "store"; + public static final String NOTE = "note"; public static final String CARD_ID = "cardid"; public static final String BARCODE_TYPE = "barcodetype"; } @@ -33,6 +35,7 @@ public class DBHelper extends SQLiteOpenHelper db.execSQL("create table " + LoyaltyCardDbIds.TABLE + "(" + LoyaltyCardDbIds.ID + " INTEGER primary key autoincrement," + LoyaltyCardDbIds.STORE + " TEXT not null," + + LoyaltyCardDbIds.NOTE + " TEXT not null," + LoyaltyCardDbIds.CARD_ID + " TEXT not null," + LoyaltyCardDbIds.BARCODE_TYPE + " TEXT not null)"); } @@ -40,16 +43,21 @@ public class DBHelper extends SQLiteOpenHelper @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - // Do not support versioning yet - db.execSQL("DROP TABLE IF EXISTS " + LoyaltyCardDbIds.TABLE); - onCreate(db); + // Upgrade from version 1 to version 2 + if(oldVersion < 2 && newVersion >= 2) + { + db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE + + " ADD COLUMN " + LoyaltyCardDbIds.NOTE + " TEXT not null default ''"); + } } - public boolean insertLoyaltyCard(final String store, final String cardId, final String barcodeType) + public boolean insertLoyaltyCard(final String store, final String note, final String cardId, + final String barcodeType) { SQLiteDatabase db = getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(LoyaltyCardDbIds.STORE, store); + contentValues.put(LoyaltyCardDbIds.NOTE, note); contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId); contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType); final long newId = db.insert(LoyaltyCardDbIds.TABLE, null, contentValues); @@ -57,12 +65,13 @@ public class DBHelper extends SQLiteOpenHelper } - public boolean updateLoyaltyCard(final int id, final String store, final String cardId, - final String barcodeType) + public boolean updateLoyaltyCard(final int id, final String store, final String note, + final String cardId, final String barcodeType) { SQLiteDatabase db = getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(LoyaltyCardDbIds.STORE, store); + contentValues.put(LoyaltyCardDbIds.NOTE, note); contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId); contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType); int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues, diff --git a/app/src/main/java/protect/card_locker/LoyaltyCard.java b/app/src/main/java/protect/card_locker/LoyaltyCard.java index 504692fac..591491344 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCard.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCard.java @@ -6,13 +6,15 @@ public class LoyaltyCard { public final int id; public final String store; + public final String note; public final String cardId; public final String barcodeType; - public LoyaltyCard(final int id, final String store, final String cardId, final String barcodeType) + public LoyaltyCard(final int id, final String store, final String note, final String cardId, final String barcodeType) { this.id = id; this.store = store; + this.note = note; this.cardId = cardId; this.barcodeType = barcodeType; } @@ -21,9 +23,10 @@ public class LoyaltyCard { int id = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID)); String store = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE)); + 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)); - return new LoyaltyCard(id, store, cardId, barcodeType); + return new LoyaltyCard(id, store, note, cardId, barcodeType); } } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java index a53236a00..937e93b61 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java @@ -77,6 +77,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity Log.i(TAG, "To view card: " + loyaltyCardId); final EditText storeField = (EditText) findViewById(R.id.storeName); + final EditText noteField = (EditText) findViewById(R.id.note); final EditText cardIdField = (EditText) findViewById(R.id.cardId); final EditText barcodeTypeField = (EditText) findViewById(R.id.barcodeType); final ImageView barcodeImage = (ImageView) findViewById(R.id.barcode); @@ -97,6 +98,11 @@ public class LoyaltyCardViewActivity extends AppCompatActivity storeField.setText(loyaltyCard.store); + if(noteField.getText().length() == 0) + { + noteField.setText(loyaltyCard.note); + } + if(cardIdField.getText().length() == 0) { cardIdField.setText(loyaltyCard.cardId); @@ -110,6 +116,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity if(viewLoyaltyCard) { storeField.setEnabled(false); + noteField.setEnabled(false); } if(updateLoyaltyCard) @@ -213,6 +220,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity public void onClick(final View v) { String store = storeField.getText().toString(); + String note = noteField.getText().toString(); String cardId = cardIdField.getText().toString(); String barcodeType = barcodeTypeField.getText().toString(); @@ -230,12 +238,12 @@ public class LoyaltyCardViewActivity extends AppCompatActivity if(updateLoyaltyCard) { - db.updateLoyaltyCard(loyaltyCardId, store, cardId, barcodeType); + db.updateLoyaltyCard(loyaltyCardId, store, note, cardId, barcodeType); Log.i(TAG, "Updated " + loyaltyCardId + " to " + cardId); } else { - db.insertLoyaltyCard(store, cardId, barcodeType); + db.insertLoyaltyCard(store, note, cardId, barcodeType); } finish(); diff --git a/app/src/main/res/layout/loyalty_card_view_activity.xml b/app/src/main/res/layout/loyalty_card_view_activity.xml index 5e53fbb1b..03aedbadb 100644 --- a/app/src/main/res/layout/loyalty_card_view_activity.xml +++ b/app/src/main/res/layout/loyalty_card_view_activity.xml @@ -52,6 +52,28 @@ android:inputType="text"/> + + + + + + You don\'t have any loyalty cards at the moment. Click the "+" (plus) button up top to get started.\n\nLoyalty Card Locker lets you carry your loyalty cards on your phone, so they are always within reach. Store + Note Card ID Barcode Type diff --git a/app/src/test/java/protect/card_locker/DatabaseTest.java b/app/src/test/java/protect/card_locker/DatabaseTest.java index 0de2deb75..88761c8a3 100644 --- a/app/src/test/java/protect/card_locker/DatabaseTest.java +++ b/app/src/test/java/protect/card_locker/DatabaseTest.java @@ -1,7 +1,9 @@ package protect.card_locker; import android.app.Activity; +import android.content.ContentValues; import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; import com.google.zxing.BarcodeFormat; @@ -34,13 +36,14 @@ public class DatabaseTest public void addRemoveOneGiftCard() { assertEquals(0, db.getLoyaltyCardCount()); - boolean result = db.insertLoyaltyCard("store", "cardId", BarcodeFormat.UPC_A.toString()); + boolean result = db.insertLoyaltyCard("store", "note", "cardId", BarcodeFormat.UPC_A.toString()); 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(BarcodeFormat.UPC_A.toString(), loyaltyCard.barcodeType); @@ -53,17 +56,18 @@ public class DatabaseTest @Test public void updateGiftCard() { - boolean result = db.insertLoyaltyCard("store", "cardId", BarcodeFormat.UPC_A.toString()); + boolean result = db.insertLoyaltyCard("store", "note", "cardId", BarcodeFormat.UPC_A.toString()); assertTrue(result); assertEquals(1, db.getLoyaltyCardCount()); - result = db.updateLoyaltyCard(1, "store1", "cardId1", BarcodeFormat.AZTEC.toString()); + result = db.updateLoyaltyCard(1, "store1", "note1", "cardId1", BarcodeFormat.AZTEC.toString()); assertTrue(result); assertEquals(1, db.getLoyaltyCardCount()); LoyaltyCard loyaltyCard = db.getLoyaltyCard(1); assertNotNull(loyaltyCard); assertEquals("store1", loyaltyCard.store); + assertEquals("note1", loyaltyCard.note); assertEquals("cardId1", loyaltyCard.cardId); assertEquals(BarcodeFormat.AZTEC.toString(), loyaltyCard.barcodeType); } @@ -73,7 +77,8 @@ public class DatabaseTest { assertEquals(0, db.getLoyaltyCardCount()); - boolean result = db.updateLoyaltyCard(1, "store1", "cardId1", BarcodeFormat.UPC_A.toString()); + boolean result = db.updateLoyaltyCard(1, "store1", "note1", "cardId1", + BarcodeFormat.UPC_A.toString()); assertEquals(false, result); assertEquals(0, db.getLoyaltyCardCount()); } @@ -81,13 +86,14 @@ public class DatabaseTest @Test public void emptyGiftCardValues() { - boolean result = db.insertLoyaltyCard("", "", ""); + boolean result = db.insertLoyaltyCard("", "", "", ""); assertTrue(result); assertEquals(1, db.getLoyaltyCardCount()); LoyaltyCard loyaltyCard = db.getLoyaltyCard(1); assertNotNull(loyaltyCard); assertEquals("", loyaltyCard.store); + assertEquals("", loyaltyCard.note); assertEquals("", loyaltyCard.cardId); assertEquals("", loyaltyCard.barcodeType); } @@ -101,7 +107,8 @@ public class DatabaseTest // that they are sorted for(int index = CARDS_TO_ADD-1; index >= 0; index--) { - boolean result = db.insertLoyaltyCard("store" + index, "cardId" + index, BarcodeFormat.UPC_A.toString()); + boolean result = db.insertLoyaltyCard("store" + index, "note" + index, "cardId" + index, + BarcodeFormat.UPC_A.toString()); assertTrue(result); } @@ -117,6 +124,7 @@ public class DatabaseTest for(int index = 0; index < CARDS_TO_ADD; 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(BarcodeFormat.UPC_A.toString(), cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_TYPE))); @@ -125,4 +133,54 @@ public class DatabaseTest assertTrue(cursor.isAfterLast()); } + + private void setupDatabaseVersion1(SQLiteDatabase database) + { + // Delete the tables as they exist now + database.execSQL("drop table " + DBHelper.LoyaltyCardDbIds.TABLE); + + // Create the table as it existed in revision 1 + database.execSQL("create table " + DBHelper.LoyaltyCardDbIds.TABLE + "(" + + DBHelper.LoyaltyCardDbIds.ID + " INTEGER primary key autoincrement," + + DBHelper.LoyaltyCardDbIds.STORE + " TEXT not null," + + DBHelper.LoyaltyCardDbIds.CARD_ID + " TEXT not null," + + DBHelper.LoyaltyCardDbIds.BARCODE_TYPE + " TEXT not null)"); + } + + private int insertCardVersion1(SQLiteDatabase database, + final String store, final String cardId, + final String barcodeType) + { + ContentValues contentValues = new ContentValues(); + contentValues.put(DBHelper.LoyaltyCardDbIds.STORE, store); + contentValues.put(DBHelper.LoyaltyCardDbIds.CARD_ID, cardId); + contentValues.put(DBHelper.LoyaltyCardDbIds.BARCODE_TYPE, barcodeType); + final long newId = database.insert(DBHelper.LoyaltyCardDbIds.TABLE, null, contentValues); + assertTrue(newId != -1); + return (int)newId; + } + + @Test + public void databaseUpgradeFromVersion1() + { + SQLiteDatabase database = db.getWritableDatabase(); + + // Setup the database as it appeared in revision 1 + setupDatabaseVersion1(database); + + // Insert a budget and transaction + int newCardId = insertCardVersion1(database, "store", "cardId", BarcodeFormat.UPC_A.toString()); + + // Upgrade database + db.onUpgrade(database, DBHelper.ORIGINAL_DATABASE_VERSION, DBHelper.DATABASE_VERSION); + + // Determine that the entries are queryable and the fields are correct + LoyaltyCard card = db.getLoyaltyCard(newCardId); + assertEquals("store", card.store); + assertEquals("cardId", card.cardId); + assertEquals(BarcodeFormat.UPC_A.toString(), card.barcodeType); + assertEquals("", card.note); + + database.close(); + } } diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java index cbe51d0ec..17350d5b0 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java @@ -68,7 +68,8 @@ public class LoyaltyCardViewActivityTest * expected values */ private void saveLoyaltyCardWithArguments(final Activity activity, - final String store, final String cardId, + final String store, final String note, + final String cardId, final String barcodeType, boolean creatingNewCard) { @@ -83,12 +84,14 @@ public class LoyaltyCardViewActivityTest } final EditText storeField = (EditText) activity.findViewById(R.id.storeName); + final EditText noteField = (EditText) activity.findViewById(R.id.note); final EditText cardIdField = (EditText) activity.findViewById(R.id.cardId); final EditText barcodeTypeField = (EditText) activity.findViewById(R.id.barcodeType); final Button saveButton = (Button) activity.findViewById(R.id.saveButton); storeField.setText(store); + noteField.setText(note); cardIdField.setText(cardId); barcodeTypeField.setText(barcodeType); @@ -100,6 +103,7 @@ public class LoyaltyCardViewActivityTest LoyaltyCard card = db.getLoyaltyCard(1); assertEquals(store, card.store); + assertEquals(note, card.note); assertEquals(cardId, card.cardId); assertEquals(barcodeType, card.barcodeType); } @@ -154,13 +158,14 @@ public class LoyaltyCardViewActivityTest } } - private void checkAllFields(final Activity activity, boolean editMode, final String store, final String cardId, - final String barcodeType) + private void checkAllFields(final Activity activity, boolean editMode, final String store, + final String note, final String cardId, final String barcodeType) { int cardIdVisibility = cardId.isEmpty() ? View.GONE : View.VISIBLE; int captureVisibility = editMode ? View.VISIBLE : View.GONE; checkFieldProperties(activity, R.id.storeName, View.VISIBLE, editMode, store); + checkFieldProperties(activity, R.id.note, View.VISIBLE, editMode, note); checkFieldProperties(activity, R.id.cardId, View.VISIBLE, false, cardId); checkFieldProperties(activity, R.id.barcodeType, View.VISIBLE, false, barcodeType); checkFieldProperties(activity, R.id.captureButton, captureVisibility, true, null); @@ -183,7 +188,7 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); - checkAllFields(activity, true, "", "", ""); + checkAllFields(activity, true, "", "", "", ""); } @Test @@ -199,6 +204,7 @@ public class LoyaltyCardViewActivityTest assertEquals(0, db.getLoyaltyCardCount()); final EditText storeField = (EditText) activity.findViewById(R.id.storeName); + final EditText noteField = (EditText) activity.findViewById(R.id.note); final EditText cardIdField = (EditText) activity.findViewById(R.id.cardId); final Button saveButton = (Button) activity.findViewById(R.id.saveButton); @@ -210,6 +216,10 @@ public class LoyaltyCardViewActivityTest saveButton.performClick(); assertEquals(0, db.getLoyaltyCardCount()); + noteField.setText("note"); + saveButton.performClick(); + assertEquals(0, db.getLoyaltyCardCount()); + cardIdField.setText("cardId"); saveButton.performClick(); assertEquals(0, db.getLoyaltyCardCount()); @@ -244,15 +254,15 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); - checkAllFields(activity, true, "", "", ""); + checkAllFields(activity, true, "", "", "", ""); // Complete barcode capture successfully captureBarcodeWithResult(activity, R.id.captureButton, true); - checkAllFields(activity, true, "", BARCODE_DATA, BARCODE_TYPE); + checkAllFields(activity, true, "", "", BARCODE_DATA, BARCODE_TYPE); // Save and check the gift card - saveLoyaltyCardWithArguments(activity, "store", BARCODE_DATA, BARCODE_TYPE, true); + saveLoyaltyCardWithArguments(activity, "store", "note", BARCODE_DATA, BARCODE_TYPE, true); } @Test @@ -265,12 +275,12 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); - checkAllFields(activity, true, "", "", ""); + checkAllFields(activity, true, "", "", "", ""); // Complete barcode capture in failure captureBarcodeWithResult(activity, R.id.captureButton, false); - checkAllFields(activity, true, "", "", ""); + checkAllFields(activity, true, "", "", "", ""); } @Test @@ -283,12 +293,12 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); - checkAllFields(activity, true, "", "", ""); + checkAllFields(activity, true, "", "", "", ""); // Complete barcode capture successfully captureBarcodeWithResult(activity, R.id.captureButton, true); - checkAllFields(activity, true, "", BARCODE_DATA, BARCODE_TYPE); + checkAllFields(activity, true, "", "", BARCODE_DATA, BARCODE_TYPE); // Cancel the gift card creation final Button cancelButton = (Button) activity.findViewById(R.id.cancelButton); @@ -324,13 +334,13 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = new DBHelper(activity); - db.insertLoyaltyCard("store", BARCODE_DATA, BARCODE_TYPE); + db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE); activityController.start(); activityController.visible(); activityController.resume(); - checkAllFields(activity, true, "store", BARCODE_DATA, BARCODE_TYPE); + checkAllFields(activity, true, "store", "note", BARCODE_DATA, BARCODE_TYPE); } @Test @@ -340,13 +350,13 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = new DBHelper(activity); - db.insertLoyaltyCard("store", BARCODE_DATA, BARCODE_TYPE); + db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE); activityController.start(); activityController.visible(); activityController.resume(); - checkAllFields(activity, false, "store", BARCODE_DATA, BARCODE_TYPE); + checkAllFields(activity, false, "store", "note", BARCODE_DATA, BARCODE_TYPE); } @Test @@ -356,18 +366,18 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = new DBHelper(activity); - db.insertLoyaltyCard("store", EAN_BARCODE_DATA, EAN_BARCODE_TYPE); + db.insertLoyaltyCard("store", "note", EAN_BARCODE_DATA, EAN_BARCODE_TYPE); activityController.start(); activityController.visible(); activityController.resume(); - checkAllFields(activity, true, "store", EAN_BARCODE_DATA, EAN_BARCODE_TYPE); + checkAllFields(activity, true, "store", "note", EAN_BARCODE_DATA, EAN_BARCODE_TYPE); // Complete barcode capture successfully captureBarcodeWithResult(activity, R.id.captureButton, true); - checkAllFields(activity, true, "store", BARCODE_DATA, BARCODE_TYPE); + checkAllFields(activity, true, "store", "note", BARCODE_DATA, BARCODE_TYPE); } @Test @@ -377,18 +387,18 @@ public class LoyaltyCardViewActivityTest Activity activity = (Activity)activityController.get(); DBHelper db = new DBHelper(activity); - db.insertLoyaltyCard("store", EAN_BARCODE_DATA, EAN_BARCODE_TYPE); + db.insertLoyaltyCard("store", "note", EAN_BARCODE_DATA, EAN_BARCODE_TYPE); activityController.start(); activityController.visible(); activityController.resume(); - checkAllFields(activity, true, "store", EAN_BARCODE_DATA, EAN_BARCODE_TYPE); + checkAllFields(activity, true, "store", "note", EAN_BARCODE_DATA, EAN_BARCODE_TYPE); // Complete barcode capture successfully captureBarcodeWithResult(activity, R.id.captureButton, true); - checkAllFields(activity, true, "store", BARCODE_DATA, BARCODE_TYPE); + checkAllFields(activity, true, "store", "note", BARCODE_DATA, BARCODE_TYPE); // Cancel the gift card creation final Button cancelButton = (Button) activity.findViewById(R.id.cancelButton); diff --git a/app/src/test/java/protect/card_locker/MainActivityTest.java b/app/src/test/java/protect/card_locker/MainActivityTest.java index 185142455..d345ba669 100644 --- a/app/src/test/java/protect/card_locker/MainActivityTest.java +++ b/app/src/test/java/protect/card_locker/MainActivityTest.java @@ -83,7 +83,7 @@ public class MainActivityTest assertEquals(0, list.getCount()); DBHelper db = new DBHelper(mainActivity); - db.insertLoyaltyCard("store", "cardId", BarcodeFormat.UPC_A.toString()); + db.insertLoyaltyCard("store", "note", "cardId", BarcodeFormat.UPC_A.toString()); assertEquals(View.VISIBLE, helpText.getVisibility()); assertEquals(View.GONE, list.getVisibility());