Compare commits

..

28 Commits
v0.2 ... v0.4

Author SHA1 Message Date
Branden Archer
b2e333c379 Merge pull request #30 from brarcher/pre-v0.4
Update for release v0.4
2016-04-09 22:26:30 -04:00
Branden Archer
2b058ee766 Update for release v0.4 2016-04-09 22:21:23 -04:00
Branden Archer
fc3302219e Merge pull request #29 from brarcher/note-field
Add a note field
2016-04-09 22:18:35 -04:00
Branden Archer
e0a77e9628 display store and note on card summary view
Dutch translation provided by PanderMusubi

Related issues:
https://github.com/brarcher/loyalty-card-locker/issues/23
https://github.com/brarcher/loyalty-card-locker/issues/24
2016-04-09 22:11:20 -04:00
Branden Archer
f6f749de1c Use multi exception catch for idential exceptions 2016-03-20 18:05:51 -04:00
Branden Archer
61dec10e74 Do not overwrite store field when capturing barcode 2016-03-20 18:05:51 -04:00
Branden Archer
9306e1a3d9 Add ability to store a note with loyalty card 2016-03-20 18:05:51 -04:00
Branden Archer
62e4fa402c split parts of test into separate methods
in the future additional tests will be added, and this will
allow for more reuse
2016-03-20 18:05:51 -04:00
Branden Archer
d12edd06a4 Merge pull request #28 from brarcher/dutch
Add Dutch translations
2016-03-16 23:02:28 -04:00
Branden Archer
4a8bc4744d Add Dutch translations
These are provided by PanderMusubi

https://github.com/brarcher/loyalty-card-locker/issues/27
2016-03-16 22:54:31 -04:00
Branden Archer
34faf18deb Merge pull request #26 from brarcher/edit-name
Edit name
2016-03-12 21:26:18 -05:00
Branden Archer
8c371751a7 Allow store name to be editable after creation 2016-03-11 21:53:38 -05:00
Branden Archer
c21c81f2c7 Correct names of unit tests
Some of the tests mentioned "Gift" cards, but should mention
"Loyalty" cards instead. Additionally, made one unit test's
intention more clear.
2016-03-11 21:53:38 -05:00
Branden Archer
77afaf1a3d Merge pull request #22 from brarcher/findbugs
enable findbugs in travis-ci build
2016-02-20 16:29:24 -05:00
Branden Archer
eb61f81b52 cat unit test failure report if failures found 2016-02-20 13:47:30 -05:00
Branden Archer
0289720c09 enable findbugs during travis-ci build 2016-02-20 13:46:53 -05:00
Branden Archer
5f2e3a5e1d Change inner class to be static 2016-02-20 13:31:34 -05:00
Branden Archer
5bc992f7f8 Merge pull request #15 from brarcher/readme
mention barcode types in README.md
2016-02-11 06:32:17 -05:00
Branden Archer
a2ab434d01 Merge branch 'master' into readme 2016-02-11 01:36:03 -05:00
Branden Archer
9593b94a2b Merge pull request #16 from brarcher/pre-v0.3
update version for next release
2016-02-11 01:35:56 -05:00
Branden Archer
075a440e4f update version for next release 2016-02-11 01:30:12 -05:00
Branden Archer
c6967f6a3f mention barcode types in README.md 2016-02-11 01:29:30 -05:00
Branden Archer
a8ca5470c7 Merge pull request #14 from brarcher/update-zxing-android-embedded
update zxing-android-embedded to latest release
2016-02-11 01:22:41 -05:00
Branden Archer
4d277eff51 update zxing-android-embedded to latest release
there was an issue with requesting camera permission
for Android 6 which was resolved in release 3.2.0.
2016-02-11 01:00:02 -05:00
Branden Archer
c51531e367 Merge pull request #13 from brarcher/all-barcodes
All barcodes
2016-02-10 21:49:21 -05:00
Branden Archer
5e57d66daa Do not bring up keyboard in view activity
Typically one will open the view activity to bring up a
barcode, and the keyboard is not expected. Disable the
keyboard until an editable field is selected.
2016-02-10 21:42:57 -05:00
Branden Archer
73aff4aeb8 Support all barcodes zxing can generate 2016-02-10 21:42:57 -05:00
Branden Archer
e6241b5a47 Update to using latest zxing library release, 3.2.1 2016-02-10 21:42:57 -05:00
19 changed files with 384 additions and 91 deletions

View File

@@ -19,7 +19,9 @@ android:
# if you need to run emulator(s) during your tests
- sys-img-x86-android-17
script: gradle build lint test
script: gradle build lint findbugs test
after_failure:
- cat app/build/outputs/lint-results.xml
- cat app/build/reports/findbugs/findbugs.html
- cat app/build/reports/tests/debug/index.html

View File

@@ -4,7 +4,19 @@
[![F-Droid](https://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Get_it_on_F-Droid.svg/160px-Get_it_on_F-Droid.svg.png)](https://f-droid.org/repository/browse/?fdid=protect.card_locker "Loyalty Card Locker on F-Droid")
Stores all of your store loyalty cards on your phone, removing the need to carry them around.
Stores all of your store loyalty cards on your phone, removing the need to carry them around. Currently the following barcode types are supported:
- AZTEC
- CODABAR
- CODE_39
- CODE_128
- DATA_MATRIX
- EAN_8
- EAN_13
- ITF
- PDF_417
- QR_CODE
- UPC_A
If there is any interest in improving this project, kindly submit a pull request with
proposed changes.

View File

@@ -1,4 +1,10 @@
apply plugin: 'com.android.application'
apply plugin: 'findbugs'
findbugs {
sourceSets = []
ignoreFailures = false
}
android {
compileSdkVersion 23
@@ -8,8 +14,8 @@ android {
applicationId "protect.card_locker"
minSdkVersion 17
targetSdkVersion 23
versionCode 2
versionName "0.2"
versionCode 4
versionName "0.4"
}
buildTypes {
release {
@@ -31,8 +37,27 @@ dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile 'com.journeyapps:zxing-android-embedded:3.0.1@aar'
compile 'com.google.zxing:core:3.2.0'
compile 'com.journeyapps:zxing-android-embedded:3.2.0@aar'
compile 'com.google.zxing:core:3.2.1'
testCompile 'junit:junit:4.12'
testCompile "org.robolectric:robolectric:3.0"
}
task findbugs(type: FindBugs, dependsOn: assembleDebug) {
description 'Run findbugs'
group 'verification'
classes = fileTree('build/intermediates/classes/debug/')
source = fileTree('src/main/java')
classpath = files()
effort = 'max'
excludeFilter = file("./config/findbugs/exclude.xml")
reports {
xml.enabled = false
html.enabled = true
}
}

View File

@@ -0,0 +1,10 @@
<FindBugsFilter>
<Match>
<Class name="~.*R\$.*"/>
</Match>
<Match>
<Class name="~.*Manifest\$.*"/>
</Match>
</FindBugsFilter>

View File

@@ -35,6 +35,7 @@
android:name=".LoyaltyCardViewActivity"
android:theme="@style/AppTheme.NoActionBar"
android:configChanges="orientation|screenSize"
android:windowSoftInputMode="stateHidden"
android:parentActivityName="protect.card_locker.MainActivity"/>
</application>

View File

@@ -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;
class LoyaltyCardDbIds
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,

View File

@@ -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);
}
}

View File

@@ -36,7 +36,14 @@ class LoyaltyCardCursorAdapter extends CursorAdapter
LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(cursor);
// Populate fields with extracted properties
storeField.setText(loyaltyCard.store);
String storeAndNote = loyaltyCard.store;
if(loyaltyCard.note.isEmpty() == false)
{
String storeNameAndNoteFormat = view.getResources().getString(R.string.storeNameAndNoteFormat);
storeAndNote = String.format(storeNameAndNoteFormat, loyaltyCard.store, loyaltyCard.note);
}
storeField.setText(storeAndNote);
String cardIdFormat = view.getResources().getString(R.string.cardIdFormat);
String cardIdLabel = view.getResources().getString(R.string.cardId);

View File

@@ -23,11 +23,32 @@ import com.google.zxing.common.BitMatrix;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
public class LoyaltyCardViewActivity extends AppCompatActivity
{
private static final String TAG = "CardLocker";
// These are all the barcode types that the zxing library
// is able to generate a barcode for, and thus should be
// the only barcodes which we should attempt to scan.
Collection<String> supportedBarcodeTypes = Collections.unmodifiableList(Arrays.asList(
BarcodeFormat.AZTEC.name(),
BarcodeFormat.CODE_39.name(),
BarcodeFormat.CODE_128.name(),
BarcodeFormat.CODABAR.name(),
BarcodeFormat.DATA_MATRIX.name(),
BarcodeFormat.EAN_8.name(),
BarcodeFormat.EAN_13.name(),
BarcodeFormat.ITF.name(),
BarcodeFormat.PDF_417.name(),
BarcodeFormat.QR_CODE.name(),
BarcodeFormat.UPC_A.name()
));
@Override
protected void onCreate(Bundle savedInstanceState)
{
@@ -56,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);
@@ -74,7 +96,15 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
{
final LoyaltyCard loyaltyCard = db.getLoyaltyCard(loyaltyCardId);
storeField.setText(loyaltyCard.store);
if(storeField.getText().length() == 0)
{
storeField.setText(loyaltyCard.store);
}
if(noteField.getText().length() == 0)
{
noteField.setText(loyaltyCard.note);
}
if(cardIdField.getText().length() == 0)
{
@@ -86,7 +116,11 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
barcodeTypeField.setText(loyaltyCard.barcodeType);
}
storeField.setEnabled(false);
if(viewLoyaltyCard)
{
storeField.setEnabled(false);
noteField.setEnabled(false);
}
if(updateLoyaltyCard)
{
@@ -126,11 +160,14 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
throw new IllegalArgumentException("Unrecognized barcode format: " + formatString);
}
int generateWidth = 100;
int generateHeight = 100;
String cardIdString = cardIdField.getText().toString();
Log.i(TAG, "Card: " + cardIdString);
result = writer.encode(cardIdString, format, 1500, 400, null);
result = writer.encode(cardIdString, format, generateWidth, generateHeight, null);
final int WHITE = 0xFFFFFFFF;
final int BLACK = 0xFF000000;
@@ -154,11 +191,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
barcodeIdLayout.setVisibility(View.VISIBLE);
barcodeImageLayout.setVisibility(View.VISIBLE);
}
catch (WriterException e)
{
Log.e(TAG, "Failed to generate barcode", e);
}
catch(IllegalArgumentException e)
catch (WriterException | IllegalArgumentException e)
{
Log.e(TAG, "Failed to generate barcode", e);
}
@@ -170,7 +203,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity
public void onClick(View v)
{
IntentIntegrator integrator = new IntentIntegrator(LoyaltyCardViewActivity.this);
integrator.setDesiredBarcodeFormats(IntentIntegrator.ONE_D_CODE_TYPES);
integrator.setDesiredBarcodeFormats(supportedBarcodeTypes);
String prompt = getResources().getString(R.string.scanCardBarcode);
integrator.setPrompt(prompt);
@@ -186,6 +219,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();
@@ -203,12 +237,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();

View File

@@ -13,7 +13,8 @@
android:id="@+id/store"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"/>
android:layout_weight="1.0"
android:maxLines="1"/>
</LinearLayout>
<LinearLayout android:orientation="horizontal"

View File

@@ -52,6 +52,28 @@
android:inputType="text"/>
</LinearLayout>
</LinearLayout>
<LinearLayout android:orientation="horizontal"
android:padding="10.0dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView android:textSize="16.0sp"
android:textStyle="bold"
android:layout_gravity="center_vertical"
android:paddingStart="20.0dip"
android:paddingEnd="20.0dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:labelFor="@+id/note"
android:text="@string/note" />
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<EditText android:id="@+id/note"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="text"/>
</LinearLayout>
</LinearLayout>
<LinearLayout android:orientation="horizontal"
android:padding="10.0dip"
android:layout_width="fill_parent"

View File

@@ -25,4 +25,5 @@
<string name="noCardIdError">Nessun codice carta inserito</string>
<string name="cardIdFormat">%1$s: %2$s</string>
<string name="note">Nota</string>
</resources>

View File

@@ -0,0 +1,29 @@
<resources>
<string name="app_name">Klantenkaartenkluis</string>
<string name="action_add">Voeg toe</string>
<string name="noGiftCards">Er zijn momenteel geen klantenkaarten toegevoegd. Klik de knop met "+" (plus) om te beginnen.\n\nKlantenkaartenkluis beheert klantenkaarten op een smartphone of tablet, zodat ze altijd binnen handbereik zijn.</string>
<string name="storeName">Winkel</string>
<string name="cardId">Kaart-ID</string>
<string name="barcodeType">Barcodetype</string>
<string name="cancel">Annuleer</string>
<string name="save">Sla op</string>
<string name="capture">Scan kaart</string>
<string name="edit">Bewerk</string>
<string name="delete">Verwijder</string>
<string name="editCardTitle">Bewerk klantenkaart</string>
<string name="addCardTitle">Voeg klantenkaart toe</string>
<string name="viewCardTitle">Bekijk klantenkaart</string>
<string name="scanCardBarcode">Scan barcode klantenkaart</string>
<string name="barcodeImageDescription">Afbeelding barcode klantenkaart</string>
<string name="noStoreError">Geen winkel toegevoegd</string>
<string name="noCardIdError">Geen kaart-ID toegevoegd</string>
<string name="cardIdFormat">%1$s: %2$s</string>
<string name="note">Notitie</string>
</resources>

View File

@@ -6,5 +6,5 @@
<dimen name="no_data_textSize">16sp</dimen>
<dimen name="no_data_padding">22dp</dimen>
<dimen name="barcode_disp_height">50dp</dimen>
<dimen name="barcode_disp_height">200dp</dimen>
</resources>

View File

@@ -5,6 +5,7 @@
<string name="noGiftCards">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.</string>
<string name="storeName">Store</string>
<string name="note">Note</string>
<string name="cardId">Card ID</string>
<string name="barcodeType">Barcode Type</string>
@@ -25,4 +26,5 @@
<string name="noCardIdError">No Card ID entered</string>
<string name="cardIdFormat">%1$s: %2$s</string>
<string name="storeNameAndNoteFormat" translatable="false">%1$s - %2$s</string>
</resources>

View File

@@ -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();
}
}

View File

@@ -7,12 +7,12 @@ import android.widget.TextView;
import com.google.zxing.BarcodeFormat;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.util.ActivityController;
import static org.junit.Assert.assertEquals;
@@ -20,32 +20,72 @@ import static org.junit.Assert.assertEquals;
@Config(constants = BuildConfig.class, sdk = 17)
public class LoyaltyCardCursorAdapterTest
{
@Test
public void TestCursorAdapter()
private Activity activity;
private DBHelper db;
@Before
public void setUp()
{
ActivityController activityController = Robolectric.buildActivity(MainActivity.class).create();
Activity activity = (Activity)activityController.get();
DBHelper db = new DBHelper(activity);
db.insertLoyaltyCard("store", "cardId", BarcodeFormat.UPC_A.toString());
LoyaltyCard card = db.getLoyaltyCard(1);
Cursor cursor = db.getLoyaltyCardCursor();
cursor.moveToFirst();
activity = Robolectric.setupActivity(MainActivity.class);
db = new DBHelper(activity);
}
private View createView(Cursor cursor)
{
LoyaltyCardCursorAdapter adapter = new LoyaltyCardCursorAdapter(activity.getApplicationContext(), cursor);
View view = adapter.newView(activity.getApplicationContext(), cursor, null);
adapter.bindView(view, activity.getApplicationContext(), cursor);
final TextView storeField = (TextView) view.findViewById(R.id.store);
return view;
}
assertEquals(card.store, storeField.getText().toString());
private void checkView(final View view, final String store, final String cardId)
{
final TextView storeField = (TextView) view.findViewById(R.id.store);
assertEquals(store, storeField.getText().toString());
final TextView cardIdField = (TextView) view.findViewById(R.id.cardId);
assertEquals(cardId, cardIdField.getText().toString());
}
@Test
public void TestCursorAdapterEmptyNote()
{
db.insertLoyaltyCard("store", "", "cardId", BarcodeFormat.UPC_A.toString());
LoyaltyCard card = db.getLoyaltyCard(1);
Cursor cursor = db.getLoyaltyCardCursor();
cursor.moveToFirst();
View view = createView(cursor);
final String cardIdLabel = activity.getResources().getString(R.string.cardId);
final String cardIdFormat = activity.getResources().getString(R.string.cardIdFormat);
String cardIdText = String.format(cardIdFormat, cardIdLabel, "cardId");
assertEquals(cardIdText, cardIdField.getText().toString());
String cardIdText = String.format(cardIdFormat, cardIdLabel, card.cardId);
checkView(view, card.store, cardIdText);
}
@Test
public void TestCursorAdapterWithNote()
{
db.insertLoyaltyCard("store", "note", "cardId", BarcodeFormat.UPC_A.toString());
LoyaltyCard card = db.getLoyaltyCard(1);
Cursor cursor = db.getLoyaltyCardCursor();
cursor.moveToFirst();
View view = createView(cursor);
final String storeNameAndNoteFormat = activity.getResources().getString(R.string.storeNameAndNoteFormat);
String storeAndNoteText = String.format(storeNameAndNoteFormat, card.store, card.note);
final String cardIdLabel = activity.getResources().getString(R.string.cardId);
final String cardIdFormat = activity.getResources().getString(R.string.cardIdFormat);
String cardIdText = String.format(cardIdFormat, cardIdLabel, card.cardId);
checkView(view, storeAndNoteText, cardIdText);
}
}

View File

@@ -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);
}
@@ -141,11 +145,12 @@ public class LoyaltyCardViewActivityTest
}
private void checkFieldProperties(final Activity activity, final int id, final int visibility,
final String contents)
boolean enabled, final String contents)
{
final View view = activity.findViewById(id);
assertNotNull(view);
assertEquals(visibility, view.getVisibility());
assertEquals(enabled, view.isEnabled());
if(contents != null)
{
TextView textView = (TextView)view;
@@ -153,22 +158,24 @@ public class LoyaltyCardViewActivityTest
}
}
private void checkAllFields(final Activity activity, 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, store);
checkFieldProperties(activity, R.id.cardId, View.VISIBLE, cardId);
checkFieldProperties(activity, R.id.barcodeType, View.VISIBLE, barcodeType);
checkFieldProperties(activity, R.id.captureButton, View.VISIBLE, null);
checkFieldProperties(activity, R.id.saveButton, View.VISIBLE, null);
checkFieldProperties(activity, R.id.cancelButton, View.VISIBLE, null);
checkFieldProperties(activity, R.id.barcode, View.VISIBLE, null);
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);
checkFieldProperties(activity, R.id.saveButton, captureVisibility, true, null);
checkFieldProperties(activity, R.id.cancelButton, captureVisibility, true, null);
checkFieldProperties(activity, R.id.barcode, View.VISIBLE, true, null);
checkFieldProperties(activity, R.id.barcodeIdLayout, cardIdVisibility, null);
checkFieldProperties(activity, R.id.barcodeLayout, cardIdVisibility, null);
checkFieldProperties(activity, R.id.barcodeTypeLayout, View.GONE, null);
checkFieldProperties(activity, R.id.barcodeIdLayout, cardIdVisibility, true, null);
checkFieldProperties(activity, R.id.barcodeLayout, cardIdVisibility, true, null);
checkFieldProperties(activity, R.id.barcodeTypeLayout, View.GONE, true, null);
}
@Test
@@ -181,7 +188,7 @@ public class LoyaltyCardViewActivityTest
Activity activity = (Activity)activityController.get();
checkAllFields(activity, "", "", "");
checkAllFields(activity, true, "", "", "", "");
}
@Test
@@ -197,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);
@@ -208,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());
@@ -231,7 +243,7 @@ public class LoyaltyCardViewActivityTest
}
@Test
public void startWithoutParametersCaptureBarcodeCreateGiftCard() throws IOException
public void startWithoutParametersCaptureBarcodeCreateLoyaltyCard() throws IOException
{
registerMediaStoreIntentHandler();
@@ -242,15 +254,15 @@ public class LoyaltyCardViewActivityTest
Activity activity = (Activity)activityController.get();
checkAllFields(activity, "", "", "");
checkAllFields(activity, true, "", "", "", "");
// Complete barcode capture successfully
captureBarcodeWithResult(activity, R.id.captureButton, true);
checkAllFields(activity, "", 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
@@ -263,12 +275,12 @@ public class LoyaltyCardViewActivityTest
Activity activity = (Activity)activityController.get();
checkAllFields(activity, "", "", "");
checkAllFields(activity, true, "", "", "", "");
// Complete barcode capture in failure
captureBarcodeWithResult(activity, R.id.captureButton, false);
checkAllFields(activity, "", "", "");
checkAllFields(activity, true, "", "", "", "");
}
@Test
@@ -281,12 +293,12 @@ public class LoyaltyCardViewActivityTest
Activity activity = (Activity)activityController.get();
checkAllFields(activity, "", "", "");
checkAllFields(activity, true, "", "", "", "");
// Complete barcode capture successfully
captureBarcodeWithResult(activity, R.id.captureButton, true);
checkAllFields(activity, "", 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);
@@ -295,73 +307,98 @@ public class LoyaltyCardViewActivityTest
assertEquals(true, activity.isFinishing());
}
private ActivityController createActivityWithLoyaltyCard()
private ActivityController createActivityWithLoyaltyCard(boolean editMode)
{
Intent intent = new Intent();
final Bundle bundle = new Bundle();
bundle.putInt("id", 1);
bundle.putBoolean("update", true);
if(editMode)
{
bundle.putBoolean("update", true);
}
else
{
bundle.putBoolean("view", true);
}
intent.putExtras(bundle);
return Robolectric.buildActivity(LoyaltyCardViewActivity.class).withIntent(intent).create();
}
@Test
public void startWithGiftCardCheckDisplay() throws IOException
public void startWithLoyaltyCardEditModeCheckDisplay() throws IOException
{
ActivityController activityController = createActivityWithLoyaltyCard();
ActivityController activityController = createActivityWithLoyaltyCard(true);
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, "store", BARCODE_DATA, BARCODE_TYPE);
checkAllFields(activity, true, "store", "note", BARCODE_DATA, BARCODE_TYPE);
}
@Test
public void startWithLoyaltyCardViewModeCheckDisplay() throws IOException
{
ActivityController activityController = createActivityWithLoyaltyCard(false);
Activity activity = (Activity)activityController.get();
DBHelper db = new DBHelper(activity);
db.insertLoyaltyCard("store", "note", BARCODE_DATA, BARCODE_TYPE);
activityController.start();
activityController.visible();
activityController.resume();
checkAllFields(activity, false, "store", "note", BARCODE_DATA, BARCODE_TYPE);
}
@Test
public void startWithLoyaltyCardWithBarcodeUpdateBarcode() throws IOException
{
ActivityController activityController = createActivityWithLoyaltyCard();
ActivityController activityController = createActivityWithLoyaltyCard(true);
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, "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, "store", BARCODE_DATA, BARCODE_TYPE);
checkAllFields(activity, true, "store", "note", BARCODE_DATA, BARCODE_TYPE);
}
@Test
public void startWithGiftCardWithReceiptUpdateReceiptCancel() throws IOException
public void startWithLoyaltyCardWithReceiptUpdateReceiptCancel() throws IOException
{
ActivityController activityController = createActivityWithLoyaltyCard();
ActivityController activityController = createActivityWithLoyaltyCard(true);
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, "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, "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);

View File

@@ -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());