diff --git a/app/build.gradle b/app/build.gradle index d1bbe4284..21f7435be 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -49,8 +49,8 @@ android { // Flag to enable support for the new language APIs coreLibraryDesugaringEnabled true - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } lintOptions { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ed11d0e1b..2f7674721 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -128,6 +128,13 @@ android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_provider_paths" /> + + + + + + \ No newline at end of file diff --git a/app/src/main/java/protect/card_locker/BaseCursorAdapter.java b/app/src/main/java/protect/card_locker/BaseCursorAdapter.java index 7c9d77899..5da4eeef2 100644 --- a/app/src/main/java/protect/card_locker/BaseCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/BaseCursorAdapter.java @@ -5,7 +5,7 @@ import android.database.Cursor; import androidx.recyclerview.widget.RecyclerView; public abstract class BaseCursorAdapter extends RecyclerView.Adapter { - private Cursor mCursor; + public Cursor mCursor; private boolean mDataValid; private int mRowIDColumn; diff --git a/app/src/main/java/protect/card_locker/CardsOnPowerScreenService.java b/app/src/main/java/protect/card_locker/CardsOnPowerScreenService.java new file mode 100644 index 000000000..a6c0a54b6 --- /dev/null +++ b/app/src/main/java/protect/card_locker/CardsOnPowerScreenService.java @@ -0,0 +1,159 @@ +package protect.card_locker; + +import android.annotation.SuppressLint; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.drawable.Icon; +import android.os.Build; +import android.service.controls.Control; +import android.service.controls.ControlsProviderService; +import android.service.controls.DeviceTypes; +import android.service.controls.actions.ControlAction; +import android.service.controls.templates.StatelessTemplate; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; + +import java.util.List; +import java.util.concurrent.Flow; +import java.util.function.Consumer; + +@RequiresApi(Build.VERSION_CODES.R) +public class CardsOnPowerScreenService extends ControlsProviderService { + + public static final String PREFIX = "catima-"; + static final String TAG = "Catima"; + private final DBHelper dbHelper = new DBHelper(this); + + @NonNull + @Override + public Flow.Publisher createPublisherForAllAvailable() { + Cursor loyaltyCardCursor = dbHelper.getLoyaltyCardCursor(); + return subscriber -> { + while (loyaltyCardCursor.moveToNext()) { + LoyaltyCard card = LoyaltyCard.toLoyaltyCard(loyaltyCardCursor); + Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .putExtra("id", card.id); + PendingIntent pendingIntent = PendingIntent.getActivity(getBaseContext(), card.id, openIntent, PendingIntent.FLAG_IMMUTABLE); + subscriber.onNext( + new Control.StatelessBuilder(PREFIX + card.id, pendingIntent) + .setControlId(PREFIX + card.id) + .setTitle(card.store) + .setDeviceType(DeviceTypes.TYPE_GENERIC_OPEN_CLOSE) + .setSubtitle(card.note) + .setCustomIcon(Icon.createWithBitmap(getIcon(this, card))) + .build() + ); + } + subscriber.onComplete(); + }; + } + + @NonNull + @Override + public Flow.Publisher createPublisherFor(@NonNull List controlIds) { + return subscriber -> { + subscriber.onSubscribe(new NoOpSubscription()); + for (String controlId : controlIds) { + Control control; + + try { + Integer cardId = this.controlIdToCardId(controlId); + LoyaltyCard card = dbHelper.getLoyaltyCard(cardId); + Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .putExtra("id", card.id); + PendingIntent pendingIntent = PendingIntent.getActivity(getBaseContext(), card.id, openIntent, PendingIntent.FLAG_IMMUTABLE); + control = new Control.StatefulBuilder(controlId, pendingIntent) + .setTitle(card.store) + .setDeviceType(DeviceTypes.TYPE_GENERIC_OPEN_CLOSE) + .setSubtitle(card.note) + .setStatus(Control.STATUS_OK) + .setControlTemplate(new StatelessTemplate(controlId)) + .setCustomIcon(Icon.createWithBitmap(getIcon(this, card))) + .build(); + } catch (NullPointerException ignored) { + Intent mainScreenIntent = new Intent(this, MainActivity.class) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + PendingIntent pendingIntent = PendingIntent.getActivity(getBaseContext(), -1, mainScreenIntent, PendingIntent.FLAG_IMMUTABLE); + control = new Control.StatefulBuilder(controlId, pendingIntent) + .setStatus(Control.STATUS_NOT_FOUND) + .build(); + } + Log.d(TAG, "Dispatching widget " + controlId); + subscriber.onNext(control); + } + subscriber.onComplete(); + }; + } + + private Bitmap getIcon(Context context, LoyaltyCard loyaltyCard) { + Bitmap cardIcon = Utils.retrieveCardImage(context, loyaltyCard.id, ImageLocationType.icon); + + if (cardIcon != null) { + return cardIcon; + } + + return Utils.generateIcon(this, loyaltyCard.store, loyaltyCard.headerColor).getLetterTile(); + } + + private Integer controlIdToCardId(String controlId) { + if (controlId == null) + return null; + if (!controlId.startsWith(PREFIX)) { + Log.w(TAG, "Unsupported control ID format: " + controlId); + return null; + } + controlId = controlId.substring(PREFIX.length()); + try { + return Integer.parseInt(controlId); + } catch (RuntimeException ex) { + Log.e(TAG, "Unsupported control ID format. Expected numeric after prefix, found: " + controlId); + return null; + } + } + + @Override + public void performControlAction(@NonNull String controlId, @NonNull ControlAction action, @NonNull Consumer consumer) { + consumer.accept(ControlAction.RESPONSE_OK); + Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .putExtra("id", controlIdToCardId(controlId)); + startActivity(openIntent); + + closePowerScreenOnAndroid11(); + } + + @SuppressLint({"MissingPermission", "deprecation"}) + private void closePowerScreenOnAndroid11() { + // Android 12 will auto-close the power screen, but earlier versions won't + // Lint complains about this but on Android 11 the permission is not needed + // On Android 12, we don't need it, and Google will probably get angry if we ask for it + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { + sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); + } + } + + /** + * A no-op subscription. + *

+ * Flow.Subscriptions are made to last during time and receive periodic updates. + * Our app does not require sending periodic updates of loyalty cards, so we are just ignoring anything in the subscription + * Also, our db is quick enough to respond that the Publisher is immediately sending and completing data. + * This facility is overkill, but if we don't call onSubscribe the service won't work + */ + private static class NoOpSubscription implements Flow.Subscription { + @Override + public void request(long l) { + } + + @Override + public void cancel() { + } + } +} diff --git a/app/src/main/java/protect/card_locker/CatimaCaptureManager.java b/app/src/main/java/protect/card_locker/CatimaCaptureManager.java index bff294749..7507d8090 100644 --- a/app/src/main/java/protect/card_locker/CatimaCaptureManager.java +++ b/app/src/main/java/protect/card_locker/CatimaCaptureManager.java @@ -1,24 +1,25 @@ package protect.card_locker; import android.app.Activity; +import android.content.Context; import android.widget.Toast; import com.journeyapps.barcodescanner.CaptureManager; import com.journeyapps.barcodescanner.DecoratedBarcodeView; public class CatimaCaptureManager extends CaptureManager { - private Activity activity; + private final Context mContext; public CatimaCaptureManager(Activity activity, DecoratedBarcodeView barcodeView) { super(activity, barcodeView); - this.activity = activity; + mContext = activity.getApplicationContext(); } @Override protected void displayFrameworkBugMessageAndExit(String message) { // We don't want to exit, as we also have a enter from card image and add manually button here // So we show a toast instead - Toast.makeText(activity, message, Toast.LENGTH_LONG).show(); + Toast.makeText(mContext, message, Toast.LENGTH_LONG).show(); } } diff --git a/app/src/main/java/protect/card_locker/DBHelper.java b/app/src/main/java/protect/card_locker/DBHelper.java index 6b9aa515d..a8fee8220 100644 --- a/app/src/main/java/protect/card_locker/DBHelper.java +++ b/app/src/main/java/protect/card_locker/DBHelper.java @@ -71,12 +71,8 @@ public class DBHelper extends SQLiteOpenHelper { Descending } - private Context mContext; - public DBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); - - mContext = context; } @Override @@ -583,7 +579,7 @@ public class DBHelper extends SQLiteOpenHelper { } } - public boolean deleteLoyaltyCard(final int id) { + public boolean deleteLoyaltyCard(Context context, final int id) { SQLiteDatabase db = getWritableDatabase(); // Delete card int rowsDeleted = db.delete(LoyaltyCardDbIds.TABLE, @@ -603,7 +599,7 @@ public class DBHelper extends SQLiteOpenHelper { // Also wipe card images associated with this card for (ImageLocationType imageLocationType : ImageLocationType.values()) { try { - Utils.saveCardImage(mContext, null, id, imageLocationType); + Utils.saveCardImage(context, null, id, imageLocationType); } catch (FileNotFoundException e) { e.printStackTrace(); } diff --git a/app/src/main/java/protect/card_locker/GroupCursorAdapter.java b/app/src/main/java/protect/card_locker/GroupCursorAdapter.java index 05cc1d9f6..306027b0e 100644 --- a/app/src/main/java/protect/card_locker/GroupCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/GroupCursorAdapter.java @@ -14,7 +14,6 @@ import protect.card_locker.preferences.Settings; class GroupCursorAdapter extends BaseCursorAdapter { Settings mSettings; - private Cursor mCursor; private final Context mContext; private final GroupCursorAdapter.GroupAdapterListener mListener; DBHelper mDb; @@ -27,13 +26,7 @@ class GroupCursorAdapter extends BaseCursorAdapter { private int mCurrentSelectedIndex = -1; - private Cursor mCursor; Settings mSettings; boolean mDarkModeEnabled; private final Context mContext; @@ -44,20 +43,14 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter mMainRequestLauncher; private ActivityResultLauncher mBarcodeScannerLauncher; private ActionMode.Callback mCurrentActionModeCallback = new ActionMode.Callback() { @@ -143,7 +142,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) { Log.e(TAG, "Deleting card: " + loyaltyCard.id); - db.deleteLoyaltyCard(loyaltyCard.id); + db.deleteLoyaltyCard(MainActivity.this, loyaltyCard.id); ShortcutHelper.removeShortcut(MainActivity.this, loyaltyCard.id); } @@ -267,16 +266,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard } */ - mMainRequestLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { - // We're coming back from another view so clear the search - // We only do this now to prevent a flash of all entries right after picking one - mFilter = ""; - if (mMenu != null) { - MenuItem searchItem = mMenu.findItem(R.id.action_search); - searchItem.collapseActionView(); - } - }); - mBarcodeScannerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { Intent intent = result.getData(); BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(Utils.BARCODE_SCAN, result.getResultCode(), intent, this); @@ -305,12 +294,8 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard mCurrentActionMode.finish(); } - if (mMenu != null) { - SearchView searchView = (SearchView) mMenu.findItem(R.id.action_search).getActionView(); - - if (!searchView.isIconified()) { - mFilter = searchView.getQuery().toString(); - } + if (mSearchView != null && !mSearchView.isIconified()) { + mFilter = mSearchView.getQuery().toString(); } // Start of active tab logic @@ -361,13 +346,9 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard @Override public void onBackPressed() { - if (mMenu != null) { - SearchView searchView = (SearchView) mMenu.findItem(R.id.action_search).getActionView(); - - if (!searchView.isIconified()) { - searchView.setIconified(true); - return; - } + if (!mSearchView.isIconified()) { + mSearchView.setIconified(true); + return; } super.onBackPressed(); @@ -444,22 +425,20 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard @Override public boolean onCreateOptionsMenu(Menu inputMenu) { - this.mMenu = inputMenu; - getMenuInflater().inflate(R.menu.main_menu, inputMenu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); if (searchManager != null) { - SearchView searchView = (SearchView) inputMenu.findItem(R.id.action_search).getActionView(); - searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); - searchView.setSubmitButtonEnabled(false); + mSearchView = (SearchView) inputMenu.findItem(R.id.action_search).getActionView(); + mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); + mSearchView.setSubmitButtonEnabled(false); - searchView.setOnCloseListener(() -> { + mSearchView.setOnCloseListener(() -> { invalidateOptionsMenu(); return false; }); - searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; @@ -543,25 +522,25 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard if (id == R.id.action_manage_groups) { Intent i = new Intent(getApplicationContext(), ManageGroupsActivity.class); - mMainRequestLauncher.launch(i); + startActivity(i); return true; } if (id == R.id.action_import_export) { Intent i = new Intent(getApplicationContext(), ImportExportActivity.class); - mMainRequestLauncher.launch(i); + startActivity(i); return true; } if (id == R.id.action_settings) { Intent i = new Intent(getApplicationContext(), SettingsActivity.class); - mMainRequestLauncher.launch(i); + startActivity(i); return true; } if (id == R.id.action_about) { Intent i = new Intent(getApplicationContext(), AboutActivity.class); - mMainRequestLauncher.launch(i); + startActivity(i); return true; } @@ -703,8 +682,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard if (mAdapter.getSelectedItemCount() > 0) { enableActionMode(inputPosition); } else { - Cursor selected = mAdapter.getCursor(); - selected.moveToPosition(inputPosition); // FIXME // // There is a really nasty edge case that can happen when someone taps a card but right @@ -715,7 +692,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard // click is being processed. Sadly, I have not yet found a way to make that possible. LoyaltyCard loyaltyCard; try { - loyaltyCard = LoyaltyCard.toLoyaltyCard(selected); + loyaltyCard = mAdapter.getCard(inputPosition); } catch (CursorIndexOutOfBoundsException e) { Log.w(TAG, "Prevented crash from tap + swipe on ID " + inputPosition + ": " + e); return; @@ -729,7 +706,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard ShortcutHelper.updateShortcuts(MainActivity.this, loyaltyCard); - mMainRequestLauncher.launch(i); + startActivity(i); } } } diff --git a/app/src/main/java/protect/card_locker/ManageGroupActivity.java b/app/src/main/java/protect/card_locker/ManageGroupActivity.java index 8e0df0883..19482bce0 100644 --- a/app/src/main/java/protect/card_locker/ManageGroupActivity.java +++ b/app/src/main/java/protect/card_locker/ManageGroupActivity.java @@ -165,7 +165,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana private void updateLoyaltyCardList() { mAdapter.swapCursor(mDB.getLoyaltyCardCursor()); - if (mAdapter.getCountFromCursor() == 0) { + if (mAdapter.getItemCount() == 0) { mCardList.setVisibility(View.GONE); mHelpText.setVisibility(View.VISIBLE); } else { diff --git a/app/src/main/java/protect/card_locker/ManageGroupCursorAdapter.java b/app/src/main/java/protect/card_locker/ManageGroupCursorAdapter.java index cef4fb8d1..bf37effb5 100644 --- a/app/src/main/java/protect/card_locker/ManageGroupCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/ManageGroupCursorAdapter.java @@ -105,8 +105,4 @@ public class ManageGroupCursorAdapter extends LoyaltyCardCursorAdapter { public HashMap exportInGroupState() { return new HashMap<>(mInGroupOverlay); } - - public int getCountFromCursor() { - return super.getCursor().getCount(); - } } diff --git a/app/src/main/java/protect/card_locker/preferences/Settings.java b/app/src/main/java/protect/card_locker/preferences/Settings.java index 977271ffc..1583382be 100644 --- a/app/src/main/java/protect/card_locker/preferences/Settings.java +++ b/app/src/main/java/protect/card_locker/preferences/Settings.java @@ -13,32 +13,32 @@ import protect.card_locker.R; import protect.card_locker.Utils; public class Settings { - private Context context; - private SharedPreferences settings; + private final Context mContext; + private SharedPreferences mSettings; public Settings(Context context) { - this.context = context; - this.settings = PreferenceManager.getDefaultSharedPreferences(context); + mContext = context.getApplicationContext(); + mSettings = PreferenceManager.getDefaultSharedPreferences(context); } private String getResString(@StringRes int resId) { - return context.getString(resId); + return mContext.getString(resId); } private int getResInt(@IntegerRes int resId) { - return context.getResources().getInteger(resId); + return mContext.getResources().getInteger(resId); } private String getString(@StringRes int keyId, String defaultValue) { - return settings.getString(getResString(keyId), defaultValue); + return mSettings.getString(getResString(keyId), defaultValue); } private int getInt(@StringRes int keyId, @IntegerRes int defaultId) { - return settings.getInt(getResString(keyId), getResInt(defaultId)); + return mSettings.getInt(getResString(keyId), getResInt(defaultId)); } private boolean getBoolean(@StringRes int keyId, boolean defaultValue) { - return settings.getBoolean(getResString(keyId), defaultValue); + return mSettings.getBoolean(getResString(keyId), defaultValue); } public Locale getLocale() { diff --git a/app/src/test/java/protect/card_locker/DatabaseTest.java b/app/src/test/java/protect/card_locker/DatabaseTest.java index d75038d10..cb5271f55 100644 --- a/app/src/test/java/protect/card_locker/DatabaseTest.java +++ b/app/src/test/java/protect/card_locker/DatabaseTest.java @@ -29,25 +29,26 @@ import static org.junit.Assert.assertTrue; @RunWith(RobolectricTestRunner.class) @Config(sdk = 23) public class DatabaseTest { - private DBHelper db; + private DBHelper mDb; + private Activity mActivity; private static final Integer DEFAULT_HEADER_COLOR = Color.BLACK; @Before public void setUp() { - Activity activity = Robolectric.setupActivity(MainActivity.class); - db = TestHelpers.getEmptyDb(activity); + mActivity = Robolectric.setupActivity(MainActivity.class); + mDb = TestHelpers.getEmptyDb(mActivity); } @Test public void addRemoveOneGiftCard() { - assertEquals(0, db.getLoyaltyCardCount()); - long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null); + assertEquals(0, mDb.getLoyaltyCardCount()); + long id = mDb.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null); boolean result = (id != -1); assertTrue(result); - assertEquals(1, db.getLoyaltyCardCount()); + assertEquals(1, mDb.getLoyaltyCardCount()); - LoyaltyCard loyaltyCard = db.getLoyaltyCard(1); + LoyaltyCard loyaltyCard = mDb.getLoyaltyCard(1); assertNotNull(loyaltyCard); assertEquals("store", loyaltyCard.store); assertEquals("note", loyaltyCard.note); @@ -60,24 +61,24 @@ public class DatabaseTest { assertEquals(DEFAULT_HEADER_COLOR, loyaltyCard.headerColor); assertEquals(0, loyaltyCard.starStatus); - result = db.deleteLoyaltyCard(1); + result = mDb.deleteLoyaltyCard(mActivity, 1); assertTrue(result); - assertEquals(0, db.getLoyaltyCardCount()); - assertNull(db.getLoyaltyCard(1)); + assertEquals(0, mDb.getLoyaltyCardCount()); + assertNull(mDb.getLoyaltyCard(1)); } @Test public void updateGiftCard() { - long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null); + long id = mDb.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null); boolean result = (id != -1); assertTrue(result); - assertEquals(1, db.getLoyaltyCardCount()); + assertEquals(1, mDb.getLoyaltyCardCount()); - result = db.updateLoyaltyCard(1, "store1", "note1", null, new BigDecimal("10.00"), Currency.getInstance("EUR"), "cardId1", null, CatimaBarcode.fromBarcode(BarcodeFormat.AZTEC), DEFAULT_HEADER_COLOR); + result = mDb.updateLoyaltyCard(1, "store1", "note1", null, new BigDecimal("10.00"), Currency.getInstance("EUR"), "cardId1", null, CatimaBarcode.fromBarcode(BarcodeFormat.AZTEC), DEFAULT_HEADER_COLOR); assertTrue(result); - assertEquals(1, db.getLoyaltyCardCount()); + assertEquals(1, mDb.getLoyaltyCardCount()); - LoyaltyCard loyaltyCard = db.getLoyaltyCard(1); + LoyaltyCard loyaltyCard = mDb.getLoyaltyCard(1); assertNotNull(loyaltyCard); assertEquals("store1", loyaltyCard.store); assertEquals("note1", loyaltyCard.note); @@ -93,16 +94,16 @@ public class DatabaseTest { @Test public void updateGiftCardOnlyStar() { - long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null); + long id = mDb.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null); boolean result = (id != -1); assertTrue(result); - assertEquals(1, db.getLoyaltyCardCount()); + assertEquals(1, mDb.getLoyaltyCardCount()); - result = db.updateLoyaltyCardStarStatus(1, 1); + result = mDb.updateLoyaltyCardStarStatus(1, 1); assertTrue(result); - assertEquals(1, db.getLoyaltyCardCount()); + assertEquals(1, mDb.getLoyaltyCardCount()); - LoyaltyCard loyaltyCard = db.getLoyaltyCard(1); + LoyaltyCard loyaltyCard = mDb.getLoyaltyCard(1); assertNotNull(loyaltyCard); assertEquals("store", loyaltyCard.store); assertEquals("note", loyaltyCard.note); @@ -118,22 +119,22 @@ public class DatabaseTest { @Test public void updateMissingGiftCard() { - assertEquals(0, db.getLoyaltyCardCount()); + assertEquals(0, mDb.getLoyaltyCardCount()); - boolean result = db.updateLoyaltyCard(1, "store1", "note1", null, new BigDecimal("0"), null, "cardId1", + boolean result = mDb.updateLoyaltyCard(1, "store1", "note1", null, new BigDecimal("0"), null, "cardId1", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR); assertEquals(false, result); - assertEquals(0, db.getLoyaltyCardCount()); + assertEquals(0, mDb.getLoyaltyCardCount()); } @Test public void emptyGiftCardValues() { - long id = db.insertLoyaltyCard("", "", null, new BigDecimal("0"), null, "", null, null, null, 0, null); + long id = mDb.insertLoyaltyCard("", "", null, new BigDecimal("0"), null, "", null, null, null, 0, null); boolean result = (id != -1); assertTrue(result); - assertEquals(1, db.getLoyaltyCardCount()); + assertEquals(1, mDb.getLoyaltyCardCount()); - LoyaltyCard loyaltyCard = db.getLoyaltyCard(1); + LoyaltyCard loyaltyCard = mDb.getLoyaltyCard(1); assertNotNull(loyaltyCard); assertEquals("", loyaltyCard.store); assertEquals("", loyaltyCard.note); @@ -154,15 +155,15 @@ public class DatabaseTest { // Add the gift cards in reverse order, to ensure // that they are sorted for (int index = CARDS_TO_ADD - 1; index >= 0; index--) { - long id = db.insertLoyaltyCard("store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index, + long id = mDb.insertLoyaltyCard("store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index, null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 0, null); boolean result = (id != -1); assertTrue(result); } - assertEquals(CARDS_TO_ADD, db.getLoyaltyCardCount()); + assertEquals(CARDS_TO_ADD, mDb.getLoyaltyCardCount()); - Cursor cursor = db.getLoyaltyCardCursor(); + Cursor cursor = mDb.getLoyaltyCardCursor(); assertNotNull(cursor); assertEquals(CARDS_TO_ADD, cursor.getCount()); @@ -198,19 +199,19 @@ public class DatabaseTest { // 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, null, new BigDecimal("0"), null, "cardId" + index, + id = mDb.insertLoyaltyCard("store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index, null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 1, null); } else { - id = db.insertLoyaltyCard("store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index, + id = mDb.insertLoyaltyCard("store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index, null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 0, null); } boolean result = (id != -1); assertTrue(result); } - assertEquals(CARDS_TO_ADD, db.getLoyaltyCardCount()); + assertEquals(CARDS_TO_ADD, mDb.getLoyaltyCardCount()); - Cursor cursor = db.getLoyaltyCardCursor(); + Cursor cursor = mDb.getLoyaltyCardCursor(); assertNotNull(cursor); assertEquals(CARDS_TO_ADD, cursor.getCount()); @@ -279,130 +280,130 @@ public class DatabaseTest { @Test public void addRemoveOneGroup() { - assertEquals(0, db.getGroupCount()); - long id = db.insertGroup("group one"); + assertEquals(0, mDb.getGroupCount()); + long id = mDb.insertGroup("group one"); boolean result = (id != -1); assertTrue(result); - assertEquals(1, db.getGroupCount()); + assertEquals(1, mDb.getGroupCount()); - Group group = db.getGroup("group one"); + Group group = mDb.getGroup("group one"); assertNotNull(group); assertEquals("group one", group._id); - result = db.deleteGroup("group one"); + result = mDb.deleteGroup("group one"); assertTrue(result); - assertEquals(0, db.getGroupCount()); - assertNull(db.getGroup("group one")); + assertEquals(0, mDb.getGroupCount()); + assertNull(mDb.getGroup("group one")); } @Test public void updateGroup() { // Create card - assertEquals(0, db.getLoyaltyCardCount()); - long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null); + assertEquals(0, mDb.getLoyaltyCardCount()); + long id = mDb.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null); boolean result = (id != -1); assertTrue(result); - assertEquals(1, db.getLoyaltyCardCount()); + assertEquals(1, mDb.getLoyaltyCardCount()); // Create group - long groupId = db.insertGroup("group one"); + long groupId = mDb.insertGroup("group one"); result = (groupId != -1); assertTrue(result); - assertEquals(1, db.getGroupCount()); + assertEquals(1, mDb.getGroupCount()); // Add card to group - Group group = db.getGroup("group one"); + Group group = mDb.getGroup("group one"); List groupList1 = new ArrayList<>(); groupList1.add(group); - db.setLoyaltyCardGroups(1, groupList1); + mDb.setLoyaltyCardGroups(1, groupList1); // Ensure the card has one group and the group has one card - List cardGroups = db.getLoyaltyCardGroups((int) id); + List cardGroups = mDb.getLoyaltyCardGroups((int) id); assertEquals(1, cardGroups.size()); assertEquals("group one", cardGroups.get(0)._id); - assertEquals(1, db.getGroupCardCount("group one")); + assertEquals(1, mDb.getGroupCardCount("group one")); // Rename group - result = db.updateGroup("group one", "group one renamed"); + result = mDb.updateGroup("group one", "group one renamed"); assertTrue(result); - assertEquals(1, db.getGroupCount()); + assertEquals(1, mDb.getGroupCount()); // Group one no longer exists - group = db.getGroup("group one"); + group = mDb.getGroup("group one"); assertNull(group); // But group one renamed does - Group group2 = db.getGroup("group one renamed"); + Group group2 = mDb.getGroup("group one renamed"); assertNotNull(group2); assertEquals("group one renamed", group2._id); // And card is in "group one renamed" // Ensure the card has one group and the group has one card - cardGroups = db.getLoyaltyCardGroups((int) id); + cardGroups = mDb.getLoyaltyCardGroups((int) id); assertEquals(1, cardGroups.size()); assertEquals("group one renamed", cardGroups.get(0)._id); - assertEquals(1, db.getGroupCardCount("group one renamed")); + assertEquals(1, mDb.getGroupCardCount("group one renamed")); } @Test public void updateMissingGroup() { - assertEquals(0, db.getGroupCount()); + assertEquals(0, mDb.getGroupCount()); - boolean result = db.updateGroup("group one", "new name"); + boolean result = mDb.updateGroup("group one", "new name"); assertEquals(false, result); - assertEquals(0, db.getGroupCount()); + assertEquals(0, mDb.getGroupCount()); } @Test public void emptyGroupValues() { - long id = db.insertGroup(""); + long id = mDb.insertGroup(""); boolean result = (id != -1); assertFalse(result); - assertEquals(0, db.getLoyaltyCardCount()); + assertEquals(0, mDb.getLoyaltyCardCount()); } @Test public void duplicateGroupName() { - assertEquals(0, db.getGroupCount()); - long id = db.insertGroup("group one"); + assertEquals(0, mDb.getGroupCount()); + long id = mDb.insertGroup("group one"); boolean result = (id != -1); assertTrue(result); - assertEquals(1, db.getGroupCount()); + assertEquals(1, mDb.getGroupCount()); - Group group = db.getGroup("group one"); + Group group = mDb.getGroup("group one"); assertNotNull(group); assertEquals("group one", group._id); // Should fail on duplicate - long id2 = db.insertGroup("group one"); + long id2 = mDb.insertGroup("group one"); boolean result2 = (id2 != -1); assertFalse(result2); - assertEquals(1, db.getGroupCount()); + assertEquals(1, mDb.getGroupCount()); } @Test public void updateGroupDuplicate() { - long id = db.insertGroup("group one"); + long id = mDb.insertGroup("group one"); boolean result = (id != -1); assertTrue(result); - assertEquals(1, db.getGroupCount()); + assertEquals(1, mDb.getGroupCount()); - long id2 = db.insertGroup("group two"); + long id2 = mDb.insertGroup("group two"); boolean result2 = (id2 != -1); assertTrue(result2); - assertEquals(2, db.getGroupCount()); + assertEquals(2, mDb.getGroupCount()); // Should fail when trying to rename group two to one - boolean result3 = db.updateGroup("group two", "group one"); + boolean result3 = mDb.updateGroup("group two", "group one"); assertFalse(result3); - assertEquals(2, db.getGroupCount()); + assertEquals(2, mDb.getGroupCount()); // Rename failed so both should still be the same - Group group = db.getGroup("group one"); + Group group = mDb.getGroup("group one"); assertNotNull(group); assertEquals("group one", group._id); - Group group2 = db.getGroup("group two"); + Group group2 = mDb.getGroup("group two"); assertNotNull(group2); assertEquals("group two", group2._id); } @@ -410,52 +411,52 @@ public class DatabaseTest { @Test public void cardAddAndRemoveGroups() { // Create card - assertEquals(0, db.getLoyaltyCardCount()); - long id = db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null); + assertEquals(0, mDb.getLoyaltyCardCount()); + long id = mDb.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null); boolean result = (id != -1); assertTrue(result); - assertEquals(1, db.getLoyaltyCardCount()); + assertEquals(1, mDb.getLoyaltyCardCount()); // Create two groups to only one card - assertEquals(0, db.getGroupCount()); - long gid = db.insertGroup("one"); + assertEquals(0, mDb.getGroupCount()); + long gid = mDb.insertGroup("one"); boolean gresult = (gid != -1); assertTrue(gresult); - long gid2 = db.insertGroup("two"); + long gid2 = mDb.insertGroup("two"); boolean gresult2 = (gid2 != -1); assertTrue(gresult2); - assertEquals(2, db.getGroupCount()); + assertEquals(2, mDb.getGroupCount()); - Group group1 = db.getGroup("one"); + Group group1 = mDb.getGroup("one"); // Card has no groups by default - List cardGroups = db.getLoyaltyCardGroups(1); + List cardGroups = mDb.getLoyaltyCardGroups(1); assertEquals(0, cardGroups.size()); // Add one groups to card List groupList1 = new ArrayList<>(); groupList1.add(group1); - db.setLoyaltyCardGroups(1, groupList1); + mDb.setLoyaltyCardGroups(1, groupList1); - List cardGroups1 = db.getLoyaltyCardGroups(1); + List cardGroups1 = mDb.getLoyaltyCardGroups(1); assertEquals(1, cardGroups1.size()); assertEquals(cardGroups1.get(0)._id, group1._id); - assertEquals(1, db.getGroupCardCount("one")); - assertEquals(0, db.getGroupCardCount("two")); + assertEquals(1, mDb.getGroupCardCount("one")); + assertEquals(0, mDb.getGroupCardCount("two")); // Remove groups - db.setLoyaltyCardGroups(1, new ArrayList()); - List cardGroups2 = db.getLoyaltyCardGroups(1); + mDb.setLoyaltyCardGroups(1, new ArrayList()); + List cardGroups2 = mDb.getLoyaltyCardGroups(1); assertEquals(0, cardGroups2.size()); - assertEquals(0, db.getGroupCardCount("one")); - assertEquals(0, db.getGroupCardCount("two")); + assertEquals(0, mDb.getGroupCardCount("one")); + assertEquals(0, mDb.getGroupCardCount("two")); } @Test public void databaseUpgradeFromVersion1() { - SQLiteDatabase database = db.getWritableDatabase(); + SQLiteDatabase database = mDb.getWritableDatabase(); // Setup the database as it appeared in revision 1 setupDatabaseVersion1(database); @@ -465,10 +466,10 @@ public class DatabaseTest { int newCardId2 = insertCardVersion1(database, "store", "cardId", ""); // Upgrade database - db.onUpgrade(database, DBHelper.ORIGINAL_DATABASE_VERSION, DBHelper.DATABASE_VERSION); + mDb.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); + LoyaltyCard card = mDb.getLoyaltyCard(newCardId); assertEquals("store", card.store); assertEquals("", card.note); assertEquals(null, card.expiry); @@ -483,7 +484,7 @@ public class DatabaseTest { assertEquals(100, card.zoomLevel); // Determine that the entries are queryable and the fields are correct - LoyaltyCard card2 = db.getLoyaltyCard(newCardId2); + LoyaltyCard card2 = mDb.getLoyaltyCard(newCardId2); assertEquals("store", card2.store); assertEquals("", card2.note); assertEquals(null, card2.expiry);