diff --git a/CHANGELOG.md b/CHANGELOG.md index 90088edc5..f7008b8f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,23 @@ # Changelog -## Unreleased - 93 +## Unreleased - 96 + +- Add CODE 93 support + +## v2.11.2 - 95 (2021-12-04) + +- Fix crash on sharing card + +## v2.11.1 - 94 (2021-11-30) + +- Fix blurriness of main screen letter icons +- Fix icons sometimes disappearing after selection +- Fix status bar icons possibly being invisible on Android 5 + +## v2.11.0 - 93 (2021-11-28) - Add Catima to [Quick Access Device Controls](https://developer.android.com/guide/topics/ui/device-control) +- Fix some groups not showing up correctly in group management screen ## v2.10.0 - 92 (2021-11-20) diff --git a/app/build.gradle b/app/build.gradle index 682a08680..57053259d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { applicationId "me.hackerchick.catima" minSdkVersion 21 targetSdkVersion 31 - versionCode 92 - versionName "2.10.0" + versionCode 95 + versionName "2.11.2" vectorDrawables.useSupportLibrary true multiDexEnabled true @@ -106,7 +106,7 @@ dependencies { // Testing testImplementation 'androidx.test:core:1.4.0' testImplementation 'junit:junit:4.13.2' - testImplementation 'org.robolectric:robolectric:4.7.2' + testImplementation 'org.robolectric:robolectric:4.7.3' } tasks.withType(SpotBugsTask) { diff --git a/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java b/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java index 241ebf90d..62f1e1826 100644 --- a/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java +++ b/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java @@ -120,6 +120,8 @@ public class BarcodeImageWriterTask implements CompatCallable { return "C0C"; case CODE_39: return "CODE_39"; + case CODE_93: + return "CODE_93"; case CODE_128: return "CODE_128"; case EAN_8: diff --git a/app/src/main/java/protect/card_locker/BaseCursorAdapter.java b/app/src/main/java/protect/card_locker/BaseCursorAdapter.java index 5da4eeef2..682093785 100644 --- a/app/src/main/java/protect/card_locker/BaseCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/BaseCursorAdapter.java @@ -9,8 +9,13 @@ public abstract class BaseCursorAdapter exten private boolean mDataValid; private int mRowIDColumn; - public BaseCursorAdapter(Cursor inputCursor) { + private String mRowIDColumnName; + + public BaseCursorAdapter(Cursor inputCursor, String rowIDColumnName) { setHasStableIds(true); + + mRowIDColumnName = rowIDColumnName; + swapCursor(inputCursor); } @@ -58,6 +63,7 @@ public abstract class BaseCursorAdapter exten if (inputCursor != null) { mCursor = inputCursor; + mRowIDColumn = mCursor.getColumnIndex(mRowIDColumnName); mDataValid = true; notifyDataSetChanged(); } else { diff --git a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java index be9cc84d5..4f5fa1e33 100644 --- a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java +++ b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java @@ -1,19 +1,16 @@ package protect.card_locker; import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.util.Log; -import android.view.View; import android.widget.Toast; -import com.google.android.material.floatingactionbutton.FloatingActionButton; - import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.core.content.pm.ShortcutInfoCompat; import androidx.core.content.pm.ShortcutManagerCompat; -import androidx.recyclerview.widget.DefaultItemAnimator; -import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; /** @@ -21,48 +18,41 @@ import androidx.recyclerview.widget.RecyclerView; */ public class CardShortcutConfigure extends AppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener { static final String TAG = "Catima"; - final DBHelper mDb = new DBHelper(this); + private SQLiteDatabase mDatabase; @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); + mDatabase = new DBHelper(this).getReadableDatabase(); + // Set the result to CANCELED. This will cause nothing to happen if the // aback button is pressed. setResult(RESULT_CANCELED); - setContentView(R.layout.main_activity); + setContentView(R.layout.simple_toolbar_list_activity); Toolbar toolbar = findViewById(R.id.toolbar); - toolbar.setVisibility(View.GONE); - - // Hide new button because it won't work here anyway - FloatingActionButton newFab = findViewById(R.id.fabAdd); - newFab.setVisibility(View.GONE); - - final DBHelper db = new DBHelper(this); + toolbar.setTitle(R.string.shortcutSelectCard); // If there are no cards, bail - if (db.getLoyaltyCardCount() == 0) { + if (DBHelper.getLoyaltyCardCount(mDatabase) == 0) { Toast.makeText(this, R.string.noCardsMessage, Toast.LENGTH_LONG).show(); finish(); } final RecyclerView cardList = findViewById(R.id.list); + GridLayoutManager layoutManager = (GridLayoutManager) cardList.getLayoutManager(); + if (layoutManager != null) { + layoutManager.setSpanCount(getResources().getInteger(R.integer.main_view_card_columns)); + } - RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); - cardList.setLayoutManager(mLayoutManager); - cardList.setItemAnimator(new DefaultItemAnimator()); - - cardList.setVisibility(View.VISIBLE); - - Cursor cardCursor = db.getLoyaltyCardCursor(); - + Cursor cardCursor = DBHelper.getLoyaltyCardCursor(mDatabase); final LoyaltyCardCursorAdapter adapter = new LoyaltyCardCursorAdapter(this, cardCursor, this); cardList.setAdapter(adapter); } private void onClickAction(int position) { - Cursor selected = mDb.getLoyaltyCardCursor(); + Cursor selected = DBHelper.getLoyaltyCardCursor(mDatabase); selected.moveToPosition(position); LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(selected); diff --git a/app/src/main/java/protect/card_locker/CardsOnPowerScreenService.java b/app/src/main/java/protect/card_locker/CardsOnPowerScreenService.java index a6c0a54b6..8eaa5a8ed 100644 --- a/app/src/main/java/protect/card_locker/CardsOnPowerScreenService.java +++ b/app/src/main/java/protect/card_locker/CardsOnPowerScreenService.java @@ -5,6 +5,7 @@ import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.drawable.Icon; import android.os.Build; @@ -27,12 +28,19 @@ public class CardsOnPowerScreenService extends ControlsProviderService { public static final String PREFIX = "catima-"; static final String TAG = "Catima"; - private final DBHelper dbHelper = new DBHelper(this); + private SQLiteDatabase mDatabase; + + @Override + public void onCreate() { + super.onCreate(); + + mDatabase = new DBHelper(this).getReadableDatabase(); + } @NonNull @Override public Flow.Publisher createPublisherForAllAvailable() { - Cursor loyaltyCardCursor = dbHelper.getLoyaltyCardCursor(); + Cursor loyaltyCardCursor = DBHelper.getLoyaltyCardCursor(mDatabase); return subscriber -> { while (loyaltyCardCursor.moveToNext()) { LoyaltyCard card = LoyaltyCard.toLoyaltyCard(loyaltyCardCursor); @@ -64,7 +72,7 @@ public class CardsOnPowerScreenService extends ControlsProviderService { try { Integer cardId = this.controlIdToCardId(controlId); - LoyaltyCard card = dbHelper.getLoyaltyCard(cardId); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, cardId); Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) .putExtra("id", card.id); diff --git a/app/src/main/java/protect/card_locker/CatimaAppCompatActivity.java b/app/src/main/java/protect/card_locker/CatimaAppCompatActivity.java index 27c08254f..906e36ea9 100644 --- a/app/src/main/java/protect/card_locker/CatimaAppCompatActivity.java +++ b/app/src/main/java/protect/card_locker/CatimaAppCompatActivity.java @@ -5,11 +5,11 @@ import android.content.SharedPreferences; import android.content.res.Resources; import android.util.TypedValue; -import java.util.HashMap; - import androidx.appcompat.app.AppCompatActivity; import androidx.preference.PreferenceManager; +import java.util.HashMap; + public class CatimaAppCompatActivity extends AppCompatActivity { SharedPreferences pref; diff --git a/app/src/main/java/protect/card_locker/CatimaBarcode.java b/app/src/main/java/protect/card_locker/CatimaBarcode.java index c402f7991..2b1a5c488 100644 --- a/app/src/main/java/protect/card_locker/CatimaBarcode.java +++ b/app/src/main/java/protect/card_locker/CatimaBarcode.java @@ -10,6 +10,7 @@ public class CatimaBarcode { public static final List barcodeFormats = Collections.unmodifiableList(Arrays.asList( BarcodeFormat.AZTEC, BarcodeFormat.CODE_39, + BarcodeFormat.CODE_93, BarcodeFormat.CODE_128, BarcodeFormat.CODABAR, BarcodeFormat.DATA_MATRIX, @@ -25,6 +26,7 @@ public class CatimaBarcode { public static final List barcodePrettyNames = Collections.unmodifiableList(Arrays.asList( "Aztec", "Code 39", + "Code 93", "Code 128", "Codabar", "Data Matrix", diff --git a/app/src/main/java/protect/card_locker/DBHelper.java b/app/src/main/java/protect/card_locker/DBHelper.java index a8fee8220..2773b9f88 100644 --- a/app/src/main/java/protect/card_locker/DBHelper.java +++ b/app/src/main/java/protect/card_locker/DBHelper.java @@ -111,7 +111,6 @@ public class DBHelper extends SQLiteOpenHelper { "tokenize=unicode61);"); } - @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < 2 && newVersion >= 2) { @@ -305,7 +304,7 @@ public class DBHelper extends SQLiteOpenHelper { } } - private ContentValues generateFTSContentValues(final int id, final String store, final String note) { + private static ContentValues generateFTSContentValues(final int id, final String store, final String note) { // FTS on Android is severely limited and can only search for word starting with a certain string // So for each word, we grab every single substring // This makes it possible to find Décathlon by searching both de and cat, for example @@ -337,22 +336,21 @@ public class DBHelper extends SQLiteOpenHelper { return ftsContentValues; } - private void insertFTS(final SQLiteDatabase db, final int id, final String store, final String note) { + private static void insertFTS(final SQLiteDatabase db, final int id, final String store, final String note) { db.insert(LoyaltyCardDbFTS.TABLE, null, generateFTSContentValues(id, store, note)); } - private void updateFTS(final SQLiteDatabase db, final int id, final String store, final String note) { + private static void updateFTS(final SQLiteDatabase db, final int id, final String store, final String note) { db.update(LoyaltyCardDbFTS.TABLE, generateFTSContentValues(id, store, note), whereAttrs(LoyaltyCardDbFTS.ID), withArgs(id)); } - public long insertLoyaltyCard(final String store, final String note, final Date expiry, - final BigDecimal balance, final Currency balanceType, - final String cardId, final String barcodeId, - final CatimaBarcode barcodeType, final Integer headerColor, - final int starStatus, final Long lastUsed) { - SQLiteDatabase db = getWritableDatabase(); - db.beginTransaction(); + public static long insertLoyaltyCard( + final SQLiteDatabase database, final String store, final String note, final Date expiry, + final BigDecimal balance, final Currency balanceType, final String cardId, + final String barcodeId, final CatimaBarcode barcodeType, final Integer headerColor, + final int starStatus, final Long lastUsed) { + database.beginTransaction(); // Card ContentValues contentValues = new ContentValues(); @@ -367,56 +365,23 @@ public class DBHelper extends SQLiteOpenHelper { contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus); contentValues.put(LoyaltyCardDbIds.LAST_USED, lastUsed != null ? lastUsed : Utils.getUnixTime()); - long id = db.insert(LoyaltyCardDbIds.TABLE, null, contentValues); + long id = database.insert(LoyaltyCardDbIds.TABLE, null, contentValues); // FTS - insertFTS(db, (int) id, store, note); + insertFTS(database, (int) id, store, note); - db.setTransactionSuccessful(); - db.endTransaction(); + database.setTransactionSuccessful(); + database.endTransaction(); return id; } - public long insertLoyaltyCard(final SQLiteDatabase db, final String store, - final String note, final Date expiry, final BigDecimal balance, - final Currency balanceType, final String cardId, - final String barcodeId, final CatimaBarcode barcodeType, - final Integer headerColor, final int starStatus, - final Long lastUsed) { - db.beginTransaction(); - - // Card - ContentValues contentValues = new ContentValues(); - contentValues.put(LoyaltyCardDbIds.STORE, store); - contentValues.put(LoyaltyCardDbIds.NOTE, note); - contentValues.put(LoyaltyCardDbIds.EXPIRY, expiry != null ? expiry.getTime() : null); - contentValues.put(LoyaltyCardDbIds.BALANCE, balance.toString()); - contentValues.put(LoyaltyCardDbIds.BALANCE_TYPE, balanceType != null ? balanceType.getCurrencyCode() : null); - contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId); - contentValues.put(LoyaltyCardDbIds.BARCODE_ID, barcodeId); - contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null); - contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); - contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus); - contentValues.put(LoyaltyCardDbIds.LAST_USED, lastUsed != null ? lastUsed : Utils.getUnixTime()); - long id = db.insert(LoyaltyCardDbIds.TABLE, null, contentValues); - - // FTS - insertFTS(db, (int) id, store, note); - - db.setTransactionSuccessful(); - db.endTransaction(); - - return id; - } - - public long insertLoyaltyCard(final SQLiteDatabase db, final int id, final String store, - final String note, final Date expiry, final BigDecimal balance, - final Currency balanceType, final String cardId, - final String barcodeId, final CatimaBarcode barcodeType, - final Integer headerColor, final int starStatus, - final Long lastUsed) { - db.beginTransaction(); + public static long insertLoyaltyCard( + final SQLiteDatabase database, final int id, final String store, final String note, + final Date expiry, final BigDecimal balance, final Currency balanceType, + final String cardId, final String barcodeId, final CatimaBarcode barcodeType, + final Integer headerColor, final int starStatus, final Long lastUsed) { + database.beginTransaction(); // Card ContentValues contentValues = new ContentValues(); @@ -432,24 +397,23 @@ public class DBHelper extends SQLiteOpenHelper { contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus); contentValues.put(LoyaltyCardDbIds.LAST_USED, lastUsed != null ? lastUsed : Utils.getUnixTime()); - db.insert(LoyaltyCardDbIds.TABLE, null, contentValues); + database.insert(LoyaltyCardDbIds.TABLE, null, contentValues); // FTS - insertFTS(db, id, store, note); + insertFTS(database, id, store, note); - db.setTransactionSuccessful(); - db.endTransaction(); + database.setTransactionSuccessful(); + database.endTransaction(); return id; } - public boolean updateLoyaltyCard(final int id, final String store, final String note, - final Date expiry, final BigDecimal balance, - final Currency balanceType, final String cardId, - final String barcodeId, final CatimaBarcode barcodeType, - final Integer headerColor) { - SQLiteDatabase db = getWritableDatabase(); - db.beginTransaction(); + public static boolean updateLoyaltyCard( + SQLiteDatabase database, final int id, final String store, final String note, + final Date expiry, final BigDecimal balance, final Currency balanceType, + final String cardId, final String barcodeId, final CatimaBarcode barcodeType, + final Integer headerColor) { + database.beginTransaction(); // Card ContentValues contentValues = new ContentValues(); @@ -462,53 +426,49 @@ public class DBHelper extends SQLiteOpenHelper { contentValues.put(LoyaltyCardDbIds.BARCODE_ID, barcodeId); contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType != null ? barcodeType.name() : null); contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); - int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues, + int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues, whereAttrs(LoyaltyCardDbIds.ID), withArgs(id)); // FTS - updateFTS(db, id, store, note); + updateFTS(database, id, store, note); - db.setTransactionSuccessful(); - db.endTransaction(); + database.setTransactionSuccessful(); + database.endTransaction(); return (rowsUpdated == 1); } - public boolean updateLoyaltyCardStarStatus(final int id, final int starStatus) { - SQLiteDatabase db = getWritableDatabase(); + public static boolean updateLoyaltyCardStarStatus(SQLiteDatabase database, final int id, final int starStatus) { ContentValues contentValues = new ContentValues(); contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus); - int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues, + int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues, whereAttrs(LoyaltyCardDbIds.ID), withArgs(id)); return (rowsUpdated == 1); } - public boolean updateLoyaltyCardLastUsed(final int id) { - SQLiteDatabase db = getWritableDatabase(); + public static boolean updateLoyaltyCardLastUsed(SQLiteDatabase database, final int id) { ContentValues contentValues = new ContentValues(); contentValues.put(LoyaltyCardDbIds.LAST_USED, System.currentTimeMillis() / 1000); - int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues, + int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues, whereAttrs(LoyaltyCardDbIds.ID), withArgs(id)); return (rowsUpdated == 1); } - public boolean updateLoyaltyCardZoomLevel(int loyaltyCardId, int zoomLevel) { - SQLiteDatabase db = getWritableDatabase(); + public static boolean updateLoyaltyCardZoomLevel(SQLiteDatabase database, int loyaltyCardId, int zoomLevel) { ContentValues contentValues = new ContentValues(); contentValues.put(LoyaltyCardDbIds.ZOOM_LEVEL, zoomLevel); Log.d("updateLoyaltyCardZLevel", "Card Id = " + loyaltyCardId + " Zoom level= " + zoomLevel); - int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues, + int rowsUpdated = database.update(LoyaltyCardDbIds.TABLE, contentValues, whereAttrs(LoyaltyCardDbIds.ID), withArgs(loyaltyCardId)); Log.d("updateLoyaltyCardZLevel", "Rows changed = " + rowsUpdated); return (rowsUpdated == 1); } - public LoyaltyCard getLoyaltyCard(final int id) { - SQLiteDatabase db = getReadableDatabase(); - Cursor data = db.query(LoyaltyCardDbIds.TABLE, null, whereAttrs(LoyaltyCardDbIds.ID), withArgs(id), null, null, null); + public static LoyaltyCard getLoyaltyCard(SQLiteDatabase database, final int id) { + Cursor data = database.query(LoyaltyCardDbIds.TABLE, null, whereAttrs(LoyaltyCardDbIds.ID), withArgs(id), null, null, null); LoyaltyCard card = null; @@ -522,9 +482,8 @@ public class DBHelper extends SQLiteOpenHelper { return card; } - public List getLoyaltyCardGroups(final int id) { - SQLiteDatabase db = getReadableDatabase(); - Cursor data = db.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE + " g " + + public static List getLoyaltyCardGroups(SQLiteDatabase database, final int id) { + Cursor data = database.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE + " g " + " LEFT JOIN " + LoyaltyCardDbIdsGroups.TABLE + " ig ON ig." + LoyaltyCardDbIdsGroups.groupID + " = g." + LoyaltyCardDbGroups.ID + " where " + LoyaltyCardDbIdsGroups.cardID + "=?" + " ORDER BY " + LoyaltyCardDbIdsGroups.groupID, withArgs(id)); @@ -547,11 +506,9 @@ public class DBHelper extends SQLiteOpenHelper { return groups; } - public void setLoyaltyCardGroups(final int id, List groups) { - SQLiteDatabase db = getWritableDatabase(); - + public static void setLoyaltyCardGroups(SQLiteDatabase database, final int id, List groups) { // First delete lookup table entries associated with this card - db.delete(LoyaltyCardDbIdsGroups.TABLE, + database.delete(LoyaltyCardDbIdsGroups.TABLE, whereAttrs(LoyaltyCardDbIdsGroups.cardID), withArgs(id)); @@ -560,39 +517,23 @@ public class DBHelper extends SQLiteOpenHelper { ContentValues contentValues = new ContentValues(); contentValues.put(LoyaltyCardDbIdsGroups.cardID, id); contentValues.put(LoyaltyCardDbIdsGroups.groupID, group._id); - db.insert(LoyaltyCardDbIdsGroups.TABLE, null, contentValues); + database.insert(LoyaltyCardDbIdsGroups.TABLE, null, contentValues); } } - public void setLoyaltyCardGroups(final SQLiteDatabase db, final int id, List groups) { - // First delete lookup table entries associated with this card - db.delete(LoyaltyCardDbIdsGroups.TABLE, - whereAttrs(LoyaltyCardDbIdsGroups.cardID), - withArgs(id)); - - // Then create entries for selected values - for (Group group : groups) { - ContentValues contentValues = new ContentValues(); - contentValues.put(LoyaltyCardDbIdsGroups.cardID, id); - contentValues.put(LoyaltyCardDbIdsGroups.groupID, group._id); - db.insert(LoyaltyCardDbIdsGroups.TABLE, null, contentValues); - } - } - - public boolean deleteLoyaltyCard(Context context, final int id) { - SQLiteDatabase db = getWritableDatabase(); + public static boolean deleteLoyaltyCard(SQLiteDatabase database, Context context, final int id) { // Delete card - int rowsDeleted = db.delete(LoyaltyCardDbIds.TABLE, + int rowsDeleted = database.delete(LoyaltyCardDbIds.TABLE, whereAttrs(LoyaltyCardDbIds.ID), withArgs(id)); // And delete lookup table entries associated with this card - db.delete(LoyaltyCardDbIdsGroups.TABLE, + database.delete(LoyaltyCardDbIdsGroups.TABLE, whereAttrs(LoyaltyCardDbIdsGroups.cardID), withArgs(id)); // Delete FTS table entries - db.delete(LoyaltyCardDbFTS.TABLE, + database.delete(LoyaltyCardDbFTS.TABLE, whereAttrs(LoyaltyCardDbFTS.ID), withArgs(id)); @@ -608,9 +549,9 @@ public class DBHelper extends SQLiteOpenHelper { return (rowsDeleted == 1); } - public Cursor getLoyaltyCardCursor() { + public static Cursor getLoyaltyCardCursor(SQLiteDatabase database) { // An empty string will match everything - return getLoyaltyCardCursor(""); + return getLoyaltyCardCursor(database, ""); } /** @@ -619,8 +560,8 @@ public class DBHelper extends SQLiteOpenHelper { * @param filter * @return Cursor */ - public Cursor getLoyaltyCardCursor(final String filter) { - return getLoyaltyCardCursor(filter, null); + public static Cursor getLoyaltyCardCursor(SQLiteDatabase database, final String filter) { + return getLoyaltyCardCursor(database, filter, null); } /** @@ -630,8 +571,8 @@ public class DBHelper extends SQLiteOpenHelper { * @param group * @return Cursor */ - public Cursor getLoyaltyCardCursor(final String filter, Group group) { - return getLoyaltyCardCursor(filter, group, LoyaltyCardOrder.Alpha, LoyaltyCardOrderDirection.Ascending); + public static Cursor getLoyaltyCardCursor(SQLiteDatabase database, final String filter, Group group) { + return getLoyaltyCardCursor(database, filter, group, LoyaltyCardOrder.Alpha, LoyaltyCardOrderDirection.Ascending); } /** @@ -642,14 +583,12 @@ public class DBHelper extends SQLiteOpenHelper { * @param order * @return Cursor */ - public Cursor getLoyaltyCardCursor(String filter, Group group, LoyaltyCardOrder order, LoyaltyCardOrderDirection direction) { + public static Cursor getLoyaltyCardCursor(SQLiteDatabase database, String filter, Group group, LoyaltyCardOrder order, LoyaltyCardOrderDirection direction) { StringBuilder groupFilter = new StringBuilder(); String limitString = ""; - SQLiteDatabase db = getReadableDatabase(); - if (group != null) { - List allowedIds = getGroupCardIds(group._id); + List allowedIds = getGroupCardIds(database, group._id); // Empty group if (!allowedIds.isEmpty()) { @@ -669,7 +608,7 @@ public class DBHelper extends SQLiteOpenHelper { String orderField = getFieldForOrder(order); - return db.rawQuery("SELECT " + LoyaltyCardDbIds.TABLE + ".* FROM " + LoyaltyCardDbIds.TABLE + + return database.rawQuery("SELECT " + LoyaltyCardDbIds.TABLE + ".* FROM " + LoyaltyCardDbIds.TABLE + " JOIN " + LoyaltyCardDbFTS.TABLE + " ON " + LoyaltyCardDbFTS.TABLE + "." + LoyaltyCardDbFTS.ID + " = " + LoyaltyCardDbIds.TABLE + "." + LoyaltyCardDbIds.ID + (filter.trim().isEmpty() ? " " : " AND " + LoyaltyCardDbFTS.TABLE + " MATCH ? ") + @@ -686,9 +625,8 @@ public class DBHelper extends SQLiteOpenHelper { * * @return Integer */ - public int getLoyaltyCardCount() { - SQLiteDatabase db = getReadableDatabase(); - return (int) DatabaseUtils.queryNumEntries(db, LoyaltyCardDbIds.TABLE); + public static int getLoyaltyCardCount(SQLiteDatabase database) { + return (int) DatabaseUtils.queryNumEntries(database, LoyaltyCardDbIds.TABLE); } /** @@ -696,15 +634,13 @@ public class DBHelper extends SQLiteOpenHelper { * * @return Cursor */ - public Cursor getGroupCursor() { - SQLiteDatabase db = getReadableDatabase(); - - return db.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE + + public static Cursor getGroupCursor(SQLiteDatabase database) { + return database.rawQuery("select * from " + LoyaltyCardDbGroups.TABLE + " ORDER BY " + LoyaltyCardDbGroups.ORDER + " ASC," + LoyaltyCardDbGroups.ID + " COLLATE NOCASE ASC", null, null); } - public List getGroups() { - Cursor data = getGroupCursor(); + public static List getGroups(SQLiteDatabase database) { + Cursor data = getGroupCursor(database); List groups = new ArrayList<>(); @@ -722,15 +658,14 @@ public class DBHelper extends SQLiteOpenHelper { return groups; } - public void reorderGroups(final List groups) { + public static void reorderGroups(SQLiteDatabase database, final List groups) { Integer order = 0; - SQLiteDatabase db = getWritableDatabase(); for (Group group : groups) { ContentValues contentValues = new ContentValues(); contentValues.put(LoyaltyCardDbGroups.ORDER, order); - db.update(LoyaltyCardDbGroups.TABLE, contentValues, + database.update(LoyaltyCardDbGroups.TABLE, contentValues, whereAttrs(LoyaltyCardDbGroups.ID), withArgs(group._id)); @@ -738,9 +673,8 @@ public class DBHelper extends SQLiteOpenHelper { } } - public Group getGroup(final String groupName) { - SQLiteDatabase db = getReadableDatabase(); - Cursor data = db.query(LoyaltyCardDbGroups.TABLE, null, + public static Group getGroup(SQLiteDatabase database, final String groupName) { + Cursor data = database.query(LoyaltyCardDbGroups.TABLE, null, whereAttrs(LoyaltyCardDbGroups.ID), withArgs(groupName), null, null, null); Group group = null; @@ -753,14 +687,12 @@ public class DBHelper extends SQLiteOpenHelper { return group; } - public int getGroupCount() { - SQLiteDatabase db = getReadableDatabase(); - return (int) DatabaseUtils.queryNumEntries(db, LoyaltyCardDbGroups.TABLE); + public static int getGroupCount(SQLiteDatabase database) { + return (int) DatabaseUtils.queryNumEntries(database, LoyaltyCardDbGroups.TABLE); } - public List getGroupCardIds(final String groupName) { - SQLiteDatabase db = getReadableDatabase(); - Cursor data = db.query(LoyaltyCardDbIdsGroups.TABLE, withArgs(LoyaltyCardDbIdsGroups.cardID), + public static List getGroupCardIds(SQLiteDatabase database, final String groupName) { + Cursor data = database.query(LoyaltyCardDbIdsGroups.TABLE, withArgs(LoyaltyCardDbIdsGroups.cardID), whereAttrs(LoyaltyCardDbIdsGroups.groupID), withArgs(groupName), null, null, null); List cardIds = new ArrayList<>(); @@ -779,99 +711,85 @@ public class DBHelper extends SQLiteOpenHelper { return cardIds; } - public long insertGroup(final String name) { + public static long insertGroup(SQLiteDatabase database, final String name) { if (name.isEmpty()) return -1; - SQLiteDatabase db = getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(LoyaltyCardDbGroups.ID, name); - contentValues.put(LoyaltyCardDbGroups.ORDER, getGroupCount()); - return db.insert(LoyaltyCardDbGroups.TABLE, null, contentValues); + contentValues.put(LoyaltyCardDbGroups.ORDER, getGroupCount(database)); + return database.insert(LoyaltyCardDbGroups.TABLE, null, contentValues); } - public boolean insertGroup(final SQLiteDatabase db, final String name) { - ContentValues contentValues = new ContentValues(); - contentValues.put(LoyaltyCardDbGroups.ID, name); - contentValues.put(LoyaltyCardDbGroups.ORDER, getGroupCount()); - final long newId = db.insert(LoyaltyCardDbGroups.TABLE, null, contentValues); - return newId != -1; - } - - public boolean updateGroup(final String groupName, final String newName) { + public static boolean updateGroup(SQLiteDatabase database, final String groupName, final String newName) { if (newName.isEmpty()) return false; boolean success = false; - SQLiteDatabase db = getWritableDatabase(); ContentValues groupContentValues = new ContentValues(); groupContentValues.put(LoyaltyCardDbGroups.ID, newName); ContentValues lookupContentValues = new ContentValues(); lookupContentValues.put(LoyaltyCardDbIdsGroups.groupID, newName); - db.beginTransaction(); + database.beginTransaction(); try { // Update group name - int groupsChanged = db.update(LoyaltyCardDbGroups.TABLE, groupContentValues, + int groupsChanged = database.update(LoyaltyCardDbGroups.TABLE, groupContentValues, whereAttrs(LoyaltyCardDbGroups.ID), withArgs(groupName)); // Also update lookup tables - db.update(LoyaltyCardDbIdsGroups.TABLE, lookupContentValues, + database.update(LoyaltyCardDbIdsGroups.TABLE, lookupContentValues, whereAttrs(LoyaltyCardDbIdsGroups.groupID), withArgs(groupName)); if (groupsChanged == 1) { - db.setTransactionSuccessful(); + database.setTransactionSuccessful(); success = true; } - } catch (SQLiteException e) { + } catch (SQLiteException ignored) { } finally { - db.endTransaction(); + database.endTransaction(); } return success; } - public boolean deleteGroup(final String groupName) { + public static boolean deleteGroup(SQLiteDatabase database, final String groupName) { boolean success = false; - SQLiteDatabase db = getWritableDatabase(); - - db.beginTransaction(); + database.beginTransaction(); try { // Delete group - int groupsDeleted = db.delete(LoyaltyCardDbGroups.TABLE, + int groupsDeleted = database.delete(LoyaltyCardDbGroups.TABLE, whereAttrs(LoyaltyCardDbGroups.ID), withArgs(groupName)); // And delete lookup table entries associated with this group - db.delete(LoyaltyCardDbIdsGroups.TABLE, + database.delete(LoyaltyCardDbIdsGroups.TABLE, whereAttrs(LoyaltyCardDbIdsGroups.groupID), withArgs(groupName)); if (groupsDeleted == 1) { - db.setTransactionSuccessful(); + database.setTransactionSuccessful(); success = true; } } finally { - db.endTransaction(); + database.endTransaction(); } // Reorder after delete to ensure no bad order IDs - reorderGroups(getGroups()); + reorderGroups(database, getGroups(database)); return success; } - public int getGroupCardCount(final String groupName) { - SQLiteDatabase db = getReadableDatabase(); - - return (int) DatabaseUtils.queryNumEntries(db, LoyaltyCardDbIdsGroups.TABLE, + public static int getGroupCardCount(SQLiteDatabase database, final String groupName) { + return (int) DatabaseUtils.queryNumEntries(database, LoyaltyCardDbIdsGroups.TABLE, whereAttrs(LoyaltyCardDbIdsGroups.groupID), withArgs(groupName)); } - private String whereAttrs(String... attrs) { + static private String whereAttrs(String... attrs) { if (attrs.length == 0) { return null; } @@ -882,13 +800,13 @@ public class DBHelper extends SQLiteOpenHelper { return whereClause.toString(); } - private String[] withArgs(Object... object) { + static private String[] withArgs(Object... object) { return Arrays.stream(object) .map(String::valueOf) .toArray(String[]::new); } - private String getFieldForOrder(LoyaltyCardOrder order) { + private static String getFieldForOrder(LoyaltyCardOrder order) { if (order == LoyaltyCardOrder.Alpha) { return LoyaltyCardDbIds.STORE; } @@ -904,7 +822,7 @@ public class DBHelper extends SQLiteOpenHelper { throw new IllegalArgumentException("Unknown order " + order); } - private String getDbDirection(LoyaltyCardOrder order, LoyaltyCardOrderDirection direction) { + private static String getDbDirection(LoyaltyCardOrder order, LoyaltyCardOrderDirection direction) { if (order == LoyaltyCardOrder.LastUsed) { // We want the default sorting to put the most recently used first return direction == LoyaltyCardOrderDirection.Descending ? "ASC" : "DESC"; diff --git a/app/src/main/java/protect/card_locker/GroupCursorAdapter.java b/app/src/main/java/protect/card_locker/GroupCursorAdapter.java index 306027b0e..42670be6c 100644 --- a/app/src/main/java/protect/card_locker/GroupCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/GroupCursorAdapter.java @@ -2,6 +2,7 @@ package protect.card_locker; import android.content.Context; import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -12,19 +13,19 @@ import androidx.appcompat.widget.AppCompatImageButton; import androidx.recyclerview.widget.RecyclerView; import protect.card_locker.preferences.Settings; -class GroupCursorAdapter extends BaseCursorAdapter { +public class GroupCursorAdapter extends BaseCursorAdapter { Settings mSettings; private final Context mContext; - private final GroupCursorAdapter.GroupAdapterListener mListener; - DBHelper mDb; + private final GroupAdapterListener mListener; + SQLiteDatabase mDatabase; - public GroupCursorAdapter(Context inputContext, Cursor inputCursor, GroupCursorAdapter.GroupAdapterListener inputListener) { - super(inputCursor); + public GroupCursorAdapter(Context inputContext, Cursor inputCursor, GroupAdapterListener inputListener) { + super(inputCursor, DBHelper.LoyaltyCardDbGroups.ORDER); setHasStableIds(true); mSettings = new Settings(inputContext); - mContext = inputContext; + mContext = inputContext.getApplicationContext(); mListener = inputListener; - mDb = new DBHelper(inputContext); + mDatabase = new DBHelper(inputContext).getReadableDatabase(); swapCursor(inputCursor); } @@ -36,12 +37,12 @@ class GroupCursorAdapter extends BaseCursorAdapter { this.listener = listener; } - private ImportExportResult performImport(Context context, InputStream stream, DBHelper db, char[] password) { - ImportExportResult result = MultiFormatImporter.importData(context, db, stream, format, password); + private ImportExportResult performImport(Context context, InputStream stream, SQLiteDatabase database, char[] password) { + ImportExportResult result = MultiFormatImporter.importData(context, database, stream, format, password); Log.i(TAG, "Import result: " + result.name()); return result; } - private ImportExportResult performExport(Context context, OutputStream stream, DBHelper db, char[] password) { + private ImportExportResult performExport(Context context, OutputStream stream, SQLiteDatabase database, char[] password) { ImportExportResult result = ImportExportResult.GenericFailure; try { OutputStreamWriter writer = new OutputStreamWriter(stream, StandardCharsets.UTF_8); - result = MultiFormatExporter.exportData(context, db, stream, format, password); + result = MultiFormatExporter.exportData(context, database, stream, format, password); writer.close(); } catch (IOException e) { Log.e(TAG, "Unable to export file", e); @@ -82,15 +84,17 @@ public class ImportExportTask implements CompatCallable { } protected ImportExportResult doInBackground(Void... nothing) { - final DBHelper db = new DBHelper(activity); + final SQLiteDatabase database = new DBHelper(activity).getWritableDatabase(); ImportExportResult result; if (doImport) { - result = performImport(activity.getApplicationContext(), inputStream, db, password); + result = performImport(activity.getApplicationContext(), inputStream, database, password); } else { - result = performExport(activity.getApplicationContext(), outputStream, db, password); + result = performExport(activity.getApplicationContext(), outputStream, database, password); } + database.close(); + return result; } diff --git a/app/src/main/java/protect/card_locker/ImportURIHelper.java b/app/src/main/java/protect/card_locker/ImportURIHelper.java index 6623aded5..8a94cc6df 100644 --- a/app/src/main/java/protect/card_locker/ImportURIHelper.java +++ b/app/src/main/java/protect/card_locker/ImportURIHelper.java @@ -197,6 +197,7 @@ public class ImportURIHelper { sendIntent.setType("text/plain"); Intent shareIntent = Intent.createChooser(sendIntent, null); + shareIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(shareIntent); } } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardAnimator.java b/app/src/main/java/protect/card_locker/LoyaltyCardAnimator.java deleted file mode 100644 index 43e6ed6e8..000000000 --- a/app/src/main/java/protect/card_locker/LoyaltyCardAnimator.java +++ /dev/null @@ -1,37 +0,0 @@ -package protect.card_locker; - -import android.animation.AnimatorInflater; -import android.animation.AnimatorSet; -import android.content.Context; -import android.view.View; - -public class LoyaltyCardAnimator { - - private static AnimatorSet selectedViewIn, defaultViewOut, selectedViewOut, defaultViewIn; - - public static void flipView(Context inputContext, final View inputSelectedView, final View inputDefaultView, boolean inputItemSelected) { - - selectedViewIn = (AnimatorSet) AnimatorInflater.loadAnimator(inputContext, R.animator.flip_left_in); - defaultViewOut = (AnimatorSet) AnimatorInflater.loadAnimator(inputContext, R.animator.flip_right_out); - selectedViewOut = (AnimatorSet) AnimatorInflater.loadAnimator(inputContext, R.animator.flip_left_out); - defaultViewIn = (AnimatorSet) AnimatorInflater.loadAnimator(inputContext, R.animator.flip_right_in); - - final AnimatorSet showFrontAnim = new AnimatorSet(); - final AnimatorSet showBackAnim = new AnimatorSet(); - - selectedViewIn.setTarget(inputSelectedView); - defaultViewOut.setTarget(inputDefaultView); - showFrontAnim.playTogether(selectedViewIn, defaultViewOut); - - selectedViewOut.setTarget(inputSelectedView); - defaultViewIn.setTarget(inputDefaultView); - showBackAnim.playTogether(defaultViewIn, selectedViewOut); - - if (inputItemSelected) { - showFrontAnim.start(); - } else { - showBackAnim.start(); - } - } - -} diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java index 93f098319..072cec446 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java @@ -15,6 +15,7 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import androidx.constraintlayout.widget.ConstraintLayout; import androidx.core.content.ContextCompat; import androidx.core.graphics.BlendModeColorFilterCompat; import androidx.core.graphics.BlendModeCompat; @@ -25,6 +26,8 @@ import com.google.android.material.card.MaterialCardView; import java.math.BigDecimal; import java.text.DateFormat; import java.util.ArrayList; +import java.util.Currency; +import java.util.Date; import protect.card_locker.preferences.Settings; @@ -40,7 +43,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter { inputListener.onRowClicked(getAdapterPosition()); @@ -263,6 +226,101 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter= Build.VERSION_CODES.N) { LocaleList locales = getApplicationContext().getResources().getConfiguration().getLocales(); - for (int i = locales.size() - 1; i > 0; i--) { + for (int i = locales.size() - 1; i >= 0; i--) { Locale locale = locales.get(i); String currencySymbol = Currency.getInstance(locale).getSymbol(); currencyList.remove(currencySymbol); currencyList.add(0, currencySymbol); } } else { - String currencySymbol = Currency.getInstance(getApplicationContext().getResources().getConfiguration().locale).getSymbol(); + String currencySymbol = Currency.getInstance(mSystemLocale).getSymbol(); currencyList.remove(currencySymbol); currencyList.add(0, currencySymbol); } @@ -729,7 +742,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { if (tempLoyaltyCard == null) { if (updateLoyaltyCard) { - tempLoyaltyCard = db.getLoyaltyCard(loyaltyCardId); + tempLoyaltyCard = DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId); if (tempLoyaltyCard == null) { Log.w(TAG, "Could not lookup loyalty card " + loyaltyCardId); Toast.makeText(this, R.string.noCardExistsError, Toast.LENGTH_LONG).show(); @@ -792,9 +805,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { barcodeTypeField.setText(tempLoyaltyCard.barcodeType != null ? tempLoyaltyCard.barcodeType.prettyName() : getString(R.string.noBarcode)); if (groupsChips.getChildCount() == 0) { - List existingGroups = db.getGroups(); + List existingGroups = DBHelper.getGroups(mDatabase); - List loyaltyCardGroups = db.getLoyaltyCardGroups(loyaltyCardId); + List loyaltyCardGroups = DBHelper.getLoyaltyCardGroups(mDatabase, loyaltyCardId); if (existingGroups.isEmpty()) { groupsChips.setVisibility(View.GONE); @@ -802,7 +815,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { groupsChips.setVisibility(View.VISIBLE); } - for (Group group : db.getGroups()) { + for (Group group : DBHelper.getGroups(mDatabase)) { Chip chip = (Chip) getLayoutInflater().inflate(R.layout.layout_chip_choice, groupsChips, false); chip.setText(group._id); chip.setTag(group); @@ -1258,7 +1271,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { } if (updateLoyaltyCard) { //update of "starStatus" not necessary, since it cannot be changed in this activity (only in ViewActivity) - db.updateLoyaltyCard(loyaltyCardId, tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor); + DBHelper.updateLoyaltyCard(mDatabase, loyaltyCardId, tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor); try { Utils.saveCardImage(this, (Bitmap) cardImageFront.getTag(), loyaltyCardId, ImageLocationType.front); Utils.saveCardImage(this, (Bitmap) cardImageBack.getTag(), loyaltyCardId, ImageLocationType.back); @@ -1268,7 +1281,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { } Log.i(TAG, "Updated " + loyaltyCardId + " to " + cardId); } else { - loyaltyCardId = (int) db.insertLoyaltyCard(tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor, 0, tempLoyaltyCard.lastUsed); + loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, tempLoyaltyCard.store, tempLoyaltyCard.note, tempLoyaltyCard.expiry, tempLoyaltyCard.balance, tempLoyaltyCard.balanceType, tempLoyaltyCard.cardId, tempLoyaltyCard.barcodeId, tempLoyaltyCard.barcodeType, tempLoyaltyCard.headerColor, 0, tempLoyaltyCard.lastUsed); try { Utils.saveCardImage(this, (Bitmap) cardImageFront.getTag(), loyaltyCardId, ImageLocationType.front); Utils.saveCardImage(this, (Bitmap) cardImageBack.getTag(), loyaltyCardId, ImageLocationType.back); @@ -1278,9 +1291,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { } } - db.setLoyaltyCardGroups(loyaltyCardId, selectedGroups); + DBHelper.setLoyaltyCardGroups(mDatabase, loyaltyCardId, selectedGroups); - ShortcutHelper.updateShortcuts(this, db.getLoyaltyCard(loyaltyCardId)); + ShortcutHelper.updateShortcuts(this, DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId)); finish(); } @@ -1312,8 +1325,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { builder.setPositiveButton(R.string.confirm, (dialog, which) -> { Log.e(TAG, "Deleting card: " + loyaltyCardId); - DBHelper db = new DBHelper(LoyaltyCardEditActivity.this); - db.deleteLoyaltyCard(LoyaltyCardEditActivity.this, loyaltyCardId); + DBHelper.deleteLoyaltyCard(mDatabase, LoyaltyCardEditActivity.this, loyaltyCardId); ShortcutHelper.removeShortcut(LoyaltyCardEditActivity.this, loyaltyCardId); diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java index d7b1b7335..13d6e1263 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java @@ -3,6 +3,7 @@ package protect.card_locker; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.res.Configuration; +import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.Outline; @@ -48,6 +49,7 @@ import androidx.appcompat.widget.Toolbar; import androidx.constraintlayout.widget.Guideline; import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.core.content.ContextCompat; +import androidx.core.graphics.ColorUtils; import androidx.core.graphics.drawable.DrawableCompat; import androidx.core.widget.NestedScrollView; import androidx.core.widget.TextViewCompat; @@ -83,7 +85,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements int loyaltyCardId; LoyaltyCard loyaltyCard; boolean rotationEnabled; - DBHelper db; + SQLiteDatabase database; ImportURIHelper importURIHelper; Settings settings; @@ -256,7 +258,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements setContentView(R.layout.loyalty_card_view_layout); - db = new DBHelper(this); + database = new DBHelper(this).getWritableDatabase(); importURIHelper = new ImportURIHelper(this); coordinatorLayout = findViewById(R.id.coordinator_layout); @@ -296,7 +298,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements Log.d(TAG, "Scaling to " + scale); loyaltyCard.zoomLevel = progress; - db.updateLoyaltyCardZoomLevel(loyaltyCardId, loyaltyCard.zoomLevel); + DBHelper.updateLoyaltyCardZoomLevel(database, loyaltyCardId, loyaltyCard.zoomLevel); setCenterGuideline(loyaltyCard.zoomLevel); @@ -465,7 +467,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements window.setAttributes(attributes); } - loyaltyCard = db.getLoyaltyCard(loyaltyCardId); + loyaltyCard = DBHelper.getLoyaltyCard(database, loyaltyCardId); if (loyaltyCard == null) { Log.w(TAG, "Could not lookup loyalty card " + loyaltyCardId); Toast.makeText(this, R.string.noCardExistsError, Toast.LENGTH_LONG).show(); @@ -492,7 +494,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements noteView.setVisibility(View.GONE); } - List loyaltyCardGroups = db.getLoyaltyCardGroups(loyaltyCardId); + List loyaltyCardGroups = DBHelper.getLoyaltyCardGroups(database, loyaltyCardId); if (loyaltyCardGroups.size() > 0) { List groupNames = new ArrayList<>(); @@ -583,8 +585,11 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements // Make notification area light if dark icons are needed if (Build.VERSION.SDK_INT >= 23) { window.getDecorView().setSystemUiVisibility(backgroundNeedsDarkIcons ? View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR : 0); + window.setStatusBarColor(Color.TRANSPARENT); + } else { + // Darken statusbar if icons won't be visible otherwise + window.setStatusBarColor(backgroundNeedsDarkIcons ? ColorUtils.blendARGB(backgroundHeaderColor, Color.BLACK, 0.15f) : Color.TRANSPARENT); } - window.setStatusBarColor(Color.TRANSPARENT); // Set shadow colour of store text so even same color on same color would be readable storeName.setShadowLayer(1, 1, 1, backgroundNeedsDarkIcons ? Color.BLACK : Color.WHITE); @@ -636,7 +641,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements // restore bottomSheet UI states from changing orientation changeUiToBottomSheetState(bottomSheetState); - db.updateLoyaltyCardLastUsed(loyaltyCard.id); + DBHelper.updateLoyaltyCardLastUsed(database, loyaltyCard.id); } @Override @@ -661,7 +666,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements item.setVisible(false); } - loyaltyCard = db.getLoyaltyCard(loyaltyCardId); + loyaltyCard = DBHelper.getLoyaltyCard(database, loyaltyCardId); starred = loyaltyCard.starStatus != 0; menu.findItem(R.id.action_share).setIcon(getIcon(R.drawable.ic_share_white, backgroundNeedsDarkIcons)); @@ -712,7 +717,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements case R.id.action_star_unstar: starred = !starred; - db.updateLoyaltyCardStarStatus(loyaltyCardId, starred ? 1 : 0); + DBHelper.updateLoyaltyCardStarStatus(database, loyaltyCardId, starred ? 1 : 0); invalidateOptionsMenu(); return true; } diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index e33ad7c42..b5c6baf40 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -1,13 +1,14 @@ package protect.card_locker; +import android.app.Activity; import android.app.SearchManager; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.database.Cursor; import android.database.CursorIndexOutOfBoundsException; +import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.util.Log; import android.view.GestureDetector; @@ -18,14 +19,6 @@ import android.view.View; import android.widget.CheckBox; import android.widget.Toast; -import com.google.android.material.floatingactionbutton.FloatingActionButton; -import com.google.android.material.tabs.TabLayout; - -import java.io.UnsupportedEncodingException; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AlertDialog; @@ -35,12 +28,21 @@ import androidx.appcompat.widget.Toolbar; import androidx.core.splashscreen.SplashScreen; import androidx.recyclerview.widget.RecyclerView; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.google.android.material.tabs.TabLayout; + +import java.io.UnsupportedEncodingException; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + import protect.card_locker.preferences.SettingsActivity; public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener, GestureDetector.OnGestureListener { private static final String TAG = "Catima"; + public static final String RESTART_ACTIVITY_INTENT = "restart_activity_intent"; - private final DBHelper mDB = new DBHelper(this); + private SQLiteDatabase mDatabase; private LoyaltyCardCursorAdapter mAdapter; private ActionMode mCurrentActionMode; private SearchView mSearchView; @@ -56,6 +58,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard private View mNoGroupCardsText; private ActivityResultLauncher mBarcodeScannerLauncher; + private ActivityResultLauncher mSettingsLauncher; private ActionMode.Callback mCurrentActionModeCallback = new ActionMode.Callback() { @Override @@ -142,7 +145,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) { Log.e(TAG, "Deleting card: " + loyaltyCard.id); - db.deleteLoyaltyCard(MainActivity.this, loyaltyCard.id); + DBHelper.deleteLoyaltyCard(mDatabase, MainActivity.this, loyaltyCard.id); ShortcutHelper.removeShortcut(MainActivity.this, loyaltyCard.id); } @@ -168,12 +171,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard public void onDestroyActionMode(ActionMode inputMode) { mAdapter.clearSelections(); mCurrentActionMode = null; - mCardList.post(new Runnable() { - @Override - public void run() { - mAdapter.resetAnimationIndex(); - } - }); } }; @@ -186,6 +183,8 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); + mDatabase = new DBHelper(this).getWritableDatabase(); + TabLayout groupsTabLayout = findViewById(R.id.groups); groupsTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override @@ -283,6 +282,15 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard startActivity(newIntent); } }); + + mSettingsLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == Activity.RESULT_OK) { + Intent intent = result.getData(); + if (intent != null && intent.getBooleanExtra(RESTART_ACTIVITY_INTENT, false)) { + recreate(); + } + } + }); } @Override @@ -360,9 +368,9 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard group = (Group) mGroup; } - mAdapter.swapCursor(mDB.getLoyaltyCardCursor(mFilter, group, mOrder, mOrderDirection)); + mAdapter.swapCursor(DBHelper.getLoyaltyCardCursor(mDatabase, mFilter, group, mOrder, mOrderDirection)); - if (mDB.getLoyaltyCardCount() > 0) { + if (DBHelper.getLoyaltyCardCount(mDatabase) > 0) { // We want the cardList to be visible regardless of the filtered match count // to ensure that the noMatchingCardsText doesn't end up being shown below // the keyboard @@ -396,9 +404,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard } public void updateTabGroups(TabLayout groupsTabLayout) { - final DBHelper db = new DBHelper(this); - - List newGroups = db.getGroups(); + List newGroups = DBHelper.getGroups(mDatabase); if (newGroups.size() == 0) { groupsTabLayout.removeAllTabs(); @@ -534,7 +540,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard if (id == R.id.action_settings) { Intent i = new Intent(getApplicationContext(), SettingsActivity.class); - startActivity(i); + mSettingsLauncher.launch(i); return true; } diff --git a/app/src/main/java/protect/card_locker/ManageGroupActivity.java b/app/src/main/java/protect/card_locker/ManageGroupActivity.java index 19482bce0..436a98cdd 100644 --- a/app/src/main/java/protect/card_locker/ManageGroupActivity.java +++ b/app/src/main/java/protect/card_locker/ManageGroupActivity.java @@ -2,6 +2,7 @@ package protect.card_locker; import android.content.Intent; +import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; @@ -25,7 +26,7 @@ import androidx.recyclerview.widget.RecyclerView; public class ManageGroupActivity extends CatimaAppCompatActivity implements ManageGroupCursorAdapter.CardAdapterListener { - private final DBHelper mDB = new DBHelper(this); + private SQLiteDatabase mDatabase; private ManageGroupCursorAdapter mAdapter; private final String SAVE_INSTANCE_ADAPTER_STATE = "adapterState"; @@ -45,6 +46,8 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); + mDatabase = new DBHelper(this).getWritableDatabase(); + mHelpText = findViewById(R.id.helpText); mCardList = findViewById(R.id.list); FloatingActionButton saveButton = findViewById(R.id.fabSave); @@ -70,7 +73,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana return; } if (!mGroup._id.equals(currentGroupName)) { - if (mDB.getGroup(currentGroupName) != null) { + if (DBHelper.getGroup(mDatabase, currentGroupName) != null) { mGroupNameNotInUse = false; mGroupNameText.setError(getResources().getText(R.string.group_name_already_in_use)); } else { @@ -86,7 +89,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana throw (new IllegalArgumentException("this activity expects a group loaded into it's intent")); } Log.d("groupId", "groupId: " + groupId); - mGroup = mDB.getGroup(groupId); + mGroup = DBHelper.getGroup(mDatabase, groupId); if (mGroup == null) { throw (new IllegalArgumentException("cannot load group " + groupId + " from database")); } @@ -123,7 +126,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana mAdapter.commitToDatabase(); if (!currentGroupName.equals(mGroup._id)) { - mDB.updateGroup(mGroup._id, currentGroupName); + DBHelper.updateGroup(mDatabase, mGroup._id, currentGroupName); } Toast.makeText(getApplicationContext(), R.string.group_updated, Toast.LENGTH_SHORT).show(); finish(); @@ -163,7 +166,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana } private void updateLoyaltyCardList() { - mAdapter.swapCursor(mDB.getLoyaltyCardCursor()); + mAdapter.swapCursor(DBHelper.getLoyaltyCardCursor(mDatabase)); if (mAdapter.getItemCount() == 0) { mCardList.setVisibility(View.GONE); @@ -205,7 +208,7 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana @Override public void onRowLongClicked(int inputPosition) { - // do nothing for now + mAdapter.toggleSelection(inputPosition); } @Override diff --git a/app/src/main/java/protect/card_locker/ManageGroupCursorAdapter.java b/app/src/main/java/protect/card_locker/ManageGroupCursorAdapter.java index bf37effb5..9e198719b 100644 --- a/app/src/main/java/protect/card_locker/ManageGroupCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/ManageGroupCursorAdapter.java @@ -2,6 +2,7 @@ package protect.card_locker; import android.content.Context; import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; import java.util.HashMap; import java.util.List; @@ -13,13 +14,13 @@ public class ManageGroupCursorAdapter extends LoyaltyCardCursorAdapter { private HashMap mIsLoyaltyCardInGroupCache; private HashMap> mGetGroupCache; final private Group mGroup; - final private DBHelper mDb; + final private SQLiteDatabase mDatabase; public ManageGroupCursorAdapter(Context inputContext, Cursor inputCursor, CardAdapterListener inputListener, Group group) { super(inputContext, inputCursor, inputListener); mGroup = new Group(group._id, group.order); mInGroupOverlay = new HashMap<>(); - mDb = new DBHelper(inputContext); + mDatabase = new DBHelper(inputContext).getWritableDatabase(); } @Override @@ -47,7 +48,7 @@ public class ManageGroupCursorAdapter extends LoyaltyCardCursorAdapter { if (cache != null) { return cache; } - List groups = mDb.getLoyaltyCardGroups(cardId); + List groups = DBHelper.getLoyaltyCardGroups(mDatabase, cardId); mGetGroupCache.put(cardId, groups); return groups; } @@ -94,7 +95,7 @@ public class ManageGroupCursorAdapter extends LoyaltyCardCursorAdapter { } else { groups.remove(mGroup); } - mDb.setLoyaltyCardGroups(cardId, groups); + DBHelper.setLoyaltyCardGroups(mDatabase, cardId, groups); } } diff --git a/app/src/main/java/protect/card_locker/ManageGroupsActivity.java b/app/src/main/java/protect/card_locker/ManageGroupsActivity.java index 2573a9440..a5f281b1e 100644 --- a/app/src/main/java/protect/card_locker/ManageGroupsActivity.java +++ b/app/src/main/java/protect/card_locker/ManageGroupsActivity.java @@ -3,6 +3,7 @@ package protect.card_locker; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.text.InputType; import android.view.MenuItem; @@ -26,7 +27,7 @@ import androidx.recyclerview.widget.RecyclerView; public class ManageGroupsActivity extends CatimaAppCompatActivity implements GroupCursorAdapter.GroupAdapterListener { private static final String TAG = "Catima"; - private final DBHelper mDb = new DBHelper(this); + private SQLiteDatabase mDatabase; private TextView mHelpText; private RecyclerView mGroupList; GroupCursorAdapter mAdapter; @@ -42,6 +43,8 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); } + + mDatabase = new DBHelper(this).getWritableDatabase(); } @Override @@ -72,9 +75,9 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro } private void updateGroupList() { - mAdapter.swapCursor(mDb.getGroupCursor()); + mAdapter.swapCursor(DBHelper.getGroupCursor(mDatabase)); - if (mDb.getGroupCount() == 0) { + if (DBHelper.getGroupCount(mDatabase) == 0) { mGroupList.setVisibility(View.GONE); mHelpText.setVisibility(View.VISIBLE); @@ -118,11 +121,11 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro Toast.makeText(getApplicationContext(), R.string.group_name_is_empty, Toast.LENGTH_SHORT).show(); return; } - if (mDb.getGroup(inputString) != null) { + if (DBHelper.getGroup(mDatabase, inputString) != null) { Toast.makeText(getApplicationContext(), R.string.group_name_already_in_use, Toast.LENGTH_SHORT).show(); return; } - mDb.insertGroup(inputString); + DBHelper.insertGroup(mDatabase, inputString); updateGroupList(); }); builder.setNegativeButton(getString(R.string.cancel), (dialog, which) -> dialog.cancel()); @@ -138,10 +141,10 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro } private void moveGroup(View view, boolean up) { - List groups = mDb.getGroups(); + List groups = DBHelper.getGroups(mDatabase); final String groupName = getGroupName(view); - int currentIndex = mDb.getGroup(groupName).order; + int currentIndex = DBHelper.getGroup(mDatabase, groupName).order; int newIndex; // Reinsert group in correct position @@ -160,7 +163,7 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro groups.add(newIndex, group); // Update database - mDb.reorderGroups(groups); + DBHelper.reorderGroups(mDatabase, groups); // Update UI updateGroupList(); @@ -195,7 +198,7 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro builder.setMessage(groupName); builder.setPositiveButton(getString(R.string.ok), (dialog, which) -> { - mDb.deleteGroup(groupName); + DBHelper.deleteGroup(mDatabase, groupName); updateGroupList(); // Delete may change ordering, so invalidate invalidateHomescreenActiveTab(); diff --git a/app/src/main/java/protect/card_locker/ShortcutHelper.java b/app/src/main/java/protect/card_locker/ShortcutHelper.java index 426983cf1..e974421a9 100644 --- a/app/src/main/java/protect/card_locker/ShortcutHelper.java +++ b/app/src/main/java/protect/card_locker/ShortcutHelper.java @@ -2,6 +2,7 @@ package protect.card_locker; import android.content.Context; import android.content.Intent; +import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; @@ -45,7 +46,7 @@ class ShortcutHelper { static void updateShortcuts(Context context, LoyaltyCard card) { LinkedList list = new LinkedList<>(ShortcutManagerCompat.getDynamicShortcuts(context)); - DBHelper dbHelper = new DBHelper(context); + SQLiteDatabase database = new DBHelper(context).getReadableDatabase(); String shortcutId = Integer.toString(card.id); @@ -88,7 +89,7 @@ class ShortcutHelper { for (int index = 0; index < list.size(); index++) { ShortcutInfoCompat prevShortcut = list.get(index); - LoyaltyCard loyaltyCard = dbHelper.getLoyaltyCard(Integer.parseInt(prevShortcut.getId())); + LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(database, Integer.parseInt(prevShortcut.getId())); ShortcutInfoCompat updatedShortcut = createShortcutBuilder(context, loyaltyCard) .setRank(index) diff --git a/app/src/main/java/protect/card_locker/Utils.java b/app/src/main/java/protect/card_locker/Utils.java index 34e697bd4..0094bddd0 100644 --- a/app/src/main/java/protect/card_locker/Utils.java +++ b/app/src/main/java/protect/card_locker/Utils.java @@ -84,7 +84,7 @@ public class Utils { tileLetterFontSize = context.getResources().getDimensionPixelSize(R.dimen.tileLetterFontSize); } - int pixelSize = context.getResources().getDimensionPixelSize(R.dimen.cardThumbnailSize); + int pixelSize = context.getResources().getDimensionPixelSize(R.dimen.tileLetterImageSize); if (backgroundColor == null) { backgroundColor = LetterBitmap.getDefaultColor(context, store); diff --git a/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java b/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java index b55337ad1..afc59fdad 100644 --- a/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java +++ b/app/src/main/java/protect/card_locker/importexport/CatimaExporter.java @@ -2,6 +2,7 @@ package protect.card_locker.importexport; import android.content.Context; import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import net.lingala.zip4j.io.outputstream.ZipOutputStream; @@ -31,7 +32,7 @@ import protect.card_locker.Utils; * format. */ public class CatimaExporter implements Exporter { - public void exportData(Context context, DBHelper db, OutputStream output, char[] password) throws IOException, InterruptedException { + public void exportData(Context context, SQLiteDatabase database, OutputStream output, char[] password) throws IOException, InterruptedException { // Necessary vars int readLen; byte[] readBuffer = new byte[InternalZipConstants.BUFF_SIZE]; @@ -48,7 +49,7 @@ public class CatimaExporter implements Exporter { // Generate CSV ByteArrayOutputStream catimaOutputStream = new ByteArrayOutputStream(); OutputStreamWriter catimaOutputStreamWriter = new OutputStreamWriter(catimaOutputStream, StandardCharsets.UTF_8); - writeCSV(db, catimaOutputStreamWriter); + writeCSV(database, catimaOutputStreamWriter); // Add CSV to zip file ZipParameters csvZipParameters = createZipParameters("catima.csv", password); @@ -60,7 +61,7 @@ public class CatimaExporter implements Exporter { zipOutputStream.closeEntry(); // Loop over all cards again - Cursor cardCursor = db.getLoyaltyCardCursor(); + Cursor cardCursor = DBHelper.getLoyaltyCardCursor(database); while (cardCursor.moveToNext()) { // For each card LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cardCursor); @@ -94,7 +95,7 @@ public class CatimaExporter implements Exporter { return zipParameters; } - private void writeCSV(DBHelper db, OutputStreamWriter output) throws IOException, InterruptedException { + private void writeCSV(SQLiteDatabase database, OutputStreamWriter output) throws IOException, InterruptedException { CSVPrinter printer = new CSVPrinter(output, CSVFormat.RFC4180); // Print the version @@ -105,7 +106,7 @@ public class CatimaExporter implements Exporter { // Print the header for groups printer.printRecord(DBHelper.LoyaltyCardDbGroups.ID); - Cursor groupCursor = db.getGroupCursor(); + Cursor groupCursor = DBHelper.getGroupCursor(database); while (groupCursor.moveToNext()) { Group group = Group.toGroup(groupCursor); @@ -136,7 +137,7 @@ public class CatimaExporter implements Exporter { DBHelper.LoyaltyCardDbIds.STAR_STATUS, DBHelper.LoyaltyCardDbIds.LAST_USED); - Cursor cardCursor = db.getLoyaltyCardCursor(); + Cursor cardCursor = DBHelper.getLoyaltyCardCursor(database); while (cardCursor.moveToNext()) { LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cardCursor); @@ -168,12 +169,12 @@ public class CatimaExporter implements Exporter { printer.printRecord(DBHelper.LoyaltyCardDbIdsGroups.cardID, DBHelper.LoyaltyCardDbIdsGroups.groupID); - Cursor cardCursor2 = db.getLoyaltyCardCursor(); + Cursor cardCursor2 = DBHelper.getLoyaltyCardCursor(database); while (cardCursor2.moveToNext()) { LoyaltyCard card = LoyaltyCard.toLoyaltyCard(cardCursor2); - for (Group group : db.getLoyaltyCardGroups(card.id)) { + for (Group group : DBHelper.getLoyaltyCardGroups(database, card.id)) { printer.printRecord(card.id, group._id); } diff --git a/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java b/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java index 6b4fc05a5..9fd7192ee 100644 --- a/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/CatimaImporter.java @@ -40,7 +40,7 @@ import protect.card_locker.ZipUtils; * A header is expected for the each table showing the names of the columns. */ public class CatimaImporter implements Importer { - public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, InterruptedException { + public void importData(Context context, SQLiteDatabase database, InputStream input, char[] password) throws IOException, FormatException, InterruptedException { InputStream bufferedInputStream = new BufferedInputStream(input); bufferedInputStream.mark(100); @@ -55,7 +55,7 @@ public class CatimaImporter implements Importer { String fileName = Uri.parse(localFileHeader.getFileName()).getLastPathSegment(); if (fileName.equals("catima.csv")) { - importCSV(context, db, new ByteArrayInputStream(ZipUtils.read(zipInputStream).getBytes(StandardCharsets.UTF_8))); + importCSV(context, database, new ByteArrayInputStream(ZipUtils.read(zipInputStream).getBytes(StandardCharsets.UTF_8))); } else if (fileName.endsWith(".png")) { Utils.saveCardImage(context, ZipUtils.readImage(zipInputStream), fileName); } else { @@ -66,11 +66,11 @@ public class CatimaImporter implements Importer { if (!isZipFile) { // This is not a zip file, try importing as bare CSV bufferedInputStream.reset(); - importCSV(context, db, bufferedInputStream); + importCSV(context, database, bufferedInputStream); } } - public void importCSV(Context context, DBHelper db, InputStream input) throws IOException, FormatException, InterruptedException { + public void importCSV(Context context, SQLiteDatabase database, InputStream input) throws IOException, FormatException, InterruptedException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)); bufferedReader.mark(100); @@ -87,10 +87,10 @@ public class CatimaImporter implements Importer { switch (version) { case 1: - parseV1(context, db, bufferedReader); + parseV1(context, database, bufferedReader); break; case 2: - parseV2(context, db, bufferedReader); + parseV2(context, database, bufferedReader); break; default: throw new FormatException(String.format("No code to parse version %s", version)); @@ -99,15 +99,12 @@ public class CatimaImporter implements Importer { bufferedReader.close(); } - public void parseV1(Context context, DBHelper db, BufferedReader input) throws IOException, FormatException, InterruptedException { + public void parseV1(Context context, SQLiteDatabase database, BufferedReader input) throws IOException, FormatException, InterruptedException { final CSVParser parser = new CSVParser(input, CSVFormat.RFC4180.builder().setHeader().build()); - SQLiteDatabase database = db.getWritableDatabase(); - database.beginTransaction(); - try { for (CSVRecord record : parser) { - importLoyaltyCard(context, database, db, record); + importLoyaltyCard(context, database, record); if (Thread.currentThread().isInterrupted()) { throw new InterruptedException(); @@ -115,19 +112,12 @@ public class CatimaImporter implements Importer { } parser.close(); - database.setTransactionSuccessful(); } catch (IllegalArgumentException | IllegalStateException e) { throw new FormatException("Issue parsing CSV data", e); - } finally { - database.endTransaction(); - database.close(); } } - public void parseV2(Context context, DBHelper db, BufferedReader input) throws IOException, FormatException, InterruptedException { - SQLiteDatabase database = db.getWritableDatabase(); - database.beginTransaction(); - + public void parseV2(Context context, SQLiteDatabase database, BufferedReader input) throws IOException, FormatException, InterruptedException { Integer part = 0; String stringPart = ""; @@ -145,7 +135,7 @@ public class CatimaImporter implements Importer { break; case 1: try { - parseV2Groups(db, database, stringPart); + parseV2Groups(database, stringPart); sectionParsed = true; } catch (FormatException e) { // We may have a multiline field, try again @@ -153,7 +143,7 @@ public class CatimaImporter implements Importer { break; case 2: try { - parseV2Cards(context, db, database, stringPart); + parseV2Cards(context, database, stringPart); sectionParsed = true; } catch (FormatException e) { // We may have a multiline field, try again @@ -161,7 +151,7 @@ public class CatimaImporter implements Importer { break; case 3: try { - parseV2CardGroups(db, database, stringPart); + parseV2CardGroups(database, stringPart); sectionParsed = true; } catch (FormatException e) { // We may have a multiline field, try again @@ -185,16 +175,12 @@ public class CatimaImporter implements Importer { stringPart += tmp + "\n"; } } - database.setTransactionSuccessful(); } catch (FormatException e) { throw new FormatException("Issue parsing CSV data", e); - } finally { - database.endTransaction(); - database.close(); } } - public void parseV2Groups(DBHelper db, SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException { + public void parseV2Groups(SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException { // Parse groups final CSVParser groupParser = new CSVParser(new StringReader(data), CSVFormat.RFC4180.builder().setHeader().build()); @@ -215,11 +201,11 @@ public class CatimaImporter implements Importer { } for (CSVRecord record : records) { - importGroup(database, db, record); + importGroup(database, record); } } - public void parseV2Cards(Context context, DBHelper db, SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException { + public void parseV2Cards(Context context, SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException { // Parse cards final CSVParser cardParser = new CSVParser(new StringReader(data), CSVFormat.RFC4180.builder().setHeader().build()); @@ -240,11 +226,11 @@ public class CatimaImporter implements Importer { } for (CSVRecord record : records) { - importLoyaltyCard(context, database, db, record); + importLoyaltyCard(context, database, record); } } - public void parseV2CardGroups(DBHelper db, SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException { + public void parseV2CardGroups(SQLiteDatabase database, String data) throws IOException, FormatException, InterruptedException { // Parse card group mappings final CSVParser cardGroupParser = new CSVParser(new StringReader(data), CSVFormat.RFC4180.builder().setHeader().build()); @@ -265,7 +251,7 @@ public class CatimaImporter implements Importer { } for (CSVRecord record : records) { - importCardGroupMapping(database, db, record); + importCardGroupMapping(database, record); } } @@ -273,7 +259,7 @@ public class CatimaImporter implements Importer { * Import a single loyalty card into the database using the given * session. */ - private void importLoyaltyCard(Context context, SQLiteDatabase database, DBHelper helper, CSVRecord record) + private void importLoyaltyCard(Context context, SQLiteDatabase database, CSVRecord record) throws IOException, FormatException { int id = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIds.ID, record, false); @@ -343,31 +329,29 @@ public class CatimaImporter implements Importer { // We catch this exception so we can still import old backups } - helper.insertLoyaltyCard(database, id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed); + DBHelper.insertLoyaltyCard(database, id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starStatus, lastUsed); } /** * Import a single group into the database using the given * session. */ - private void importGroup(SQLiteDatabase database, DBHelper helper, CSVRecord record) - throws IOException, FormatException { + private void importGroup(SQLiteDatabase database, CSVRecord record) throws FormatException { String id = CSVHelpers.extractString(DBHelper.LoyaltyCardDbGroups.ID, record, null); - helper.insertGroup(database, id); + DBHelper.insertGroup(database, id); } /** * Import a single card to group mapping into the database using the given * session. */ - private void importCardGroupMapping(SQLiteDatabase database, DBHelper helper, CSVRecord record) - throws IOException, FormatException { + private void importCardGroupMapping(SQLiteDatabase database, CSVRecord record) throws FormatException { Integer cardId = CSVHelpers.extractInt(DBHelper.LoyaltyCardDbIdsGroups.cardID, record, false); String groupId = CSVHelpers.extractString(DBHelper.LoyaltyCardDbIdsGroups.groupID, record, null); - List cardGroups = helper.getLoyaltyCardGroups(cardId); - cardGroups.add(helper.getGroup(groupId)); - helper.setLoyaltyCardGroups(database, cardId, cardGroups); + List cardGroups = DBHelper.getLoyaltyCardGroups(database, cardId); + cardGroups.add(DBHelper.getGroup(database, groupId)); + DBHelper.setLoyaltyCardGroups(database, cardId, cardGroups); } } \ No newline at end of file diff --git a/app/src/main/java/protect/card_locker/importexport/Exporter.java b/app/src/main/java/protect/card_locker/importexport/Exporter.java index 584572360..5c2d54962 100644 --- a/app/src/main/java/protect/card_locker/importexport/Exporter.java +++ b/app/src/main/java/protect/card_locker/importexport/Exporter.java @@ -1,6 +1,7 @@ package protect.card_locker.importexport; import android.content.Context; +import android.database.sqlite.SQLiteDatabase; import java.io.IOException; import java.io.OutputStream; @@ -17,5 +18,5 @@ public interface Exporter { * * @throws IOException */ - void exportData(Context context, DBHelper db, OutputStream output, char[] password) throws IOException, InterruptedException; + void exportData(Context context, SQLiteDatabase database, OutputStream output, char[] password) throws IOException, InterruptedException; } diff --git a/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java b/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java index 23c927b8b..e70ba0c88 100644 --- a/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java @@ -30,7 +30,7 @@ import protect.card_locker.FormatException; * A header is expected for the each table showing the names of the columns. */ public class FidmeImporter implements Importer { - public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException { + public void importData(Context context, SQLiteDatabase database, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException { // We actually retrieve a .zip file ZipInputStream zipInputStream = new ZipInputStream(input, password); @@ -52,14 +52,11 @@ public class FidmeImporter implements Importer { throw new FormatException("Couldn't find loyalty_programs.csv in zip file or it is empty"); } - SQLiteDatabase database = db.getWritableDatabase(); - database.beginTransaction(); - final CSVParser fidmeParser = new CSVParser(new StringReader(loyaltyCards.toString()), CSVFormat.RFC4180.builder().setDelimiter(';').setHeader().build()); try { for (CSVRecord record : fidmeParser) { - importLoyaltyCard(database, db, record); + importLoyaltyCard(database, record); if (Thread.currentThread().isInterrupted()) { throw new InterruptedException(); @@ -71,10 +68,6 @@ public class FidmeImporter implements Importer { fidmeParser.close(); } - database.setTransactionSuccessful(); - database.endTransaction(); - database.close(); - zipInputStream.close(); } @@ -82,8 +75,8 @@ public class FidmeImporter implements Importer { * Import a single loyalty card into the database using the given * session. */ - private void importLoyaltyCard(SQLiteDatabase database, DBHelper helper, CSVRecord record) - throws IOException, FormatException { + private void importLoyaltyCard(SQLiteDatabase database, CSVRecord record) + throws FormatException { // A loyalty card export from Fidme contains the following fields: // Retailer (store name) // Program (program name) @@ -129,6 +122,6 @@ public class FidmeImporter implements Importer { // TODO: Front and back image - helper.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, starStatus, null); + DBHelper.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, starStatus, null); } } \ No newline at end of file diff --git a/app/src/main/java/protect/card_locker/importexport/Importer.java b/app/src/main/java/protect/card_locker/importexport/Importer.java index a394e455b..41f73df26 100644 --- a/app/src/main/java/protect/card_locker/importexport/Importer.java +++ b/app/src/main/java/protect/card_locker/importexport/Importer.java @@ -1,6 +1,7 @@ package protect.card_locker.importexport; import android.content.Context; +import android.database.sqlite.SQLiteDatabase; import org.json.JSONException; @@ -8,7 +9,6 @@ import java.io.IOException; import java.io.InputStream; import java.text.ParseException; -import protect.card_locker.DBHelper; import protect.card_locker.FormatException; /** @@ -23,5 +23,5 @@ public interface Importer { * @throws IOException * @throws FormatException */ - void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, InterruptedException, JSONException, ParseException; + void importData(Context context, SQLiteDatabase database, InputStream input, char[] password) throws IOException, FormatException, InterruptedException, JSONException, ParseException; } diff --git a/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java b/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java index c4a3e2dd2..e8548a21b 100644 --- a/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java +++ b/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java @@ -1,6 +1,7 @@ package protect.card_locker.importexport; import android.content.Context; +import android.database.sqlite.SQLiteDatabase; import android.util.Log; import java.io.IOException; @@ -21,7 +22,7 @@ public class MultiFormatExporter { * another ImportExportResult otherwise. If not Success, partial data may have been * written to the output stream, and it should be discarded. */ - public static ImportExportResult exportData(Context context, DBHelper db, OutputStream output, DataFormat format, char[] password) { + public static ImportExportResult exportData(Context context, SQLiteDatabase database, OutputStream output, DataFormat format, char[] password) { Exporter exporter = null; switch (format) { @@ -35,7 +36,7 @@ public class MultiFormatExporter { if (exporter != null) { try { - exporter.exportData(context, db, output, password); + exporter.exportData(context, database, output, password); return ImportExportResult.Success; } catch (IOException e) { Log.e(TAG, "Failed to export data", e); diff --git a/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java b/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java index 21a520f41..9b009381b 100644 --- a/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java @@ -1,6 +1,7 @@ package protect.card_locker.importexport; import android.content.Context; +import android.database.sqlite.SQLiteDatabase; import android.util.Log; import net.lingala.zip4j.exception.ZipException; @@ -28,7 +29,7 @@ public class MultiFormatImporter { * or another result otherwise. If no Success, no data was written to * the database. */ - public static ImportExportResult importData(Context context, DBHelper db, InputStream input, DataFormat format, char[] password) { + public static ImportExportResult importData(Context context, SQLiteDatabase database, InputStream input, DataFormat format, char[] password) { Importer importer = null; switch (format) { @@ -47,15 +48,18 @@ public class MultiFormatImporter { } if (importer != null) { + database.beginTransaction(); try { - importer.importData(context, db, input, password); + importer.importData(context, database, input, password); + database.setTransactionSuccessful(); return ImportExportResult.Success; } catch (ZipException e) { return ImportExportResult.BadPassword; } catch (IOException | FormatException | InterruptedException | JSONException | ParseException | NullPointerException e) { Log.e(TAG, "Failed to import data", e); + } finally { + database.endTransaction(); } - } else { Log.e(TAG, "Unsupported data format imported: " + format.name()); } diff --git a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java index 2f8280285..d51091986 100644 --- a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java @@ -39,7 +39,7 @@ import protect.card_locker.ZipUtils; * A header is expected for the each table showing the names of the columns. */ public class StocardImporter implements Importer { - public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException { + public void importData(Context context, SQLiteDatabase database, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException { HashMap> loyaltyCardHashMap = new HashMap<>(); HashMap> providers = new HashMap<>(); @@ -153,9 +153,6 @@ public class StocardImporter implements Importer { throw new FormatException("Couldn't find any loyalty cards in this Stocard export."); } - SQLiteDatabase database = db.getWritableDatabase(); - database.beginTransaction(); - for (HashMap loyaltyCardData : loyaltyCardHashMap.values()) { String providerId = (String) loyaltyCardData.get("_providerId"); HashMap providerData = providers.get(providerId); @@ -173,7 +170,7 @@ public class StocardImporter implements Importer { } } - long loyaltyCardInternalId = db.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, 0, null); + long loyaltyCardInternalId = DBHelper.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, 0, null); if (loyaltyCardData.containsKey("frontImage")) { Utils.saveCardImage(context, (Bitmap) loyaltyCardData.get("frontImage"), (int) loyaltyCardInternalId, ImageLocationType.front); @@ -183,10 +180,6 @@ public class StocardImporter implements Importer { } } - database.setTransactionSuccessful(); - database.endTransaction(); - database.close(); - zipInputStream.close(); } diff --git a/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java b/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java index 0aa038e1b..e4e298692 100644 --- a/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java @@ -36,7 +36,7 @@ import protect.card_locker.Utils; * A header is expected for the each table showing the names of the columns. */ public class VoucherVaultImporter implements Importer { - public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException { + public void importData(Context context, SQLiteDatabase database, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)); StringBuilder sb = new StringBuilder(); @@ -46,9 +46,6 @@ public class VoucherVaultImporter implements Importer { } JSONArray jsonArray = new JSONArray(sb.toString()); - SQLiteDatabase database = db.getWritableDatabase(); - database.beginTransaction(); - // See https://github.com/tim-smart/vouchervault/issues/4#issuecomment-788226503 for more info for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonCard = jsonArray.getJSONObject(i); @@ -129,13 +126,9 @@ public class VoucherVaultImporter implements Importer { throw new FormatException("Unknown colour type found: " + colorFromJSON); } - db.insertLoyaltyCard(store, "", expiry, balance, balanceType, cardId, null, barcodeType, headerColor, 0, Utils.getUnixTime()); + DBHelper.insertLoyaltyCard(database, store, "", expiry, balance, balanceType, cardId, null, barcodeType, headerColor, 0, Utils.getUnixTime()); } - database.setTransactionSuccessful(); - database.endTransaction(); - database.close(); - bufferedReader.close(); } } \ No newline at end of file diff --git a/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java b/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java index 7bd73d668..567812914 100644 --- a/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java +++ b/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java @@ -1,30 +1,36 @@ package protect.card_locker.preferences; +import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.MenuItem; +import androidx.annotation.NonNull; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.appcompat.widget.Toolbar; +import androidx.fragment.app.DialogFragment; +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceFragmentCompat; + import java.util.ArrayList; import java.util.List; import java.util.Locale; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatDelegate; -import androidx.appcompat.widget.Toolbar; -import androidx.core.app.ActivityCompat; -import androidx.fragment.app.DialogFragment; -import androidx.fragment.app.FragmentActivity; -import androidx.preference.ListPreference; -import androidx.preference.Preference; -import androidx.preference.PreferenceFragmentCompat; import nl.invissvenska.numberpickerpreference.NumberDialogPreference; import nl.invissvenska.numberpickerpreference.NumberPickerPreferenceDialogFragment; import protect.card_locker.CatimaAppCompatActivity; +import protect.card_locker.MainActivity; import protect.card_locker.R; import protect.card_locker.Utils; public class SettingsActivity extends CatimaAppCompatActivity { + + private final static String RELOAD_MAIN_STATE = "mReloadMain"; + private SettingsFragment fragment; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -38,10 +44,21 @@ public class SettingsActivity extends CatimaAppCompatActivity { } // Display the fragment as the main content. - SettingsFragment fragment = new SettingsFragment(); + fragment = new SettingsFragment(); getSupportFragmentManager().beginTransaction() .replace(R.id.settings_container, fragment) .commit(); + + // restore reload main state + if (savedInstanceState != null) { + fragment.mReloadMain = savedInstanceState.getBoolean(RELOAD_MAIN_STATE); + } + } + + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(RELOAD_MAIN_STATE, fragment.mReloadMain); } @Override @@ -49,16 +66,34 @@ public class SettingsActivity extends CatimaAppCompatActivity { int id = item.getItemId(); if (id == android.R.id.home) { - finish(); + finishSettingsActivity(); return true; } return super.onOptionsItemSelected(item); } + @Override + public void onBackPressed() { + finishSettingsActivity(); + } + + private void finishSettingsActivity() { + if (fragment.mReloadMain) { + Intent intent = new Intent(); + intent.putExtra(MainActivity.RESTART_ACTIVITY_INTENT, true); + setResult(Activity.RESULT_OK, intent); + } else { + setResult(Activity.RESULT_OK); + } + finish(); + } + public static class SettingsFragment extends PreferenceFragmentCompat { private static final String DIALOG_FRAGMENT_TAG = "SettingsFragment"; + public boolean mReloadMain; + @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { // Load the preferences from an XML resource @@ -91,32 +126,29 @@ public class SettingsActivity extends CatimaAppCompatActivity { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); } - FragmentActivity activity = getActivity(); - if (activity != null) { - ActivityCompat.recreate(activity); - } return true; }); Preference colorPreference = findPreference(getResources().getString(R.string.setting_key_theme_color)); assert colorPreference != null; colorPreference.setOnPreferenceChangeListener((preference, o) -> { - FragmentActivity activity = getActivity(); - if (activity != null) { - ActivityCompat.recreate(activity); - } + refreshActivity(true); return true; }); localePreference.setOnPreferenceChangeListener((preference, newValue) -> { - // Refresh the activity - Intent intent = new Intent(getContext(), SettingsActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - getContext().startActivity(intent); - + refreshActivity(true); return true; }); } + private void refreshActivity(boolean reloadMain) { + mReloadMain = reloadMain || mReloadMain; + Activity activity = getActivity(); + if (activity != null) { + activity.recreate(); + } + } + @Override public void onDisplayPreferenceDialog(Preference preference) { if (preference instanceof NumberDialogPreference) { diff --git a/app/src/main/res/animator/flip_left_in.xml b/app/src/main/res/animator/flip_left_in.xml deleted file mode 100644 index 79fd3bf85..000000000 --- a/app/src/main/res/animator/flip_left_in.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/animator/flip_left_out.xml b/app/src/main/res/animator/flip_left_out.xml deleted file mode 100644 index 4ff5709ed..000000000 --- a/app/src/main/res/animator/flip_left_out.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/animator/flip_right_in.xml b/app/src/main/res/animator/flip_right_in.xml deleted file mode 100644 index 3d252a741..000000000 --- a/app/src/main/res/animator/flip_right_in.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/animator/flip_right_out.xml b/app/src/main/res/animator/flip_right_out.xml deleted file mode 100644 index bebc16c1e..000000000 --- a/app/src/main/res/animator/flip_right_out.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_starred_black.xml b/app/src/main/res/drawable/ic_starred_black.xml new file mode 100644 index 000000000..12a4a5056 --- /dev/null +++ b/app/src/main/res/drawable/ic_starred_black.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_unstarred_black.xml b/app/src/main/res/drawable/ic_unstarred_black.xml new file mode 100644 index 000000000..59aef558e --- /dev/null +++ b/app/src/main/res/drawable/ic_unstarred_black.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/about_activity.xml b/app/src/main/res/layout/about_activity.xml index 699b35dea..38c21e419 100644 --- a/app/src/main/res/layout/about_activity.xml +++ b/app/src/main/res/layout/about_activity.xml @@ -131,6 +131,17 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + app:layout_constraintBottom_toTopOf="@+id/store" + app:layout_constraintDimensionRatio="85.6f:53.98f" + app:layout_constraintTop_toTopOf="parent"> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - - + app:srcCompat="@drawable/ic_done" /> + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/raw/contributors.txt b/app/src/main/res/raw/contributors.txt index 3af49aeec..51bb93f58 100644 --- a/app/src/main/res/raw/contributors.txt +++ b/app/src/main/res/raw/contributors.txt @@ -14,6 +14,7 @@ Gediminas Murauskas Joel A StoyanDimitrov Nyatsuki +Altonss Samantaz Fox arno-github Ankit Tiwari @@ -26,6 +27,7 @@ Michael Moroni Olivia (Zoe) betsythefc waffshappen +sr093906 K. Herbert Quentin PAGÈS String E. Fighter @@ -37,7 +39,6 @@ KovalevArtem Clonewayx D. Domig Diego -sr093906 Jane Kong Lukas Grassauer Marnick L'Eau @@ -51,6 +52,7 @@ phlostically Aditya Das Kevin Sicong Jiang Airat +Andreas Blaser BMN Biren Kasina Dheeraj @@ -60,11 +62,12 @@ Izzy Karol Kosek bittin Maciej Błędkowski +Marco Mattia Michael Gangolf pbeckmann Peer Beckmann -QuangDNguyen2211 +Quang Nguyen Reza Rohan Babbar Ronak Upadhyay diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 523523d7c..d54b66715 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -217,4 +217,7 @@ Избиране на цвят Името на списъка не може да е празно Редактиране на списък + Повече детайли + По-малко детайли + Няма карти. След като добавите ще можете да ги зачислите към списък от тук. \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 066555caa..27947c951 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -3,7 +3,7 @@ Suchen Hinzufügen Füge eine Karte mit + hinzu oder importiere welche über das ⋮ Menü. - Nichts gefunden. Versuche, deine Suche zu ändern. + Keine Ergebnisse. Versuche, deine Suche zu ändern. Name Notiz Kartennummer @@ -25,11 +25,11 @@ Shortcut zu einer Karte Füge zuerst eine Karte hinzu Kein Name eingegeben - Keine Kartennummer angegeben - Karte konnte nicht gefunden werden + Keine ID eingegeben + Diese Karte konnte nicht gefunden werden Import/Export Export - Durch das Sichern deiner Karten kannst du sie auf ein anderes Gerät übertragen. + Wenn du deine Daten sicherst, kannst du sie auf ein anderes Gerät übertragen. Importiert Import fehlgeschlagen Karten konnten nicht importiert werden: %s @@ -38,7 +38,7 @@ Karten konnten nicht exportiert werden: %s Importiere… Exportiere… - Erlaube Speicherzugriff um Karten zu importieren oder exportieren + Berechtigung für den externen Speicher zum Importieren oder Exportieren von Daten erteilen Importiere aus dem Dateisystem Wähle eine Datei vom Dateisystem aus. Wähle vom Dateisystem @@ -51,39 +51,39 @@ Version: %s Revisionsinfo: %s Barcode auswählen - Kartennummer in die Zwischenablage kopiert - Vorschaubild für die Karte + ID in die Zwischenablage kopiert + Vorschaubild Einstellungen Benutzeroberfläche Barcodeansicht aufhellen Barcoderotation sperren - Kartendaten exportiert - Kartendaten importiert + Daten exportiert + Daten importiert Ich würde gerne diese Karte mit dir teilen Dunkel Hell System Farbschema - Gib die Kartennummer ein und wähle entweder den Barcode-Typ unten oder wähle \"Diese Karte hat keinen Barcode\" aus. + Gib die ID ein und wähle unten entweder einen Barcodetyp oder „Es gibt keinen Barcode“. Basierend auf Loyalty Card Keychain \nCopyright © 2016-2020 Branden Archer Die Daten werden an einen Ort deiner Wahl geschrieben. Die Import-URI konnte nicht verarbeitet werden Teilen - Diese Karte hat keinen Barcode + Es gibt keinen Barcode Barcodetyp Favoritenstern Gruppe löschen? Alle - Klicke auf das Pluszeichen + um eine Gruppe hinzuzufügen. - Diese Gruppe hat noch keine Karten + Klicke auf das Pluszeichen +, um eine Gruppe hinzuzufügen. + Diese Gruppe ist leer Gruppen Gib einen Gruppennamen ein Beenden ohne zu speichern\? Beenden Installiere zuerst einen Dateimanager. Kein Barcode - Kartennummer manuell eingeben + ID manuell eingeben Nach unten verschieben Nach oben verschieben @@ -116,17 +116,17 @@ \nKEINE DATEN WERDEN GESAMMELT, was jeder bestätigen kann, da unsere Anwendung eine freie Software ist. Annehmen Datenschutzrichtlinie - Wählen Sie Ihren vouchervault.json-Export aus Voucher Vault zum Importieren aus. -\nErstellen Sie ihn, indem Sie zuerst auf Export in Voucher Vault drücken. + Wähle deinen vouchervault.json-Export aus Voucher Vault zum Importieren aus. +\nErstellen Sie ihn, indem du zuerst auf Export in Voucher Vault drückst. Aus Voucher Vault importieren - Wählen Sie Ihren LoyaltyCardKeychain.csv-Export aus Loyalty Card Keychain zum Importieren aus. -\nErstellen Sie ihn über das Menü Import/Export in Loyalty Card Keychain, indem Sie dort zuerst auf Export drücken. + Wählen du deinen LoyaltyCardKeychain.csv-Export aus Loyalty Card Keychain zum Importieren aus. +\nErstelle ihn über das Menü Import/Export in Loyalty Card Keychain, indem du dort zuerst auf Export drückst. Aus Loyalty Card Keychain importieren - Wählen Sie Ihren fidme-export-request-xxxxxx.zip-Export aus FidMe zum Importieren aus und wählen Sie anschließend die Strichcodetypen manuell aus. -\nOder erstellen Sie ihn aus Ihrem FidMe-Profil, indem Sie Datenschutz wählen und dann zuerst auf Meine Daten extrahieren drücken. + Wähle deinen fidme-export-request-xxxxxx.zip-Export aus FidMe zum Importieren aus und wähle anschließend die Strichcodetypen manuell aus. +\nOder erstelle ihn aus deinem FidMe-Profil, indem du Datenschutz wählst und dann zuerst auf Meine Daten extrahieren drückst. Aus FidMe importieren - Wählen Sie Ihren catima.zip-Export aus Catima zum Importieren aus. -\nErstellen Sie ihn aus dem Import/Export-Menü einer anderen Catima-Anwendung, indem Sie dort zuerst Export drücken. + Wähle deinen catima.zip-Export aus Catima zum Importieren aus. +\nErstelle ihn aus dem Import/Export-Menü einer anderen Catima-Anwendung, indem du dort zuerst Export drückst. Aus Catima importieren Manuell eingeben Entspricht Kartennummer @@ -142,28 +142,28 @@ Copyright © 2019–%d Sylvia van Os Ich möchte diese Karten mit dir teilen Kartennummern in die Zwischenablage kopiert - Kartennummer(n) kopiert + ID(s) kopiert Nein Ja - Kartennummer geändert. Möchtest du auch den Barcode auf den gleichen Wert ändern? + Kartennummer geändert. Möchtest du auch den Barcode auf den gleichen Wert ändern\? Barcodewert aktualisieren? Foto aufnehmen Bild entfernen Kartenrückseite Kartenvorderseite Fotos - Bild der Kartenvorderseite - Bild der Kartenrückseite + Bild auf der Vorseite + Bild auf der Rückseite Bitte gib das Passwort ein - Wählen Sie Ihren ***-sync.zip-Export aus Stocard zum Importieren aus. -\nSie erhalten ihn, indem Sie eine E-Mail an support@stocardapp.com senden und um einen Export Ihrer Daten bitten. + Wähle deinen ***-sync.zip-Export aus Stocard zum Importieren aus. +\nSie erhalten ihn, indem du eine E-Mail an support@stocardapp.com sendest und um einen Export deiner Daten bitten. Von Stocard importieren Licht ausschalten Licht einschalten URL konnte nicht erstellt werden. Bitte melde das an uns. - %d Karte ausgewählt - %d Karten ausgewählt + %d ausgewählt + %d ausgewählt Karte löschen Diese Karte wirklich löschen? @@ -189,7 +189,7 @@ Designfarbe Ermöglicht durch: %s Umschalten, um weitere Informationen anzuzeigen - Bild des Kartenstrichcodes des Typs %s + Bild %s Barcode Wischen oder langes Drücken zum Wechseln der Bilder Sortieren nach Kontostand @@ -197,7 +197,7 @@ Zuletzt verwendet Name Sortieren - Umgekehrt + … in umgekehrter Reihenfolge Versionshistorie Dank an Hilfe bei der Übersetzung @@ -208,16 +208,18 @@ Quellcode auf GitHub Fehler melden - Legen Sie ein Passwort fest, um Ihren Export zu schützen (optional) + Lege ein Passwort fest, um deinen Export zu schützen (optional) Passwort eingeben Der Gruppenname wird bereits verwendet Gruppenname darf nicht leer sein Gruppe aktualisiert Gruppe wird bearbeitet: %s Gruppe bearbeiten - Sie haben noch keine Kundenkarten. Sobald Sie welche hinzugefügt haben, können Sie sie hier der Gruppe zuordnen. + Erstelle einige Karten und ordne sie dann hier der Gruppe zu. Symbol einstellen Farbe auswählen Details anzeigen Details ausblenden - \ No newline at end of file + auf Weblate + Wählen Sie eine Karte + diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 5396b79a8..b8de1fbfe 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -143,7 +143,7 @@ Lisätieto Nimi Ei hakutuloksia, kokeile toisella hakutermillä. - Lisää ensin kortti napsauttamalla + plus-painiketta, tai mene ⋮ valikkoon tuodaksesi varmuuskopiosta. + Lisää kortti napsauttamalla + plus-painiketta, tai mene ⋮ valikkoon tuodaksesi varmuuskopiosta. Lisää Hae Ota valokuva @@ -164,8 +164,8 @@ Poista %dkortit - %d Kortti valittu - %d kortit valitut + %d valittu + %d valitut Tuo Stocardista Valitse tuotava ***-sync.zip-vienti Stocardista. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 4e241a425..851458086 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,7 +1,7 @@ Ajouter - Cliquez sur le bouton + plus pour ajouter une carte, ou importez les depuis le menu ⋮ + Cliquez sur le bouton + plus pour ajouter une carte, ou importez les depuis le menu ⋮. Nom Notes Numéro @@ -19,13 +19,13 @@ Ajouter une carte de fidélité Scanner le code-barres Raccourci de carte - Ajoutez d\'abord une carte + Ajoutez d’abord une carte Aucun nom saisi - Aucun numéro de carte saisi - Aucune carte trouvée + Aucun identifiant saisi + Impossible de trouver cette carte Importer/Exporter Exporter - Exporter vos cartes vous permet de les récupérer sur un autre appareil. + La sauvegarde de vos données permet de les déplacer sur un autre appareil. Importé Échec de l\'import Impossible d\'importer les cartes: %s @@ -34,7 +34,7 @@ Impossible d\'exporter les cartes: %s Import … Export … - Veuillez autoriser l\'accès au stockage externe avant d\'importer/exporter les données + Accorder au stockage externe l’autorisation d’importer ou d’exporter des données Importer depuis le système de fichiers Choisissez le fichier à importer. Système de fichiers @@ -47,26 +47,26 @@ Version : %s Notes de version : %s Choisissez le code-barres - Numéro de carte copié dans le presse-papier - Miniature de la carte + Identifiant copié dans le presse-papiers + Miniature Paramètres Interface utilisateur Augmenter la luminosité du code-barres - Verrouiller l\'orientation du code-barres - Carte exportée avec succès - Carte de fidélité importée + Verrouiller l’orientation du code-barres + Données exportées + Données importées Je veux partager une carte avec toi Sombre Clair Système Thème - Entrez l’identifiant de la carte et choisissez le type de code-barres ci-dessous, ou « Cette carte n’a pas de code-barres ». + Entrez l’identifiant, et choisissez un type de code-barres ci-dessous, ou « Il n’y a pas de code-barres ». Basé sur Loyalty Card Keychain \ncopyright © 2016-2020 Branden Archer - Les données seront exportées vers l\'emplacement de votre choix. - Impossible d\'analyser l\'URI d\'importation + Les données seront exportées vers l’emplacement de votre choix. + Impossible d’analyser l’URI d’importation Partager - Cette carte n\'a pas de code-barres + Il n’y a pas de code-barres Type de code-barres Aucun résultat. Essayez de modifier votre recherche. Rechercher @@ -82,7 +82,7 @@ Quitter sans enregistrer \? Quitter Installez d’abord un gestionnaire de fichiers. - Entrer manuellement l\'identifiant de la carte + Entrer manuellement l’identifiant Descendre Monter @@ -91,7 +91,7 @@ Groupes : %s Accepter - Avis sur la politique de confidentialité (exigé par certains magasins d\'applications) : + Avis sur la politique de confidentialité (exigé par certains magasins d’applications) : \n \nAUCUNE DONNÉE N’EST COLLECTÉE, ce que tout le monde peut confirmer puisque notre application est un logiciel libre. Politique de confidentialité @@ -101,11 +101,11 @@ Points Monnaie Solde - Centrer le code-barres sur l\'écran - Déplacez le code-barres vers le haut de l\'écran - Choisissez la date d\'expiration + Centrer le code-barres sur l’écran + Déplacez le code-barres vers le haut de l’écran + Choisissez la date d’expiration Jamais - Date d\'expiration + Date d’expiration Modifier le code-barres Code-barres Carte @@ -128,21 +128,21 @@ \nCréez-la à partir du menu Importer/Exporter d’une autre application Catima en appuyant d’abord sur Exporter. Importer depuis Catima Sélectionner dans la galerie - Impossible de lire l\'image - Aucun code-barres n\'a été trouvé + Impossible de lire l’image + Aucun code-barres n’a été trouvé Définir la valeur du code-barres - Identique à l’identifiant de la carte + Identique à l’identifiant Valeur du code-barres Taille max. de la police Ce type de code-barres ne peut pas encore être affiché. Il sera peut-être pris en charge dans une version ultérieure de l’application. - La valeur n\'est pas valide pour le type de code-barres sélectionné + La valeur n’est pas valide pour le type de code-barres sélectionné Ressources tierces libres : %s Bibliothèques tierces libres : %s Copyright © 2019–%d Sylvia van Os Je veux partager des cartes avec vous - Identifiants des cartes copiés dans le presse-papiers - Num. de la carte copié(s) - Vous avez changé l\'identifiant de la carte. Voulez-vous également mettre à jour le code-barres pour utiliser la même valeur \? + Identifiants copiés dans le presse-papiers + Numéro(s) copié(s) + Vous avez changé l’identifiant. Voulez-vous également mettre à jour le code-barres pour utiliser la même valeur \? Non Oui Mettre à jour la valeur du code-barres \? @@ -151,8 +151,8 @@ Définir l’image verso Définir l’image recto Photos - Image verso de la carte - Image recto de la carte + Image du verso + Image du recto Veuillez entrer le mot de passe Sélectionnez votre exportation ***-sync.zip de Stocard pour l’importer. \nVous pouvez l’obtenir en envoyant un courriel à support@stocardapp.com pour demander une exportation de vos données. @@ -161,8 +161,8 @@ Allumer la lampe de poche Impossible de générer une URL partageable. Veuillez signaler ceci. - %d carte sélectionnée - %d cartes sélectionnées + %d sélectionnée + %d sélectionnées Supprimer la carte Supprimer cette carte \? @@ -187,14 +187,14 @@ Catima Couleur du thème Rendu possible par : %s - Ce groupe ne contient pas de cartes - Activer/désactiver l\'affichage de plus d\'infos - Image du code-barres de la carte de type %s - Balayez ou appuyez longuement pour changer d\'image + Ce groupe est vide + Activer/désactiver l’affichage de plus d’infos + Image %s code-barres + Balayez ou appuyez longuement pour changer d’image Trier Trier par - Inversé - Date d\'expiration + … dans l’ordre inverse + Date d’expiration Les plus récemment utilisées Nom Solde @@ -211,13 +211,15 @@ Définissez un mot de passe pour protéger vos exportations (facultatif) Entrez le mot de passe Modification du groupe : %s - Vous n\'avez pas encore de cartes de fidélité. Une fois que vous en aurez ajouté, vous pourrez les affecter au groupe ici. + Créez des cartes, puis affectez-les au groupe ici. Modifier le groupe Nom de groupe déjà utilisé Groupe mis à jour Le nom du groupe ne peut pas être vide - Définir l\'icône + Définir l’icône Sélectionnez la couleur Afficher les détails Masquer les détails - \ No newline at end of file + sur Weblate + Sélectionnez une carte + diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index cb2c69a96..49342dd84 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -2,12 +2,12 @@ Cerca Aggiungi - Clicca il pulsante + più per aggiungere una carta, o importane alcune dal menù ⋮ prima. - Non ho trovato niente. Prova a cambiare la tua ricerca. + Premi il pulsante + per aggiungere una carta oppure importane alcune dal menù ⋮. + Nessun risultato. Prova a cambiare la tua ricerca. Nome Note Codice - Questa carta non ha un codice a barre + Non c\'è un codice a barre Annulla Salva Modifica @@ -15,22 +15,22 @@ Conferma Blocca rotazione Sblocca rotazione - OK - Copia ID negli appunti + Ok + Copia codice negli appunti Condividi Invia… Modifica carta Aggiungi carta - Scansiona il codice carta + Scansiona il codice Scorciatoia per la carta Aggiungi prima una carta Nessun nome inserito - Nessun codice carta inserito - Impossibile trovare la carta - Impossibile analizzare l\'URI + Nessun codice inserito + Impossibile trovare quella carta + Impossibile analizzare l\'URI di importazione Importa/Esporta Esporta - Il backup delle carte ti consente di spostarle su un altro dispositivo. + Il backup dei dati permette di spostarli su un altro dispositivo. Importato Importazione fallita Impossibile importare le carte: %s @@ -39,47 +39,47 @@ Impossibile esportare le carte: %s Importazione in corso… Esportazione in corso… - Concedi l\'autorizzazione all\'archiviazione esterna per importare o esportare prima le carte + Concedi il permesso di archiviazione esterna per importare o esportare dati Importa dall\'archivio Scegli un file dall\'archivio. Dall\'archivio - Usa un’altra app + Usa un\'altra app Usa qualsiasi app o il tuo gestore di file preferito per aprire un file. - Usa un’altra app + Usa un\'altra app Informazioni Software libero con copyleft, licenza GPLv3+ Informazioni su %s Versione: %s Informazioni sulla revisione: %s Seleziona codice a barre - Inserisci l’ID della carta, e scegli il suo tipo di codice a barre qui sotto, oppure «Questa carta non ha codice a barre». - Numero della carta copiato negli appunti - Miniatura carta + Inserisci il codice e scegli un tipo di codice a barre sotto oppure seleziona «Non c\'è un codice a barre». + Codice copiato negli appunti + Miniatura Impostazioni Interfaccia utente Tema Sistema Chiaro Scuro - Aumenta luminosità dello schermo quando apro un codice a barre + Aumenta luminosità dello schermo quando viene aperto un codice a barre Blocca orientamento del codice a barre Voglio condividere una carta fedeltà con te - Dati della carta importati - Dati della carta importati + Dati della carta esportati + Dati importati Basato su Loyalty Card Keychain \ncopyright © 2016–2020 Branden Archer I dati verranno scritti in una posizione a tua scelta. Tipo di codice a barre Rimuovi dai preferiti Aggiungi ai preferiti - Stella preferita + Stella dei preferiti Eliminare il gruppo\? Tutti - Clicca sul pulsante + più per aggiungere prima i gruppi per la categorizzazione. + Clicca sul pulsante + per aggiungere i gruppi per la categorizzazione. Gruppi Inserisci il nome del gruppo Gruppi: %s - Inserisci manualmente l\'ID della carta + Inserisci manualmente il codice Uscire senza salvare\? Esci Sposta in basso @@ -105,70 +105,70 @@ %s punti Saldo: %s Scaduta: %s - Scade: %s - Tieni schermo attivo + Scadenza: %s + Mantieni lo schermo attivo Loyalty Card Keychain - Importare i dati da\? - Impedisci blocco schermo + Importa i dati da + Impedisci il blocco dello schermo Accetta - Informativa sulla riservatezza (spesso richiesta): + Informativa sulla riservatezza (richiesta da alcuni app store): \n \nNESSUN DATO VIENE RACCOLTO, cosa che chiunque può confermare dato che la nostra applicazione è un software libero. Informativa sulla riservatezza - Seleziona la tua esportazione vouchervault.json da Voucher Vault da importare. + Seleziona il tuo file di esportazione vouchervault.json da Voucher Vault per importarlo. \nCrealo premendo prima Esporta in Voucher Vault. Importa da Voucher Vault - Seleziona la tua esportazione LoyaltyCardKeychain.csv da Loyalty Card Keychain per importarla. -\nCreatelo dal menù Importazione/Esportazione in Loyalty Card Keychain premendo prima su Esporta. + Seleziona il tuo file di esportazione LoyaltyCardKeychain.csv da Loyalty Card Keychain per importarlo. +\nCrealo dal menù Importa/Esporta in Loyalty Card Keychain premendo prima su Esporta. Importa da Loyalty Card Keychain - Seleziona la tua esportazione fidme-export-request-xxxxxx.zip da FidMe per importare, e seleziona i tipi di codice a barre manualmente dopo. -\nCrearlo dal tuo profilo FidMe scegliendo Protezione Dati e poi premendo Estrai i miei dati prima. + Seleziona il tuo file di esportazione fidme-export-request-xxxxxx.zip da FidMe per importare e seleziona successivamente i tipi di codice a barre manualmente. +\nCrealo dal tuo profilo FidMe scegliendo Protezione Dati e poi premendo Estrai i miei dati prima. Importa da FidMe - Seleziona la tua esportazione catima.zip da Catima per importarla. -\nCrealo dal menù Importazione/Esportazione di un\'altra applicazione Catima premendo prima Esporta. + Seleziona il file di esportazione catima.zip per importarlo. +\nCrealo dal menù Importa/Esporta di un\'altra applicazione Catima premendo prima Esporta. Importa da Catima Imposta il valore del codice a barre - Uguale all\'ID della carta + Uguale al codice Valore del codice a barre Impossibile leggere l\'immagine Nessun codice a barre trovato Seleziona immagine dalla galleria - Dimensione mass. caratteri + Dimensione massima del carattere Questo tipo di codice a barre non può ancora essere visualizzato. Potrebbe essere supportato in una versione successiva dell\'applicazione. Il valore non è valido per il tipo di codice a barre selezionato - Risorse libre di terze parti: %s - Librerie libre di terze parti: %s + Risorse libere di terze parti: %s + Librerie libere di terze parti: %s Copyright © 2019–%d Sylvia van Os Voglio condividere alcune carte con te - Numeri delle carte copiati negli appunti - Numero/i della carta copiato/i + Codici copiati negli appunti + Codice/i copiato/i No - Hai cambiato l\'ID della carta. Vuoi anche aggiornare il codice a barre per usare lo stesso valore\? + Hai cambiato il codice. Vuoi anche aggiornare il codice a barre per usare lo stesso valore\? Aggiornare il valore del codice a barre\? Scatta una foto - Rimuovi l’immagine + Rimuovi l\'immagine Imposta immagine posteriore Imposta immagine frontale Foto - Immagine posteriore della carta - Immagine frontale della carta + Immagine posteriore + Immagine frontale Si prega di inserire la password - Seleziona la tua esportazione ***-sync.zip da Stocard per importare. + Seleziona il tuo file di esportazione ***-sync.zip da Stocard per importarlo. \nOttienilo inviando un\'e-mail a support@stocardapp.com chiedendo un\'esportazione dei tuoi dati. Importa da Stocard Spegni la torcia Accendi la torcia Impossibile generare un URL condivisibile. Si prega di segnalarlo. - %d carta selezionata - %d carte selezionate + %d selezionata + %d selezionate Rimuovi la carta Eliminare questa carta\? - Eliminare definitivamente questa scheda %d\? - Eliminare definitivamente queste schede %d\? + Eliminare definitivamente questa %d carta\? + Eliminare definitivamente queste %d carte\? Elimina %d carta @@ -187,19 +187,19 @@ Catima Colore del tema Reso possibile da: %s - Questo gruppo non contiene carte + Questo gruppo è vuoto Attiva/disattiva la visualizzazione di altre informazioni - Immagine del codice a barre della carta del tipo %s + Immagine del codice a barre in formato %s Scorri o premi a lungo per cambiare immagine Ordina per - Inverti + …in ordine inverso Saldo Scadenza - Usate più di recente + Usate più recentemente Nome Ordina Licenza - Repository fonti + Repository del codice sorgente su GitHub Inserisci la password su Google Play @@ -210,14 +210,15 @@ e utilizzo dei dati Valuta questa applicazione Segnala un errore - Gruppo di modifica: %s + Modifica del gruppo: %s Il nome del gruppo non può essere vuoto - Non hai ancora nessuna carta fedeltà. Una volta che ne hai aggiunte, puoi assegnarle al gruppo qui. + Crea alcune carte e poi assegnale al gruppo qui. Modifica il gruppo - Nome del gruppo già in uso + Il nome del gruppo è già in uso Gruppo aggiornato Seleziona il colore Imposta l\'icona Mostra i dettagli Nascondi i dettagli - \ No newline at end of file + su Weblate + diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 0c937ee28..01cb31a6b 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -53,8 +53,8 @@ +ボタンを押してグループを追加してください。 グループ グループ名を入力 - カードのデータがエクスポートされました - カードのデータがインポートされました + データがエクスポートされました + データがインポートされました カード共有をしましょう バーコード表示中は画面をロックしない バーコード表示中は画面を消灯しない @@ -68,7 +68,7 @@ 外観 設定 お気に入りのスター - カードのサムネイル + サムネイル カード番号をクリップボードにコピーしました カード番号を入力し、バーコード形式を選択してください。 バーコード選択 @@ -89,7 +89,7 @@ ストレージからファイルを選択してください。 ストレージからインポート 選択した場所にデータを出力します。 - カードをインポート/エクスポートするために外部ストレージへのアクセスを許可してください + データをインポート/エクスポートするために外部ストレージへのアクセスを許可してください エクスポート中… インポート中… カードをエクスポートできませんでした: %s @@ -103,7 +103,7 @@ カードをインポートできません: %s インポートに失敗しました インポートしました - カードをバックアップすると、他のデバイスにカードを移すことができます。 + データをバックアップすると、他のデバイスにカードを移すことができます。 エクスポート インポート/エクスポート インポートURIを解析できません @@ -112,7 +112,7 @@ 名前が入力されていません カードを追加 カードのショートカット - カードのバーコードをスキャン + バーコードをスキャン カードの追加 カードの編集 送信先を選択… @@ -129,7 +129,7 @@ お気に入りから削除 お気に入りに追加 バーコードなし - バーコード指定なし + バーコードなし バーコード形式 カード番号 メモ @@ -154,8 +154,8 @@ 裏面の画像を設定 オモテ面の画像を設定 フォト - カードの裏面 - カードのオモテ面 + + Stocardでエクスポートした***-sync.zipファイルを選択してください。 \nファイルがない場合、e-mailing support@stocardapp.comにデータのエクスポートを要求してください。 Stocardからインポート @@ -196,7 +196,7 @@ このアプリを評価する GitHub ソースリポジトリ - パスワードを設定してエクスポートしたファイルを保護する(任意) + パスワードを設定する(不要なら空欄) パスワードを入力してください 更新履歴 貢献者 @@ -206,4 +206,15 @@ エラーを報告する 逆順 and data usage + グループを更新しました + グループ編集: %s + 詳細を表示 + 詳細を非表示 + 色を選択 + アイコン設定 + グループ編集 + このグループ名は既に使用されています + グループ名を入力してください + カードを選択してください + on Weblate \ No newline at end of file diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 115d9f815..3c79d9e73 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -158,7 +158,7 @@ Klarte ikke å lage delbar nettadresse. Rapporter denne feilen. %d kort valgt - %d korten valgt + %d kort valgt Slett dette kortet for godt? diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index e0cecebdc..0758a87e8 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -8,7 +8,7 @@ Aantekening Kaartnummer Soort barcode - Deze kaart heeft geen barcode + Er is geen barcode Annuleren Opslaan Bewerken @@ -22,16 +22,16 @@ Versturen… Kaart bewerken Kaart toevoegen - Scan de barcode van de kaart + Barcode scannen Kaartsnelkoppeling Voeg eerst een kaart toe Geen naam ingevoerd - Geen kaartnummer ingevoerd + Geen id ingevoerd De kaart is niet aangetroffen Kan de import-uri niet verwerken Importeren/Exporteren Exporteren - Door je kaarten te back-uppen, kun je ze overzetten naar een ander apparaat. + Door je gegevens te back-uppen, kun je ze overzetten naar een ander apparaat. Importeren voltooid Importeren mislukt Het importeren is mislukt: %s @@ -40,7 +40,7 @@ Het exporteren is mislukt: %s Bezig met importeren… Bezig met exporteren… - Verleen het recht ‘externe opslag’ om kaarten te kunnen im- of exporteren + Verleen het recht ‘externe opslag’ om gegevens te kunnen im- of exporteren De gegevens worden weggeschreven op een locatie naar keuze. Importeren uit bestandssysteem Kies een specifiek bestand van het bestandssysteem. @@ -56,7 +56,7 @@ Barcode toevoegen Voer de kaart-id in en kies daarna het soort barcode of druk op “Deze kaart heeft geen barcode”. De kaart-id is gekopieerd naar het klembord - Miniatuurvoorbeeld van kaart + Miniatuurvoorbeeld Instellingen Vormgeving Thema @@ -67,10 +67,10 @@ Barcode-oriëntatie vergrendelen Ik wil een klantenkaart met je delen Alles - De kaartgegevens zijn geïmporteerd + De gegevens zijn geïmporteerd Groep verwijderen\? Druk op de plusknop (‘+’) om een groep toe te voegen. - De kaartgegevens zijn geëxporteerd + De gegevens zijn geëxporteerd Groepen Voer een groepsnaam in Favoriete ster @@ -78,7 +78,7 @@ \ncopyright ©2016–2020 Branden Archer Verwijderen uit favorieten Toevoegen aan favorieten - Kaartnummer handmatig invoeren + ID handmatig invoeren Weet je zeker dat je niet wilt opslaan\? Afsluiten Omlaag verplaatsen @@ -108,7 +108,7 @@ Saldo: %s Gegevens importeren uit…\? Klantenkaartkluis - Vergrendelscherm uitschakelen + Schermvergrendeling uitschakelen Scherm niet uitschakelen Privacybeleid (vereist door sommige appwinkels): \n @@ -151,8 +151,8 @@ Voorzijde kiezen Achterzijde kiezen Afbeeldingen - Achterzijde van de kaart - Voorzijde van de kaart + Achterzijde van kaart + Voorzijde van kaart Voer het wachtwoord in Kies het te importeren Stocard-exportbestand genaamd ***-sync.zip. \nStuur een e-mail naar support@stocardapp.com waarin je vraagt om een exportbestand. @@ -161,8 +161,8 @@ Zaklamp uitzetten Zaklamp aanzetten - %d kaart geselecteerd - %d kaarten geselecteerd + %d geselecteerd + %d geselecteerd Kaart verwijderen @@ -189,10 +189,10 @@ Mede mogelijk gemaakt door: %s Deze groep bevat geen kaarten Meer informatie tonen/verbergen - Afbeelding van de barcode, type %s + Afbeelding van barcode %s Veeg of houd lang ingedrukt om te bladeren Sorteren op - Omdraaien + …in omgekeerde volgorde Op saldo Op vervaldatum Op onlangs gebruikt @@ -214,10 +214,12 @@ De groep is bijgewerkt Voer een groepsnaam in Groep bewerken: %s - Je hebt nog geen klantenkaarten toegevoegd. Voeg kaarten toe om ze hier te kunnen groeperen. + Voeg kaarten toe om ze hier te kunnen groeperen. Groep bewerken Kies een pictogram Kies een kleur Details tonen Details verbergen + op Weblate + Kies een kaart \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2fba28047..660ceb5cc 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -8,7 +8,7 @@ Примечание Номер карты Тип штрих-кода - Эта карта без штрих-кода + Нет штрих-кода Отмена Сохранить Изменить @@ -26,12 +26,12 @@ Ярлык карты Сначала добавьте карту Название не указано - Номер карты не указан + Номер не указан Карта не найдена Невозможно разобрать импортируемый URI Импорт/Экспорт Экспорт - Резервное копирование карт позволяет перенести их на другое устройство. + Резервное копирование данных позволяет перенести их на другое устройство. Импортировано Импорт не выполнен Невозможно импортировать карты: %s @@ -40,7 +40,7 @@ Невозможно экспортировать карты: %s Импорт… Экспорт… - Импорт или экспорт невозможен без разрешения на доступ к хранилищу + Импорт или экспорт данных невозможен без разрешения на доступ к хранилищу Данные будут записаны в выбранное место. Импорт из файловой системы Выберете файл на файловой системе. @@ -54,9 +54,9 @@ Версия: %s Информация о версиях: %s Выбор штрих-кода - Введите номер карты и выберите тип штрих-кода (или выберите \"Эта карта без штрих-кода\"). - Номер карты скопирован в буфер обмена - Логотип карты + Введите номер и выберите тип штрих-кода (или выберите \"Нет штрих-кода\"). + Номер скопирован в буфер обмена + Логотип Настройки Внешний вид Тема @@ -66,12 +66,12 @@ Максимальная яркость при показе карты Портретная ориентация экрана при показе карты Я хочу поделиться с вами картой - Данные карт успешно экспортированы + Данные успешно экспортированы Все - Нажмите кнопку \"+\", чтобы добавить группы для упорядочивания записей. + Нажмите кнопку \"+\", чтобы добавить группы для распределения записей. Группы Введите название группы - Данные карт успешно импортированы + Данные успешно импортированы Звезда избранного На основе Loyalty Card Keychain \nавторские права © 2016–2020 Branden Archer @@ -88,7 +88,7 @@ Срок действия истекает: %s Баллы %s не похож на правильный баланс. - Ручной ввод номера карты + Ручной ввод номера Уведомление о политике конфиденциальности (требуется некоторыми магазинами приложений): \n \nНИКАКИЕ ДАННЫЕ НЕ СОБИРАЮТСЯ ВООБЩЕ, что может подтвердить любой, так как наше приложение является свободным программным обеспечением. @@ -133,7 +133,7 @@ Штрих-код не найден Выбрать изображение из галереи Указать значение - Как номер карты + Как номер Значение штрих-кода Максимальный размер шрифта В настоящее время данный тип штрих-кодов не отображается. Его поддержка может быть добавлена в следующих версиях приложения. @@ -142,9 +142,9 @@ Свободные сторонние библиотеки: %s Авторские права © 2019–%d Sylvia van Os Поделиться картами - Скопированные номера карт - Номера карт скопированы в буфер обмена - Вы изменили номер карты. Обновить также значение штрих-кода, чтобы использовалось одинаковое значение\? + Скопированные номера + Номера скопированы в буфер обмена + Вы изменили номер. Обновить также значение штрих-кода, чтобы использовалось одинаковое значение\? Нет Да Обновить значение штрих-кода\? @@ -152,8 +152,8 @@ Изображение лицевой стороны Сфотографировать Удалить изображение - Задняя сторона карты - Лицевая сторона карты + Задняя сторона + Лицевая сторона Фото Выберите для импортирования файл ***-sync.zip. \nЭтот файл можно получить по электронной почте от support@stocardapp.com, предварительно запросив экспорт ваших данных. @@ -163,10 +163,10 @@ Отключить вспышку Включить вспышку - Выбрано: %d карта - Выбрано: %d карты - Выбрано: %d карт - Выбрано: %d карт + %d выбрана + %d выбраны + %d выбрано + %d выбрано Удаление карты Удалить карту\? @@ -195,13 +195,13 @@ Розовый Цвет темы Создано при поддержке: %s - В группе нет карт - Изображение штрих-кода карты типа %s + Группа пуста + Изображение штрих-кода %s Переключение отображения дополнительной информации Смахивание или долгое нажатие для переключения изображений Срок действия Сортировать по - Обратный порядок + …в обратном порядке Баланс Частота использования Название @@ -223,9 +223,11 @@ Редактирование группы: %s Изменить группу Такое название группы уже существует - У вас ещё нет ни одной карты. Как только появится несколько карт, вы сможете добавить их в группу здесь. + Создайте несколько карт, а затем распределите их по группам здесь. Выбор значка Выбрать цвет Скрыть детали Показать детали - \ No newline at end of file + на Weblate + Выбор карты + diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 4f470369a..fe0df4385 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -4,21 +4,21 @@ Gör streckkodsvyn ljusare Max. teckenstorlek Håll skärmen påslagen - Ange kortets ID och välj antingen streckkodstyp nedan, eller \"Detta kort har ingen streckkod\". + Ange ID:t och välj antingen streckkodstyp nedan, eller \"Det finns ingen streckkod\". Välj den exporterade fidme-export-request-xxxxxx.zip från FidMe som du vill importera och välj streckkodstyper manuellt efteråt. \nSkapa den från din FidMe-profil först genom att välja \"Data Protection\" och sen trycka på \"Extract my data\". Använd vilken app som helst eller den filhanterare du föredrar för att öppna en fil. Använd en annan app Jag vill dela ett kort med dig - Klicka på plus(+)-knappen för att lägga till kategorigrupper först. + Klicka på plus(+)-knappen för att lägga till kategorigrupper. Grupper: %s Kunde inte läsa bilden Valuta Kunde inte skapa en delningsbar URL. Var snäll och rapportera detta. - Kopierade kort ID:n + Kopierade ID:n - %d kort valt - %d kort valda + %d valt + %d valda Loyalty Card Keychain Välj den exporterade LoyaltyCardKeychain.csv från Loyalty Card Keychain som du vill importera. @@ -40,7 +40,7 @@ Flytta nedåt Avsluta Avsluta utan att spara\? - Ange kort-ID manuellt + Ange ID manuellt Välj bild från galleriet %s poäng Kort @@ -62,21 +62,21 @@ Var snäll och ange lösenordet Nej Ja - Du ändrade kortets ID. Vill du uppdatera så att streckkoden också använder samma värde\? + Du ändrade ID:t. Vill du uppdatera streckkoden så att den också använder samma värde\? Uppdatera streckkodsvärde\? Ta ett foto Ta bort bild Ange baksidesbild Ange framsidesbild Foton - Bild av kortets baksida - Bild av kortets framsida + Baksidesbild + Framsidesbild Jag vill dela några kort med dig - Kort-ID:n kopierades till Urklipp + ID:n kopierades till Urklipp Värdet är inte giltigt för den valda streckkodstypen Denna streckkodstyp kan ännu inte visas. Den kan komma att stödjas i en senare version av appen. Ange streckkodsvärde - Samma som kort-ID + Samma som ID:t Sätt på ficklampa Stäng av ficklampa Mörkt @@ -84,8 +84,8 @@ Tema Användargränssnitt Inställningar - Miniatyrbild av kort - Kort-ID kopierat till Urklipp + Miniatyrbild + ID:t kopierat till Urklipp Välj streckkod Version: %s Om %s @@ -103,10 +103,10 @@ Kunde inte importera kort: %s Importen lyckades Importen misslyckades - Säkerhetskopiering av dina kort låter dig flytta dem till en annan enhet. + Säkerhetskopiering av din data möjliggör förflyttning av den till en annan enhet. Importera/Exportera - Kunde inte hitta kort - Inget kort-ID har angivits + Kunde inte hitta det kortet + Inget ID har angivits Inget namn har angivits Lägg till ett kort först Kort-genväg @@ -134,19 +134,19 @@ Ta bort från favoriter Lägg till i favoriter Ingen streckkod - Detta kort har ingen streckkod + Det finns ingen streckkod Streckkodstyp Kort-ID Namn - Hittade ingenting. Försök justera din sökning. - Klicka på plus(+)-knappen för att lägga till ett kort, eller importera några från ⋮-menyn först. + Inget resultat. Försök justera din sökning. + Klicka på plus(+)-knappen för att lägga till ett kort, eller importera några från ⋮-menyn. Lägg till Sök Datan kommer att sparas till en plats som du väljer. Exportera Exporten misslyckades Exporten lyckades - Skanna streckkod på kort + Skanna streckkod Systemtemat Ändringsinfo: %s Notis rörande integritetspolicy (krävs av vissa appbutiker): @@ -169,13 +169,13 @@ Välj den exporterade catima.zip från Catima som du vill importera. \nSkapa den från Import/Export-menyn i en annan Catima-app genom att trycka på Exportera där först. Giltigt till: %s - Kortdata exporterad - Kortdata importerad + Data exporterad + Data importerad Kunde inte tolka import-URI:n Anteckning System Språk - Bevilja tillstånd för extern lagring för att först importera eller exportera kort + Bevilja tillstånd för extern lagring för att kunna importera eller exportera data Möjliggjordes av: %s Brunt Grått @@ -187,11 +187,11 @@ Rosa Catima Temafärg - Denna grupp innehåller inga kort + Denna grupp är tom Växla mellan att visa mer info - Bild av kortstreckkod av typen %s + Bild %s streckkod Svep eller tryck länge för att växla bild - Vänd ordning + ...i omvänd ordning Sortera efter Saldo Förfallodag @@ -219,5 +219,7 @@ Dölj detaljer Bidragsgivare Källkodslager - Du har inga kundkort än. När du senare lägger till några kan du placera dem i den här gruppen. - \ No newline at end of file + Skapa några kort och placera dem sedan i den här gruppen. + på Weblate + Välj ett kort + diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 80e47b41b..8c72ae418 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -21,21 +21,21 @@ Lütfen parolayı girin Hayır Evet - Kart numarasını değiştirdiniz. Aynı değeri kullanmak için barkodu da güncellemek ister misiniz\? + Numarayı değiştirdiniz. Aynı değeri kullanmak için barkodu da güncellemek ister misiniz\? Barkod değeri güncellensin mi\? Fotoğraf çek - Kartın arka resmi - Kartın ön resmi + Arka resmi + Ön resmi Resmi kaldır Arka resmi ayarla Ön resmi ayarla Fotoğraflar Seninle birkaç kart paylaşmak istiyorum - Kart numaraları panoya kopyalandı + Numaralar panoya kopyalandı Değer, seçilen barkod türü için geçerli değil Bu barkod türü henüz görüntülenemiyor. Uygulamanın sonraki bir sürümünde desteklenebilir. Barkod değerini ayarla - Kart numarasıyla aynı + Numarayla aynı Barkod değeri İçe aktarmak için Voucher Vault\'tan dışa aktardığınız vouchervault.json dosyasını seçin. \nÖnce Voucher Vault\'ta \"Dışa aktar\" düğmesine basarak bir tane oluşturun. @@ -79,7 +79,7 @@ Son kullanma tarihi: %s Gruplar: %s Galeriden resim seç - Kart numarasını elle gir + Numarayı elle gir Kaydetmeden çıkılsın mı\? Çıkış Aşağı git @@ -91,12 +91,12 @@ %d kart %d kart - Bu grup hiç kart içermiyor - Önce kategorilere ayırmak üzere gruplar eklemek için + artı düğmesine tıklayın. + Bu grup boş + Kategorilere ayırmak üzere gruplar eklemek için + artı düğmesine tıklayın. Gruplar Grup adını girin - Kart verileri dışa aktarıldı - Kart verileri içe aktarıldı + Veriler dışa aktarıldı + Veriler içe aktarıldı Seninle bir kart paylaşmak istiyorum Ekran kilidini engelle Ekranı açık tut @@ -110,9 +110,9 @@ Kullanıcı arayüzü Ayarlar Sık kullanılan yıldız - Kart için küçük resim - Kart numarası panoya kopyalandı - Kart numarasını girin ve aşağıdan barkod türünü veya “Bu kartın barkodu yok” seçeneğini seçin. + Küçük resim + Numara panoya kopyalandı + Numarasını girin ve aşağıdan barkod türünü veya “Barkod yok” seçeneğini seçin. Barkod Seç Özgür üçüncü taraf kaynakları: %s Özgür üçüncü taraf kütüphaneleri: %s @@ -131,7 +131,7 @@ Dosya sisteminden belirli bir dosya seçin. Dosya sisteminden içe aktar Veriler seçtiğiniz bir konuma yazılacak. - Kartları içe veya dışa aktarmak için önce harici depolama izni verin + Verileri içeri veya dışarı aktarmak için harici depolama izni verin Dışa aktarılıyor… İçe aktarılıyor… Kartlar dışa aktarılamadı: %s @@ -140,20 +140,20 @@ Kartlar içe aktarılamadı: %s İçe aktarılamadı İçe aktarıldı - Kartlarınızı yedeklemek, onları başka bir aygıta taşımanıza olanak tanır. + Verilerinizi yedeklemek, onları başka bir aygıta taşımanıza olanak tanır. Dışa aktar İçe/Dışa aktar İçe aktarma URI\'si ayrıştırılamadı - Kart bulunamadı - Kart numarası girilmedi + Bu kart bulunamadı + Numara girilmedi Ad girilmedi - %s türündeki kart barkodunun görüntüsü - Kart numara(lar)ı kopyalandı + %s barkod görüntüsü + Numara(lar) kopyalandı Numarayı panoya kopyala Kart numarası Önce bir kart ekleyin Kart Kısayolu - Kart Barkodunu Tara + Barkod Tara Kart Ekle Kartı Düzenle Gönder… @@ -179,20 +179,20 @@ Sık kullanılanlardan kaldır Sık kullanılanlara ekle Barkod yok - Bu kartın barkodu yok + Barkod yok Barkod türü Not Ad - Hiçbir şey bulunamadı. Aramanızı değiştirmeyi deneyin. - Bir kart eklemek için + artı düğmesine tıklayın veya önce ⋮ menüsünden birkaçını içe aktarın. + Sonuç yok. Aramanızı değiştirmeyi deneyin. + Bir kart eklemek için + artı düğmesine tıklayın veya ⋮ menüsünden birkaçını içe aktarın. - %d kart seçildi - %d kart seçildi + %d seçildi + %d seçildi Ekle Ara Sıralama ölçütü - Ters + …ters sırada Bakiye Son kullanma tarihi En Son Kullanılan @@ -210,7 +210,7 @@ Sürüm Geçmişi Dışa aktarmanızı korumak için bir parola belirleyin (isteğe bağlı) Parola girin - Henüz sadakat kartınız yok. Birkaç tane ekledikten sonra, onları burada gruba atayabilirsiniz. + Birkaç kart oluşturun ve ardından onları burada gruba atayın. Grup adı zaten kullanılıyor Grup Düzenleniyor: %s Grubu Düzenle @@ -220,4 +220,6 @@ Simge ayarla Ayrıntıları göster Ayrıntıları gizle - \ No newline at end of file + Weblate\'de + Kart seç + diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index da559f2c7..748368a28 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -3,13 +3,13 @@ Політика конфіденційності (вимагається деякими магазинами): \n \nЖОДНОЇ ІНФОРМАЦІЇ НЕ ЗБИРАЄТЬСЯ, що може підтвердити будь-хто, адже наша програма це вільне програмне забезпечення. - Натисніть + щоб додати карту чи спочатку імпортуйте з ⋮ меню. + Натисніть + щоб додати карту чи імпортуйте з ⋮ меню. Яскравіший штрих-код - Введіть ID карти та оберіть тип штрих-коду чи \"Ця карта не має штрих-коду\". + Введіть ID та оберіть тип штрих-коду чи \"Не має штрих-коду\". Оберіть штрих-код - Відсканувати штрих-код карти + Відсканувати штрих-код Без штрих-коду - Ця карта не має штрих-коду + Штрих-код відсутній Тип штрих-коду %d картка @@ -19,12 +19,12 @@ НІ Так - Ви змінили ID картки. Чи ви бажаєте оновити штрих-код для використання цього ж значення\? + Ви змінили ID. Чи ви бажаєте оновити штрих-код для використання цього ж значення\? Оновити значення штрих-коду\? Значення не дійсне для обраного типу штрих-коду Цей тип штрих-коду поки що не відображається. Підтримку може бути додано в подальших версіях програми. Встановіть значення штрих-коду - Таке ж як ID картки + Таке ж як ID Значення штрих-коду Оберіть Voucher Vault експорт-файл названий vouchervault.json для імпортування. \nСтворіть його натиснувши \"Експорт\" у Voucher Vault. @@ -34,7 +34,7 @@ Оберіть експорт-файл названий catima.zip для імпортування. \nСтворіть його з меню імпорту/експорту у іншій Catima, натиснувши \"Експорт\". Імпорт з Loyalty Card Keychain - Оберіть FidMe експорт-файл названий fidme-export-request-xxxxxx.zip для імпортування і оберіть типи штрих-кодів вручну пізніше. + Оберіть FidMe експорт-файл названий fidme-export-request-xxxxxx.zip для імпортування і оберіть типи штрих-кодів. \nСтворіть його у вашому FidMe профілі обравши \"Захист даних -> Витяг даних\". Імпорт з FidMe Імпорт з Catima @@ -62,7 +62,7 @@ Термін дії закінчується: %s Групи: %s Оберіть зображення з галереї - Ввести ID карти вручну + Ввести ID вручну Вийти без збереження\? Вихід Посунути донизу @@ -70,11 +70,11 @@ Спочатку встановіть файловий менеджер. Видалити групу\? Усі - Спочатку натисніть + щоб додати групи для категоризації. + Натисніть + щоб додати групи для категоризації. Групи Введіть ім\'я групи - Дані картки/карток експортовано - Дані картки/карток імпортовано + Дані експортовано + Дані імпортовано Я хочу поділитися з тобою картою Не блокувати екран Не вимикати екран @@ -87,10 +87,10 @@ Інтерфейс користувача Налаштування Улюблена зірка - Ескіз для карти + Ескіз Я хочу поділитися деякими картами з тобою - ID карток скопійовано до буферу обміну - ID карти скопійовано до буферу обміну + ID скопійовано до буферу обміну + ID скопійовано до буферу обміну Вільні ресурси третіх сторін: %s Вільні бібліотеки третіх сторін: %s Інформація про випуск: %s @@ -108,7 +108,7 @@ Оберіть файл у провіднику. Імпорт з файлу Дані буде записано до локації обраної вами. - Надайте дозвіл на доступ до пам\'яті пристрою для імпорту чи експорту карток + Надайте дозвіл на доступ до пам\'яті пристрою для імпорту/експорту даних Експортуємо… Імпортуємо… Неможливо експортувати картки: %s @@ -117,14 +117,14 @@ Неможливо імпортувати картки: %s Помилка імпорту Імпортовано - Створення резервної копії ваших карток дозволяє перемістити їх до іншого пристрою. + Резервна копія даних дозволяє перемістити їх до іншого пристрою. Експорт Імпорт/Експорт Неможливо опрацювати імпорт-URI Карту не знайдено - ID карти не введено + ID не введено Ім\'я не введено - ID карти скопійовано + ID скопійовано Спочатку додайте карту Швидкий виклик карти Додати карту @@ -157,30 +157,30 @@ Встановити зображення тильної сторони Встановити зображення лицьової сторони Фото - Тильна сторона карти - Лицьова сторона карти + Тильна сторона + Лицьова сторона Виберіть експорт ***-sync.zip зі Stocard для імпорту. -\nОтримайте його, надіславши електронною поштою support@stocardapp.com з проханням експортувати ваші дані. +\nОтримайте його, надіславши електронного листа support@stocardapp.com з проханням експортувати ваші дані. Імпорт із Stocard - Обрано: %d карта - Обрано: %d карти - Обрано: %d карток - Обрано: %d карток + Обрано: %d + Обрано: %d + Обрано: %d + Обрано: %d Видалити картку Бажаєте видалити карту\? Видалити %d картку Видалити %d картки - Видалити %d картки - Видалити %d картки + Видалити %d карток + Видалити %d карток - Видаліть цю %d карту назавжди\? - Видаліть ці %d карти назавжди\? - Видаліть ці %d карти назавжди\? - Видаліть ці %d карти назавжди\? + Видалити цю %d карту назавжди\? + Видалити ці %d карти назавжди\? + Видалити ці %d карт назавжди\? + Видалити ці %d карт назавжди\? Синій Фіолетовий @@ -195,12 +195,12 @@ Зелений Небесно-синій Стало можливим завдяки: %s - Ця група не містить жодних карток + Пуста група Показувати додаткову інформацію - Зображення штрих-коду карти типу %s + Зображення штрих-коду %s Свайп чи довге натискання для зміни зображень Сортувати за - Зворотній порядок + … у зворотному порядку Баланс Термін дії Часто використовувані @@ -223,9 +223,10 @@ Редагування групи: %s Змінити групу Група з такою назвою вже існує - У вас ще немає жодної картки. Коли ви додасте кілька, то зможете призначити їх до групи. + Створите кілька карток, та призначте їх до групи тут. Вибір кольору Вибір іконки Показати деталі Сховати деталі - \ No newline at end of file + на Weblate + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 276906ef7..9216b42c8 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -17,7 +17,7 @@ 从文件系统 从收藏中删除 我想和你分享一些卡片 - 已将卡号复制到剪贴板 + 卡号已复制到剪贴板 该值对所选条形码类型无效 此条形码类型尚无法显示。较新版本的应用程序可能提供支持。 设置条形码值 @@ -66,13 +66,13 @@ 请先安装文件管理器。 删除群组? 全部 - 点击 \"+\" 按钮,先添加组进行分类。 + 单击 “+ ” 按钮添加分组进行分类。 输入组名 - 已导出卡片数据 - 已导入卡片数据 + 已导出数据 + 已导入数据 我想和你分享一张卡 - 禁用锁屏 + 防止锁屏 保持屏幕常亮 锁定条码方向 提高条码界面亮度 @@ -82,9 +82,9 @@ 主题 用户界面 设置 - 卡片缩略图 + 缩略图 已复制卡号到剪贴板 - 输入卡号,并从下面选择其条码类型,或选择\"此卡片没有条码\"。 + 输入卡号,并从下面选择其条码类型,或选择\"无条码\"。 选择条码 第三方自由资源:%s 本软件为自由软件,使用 GPLv3+ 许可证 @@ -105,19 +105,19 @@ 无法导入卡片: %s 导入失败 导入成功 - 备份卡片后你可以让你将它们转移到其他设备。 + 备份数据允许你将其移动到另一个设备上。 导出 导入/导出 无法解析导入的URI - 无法到卡片 + 找不到卡片 未输入卡号 未输入卡片名称 - 复制卡号 + 已复制卡号 请先添加一张卡片 卡片快捷键 编辑卡片 添加卡片 - 扫描卡片条码 + 扫描条码 发送… 分享 复制卡号到剪贴板 @@ -131,13 +131,13 @@ 取消 添加到收藏 无条形码 - 此卡无条形码 + 无条形码 条形码类型 卡号 备注 名称 - 没有找到任何东西。尝试改变你的搜索。 - 点击 \"+\"加号按钮来添加卡片,或者先从⋮菜单中导入一些。 + 没有结果。尝试改变你的搜索。 + 点击 \"+\"加号按钮来添加卡片,或者从⋮ 菜单导入一些。 添加 搜索 删除此卡? @@ -149,7 +149,7 @@ 确定永久删除 %d 这些卡片? - 已选择 %d 张卡片 + 选中了 %d 张卡 删除 %d 张卡片 @@ -167,10 +167,10 @@ 设置背面图像 设置正面图像 照片 - 卡片的背面图像 - 卡片的正面图像 + 背面图像 + 正面图像 从Stocard导入 - 你还没有会员卡。一旦添加了一些卡,你可以将它们分配到这里的组。 - %s型卡片条码图像 + 创建一些卡片,然后分配给这里的小组。 + %s型条码图像 编辑组 \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index d55246521..5e3a4d22b 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -33,7 +33,8 @@ 16dp - 33sp - 24dp + 66sp + 48dp + 92dp 100sp diff --git a/app/src/main/res/values/settings.xml b/app/src/main/res/values/settings.xml index 53ec0488a..e014c7f5c 100644 --- a/app/src/main/res/values/settings.xml +++ b/app/src/main/res/values/settings.xml @@ -47,6 +47,7 @@ da de el-rGR + en eo es es-rAR diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b09771c79..eee3c0e07 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,17 +3,17 @@ Search Add - %d card selected - %d cards selected + %d selected + %d selected - Click the + plus button to add a card, or import some from the ⋮ menu first. - You don\'t have any loyalty cards yet. Once you\'ve added some you can assign them to the group here. - Didn\'t find anything. Try changing your search. + Click the + plus button to add a card, or import some from the ⋮ menu. + Create some cards, and then assign them to the group here. + No results. Try changing your search. Name Note Card ID Barcode type - This card has no barcode + There is no barcode No barcode Add to favorites Remove from favorites @@ -46,18 +46,19 @@ Send… Edit Card Add Card - Scan Card Barcode + Scan Barcode Card Shortcut Add a card first - Copied Card ID(s) - Image of card barcode of type %s + Copied ID(s) + + Image %s barcode No name entered - No card ID entered - Could not find card + No ID entered + Could not find that card Could not parse the import URI Import/Export Export - Backing up your cards allows you to move them to another device. + Backing up your data allows moving it to another device. Imported Import failed Could not import cards: %s @@ -66,7 +67,7 @@ Could not export cards: %s Importing… Exporting… - Grant external storage permission to import or export cards first + Grant external storage permission to import or export data The data will be written to a location of your choice. Import from filesystem Choose a specific file from the filesystem. @@ -84,9 +85,9 @@ Libre third-party libraries: %s Libre third-party resources: %s Select Barcode - Enter the card ID, and either pick its barcode type below, or “This card has no barcode”. - Card ID copied to clipboard - Thumbnail for card + Enter the ID, and either pick a barcode type below, or “There is no barcode”. + ID copied to clipboard + Thumbnail Favorite star Settings User interface @@ -106,7 +107,7 @@ pref_lock_barcode_orientation Keep screen on pref_keep_screen_on - Prevent lock screen + Prevent screen lock pref_disable_lockscreen_while_viewing_card sharedpreference_active_tab sharedpreference_privacy_policy_shown @@ -120,13 +121,13 @@ /Catima/share brarcher.github.io /loyalty-card-locker/share - Card data imported - Card data exported + Data imported + Data exported Enter group name Groups Edit Group - Click the + plus button to add groups for categorization first. - This group does not contain any cards + Click the + plus button to add groups for categorization. + This group is empty %d card %d cards @@ -141,7 +142,7 @@ Move downwards Exit Leave without saving? - Manually enter card ID + Manually enter ID Select image from gallery Groups: %s Editing Group: %s @@ -184,21 +185,21 @@ Select your vouchervault.json export from Voucher Vault to import. \nCreate it by pressing Export in Voucher Vault first. Barcode value - Same as card ID + Same as ID Set barcode value This barcode type can\'t yet be displayed. It may be supported in a later version of the app. The value is not valid for the selected barcode type - Card IDs copied to clipboard + IDs copied to clipboard I want to share some cards with you - Card\'s front image - Card\'s back image + Front image + Back image Photos Set front image Set back image Remove image Take a photo Update barcode value? - You changed the card ID. Do you want to also update the barcode to use the same value? + You changed the ID. Do you want to also update the barcode to use the same value? Yes No Please enter the password @@ -240,7 +241,8 @@ Most Recently Used Expiry Balance - Reverse + + …in reversed order Sort by Version History ]]> @@ -258,4 +260,6 @@ Unknown failure Incorrect password Notifications about importing or exporting card data - \ No newline at end of file + on Weblate + Select a card + diff --git a/app/src/test/java/protect/card_locker/DatabaseTest.java b/app/src/test/java/protect/card_locker/DatabaseTest.java index cb5271f55..eacbcd8cf 100644 --- a/app/src/test/java/protect/card_locker/DatabaseTest.java +++ b/app/src/test/java/protect/card_locker/DatabaseTest.java @@ -29,7 +29,7 @@ import static org.junit.Assert.assertTrue; @RunWith(RobolectricTestRunner.class) @Config(sdk = 23) public class DatabaseTest { - private DBHelper mDb; + private SQLiteDatabase mDatabase; private Activity mActivity; private static final Integer DEFAULT_HEADER_COLOR = Color.BLACK; @@ -37,18 +37,18 @@ public class DatabaseTest { @Before public void setUp() { mActivity = Robolectric.setupActivity(MainActivity.class); - mDb = TestHelpers.getEmptyDb(mActivity); + mDatabase = TestHelpers.getEmptyDb(mActivity).getWritableDatabase(); } @Test public void addRemoveOneGiftCard() { - 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); + assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); + long id = DBHelper.insertLoyaltyCard(mDatabase, "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, mDb.getLoyaltyCardCount()); + assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard loyaltyCard = mDb.getLoyaltyCard(1); + LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1); assertNotNull(loyaltyCard); assertEquals("store", loyaltyCard.store); assertEquals("note", loyaltyCard.note); @@ -61,24 +61,24 @@ public class DatabaseTest { assertEquals(DEFAULT_HEADER_COLOR, loyaltyCard.headerColor); assertEquals(0, loyaltyCard.starStatus); - result = mDb.deleteLoyaltyCard(mActivity, 1); + result = DBHelper.deleteLoyaltyCard(mDatabase, mActivity, 1); assertTrue(result); - assertEquals(0, mDb.getLoyaltyCardCount()); - assertNull(mDb.getLoyaltyCard(1)); + assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); + assertNull(DBHelper.getLoyaltyCard(mDatabase, 1)); } @Test public void updateGiftCard() { - long id = mDb.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null); + long id = DBHelper.insertLoyaltyCard(mDatabase, "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, mDb.getLoyaltyCardCount()); + assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - result = mDb.updateLoyaltyCard(1, "store1", "note1", null, new BigDecimal("10.00"), Currency.getInstance("EUR"), "cardId1", null, CatimaBarcode.fromBarcode(BarcodeFormat.AZTEC), DEFAULT_HEADER_COLOR); + result = DBHelper.updateLoyaltyCard(mDatabase, 1, "store1", "note1", null, new BigDecimal("10.00"), Currency.getInstance("EUR"), "cardId1", null, CatimaBarcode.fromBarcode(BarcodeFormat.AZTEC), DEFAULT_HEADER_COLOR); assertTrue(result); - assertEquals(1, mDb.getLoyaltyCardCount()); + assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard loyaltyCard = mDb.getLoyaltyCard(1); + LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1); assertNotNull(loyaltyCard); assertEquals("store1", loyaltyCard.store); assertEquals("note1", loyaltyCard.note); @@ -94,16 +94,16 @@ public class DatabaseTest { @Test public void updateGiftCardOnlyStar() { - long id = mDb.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR, 0, null); + long id = DBHelper.insertLoyaltyCard(mDatabase, "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, mDb.getLoyaltyCardCount()); + assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - result = mDb.updateLoyaltyCardStarStatus(1, 1); + result = DBHelper.updateLoyaltyCardStarStatus(mDatabase, 1, 1); assertTrue(result); - assertEquals(1, mDb.getLoyaltyCardCount()); + assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard loyaltyCard = mDb.getLoyaltyCard(1); + LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1); assertNotNull(loyaltyCard); assertEquals("store", loyaltyCard.store); assertEquals("note", loyaltyCard.note); @@ -119,22 +119,22 @@ public class DatabaseTest { @Test public void updateMissingGiftCard() { - assertEquals(0, mDb.getLoyaltyCardCount()); + assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); - boolean result = mDb.updateLoyaltyCard(1, "store1", "note1", null, new BigDecimal("0"), null, "cardId1", + boolean result = DBHelper.updateLoyaltyCard(mDatabase, 1, "store1", "note1", null, new BigDecimal("0"), null, "cardId1", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), DEFAULT_HEADER_COLOR); assertEquals(false, result); - assertEquals(0, mDb.getLoyaltyCardCount()); + assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); } @Test public void emptyGiftCardValues() { - long id = mDb.insertLoyaltyCard("", "", null, new BigDecimal("0"), null, "", null, null, null, 0, null); + long id = DBHelper.insertLoyaltyCard(mDatabase, "", "", null, new BigDecimal("0"), null, "", null, null, null, 0, null); boolean result = (id != -1); assertTrue(result); - assertEquals(1, mDb.getLoyaltyCardCount()); + assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard loyaltyCard = mDb.getLoyaltyCard(1); + LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(mDatabase, 1); assertNotNull(loyaltyCard); assertEquals("", loyaltyCard.store); assertEquals("", loyaltyCard.note); @@ -155,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 = mDb.insertLoyaltyCard("store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index, + long id = DBHelper.insertLoyaltyCard(mDatabase, "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, mDb.getLoyaltyCardCount()); + assertEquals(CARDS_TO_ADD, DBHelper.getLoyaltyCardCount(mDatabase)); - Cursor cursor = mDb.getLoyaltyCardCursor(); + Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); assertNotNull(cursor); assertEquals(CARDS_TO_ADD, cursor.getCount()); @@ -199,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 = mDb.insertLoyaltyCard("store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index, + id = DBHelper.insertLoyaltyCard(mDatabase, "store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index, null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), index, 1, null); } else { - id = mDb.insertLoyaltyCard("store" + index, "note" + index, null, new BigDecimal("0"), null, "cardId" + index, + id = DBHelper.insertLoyaltyCard(mDatabase, "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, mDb.getLoyaltyCardCount()); + assertEquals(CARDS_TO_ADD, DBHelper.getLoyaltyCardCount(mDatabase)); - Cursor cursor = mDb.getLoyaltyCardCursor(); + Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); assertNotNull(cursor); assertEquals(CARDS_TO_ADD, cursor.getCount()); @@ -280,130 +280,130 @@ public class DatabaseTest { @Test public void addRemoveOneGroup() { - assertEquals(0, mDb.getGroupCount()); - long id = mDb.insertGroup("group one"); + assertEquals(0, DBHelper.getGroupCount(mDatabase)); + long id = DBHelper.insertGroup(mDatabase, "group one"); boolean result = (id != -1); assertTrue(result); - assertEquals(1, mDb.getGroupCount()); + assertEquals(1, DBHelper.getGroupCount(mDatabase)); - Group group = mDb.getGroup("group one"); + Group group = DBHelper.getGroup(mDatabase, "group one"); assertNotNull(group); assertEquals("group one", group._id); - result = mDb.deleteGroup("group one"); + result = DBHelper.deleteGroup(mDatabase, "group one"); assertTrue(result); - assertEquals(0, mDb.getGroupCount()); - assertNull(mDb.getGroup("group one")); + assertEquals(0, DBHelper.getGroupCount(mDatabase)); + assertNull(DBHelper.getGroup(mDatabase, "group one")); } @Test public void updateGroup() { // Create card - 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); + assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); + long id = DBHelper.insertLoyaltyCard(mDatabase, "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, mDb.getLoyaltyCardCount()); + assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); // Create group - long groupId = mDb.insertGroup("group one"); + long groupId = DBHelper.insertGroup(mDatabase, "group one"); result = (groupId != -1); assertTrue(result); - assertEquals(1, mDb.getGroupCount()); + assertEquals(1, DBHelper.getGroupCount(mDatabase)); // Add card to group - Group group = mDb.getGroup("group one"); + Group group = DBHelper.getGroup(mDatabase, "group one"); List groupList1 = new ArrayList<>(); groupList1.add(group); - mDb.setLoyaltyCardGroups(1, groupList1); + DBHelper.setLoyaltyCardGroups(mDatabase, 1, groupList1); // Ensure the card has one group and the group has one card - List cardGroups = mDb.getLoyaltyCardGroups((int) id); + List cardGroups = DBHelper.getLoyaltyCardGroups(mDatabase, (int) id); assertEquals(1, cardGroups.size()); assertEquals("group one", cardGroups.get(0)._id); - assertEquals(1, mDb.getGroupCardCount("group one")); + assertEquals(1, DBHelper.getGroupCardCount(mDatabase, "group one")); // Rename group - result = mDb.updateGroup("group one", "group one renamed"); + result = DBHelper.updateGroup(mDatabase, "group one", "group one renamed"); assertTrue(result); - assertEquals(1, mDb.getGroupCount()); + assertEquals(1, DBHelper.getGroupCount(mDatabase)); // Group one no longer exists - group = mDb.getGroup("group one"); + group = DBHelper.getGroup(mDatabase,"group one"); assertNull(group); // But group one renamed does - Group group2 = mDb.getGroup("group one renamed"); + Group group2 = DBHelper.getGroup(mDatabase, "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 = mDb.getLoyaltyCardGroups((int) id); + cardGroups = DBHelper.getLoyaltyCardGroups(mDatabase, (int) id); assertEquals(1, cardGroups.size()); assertEquals("group one renamed", cardGroups.get(0)._id); - assertEquals(1, mDb.getGroupCardCount("group one renamed")); + assertEquals(1, DBHelper.getGroupCardCount(mDatabase, "group one renamed")); } @Test public void updateMissingGroup() { - assertEquals(0, mDb.getGroupCount()); + assertEquals(0, DBHelper.getGroupCount(mDatabase)); - boolean result = mDb.updateGroup("group one", "new name"); + boolean result = DBHelper.updateGroup(mDatabase, "group one", "new name"); assertEquals(false, result); - assertEquals(0, mDb.getGroupCount()); + assertEquals(0, DBHelper.getGroupCount(mDatabase)); } @Test public void emptyGroupValues() { - long id = mDb.insertGroup(""); + long id = DBHelper.insertGroup(mDatabase, ""); boolean result = (id != -1); assertFalse(result); - assertEquals(0, mDb.getLoyaltyCardCount()); + assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); } @Test public void duplicateGroupName() { - assertEquals(0, mDb.getGroupCount()); - long id = mDb.insertGroup("group one"); + assertEquals(0, DBHelper.getGroupCount(mDatabase)); + long id = DBHelper.insertGroup(mDatabase, "group one"); boolean result = (id != -1); assertTrue(result); - assertEquals(1, mDb.getGroupCount()); + assertEquals(1, DBHelper.getGroupCount(mDatabase)); - Group group = mDb.getGroup("group one"); + Group group = DBHelper.getGroup(mDatabase, "group one"); assertNotNull(group); assertEquals("group one", group._id); // Should fail on duplicate - long id2 = mDb.insertGroup("group one"); + long id2 = DBHelper.insertGroup(mDatabase, "group one"); boolean result2 = (id2 != -1); assertFalse(result2); - assertEquals(1, mDb.getGroupCount()); + assertEquals(1, DBHelper.getGroupCount(mDatabase)); } @Test public void updateGroupDuplicate() { - long id = mDb.insertGroup("group one"); + long id = DBHelper.insertGroup(mDatabase, "group one"); boolean result = (id != -1); assertTrue(result); - assertEquals(1, mDb.getGroupCount()); + assertEquals(1, DBHelper.getGroupCount(mDatabase)); - long id2 = mDb.insertGroup("group two"); + long id2 = DBHelper.insertGroup(mDatabase, "group two"); boolean result2 = (id2 != -1); assertTrue(result2); - assertEquals(2, mDb.getGroupCount()); + assertEquals(2, DBHelper.getGroupCount(mDatabase)); // Should fail when trying to rename group two to one - boolean result3 = mDb.updateGroup("group two", "group one"); + boolean result3 = DBHelper.updateGroup(mDatabase, "group two", "group one"); assertFalse(result3); - assertEquals(2, mDb.getGroupCount()); + assertEquals(2, DBHelper.getGroupCount(mDatabase)); // Rename failed so both should still be the same - Group group = mDb.getGroup("group one"); + Group group = DBHelper.getGroup(mDatabase, "group one"); assertNotNull(group); assertEquals("group one", group._id); - Group group2 = mDb.getGroup("group two"); + Group group2 = DBHelper.getGroup(mDatabase, "group two"); assertNotNull(group2); assertEquals("group two", group2._id); } @@ -411,52 +411,53 @@ public class DatabaseTest { @Test public void cardAddAndRemoveGroups() { // Create card - 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); + assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); + long id = DBHelper.insertLoyaltyCard(mDatabase, "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, mDb.getLoyaltyCardCount()); + assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); // Create two groups to only one card - assertEquals(0, mDb.getGroupCount()); - long gid = mDb.insertGroup("one"); + assertEquals(0, DBHelper.getGroupCount(mDatabase)); + long gid = DBHelper.insertGroup(mDatabase, "one"); boolean gresult = (gid != -1); assertTrue(gresult); - long gid2 = mDb.insertGroup("two"); + long gid2 = DBHelper.insertGroup(mDatabase, "two"); boolean gresult2 = (gid2 != -1); assertTrue(gresult2); - assertEquals(2, mDb.getGroupCount()); + assertEquals(2, DBHelper.getGroupCount(mDatabase)); - Group group1 = mDb.getGroup("one"); + Group group1 = DBHelper.getGroup(mDatabase, "one"); // Card has no groups by default - List cardGroups = mDb.getLoyaltyCardGroups(1); + List cardGroups = DBHelper.getLoyaltyCardGroups(mDatabase, 1); assertEquals(0, cardGroups.size()); // Add one groups to card List groupList1 = new ArrayList<>(); groupList1.add(group1); - mDb.setLoyaltyCardGroups(1, groupList1); + DBHelper.setLoyaltyCardGroups(mDatabase, 1, groupList1); - List cardGroups1 = mDb.getLoyaltyCardGroups(1); + List cardGroups1 = DBHelper.getLoyaltyCardGroups(mDatabase, 1); assertEquals(1, cardGroups1.size()); assertEquals(cardGroups1.get(0)._id, group1._id); - assertEquals(1, mDb.getGroupCardCount("one")); - assertEquals(0, mDb.getGroupCardCount("two")); + assertEquals(1, DBHelper.getGroupCardCount(mDatabase, "one")); + assertEquals(0, DBHelper.getGroupCardCount(mDatabase, "two")); // Remove groups - mDb.setLoyaltyCardGroups(1, new ArrayList()); - List cardGroups2 = mDb.getLoyaltyCardGroups(1); + DBHelper.setLoyaltyCardGroups(mDatabase, 1, new ArrayList()); + List cardGroups2 = DBHelper.getLoyaltyCardGroups(mDatabase, 1); assertEquals(0, cardGroups2.size()); - assertEquals(0, mDb.getGroupCardCount("one")); - assertEquals(0, mDb.getGroupCardCount("two")); + assertEquals(0, DBHelper.getGroupCardCount(mDatabase, "one")); + assertEquals(0, DBHelper.getGroupCardCount(mDatabase, "two")); } @Test public void databaseUpgradeFromVersion1() { - SQLiteDatabase database = mDb.getWritableDatabase(); + DBHelper dbHelper = TestHelpers.getEmptyDb(mActivity); + SQLiteDatabase database = dbHelper.getWritableDatabase(); // Setup the database as it appeared in revision 1 setupDatabaseVersion1(database); @@ -466,10 +467,10 @@ public class DatabaseTest { int newCardId2 = insertCardVersion1(database, "store", "cardId", ""); // Upgrade database - mDb.onUpgrade(database, DBHelper.ORIGINAL_DATABASE_VERSION, DBHelper.DATABASE_VERSION); + dbHelper.onUpgrade(database, DBHelper.ORIGINAL_DATABASE_VERSION, DBHelper.DATABASE_VERSION); // Determine that the entries are queryable and the fields are correct - LoyaltyCard card = mDb.getLoyaltyCard(newCardId); + LoyaltyCard card = DBHelper.getLoyaltyCard(database, newCardId); assertEquals("store", card.store); assertEquals("", card.note); assertEquals(null, card.expiry); @@ -484,7 +485,7 @@ public class DatabaseTest { assertEquals(100, card.zoomLevel); // Determine that the entries are queryable and the fields are correct - LoyaltyCard card2 = mDb.getLoyaltyCard(newCardId2); + LoyaltyCard card2 = DBHelper.getLoyaltyCard(database, newCardId2); assertEquals("store", card2.store); assertEquals("", card2.note); assertEquals(null, card2.expiry); @@ -497,7 +498,5 @@ public class DatabaseTest { assertEquals(0, card2.starStatus); assertEquals(0, card2.lastUsed); assertEquals(100, card2.zoomLevel); - - database.close(); } } diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index 7644dd9a1..00164213d 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -2,6 +2,7 @@ package protect.card_locker; import android.app.Activity; import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; @@ -61,7 +62,7 @@ import static org.robolectric.Shadows.shadowOf; @Config(sdk = 23) public class ImportExportTest { private Activity activity; - private DBHelper db; + private SQLiteDatabase mDatabase; private long nowMs; private long lastYearMs; private final int MONTHS_PER_YEAR = 12; @@ -74,7 +75,7 @@ public class ImportExportTest { ShadowLog.stream = System.out; activity = Robolectric.setupActivity(MainActivity.class); - db = TestHelpers.getEmptyDb(activity); + mDatabase = TestHelpers.getEmptyDb(activity).getWritableDatabase(); nowMs = System.currentTimeMillis(); Calendar lastYear = Calendar.getInstance(); @@ -93,12 +94,12 @@ public class ImportExportTest { for (int index = cardsToAdd; index > 0; index--) { String storeName = String.format("store, \"%4d", index); String note = String.format("note, \"%4d", index); - long id = db.insertLoyaltyCard(storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 0, null); + long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 0, null); boolean result = (id != -1); assertTrue(result); } - assertEquals(cardsToAdd, db.getLoyaltyCardCount()); + assertEquals(cardsToAdd, DBHelper.getLoyaltyCardCount(mDatabase)); } private void addLoyaltyCardsFiveStarred() { @@ -107,7 +108,7 @@ public class ImportExportTest { for (int index = cardsToAdd; index > 4; index--) { String storeName = String.format("store, \"%4d", index); String note = String.format("note, \"%4d", index); - long id = db.insertLoyaltyCard(storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 1, null); + long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 1, null); boolean result = (id != -1); assertTrue(result); } @@ -115,20 +116,20 @@ public class ImportExportTest { String storeName = String.format("store, \"%4d", index); String note = String.format("note, \"%4d", index); //if index is even - long id = db.insertLoyaltyCard(storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 0, null); + long id = DBHelper.insertLoyaltyCard(mDatabase, storeName, note, null, new BigDecimal(String.valueOf(index)), null, BARCODE_DATA, null, BARCODE_TYPE, index, 0, null); boolean result = (id != -1); assertTrue(result); } - assertEquals(cardsToAdd, db.getLoyaltyCardCount()); + assertEquals(cardsToAdd, DBHelper.getLoyaltyCardCount(mDatabase)); } @Test public void addLoyaltyCardsWithExpiryNeverPastTodayFuture() { - long id = db.insertLoyaltyCard("No Expiry", "", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null); + long id = DBHelper.insertLoyaltyCard(mDatabase, "No Expiry", "", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null); boolean result = (id != -1); assertTrue(result); - LoyaltyCard card = db.getLoyaltyCard((int) id); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, (int) id); assertEquals("No Expiry", card.store); assertEquals("", card.note); assertEquals(null, card.expiry); @@ -140,11 +141,11 @@ public class ImportExportTest { assertEquals(Integer.valueOf(0), card.headerColor); assertEquals(0, card.starStatus); - id = db.insertLoyaltyCard("Past", "", new Date((long) 1), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null); + id = DBHelper.insertLoyaltyCard(mDatabase, "Past", "", new Date((long) 1), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null); result = (id != -1); assertTrue(result); - card = db.getLoyaltyCard((int) id); + card = DBHelper.getLoyaltyCard(mDatabase, (int) id); assertEquals("Past", card.store); assertEquals("", card.note); assertTrue(card.expiry.before(new Date())); @@ -156,11 +157,11 @@ public class ImportExportTest { assertEquals(Integer.valueOf(0), card.headerColor); assertEquals(0, card.starStatus); - id = db.insertLoyaltyCard("Today", "", new Date(), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null); + id = DBHelper.insertLoyaltyCard(mDatabase, "Today", "", new Date(), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null); result = (id != -1); assertTrue(result); - card = db.getLoyaltyCard((int) id); + card = DBHelper.getLoyaltyCard(mDatabase, (int) id); assertEquals("Today", card.store); assertEquals("", card.note); assertTrue(card.expiry.before(new Date(new Date().getTime() + 86400))); @@ -175,11 +176,11 @@ public class ImportExportTest { // This will break after 19 January 2038 // If someone is still maintaining this code base by then: I love you - id = db.insertLoyaltyCard("Future", "", new Date(2147483648000L), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null); + id = DBHelper.insertLoyaltyCard(mDatabase, "Future", "", new Date(2147483648000L), new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, 0, 0, null); result = (id != -1); assertTrue(result); - card = db.getLoyaltyCard((int) id); + card = DBHelper.getLoyaltyCard(mDatabase, (int) id); assertEquals("Future", card.store); assertEquals("", card.note); assertTrue(card.expiry.after(new Date(new Date().getTime() + 86400))); @@ -191,19 +192,19 @@ public class ImportExportTest { assertEquals(Integer.valueOf(0), card.headerColor); assertEquals(0, card.starStatus); - assertEquals(4, db.getLoyaltyCardCount()); + assertEquals(4, DBHelper.getLoyaltyCardCount(mDatabase)); } private void addGroups(int groupsToAdd) { // Add in reverse order to test sorting for (int index = groupsToAdd; index > 0; index--) { String groupName = String.format("group, \"%4d", index); - long id = db.insertGroup(groupName); + long id = DBHelper.insertGroup(mDatabase, groupName); boolean result = (id != -1); assertTrue(result); } - assertEquals(groupsToAdd, db.getGroupCount()); + assertEquals(groupsToAdd, DBHelper.getGroupCount(mDatabase)); } /** @@ -212,7 +213,7 @@ public class ImportExportTest { * where the smallest card's index is 1 */ private void checkLoyaltyCards() { - Cursor cursor = db.getLoyaltyCardCursor(); + Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); int index = 1; while (cursor.moveToNext()) { @@ -243,7 +244,7 @@ public class ImportExportTest { * with starred ones first */ private void checkLoyaltyCardsFiveStarred() { - Cursor cursor = db.getLoyaltyCardCursor(); + Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); int index = 5; while (index < 10) { @@ -297,8 +298,8 @@ public class ImportExportTest { * where the smallest group's index is 1 */ private void checkGroups() { - Cursor cursor = db.getGroupCursor(); - int index = db.getGroupCount(); + Cursor cursor = DBHelper.getGroupCursor(mDatabase); + int index = DBHelper.getGroupCount(mDatabase); while (cursor.moveToNext()) { Group group = Group.toGroup(cursor); @@ -322,7 +323,7 @@ public class ImportExportTest { OutputStreamWriter outStream = new OutputStreamWriter(outData); // Export data to CSV format - ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima, null); + ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null); assertEquals(ImportExportResult.Success, result); outStream.close(); @@ -331,10 +332,10 @@ public class ImportExportTest { ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray()); // Import the CSV data - result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima, null); + result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, null); assertEquals(ImportExportResult.Success, result); - assertEquals(NUM_CARDS, db.getLoyaltyCardCount()); + assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase)); checkLoyaltyCards(); @@ -352,7 +353,7 @@ public class ImportExportTest { OutputStreamWriter outStream = new OutputStreamWriter(outData); // Export data to CSV format - ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima, password); + ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, password); assertEquals(ImportExportResult.Success, result); outStream.close(); @@ -361,10 +362,10 @@ public class ImportExportTest { ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray()); // Import the CSV data - result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima, password); + result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, password); assertEquals(ImportExportResult.Success, result); - assertEquals(NUM_CARDS, db.getLoyaltyCardCount()); + assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase)); checkLoyaltyCards(); @@ -384,7 +385,7 @@ public class ImportExportTest { OutputStreamWriter outStream = new OutputStreamWriter(outData); // Export data to CSV format - ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima, null); + ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null); assertEquals(ImportExportResult.Success, result); outStream.close(); @@ -393,10 +394,10 @@ public class ImportExportTest { ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray()); // Import the CSV data - result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima, null); + result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, null); assertEquals(ImportExportResult.Success, result); - assertEquals(NUM_CARDS, db.getLoyaltyCardCount()); + assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase)); checkLoyaltyCardsFiveStarred(); @@ -425,37 +426,37 @@ public class ImportExportTest { List emptyGroup = new ArrayList<>(); List groupsForOne = new ArrayList<>(); - groupsForOne.add(db.getGroup("group, \" 1")); + groupsForOne.add(DBHelper.getGroup(mDatabase, "group, \" 1")); List groupsForTwo = new ArrayList<>(); - groupsForTwo.add(db.getGroup("group, \" 1")); - groupsForTwo.add(db.getGroup("group, \" 2")); + groupsForTwo.add(DBHelper.getGroup(mDatabase, "group, \" 1")); + groupsForTwo.add(DBHelper.getGroup(mDatabase, "group, \" 2")); List groupsForThree = new ArrayList<>(); - groupsForThree.add(db.getGroup("group, \" 1")); - groupsForThree.add(db.getGroup("group, \" 2")); - groupsForThree.add(db.getGroup("group, \" 3")); + groupsForThree.add(DBHelper.getGroup(mDatabase, "group, \" 1")); + groupsForThree.add(DBHelper.getGroup(mDatabase, "group, \" 2")); + groupsForThree.add(DBHelper.getGroup(mDatabase, "group, \" 3")); List groupsForFour = new ArrayList<>(); - groupsForFour.add(db.getGroup("group, \" 1")); - groupsForFour.add(db.getGroup("group, \" 2")); - groupsForFour.add(db.getGroup("group, \" 3")); + groupsForFour.add(DBHelper.getGroup(mDatabase, "group, \" 1")); + groupsForFour.add(DBHelper.getGroup(mDatabase, "group, \" 2")); + groupsForFour.add(DBHelper.getGroup(mDatabase, "group, \" 3")); List groupsForFive = new ArrayList<>(); - groupsForFive.add(db.getGroup("group, \" 1")); - groupsForFive.add(db.getGroup("group, \" 3")); + groupsForFive.add(DBHelper.getGroup(mDatabase,"group, \" 1")); + groupsForFive.add(DBHelper.getGroup(mDatabase, "group, \" 3")); - db.setLoyaltyCardGroups(1, groupsForOne); - db.setLoyaltyCardGroups(2, groupsForTwo); - db.setLoyaltyCardGroups(3, groupsForThree); - db.setLoyaltyCardGroups(4, groupsForFour); - db.setLoyaltyCardGroups(5, groupsForFive); + DBHelper.setLoyaltyCardGroups(mDatabase, 1, groupsForOne); + DBHelper.setLoyaltyCardGroups(mDatabase, 2, groupsForTwo); + DBHelper.setLoyaltyCardGroups(mDatabase, 3, groupsForThree); + DBHelper.setLoyaltyCardGroups(mDatabase, 4, groupsForFour); + DBHelper.setLoyaltyCardGroups(mDatabase, 5, groupsForFive); ByteArrayOutputStream outData = new ByteArrayOutputStream(); OutputStreamWriter outStream = new OutputStreamWriter(outData); // Export data to CSV format - ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima, null); + ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null); assertEquals(ImportExportResult.Success, result); outStream.close(); @@ -464,25 +465,25 @@ public class ImportExportTest { ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray()); // Import the CSV data - result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima, null); + result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, null); assertEquals(ImportExportResult.Success, result); - assertEquals(NUM_CARDS, db.getLoyaltyCardCount()); - assertEquals(NUM_GROUPS, db.getGroupCount()); + assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase)); + assertEquals(NUM_GROUPS, DBHelper.getGroupCount(mDatabase)); checkLoyaltyCards(); checkGroups(); - assertEquals(groupsToGroupNames(groupsForOne), groupsToGroupNames(db.getLoyaltyCardGroups(1))); - assertEquals(groupsToGroupNames(groupsForTwo), groupsToGroupNames(db.getLoyaltyCardGroups(2))); - assertEquals(groupsToGroupNames(groupsForThree), groupsToGroupNames(db.getLoyaltyCardGroups(3))); - assertEquals(groupsToGroupNames(groupsForFour), groupsToGroupNames(db.getLoyaltyCardGroups(4))); - assertEquals(groupsToGroupNames(groupsForFive), groupsToGroupNames(db.getLoyaltyCardGroups(5))); - assertEquals(emptyGroup, db.getLoyaltyCardGroups(6)); - assertEquals(emptyGroup, db.getLoyaltyCardGroups(7)); - assertEquals(emptyGroup, db.getLoyaltyCardGroups(8)); - assertEquals(emptyGroup, db.getLoyaltyCardGroups(9)); - assertEquals(emptyGroup, db.getLoyaltyCardGroups(10)); + assertEquals(groupsToGroupNames(groupsForOne), groupsToGroupNames(DBHelper.getLoyaltyCardGroups(mDatabase, 1))); + assertEquals(groupsToGroupNames(groupsForTwo), groupsToGroupNames(DBHelper.getLoyaltyCardGroups(mDatabase, 2))); + assertEquals(groupsToGroupNames(groupsForThree), groupsToGroupNames(DBHelper.getLoyaltyCardGroups(mDatabase, 3))); + assertEquals(groupsToGroupNames(groupsForFour), groupsToGroupNames(DBHelper.getLoyaltyCardGroups(mDatabase, 4))); + assertEquals(groupsToGroupNames(groupsForFive), groupsToGroupNames(DBHelper.getLoyaltyCardGroups(mDatabase, 5))); + assertEquals(emptyGroup, DBHelper.getLoyaltyCardGroups(mDatabase, 6)); + assertEquals(emptyGroup, DBHelper.getLoyaltyCardGroups(mDatabase, 7)); + assertEquals(emptyGroup, DBHelper.getLoyaltyCardGroups(mDatabase, 8)); + assertEquals(emptyGroup, DBHelper.getLoyaltyCardGroups(mDatabase, 9)); + assertEquals(emptyGroup, DBHelper.getLoyaltyCardGroups(mDatabase, 10)); // Clear the database for the next format under test TestHelpers.getEmptyDb(activity); @@ -498,17 +499,17 @@ public class ImportExportTest { OutputStreamWriter outStream = new OutputStreamWriter(outData); // Export into CSV data - ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima, null); + ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null); assertEquals(ImportExportResult.Success, result); outStream.close(); ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray()); // Import the CSV data on top of the existing database - result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima, null); + result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, null); assertEquals(ImportExportResult.Success, result); - assertEquals(NUM_CARDS, db.getLoyaltyCardCount()); + assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase)); checkLoyaltyCards(); @@ -527,7 +528,7 @@ public class ImportExportTest { OutputStreamWriter outStream = new OutputStreamWriter(outData); // Export data to CSV format - ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima, null); + ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null); assertEquals(ImportExportResult.Success, result); TestHelpers.getEmptyDb(activity); @@ -541,10 +542,10 @@ public class ImportExportTest { ByteArrayInputStream inData = new ByteArrayInputStream((outData.toString() + corruptEntry).getBytes()); // Attempt to import the data - result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, format, null); + result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, format, null); assertEquals(ImportExportResult.GenericFailure, result); - assertEquals(0, db.getLoyaltyCardCount()); + assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); TestHelpers.getEmptyDb(activity); } @@ -608,7 +609,7 @@ public class ImportExportTest { assertNotNull(listener.result); assertEquals(ImportExportResult.Success, listener.result); - assertEquals(NUM_CARDS, db.getLoyaltyCardCount()); + assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase)); checkLoyaltyCards(); @@ -631,11 +632,11 @@ public class ImportExportTest { ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); // Import the CSV data - ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); assertEquals(ImportExportResult.Success, result); - assertEquals(1, db.getLoyaltyCardCount()); + assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard card = db.getLoyaltyCard(1); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); assertEquals("store", card.store); assertEquals("note", card.note); @@ -668,11 +669,11 @@ public class ImportExportTest { ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); // Import the CSV data - ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); assertEquals(ImportExportResult.Success, result); - assertEquals(1, db.getLoyaltyCardCount()); + assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard card = db.getLoyaltyCard(1); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); assertEquals("store", card.store); assertEquals("note", card.note); @@ -705,9 +706,9 @@ public class ImportExportTest { ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); // Import the CSV data - ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); assertEquals(ImportExportResult.GenericFailure, result); - assertEquals(0, db.getLoyaltyCardCount()); + assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); TestHelpers.getEmptyDb(activity); } @@ -729,11 +730,11 @@ public class ImportExportTest { ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); // Import the CSV data - ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); assertEquals(ImportExportResult.Success, result); - assertEquals(1, db.getLoyaltyCardCount()); + assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard card = db.getLoyaltyCard(1); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); assertEquals("store", card.store); assertEquals("note", card.note); @@ -766,11 +767,11 @@ public class ImportExportTest { ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); // Import the CSV data - ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); assertEquals(ImportExportResult.Success, result); - assertEquals(1, db.getLoyaltyCardCount()); + assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard card = db.getLoyaltyCard(1); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); assertEquals("store", card.store); assertEquals("note", card.note); @@ -803,11 +804,11 @@ public class ImportExportTest { ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); // Import the CSV data - ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); assertEquals(ImportExportResult.Success, result); - assertEquals(1, db.getLoyaltyCardCount()); + assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard card = db.getLoyaltyCard(1); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); assertEquals("store", card.store); assertEquals("note", card.note); @@ -840,9 +841,9 @@ public class ImportExportTest { ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); // Import the CSV data - ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); assertEquals(ImportExportResult.Success, result); - assertEquals(1, db.getLoyaltyCardCount()); + assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); csvText = ""; csvText += DBHelper.LoyaltyCardDbIds.ID + "," + @@ -859,11 +860,11 @@ public class ImportExportTest { inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); // Import the CSV data - result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null); + result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); assertEquals(ImportExportResult.Success, result); - assertEquals(1, db.getLoyaltyCardCount()); + assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard card = db.getLoyaltyCard(1); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); assertEquals("store", card.store); assertEquals("note", card.note); @@ -896,11 +897,11 @@ public class ImportExportTest { HashMap loyaltyCardIconImages = new HashMap<>(); // Create card 1 - int loyaltyCardId = (int) db.insertLoyaltyCard("Card 1", "Note 1", new Date(1618053234), new BigDecimal("100"), Currency.getInstance("USD"), "1234", "5432", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), 1, 0, null); - loyaltyCardHashMap.put(loyaltyCardId, db.getLoyaltyCard(loyaltyCardId)); - db.insertGroup("One"); - List groups = Arrays.asList(db.getGroup("One")); - db.setLoyaltyCardGroups(loyaltyCardId, groups); + int loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, "Card 1", "Note 1", new Date(1618053234), new BigDecimal("100"), Currency.getInstance("USD"), "1234", "5432", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), 1, 0, null); + loyaltyCardHashMap.put(loyaltyCardId, DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId)); + DBHelper.insertGroup(mDatabase, "One"); + List groups = Arrays.asList(DBHelper.getGroup(mDatabase, "One")); + DBHelper.setLoyaltyCardGroups(mDatabase, loyaltyCardId, groups); loyaltyCardGroups.put(loyaltyCardId, groups); Utils.saveCardImage(activity.getApplicationContext(), launcherBitmap, loyaltyCardId, ImageLocationType.front); Utils.saveCardImage(activity.getApplicationContext(), roundLauncherBitmap, loyaltyCardId, ImageLocationType.back); @@ -910,26 +911,26 @@ public class ImportExportTest { loyaltyCardIconImages.put(loyaltyCardId, launcherBitmap); // Create card 2 - loyaltyCardId = (int) db.insertLoyaltyCard("Card 2", "", null, new BigDecimal(0), null, "123456", null, null, 2, 1, null); - loyaltyCardHashMap.put(loyaltyCardId, db.getLoyaltyCard(loyaltyCardId)); + loyaltyCardId = (int) DBHelper.insertLoyaltyCard(mDatabase, "Card 2", "", null, new BigDecimal(0), null, "123456", null, null, 2, 1, null); + loyaltyCardHashMap.put(loyaltyCardId, DBHelper.getLoyaltyCard(mDatabase, loyaltyCardId)); // Export everything ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - MultiFormatExporter.exportData(activity.getApplicationContext(), db, outputStream, DataFormat.Catima, null); + MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outputStream, DataFormat.Catima, null); // Wipe database TestHelpers.getEmptyDb(activity); // Import everything - MultiFormatImporter.importData(activity.getApplicationContext(), db, new ByteArrayInputStream(outputStream.toByteArray()), DataFormat.Catima, null); + MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, new ByteArrayInputStream(outputStream.toByteArray()), DataFormat.Catima, null); // Ensure everything is there - assertEquals(loyaltyCardHashMap.size(), db.getLoyaltyCardCount()); + assertEquals(loyaltyCardHashMap.size(), DBHelper.getLoyaltyCardCount(mDatabase)); for (Integer loyaltyCardID : loyaltyCardHashMap.keySet()) { LoyaltyCard loyaltyCard = loyaltyCardHashMap.get(loyaltyCardID); - LoyaltyCard dbLoyaltyCard = db.getLoyaltyCard(loyaltyCardID); + LoyaltyCard dbLoyaltyCard = DBHelper.getLoyaltyCard(mDatabase, loyaltyCardID); assertEquals(loyaltyCard.id, dbLoyaltyCard.id); assertEquals(loyaltyCard.store, dbLoyaltyCard.store); @@ -954,7 +955,8 @@ public class ImportExportTest { ) ), groupsToGroupNames( - db.getLoyaltyCardGroups( + DBHelper.getLoyaltyCardGroups( + mDatabase, loyaltyCardID ) ) @@ -1017,29 +1019,29 @@ public class ImportExportTest { ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); // Import the CSV data - ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); assertEquals(ImportExportResult.Success, result); - assertEquals(7, db.getLoyaltyCardCount()); - assertEquals(3, db.getGroupCount()); + assertEquals(7, DBHelper.getLoyaltyCardCount(mDatabase)); + assertEquals(3, DBHelper.getGroupCount(mDatabase)); // Check all groups - Group healthGroup = db.getGroup("Health"); + Group healthGroup = DBHelper.getGroup(mDatabase, "Health"); assertNotNull(healthGroup); - assertEquals(1, db.getGroupCardCount("Health")); - assertEquals(Arrays.asList(4), db.getGroupCardIds("Health")); + assertEquals(1, DBHelper.getGroupCardCount(mDatabase, "Health")); + assertEquals(Arrays.asList(4), DBHelper.getGroupCardIds(mDatabase, "Health")); - Group foodGroup = db.getGroup("Food"); + Group foodGroup = DBHelper.getGroup(mDatabase, "Food"); assertNotNull(foodGroup); - assertEquals(2, db.getGroupCardCount("Food")); - assertEquals(Arrays.asList(3, 5), db.getGroupCardIds("Food")); + assertEquals(2, DBHelper.getGroupCardCount(mDatabase, "Food")); + assertEquals(Arrays.asList(3, 5), DBHelper.getGroupCardIds(mDatabase, "Food")); - Group fashionGroup = db.getGroup("Fashion"); + Group fashionGroup = DBHelper.getGroup(mDatabase, "Fashion"); assertNotNull(fashionGroup); - assertEquals(2, db.getGroupCardCount("Fashion")); - assertEquals(Arrays.asList(8, 6), db.getGroupCardIds("Fashion")); + assertEquals(2, DBHelper.getGroupCardCount(mDatabase, "Fashion")); + assertEquals(Arrays.asList(8, 6), DBHelper.getGroupCardIds(mDatabase, "Fashion")); // Check all cards - LoyaltyCard card1 = db.getLoyaltyCard(1); + LoyaltyCard card1 = DBHelper.getLoyaltyCard(mDatabase, 1); assertEquals("Card 1", card1.store); assertEquals("Note 1", card1.note); @@ -1055,7 +1057,7 @@ public class ImportExportTest { assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card1.id, ImageLocationType.back)); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card1.id, ImageLocationType.icon)); - LoyaltyCard card8 = db.getLoyaltyCard(8); + LoyaltyCard card8 = DBHelper.getLoyaltyCard(mDatabase, 8); assertEquals("Clothes Store", card8.store); assertEquals("Note about store", card8.note); @@ -1071,7 +1073,7 @@ public class ImportExportTest { assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card8.id, ImageLocationType.back)); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card8.id, ImageLocationType.icon)); - LoyaltyCard card2 = db.getLoyaltyCard(2); + LoyaltyCard card2 = DBHelper.getLoyaltyCard(mDatabase, 2); assertEquals("Department Store", card2.store); assertEquals("", card2.note); @@ -1087,7 +1089,7 @@ public class ImportExportTest { assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card2.id, ImageLocationType.back)); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card2.id, ImageLocationType.icon)); - LoyaltyCard card3 = db.getLoyaltyCard(3); + LoyaltyCard card3 = DBHelper.getLoyaltyCard(mDatabase, 3); assertEquals("Grocery Store", card3.store); assertEquals("Multiline note about grocery store\n\nwith blank line", card3.note); @@ -1103,7 +1105,7 @@ public class ImportExportTest { assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card3.id, ImageLocationType.back)); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card3.id, ImageLocationType.icon)); - LoyaltyCard card4 = db.getLoyaltyCard(4); + LoyaltyCard card4 = DBHelper.getLoyaltyCard(mDatabase, 4); assertEquals("Pharmacy", card4.store); assertEquals("", card4.note); @@ -1119,7 +1121,7 @@ public class ImportExportTest { assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card4.id, ImageLocationType.back)); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card4.id, ImageLocationType.icon)); - LoyaltyCard card5 = db.getLoyaltyCard(5); + LoyaltyCard card5 = DBHelper.getLoyaltyCard(mDatabase, 5); assertEquals("Restaurant", card5.store); assertEquals("Note about restaurant here", card5.note); @@ -1135,7 +1137,7 @@ public class ImportExportTest { assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card5.id, ImageLocationType.back)); assertEquals(null, Utils.retrieveCardImage(activity.getApplicationContext(), card5.id, ImageLocationType.icon)); - LoyaltyCard card6 = db.getLoyaltyCard(6); + LoyaltyCard card6 = DBHelper.getLoyaltyCard(mDatabase, 6); assertEquals("Shoe Store", card6.store); assertEquals("", card6.note); @@ -1159,11 +1161,11 @@ public class ImportExportTest { InputStream inputStream = getClass().getResourceAsStream("fidme.zip"); // Import the Fidme data - ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Fidme, null); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Fidme, null); assertEquals(ImportExportResult.Success, result); - assertEquals(3, db.getLoyaltyCardCount()); + assertEquals(3, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard card = db.getLoyaltyCard(1); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); assertEquals("Hema", card.store); assertEquals("2021-03-24 18:35:08 UTC", card.note); @@ -1175,7 +1177,7 @@ public class ImportExportTest { assertEquals(null, card.barcodeType); assertEquals(0, card.starStatus); - card = db.getLoyaltyCard(2); + card = DBHelper.getLoyaltyCard(mDatabase, 2); assertEquals("test", card.store); assertEquals("Test\n2021-03-24 18:34:19 UTC", card.note); @@ -1187,7 +1189,7 @@ public class ImportExportTest { assertEquals(null, card.barcodeType); assertEquals(0, card.starStatus); - card = db.getLoyaltyCard(3); + card = DBHelper.getLoyaltyCard(mDatabase, 3); assertEquals("Albert Heijn", card.store); assertEquals("Bonus Kaart\n2021-03-24 16:47:47 UTC\nFirst Last", card.note); @@ -1207,17 +1209,17 @@ public class ImportExportTest { InputStream inputStream = getClass().getResourceAsStream("stocard.zip"); // Import the Stocard data - ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Stocard, null); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Stocard, null); assertEquals(ImportExportResult.BadPassword, result); - assertEquals(0, db.getLoyaltyCardCount()); + assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); inputStream = getClass().getResourceAsStream("stocard.zip"); - result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Stocard, "da811b40a4dac56f0cbb2d99b21bbb9a".toCharArray()); + result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Stocard, "da811b40a4dac56f0cbb2d99b21bbb9a".toCharArray()); assertEquals(ImportExportResult.Success, result); - assertEquals(3, db.getLoyaltyCardCount()); + assertEquals(3, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard card = db.getLoyaltyCard(1); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); assertEquals("GAMMA", card.store); assertEquals("", card.note); @@ -1233,7 +1235,7 @@ public class ImportExportTest { assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 1, ImageLocationType.back)); assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 1, ImageLocationType.icon)); - card = db.getLoyaltyCard(2); + card = DBHelper.getLoyaltyCard(mDatabase, 2); assertEquals("Air Miles", card.store); assertEquals("szjsbs", card.note); @@ -1249,7 +1251,7 @@ public class ImportExportTest { assertTrue(BitmapFactory.decodeStream(getClass().getResourceAsStream("stocard-back.jpg")).sameAs(Utils.retrieveCardImage(activity.getApplicationContext(), 2, ImageLocationType.back))); assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 2, ImageLocationType.icon)); - card = db.getLoyaltyCard(3); + card = DBHelper.getLoyaltyCard(mDatabase, 3); // I don't think we can know this one, but falling back to an unique store name is at least something assertEquals("63536738-d64b-48ae-aeb8-82761523fa67", card.store); @@ -1299,11 +1301,11 @@ public class ImportExportTest { ByteArrayInputStream inputStream = new ByteArrayInputStream(jsonText.getBytes(StandardCharsets.UTF_8)); // Import the Voucher Vault data - ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.VoucherVault, null); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.VoucherVault, null); assertEquals(ImportExportResult.Success, result); - assertEquals(2, db.getLoyaltyCardCount()); + assertEquals(2, DBHelper.getLoyaltyCardCount(mDatabase)); - LoyaltyCard card = db.getLoyaltyCard(1); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); assertEquals("Clothes Store", card.store); assertEquals("", card.note); @@ -1316,7 +1318,7 @@ public class ImportExportTest { assertEquals(Color.GRAY, (long) card.headerColor); assertEquals(0, card.starStatus); - card = db.getLoyaltyCard(2); + card = DBHelper.getLoyaltyCard(mDatabase, 2); assertEquals("Department Store", card.store); assertEquals("", card.note); diff --git a/app/src/test/java/protect/card_locker/ImportURITest.java b/app/src/test/java/protect/card_locker/ImportURITest.java index d282d3036..6ae7dfa97 100644 --- a/app/src/test/java/protect/card_locker/ImportURITest.java +++ b/app/src/test/java/protect/card_locker/ImportURITest.java @@ -1,6 +1,7 @@ package protect.card_locker; import android.app.Activity; +import android.database.sqlite.SQLiteDatabase; import android.graphics.Color; import android.net.Uri; @@ -27,13 +28,13 @@ import static org.junit.Assert.assertTrue; @Config(sdk = 23) public class ImportURITest { private ImportURIHelper importURIHelper; - private DBHelper db; + private SQLiteDatabase mDatabase; @Before public void setUp() { Activity activity = Robolectric.setupActivity(MainActivity.class); importURIHelper = new ImportURIHelper(activity); - db = TestHelpers.getEmptyDb(activity); + mDatabase = TestHelpers.getEmptyDb(activity).getWritableDatabase(); } @Test @@ -41,10 +42,10 @@ public class ImportURITest { // Generate card Date date = new Date(); - db.insertLoyaltyCard("store", "This note contains evil symbols like & and = that will break the parser if not escaped right $#!%()*+;:á", date, new BigDecimal("100"), null, BarcodeFormat.UPC_E.toString(), BarcodeFormat.UPC_A.toString(), CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), Color.BLACK, 1, null); + DBHelper.insertLoyaltyCard(mDatabase, "store", "This note contains evil symbols like & and = that will break the parser if not escaped right $#!%()*+;:á", date, new BigDecimal("100"), null, BarcodeFormat.UPC_E.toString(), BarcodeFormat.UPC_A.toString(), CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), Color.BLACK, 1, null); // Get card - LoyaltyCard card = db.getLoyaltyCard(1); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); // Card to URI Uri cardUri = importURIHelper.toUri(card); @@ -69,10 +70,10 @@ public class ImportURITest { @Test public void ensureNoCrashOnMissingHeaderFields() throws InvalidObjectException, UnsupportedEncodingException { // Generate card - db.insertLoyaltyCard("store", "note", null, new BigDecimal("10.00"), Currency.getInstance("EUR"), BarcodeFormat.UPC_A.toString(), null, CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), null, 0, null); + DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("10.00"), Currency.getInstance("EUR"), BarcodeFormat.UPC_A.toString(), null, CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE), null, 0, null); // Get card - LoyaltyCard card = db.getLoyaltyCard(1); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); // Card to URI Uri cardUri = importURIHelper.toUri(card); diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java index 1053aeeaf..9aec4ade8 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java @@ -4,6 +4,7 @@ import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; import android.graphics.Color; import android.view.View; import android.widget.ImageView; @@ -24,7 +25,11 @@ import java.text.DateFormat; import java.util.Currency; import java.util.Date; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.constraintlayout.widget.ConstraintSet; +import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.preference.PreferenceManager; + import protect.card_locker.preferences.Settings; import static org.junit.Assert.assertEquals; @@ -35,7 +40,7 @@ import static org.junit.Assert.assertTrue; @Config(sdk = 23) public class LoyaltyCardCursorAdapterTest { private Activity activity; - private DBHelper db; + private SQLiteDatabase mDatabase; private SharedPreferences settings; @Before @@ -43,7 +48,7 @@ public class LoyaltyCardCursorAdapterTest { ShadowLog.stream = System.out; activity = Robolectric.setupActivity(MainActivity.class); - db = TestHelpers.getEmptyDb(activity); + mDatabase = TestHelpers.getEmptyDb(activity).getWritableDatabase(); settings = PreferenceManager.getDefaultSharedPreferences(activity); } @@ -104,10 +109,10 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapterEmptyNote() { - db.insertLoyaltyCard("store", "", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); - LoyaltyCard card = db.getLoyaltyCard(1); + DBHelper.insertLoyaltyCard(mDatabase, "store", "", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); - Cursor cursor = db.getLoyaltyCardCursor(); + Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); cursor.moveToFirst(); View view = createView(cursor); @@ -119,10 +124,10 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapterWithNote() { - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); - LoyaltyCard card = db.getLoyaltyCard(1); + DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); - Cursor cursor = db.getLoyaltyCardCursor(); + Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); cursor.moveToFirst(); View view = createView(cursor); @@ -134,14 +139,13 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapterFontSizes() { - final Context context = activity.getApplicationContext(); Date expiryDate = new Date(); String dateString = DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate); - db.insertLoyaltyCard("store", "note", expiryDate, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); - LoyaltyCard card = db.getLoyaltyCard(1); + DBHelper.insertLoyaltyCard(mDatabase, "store", "note", expiryDate, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); - Cursor cursor = db.getLoyaltyCardCursor(); + Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); cursor.moveToFirst(); setFontScale(50); @@ -158,13 +162,13 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapterStarring() { - assertNotEquals(-1, db.insertLoyaltyCard("storeA", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null)); - assertNotEquals(-1, db.insertLoyaltyCard("storeB", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null)); - assertNotEquals(-1, db.insertLoyaltyCard("storeC", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null)); + assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeA", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null)); + assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeB", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null)); + assertNotEquals(-1, DBHelper.insertLoyaltyCard(mDatabase, "storeC", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null)); - assertEquals(3, db.getLoyaltyCardCount()); + assertEquals(3, DBHelper.getLoyaltyCardCount(mDatabase)); - Cursor cursor = db.getLoyaltyCardCursor(); + Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); assertEquals(3, cursor.getCount()); cursor.moveToFirst(); @@ -178,7 +182,7 @@ public class LoyaltyCardCursorAdapterTest { LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(cursor); assertEquals("storeB", loyaltyCard.store); View view = createView(cursor); - ImageView star = view.findViewById(R.id.star); + ConstraintLayout star = view.findViewById(R.id.star); assertEquals(View.VISIBLE, star.getVisibility()); assertTrue(cursor.moveToNext()); @@ -200,10 +204,10 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapter0Points() { - db.insertLoyaltyCard("store", "", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); - LoyaltyCard card = db.getLoyaltyCard(1); + DBHelper.insertLoyaltyCard(mDatabase, "store", "", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); - Cursor cursor = db.getLoyaltyCardCursor(); + Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); cursor.moveToFirst(); View view = createView(cursor); @@ -215,10 +219,10 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapter0EUR() { - db.insertLoyaltyCard("store", "", null, new BigDecimal("0"), Currency.getInstance("EUR"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); - LoyaltyCard card = db.getLoyaltyCard(1); + DBHelper.insertLoyaltyCard(mDatabase,"store", "", null, new BigDecimal("0"), Currency.getInstance("EUR"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); - Cursor cursor = db.getLoyaltyCardCursor(); + Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); cursor.moveToFirst(); View view = createView(cursor); @@ -230,10 +234,10 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapter100Points() { - db.insertLoyaltyCard("store", "note", null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); - LoyaltyCard card = db.getLoyaltyCard(1); + DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("100"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); - Cursor cursor = db.getLoyaltyCardCursor(); + Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); cursor.moveToFirst(); View view = createView(cursor); @@ -245,10 +249,10 @@ public class LoyaltyCardCursorAdapterTest { @Test public void TestCursorAdapter10USD() { - db.insertLoyaltyCard("store", "note", null, new BigDecimal("10.00"), Currency.getInstance("USD"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); - LoyaltyCard card = db.getLoyaltyCard(1); + DBHelper.insertLoyaltyCard(mDatabase, "store", "note", null, new BigDecimal("10.00"), Currency.getInstance("USD"), "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); + LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); - Cursor cursor = db.getLoyaltyCardCursor(); + Cursor cursor = DBHelper.getLoyaltyCardCursor(mDatabase); cursor.moveToFirst(); View view = createView(cursor); diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java index 0a48f0c2a..16829faf7 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java @@ -9,6 +9,7 @@ import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; @@ -127,11 +128,11 @@ public class LoyaltyCardViewActivityTest { final String barcodeId, final String barcodeType, boolean creatingNewCard) throws ParseException { - DBHelper db = new DBHelper(activity); + SQLiteDatabase database = new DBHelper(activity).getWritableDatabase(); if (creatingNewCard) { - assertEquals(0, db.getLoyaltyCardCount()); + assertEquals(0, DBHelper.getLoyaltyCardCount(database)); } else { - assertEquals(1, db.getLoyaltyCardCount()); + assertEquals(1, DBHelper.getLoyaltyCardCount(database)); } final EditText storeField = activity.findViewById(R.id.storeNameEdit); @@ -156,9 +157,9 @@ public class LoyaltyCardViewActivityTest { activity.findViewById(R.id.fabSave).performClick(); assertEquals(true, activity.isFinishing()); - assertEquals(1, db.getLoyaltyCardCount()); + assertEquals(1, DBHelper.getLoyaltyCardCount(database)); - LoyaltyCard card = db.getLoyaltyCard(1); + LoyaltyCard card = DBHelper.getLoyaltyCard(database, 1); assertEquals(store, card.store); assertEquals(note, card.note); assertEquals(balance, card.balance); @@ -193,7 +194,7 @@ public class LoyaltyCardViewActivityTest { } assertNotNull(card.headerColor); - db.close(); + database.close(); } /** @@ -333,10 +334,10 @@ public class LoyaltyCardViewActivityTest { LoyaltyCardEditActivity activity = (LoyaltyCardEditActivity) activityController.get(); final Context context = activity.getApplicationContext(); - DBHelper db = TestHelpers.getEmptyDb(activity); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); if (!newCard) { - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); } activityController.start(); @@ -430,24 +431,24 @@ public class LoyaltyCardViewActivityTest { Activity activity = (Activity) activityController.get(); - DBHelper db = TestHelpers.getEmptyDb(activity); - assertEquals(0, db.getLoyaltyCardCount()); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); + assertEquals(0, DBHelper.getLoyaltyCardCount(database)); final EditText storeField = activity.findViewById(R.id.storeNameEdit); final EditText noteField = activity.findViewById(R.id.noteEdit); activity.findViewById(R.id.fabSave).performClick(); - assertEquals(0, db.getLoyaltyCardCount()); + assertEquals(0, DBHelper.getLoyaltyCardCount(database)); storeField.setText("store"); activity.findViewById(R.id.fabSave).performClick(); - assertEquals(0, db.getLoyaltyCardCount()); + assertEquals(0, DBHelper.getLoyaltyCardCount(database)); noteField.setText("note"); activity.findViewById(R.id.fabSave).performClick(); - assertEquals(0, db.getLoyaltyCardCount()); + assertEquals(0, DBHelper.getLoyaltyCardCount(database)); - db.close(); + database.close(); } @Test @@ -570,9 +571,9 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - DBHelper db = TestHelpers.getEmptyDb(activity); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -580,7 +581,7 @@ public class LoyaltyCardViewActivityTest { checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null); - db.close(); + database.close(); } @Test @@ -588,9 +589,9 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(false); Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - DBHelper db = TestHelpers.getEmptyDb(activity); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -598,7 +599,7 @@ public class LoyaltyCardViewActivityTest { checkAllFields(activity, ViewMode.VIEW_CARD, "store", "note", null, "0", context.getString(R.string.points), BARCODE_DATA, null, BARCODE_TYPE.toString(), null, null); - db.close(); + database.close(); } @Test @@ -606,9 +607,9 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - DBHelper db = TestHelpers.getEmptyDb(activity); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -622,7 +623,7 @@ public class LoyaltyCardViewActivityTest { checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), BARCODE_TYPE.prettyName(), null, null); - db.close(); + database.close(); } @Test @@ -630,9 +631,9 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); LoyaltyCardEditActivity activity = (LoyaltyCardEditActivity) activityController.get(); final Context context = activity.getApplicationContext(); - DBHelper db = TestHelpers.getEmptyDb(activity); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -660,7 +661,7 @@ public class LoyaltyCardViewActivityTest { assertEquals(false, activity.hasChanged); assertEquals(true, activity.isFinishing()); - db.close(); + database.close(); } @Test @@ -668,9 +669,9 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - DBHelper db = TestHelpers.getEmptyDb(activity); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -692,7 +693,7 @@ public class LoyaltyCardViewActivityTest { checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); - db.close(); + database.close(); } @Test @@ -700,9 +701,9 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - DBHelper db = TestHelpers.getEmptyDb(activity); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - db.insertLoyaltyCard("store", "note", new Date(), new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); + DBHelper.insertLoyaltyCard(database, "store", "note", new Date(), new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -716,7 +717,7 @@ public class LoyaltyCardViewActivityTest { checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); - db.close(); + database.close(); } @Test @@ -724,9 +725,9 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - DBHelper db = TestHelpers.getEmptyDb(activity); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -763,7 +764,7 @@ public class LoyaltyCardViewActivityTest { checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", DateFormat.getDateInstance(DateFormat.LONG).format(new Date()), "10.00", "€", EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE.toString(), null, null); - db.close(); + database.close(); } }); balanceField.clearFocus(); @@ -774,9 +775,9 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - DBHelper db = TestHelpers.getEmptyDb(activity); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("10.00"), Currency.getInstance("USD"), EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("10.00"), Currency.getInstance("USD"), EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -806,7 +807,7 @@ public class LoyaltyCardViewActivityTest { checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", "₩", EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); - db.close(); + database.close(); } @Test @@ -814,9 +815,9 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - DBHelper db = TestHelpers.getEmptyDb(activity); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -837,7 +838,7 @@ public class LoyaltyCardViewActivityTest { checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE.prettyName(), null, null); - db.close(); + database.close(); } @Test @@ -845,9 +846,9 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - DBHelper db = TestHelpers.getEmptyDb(activity); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -870,7 +871,7 @@ public class LoyaltyCardViewActivityTest { checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), "123456", context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); - db.close(); + database.close(); } @Test @@ -878,9 +879,9 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - DBHelper db = TestHelpers.getEmptyDb(activity); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -906,7 +907,7 @@ public class LoyaltyCardViewActivityTest { checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), "654321", context.getString(R.string.sameAsCardId), EAN_BARCODE_TYPE.prettyName(), null, null); - db.close(); + database.close(); } @Test @@ -914,9 +915,9 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - DBHelper db = TestHelpers.getEmptyDb(activity); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -942,16 +943,16 @@ public class LoyaltyCardViewActivityTest { checkAllFields(activity, ViewMode.UPDATE_CARD, "store", "note", context.getString(R.string.never), "0", context.getString(R.string.points), "654321", "123456", EAN_BARCODE_TYPE.prettyName(), null, null); - db.close(); + database.close(); } @Test public void checkMenu() throws IOException { ActivityController activityController = createActivityWithLoyaltyCard(false); Activity activity = (Activity) activityController.get(); - DBHelper db = TestHelpers.getEmptyDb(activity); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -969,7 +970,7 @@ public class LoyaltyCardViewActivityTest { assertEquals("Share", menu.findItem(R.id.action_share).getTitle().toString()); assertEquals("Add to favorites", menu.findItem(R.id.action_star_unstar).getTitle().toString()); - db.close(); + database.close(); } @Test @@ -996,8 +997,8 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(false); Activity activity = (Activity) activityController.get(); - DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -1007,7 +1008,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(activity).clickMenuItem(android.R.id.home); assertEquals(true, activity.isFinishing()); - db.close(); + database.close(); } @Test @@ -1015,8 +1016,8 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(false); Activity activity = (Activity) activityController.get(); - DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null); activityController.start(); activityController.visible(); @@ -1026,7 +1027,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(activity).clickMenuItem(android.R.id.home); assertEquals(true, activity.isFinishing()); - db.close(); + database.close(); } @Test @@ -1034,8 +1035,8 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity) activityController.get(); - DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, null, 0, null); activityController.start(); activityController.visible(); @@ -1044,7 +1045,7 @@ public class LoyaltyCardViewActivityTest { // Save and check the loyalty card saveLoyaltyCardWithArguments(activity, "store", "note", activity.getApplicationContext().getString(R.string.never), new BigDecimal("0"), activity.getApplicationContext().getString(R.string.points), BARCODE_DATA, activity.getApplicationContext().getString(R.string.sameAsCardId), BARCODE_TYPE.name(), false); - db.close(); + database.close(); } @Test @@ -1052,8 +1053,8 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity) activityController.get(); - DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -1062,7 +1063,7 @@ public class LoyaltyCardViewActivityTest { // Save and check the loyalty card saveLoyaltyCardWithArguments(activity, "store", "note", activity.getApplicationContext().getString(R.string.never), new BigDecimal("0"), activity.getApplicationContext().getString(R.string.points), BARCODE_DATA, activity.getApplicationContext().getString(R.string.sameAsCardId), activity.getApplicationContext().getString(R.string.noBarcode), false); - db.close(); + database.close(); } @Test @@ -1070,9 +1071,9 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(true); Activity activity = (Activity) activityController.get(); final Context context = activity.getApplicationContext(); - DBHelper db = TestHelpers.getEmptyDb(activity); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -1092,7 +1093,7 @@ public class LoyaltyCardViewActivityTest { // Check if the special NO_BARCODE string doesn't get saved saveLoyaltyCardWithArguments(activity, "store", "note", context.getString(R.string.never), new BigDecimal("0"), context.getString(R.string.points), BARCODE_DATA, context.getString(R.string.sameAsCardId), context.getString(R.string.noBarcode), false); - db.close(); + database.close(); } @Test @@ -1100,8 +1101,8 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(false); Activity activity = (Activity) activityController.get(); - DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); final int LARGE_FONT_SIZE = 40; @@ -1126,7 +1127,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(activity).clickMenuItem(android.R.id.home); assertEquals(true, activity.isFinishing()); - db.close(); + database.close(); } @Test @@ -1135,8 +1136,8 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(false); Activity activity = (Activity) activityController.get(); - DBHelper db = new DBHelper(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); + SQLiteDatabase database = new DBHelper(activity).getWritableDatabase(); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(activity); settings.edit() @@ -1159,7 +1160,7 @@ public class LoyaltyCardViewActivityTest { assertEquals(title, activity.getString(R.string.lockScreen)); } - db.close(); + database.close(); } } @@ -1168,8 +1169,8 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(false); Activity activity = (Activity) activityController.get(); - DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); activityController.resume(); @@ -1194,7 +1195,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); assertEquals("Add to favorites", menu.findItem(R.id.action_star_unstar).getTitle().toString()); - db.close(); + database.close(); } @Test @@ -1202,8 +1203,8 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(false); Activity activity = (Activity) activityController.get(); - DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -1299,7 +1300,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); assertEquals(true, activity.isFinishing()); - db.close(); + database.close(); } @Test @@ -1307,8 +1308,8 @@ public class LoyaltyCardViewActivityTest { ActivityController activityController = createActivityWithLoyaltyCard(false); Activity activity = (Activity) activityController.get(); - DBHelper db = TestHelpers.getEmptyDb(activity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null); + SQLiteDatabase database = TestHelpers.getEmptyDb(activity).getWritableDatabase(); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, BARCODE_DATA, null, null, Color.BLACK, 0, null); activityController.start(); activityController.visible(); @@ -1342,7 +1343,7 @@ public class LoyaltyCardViewActivityTest { shadowOf(getMainLooper()).idle(); assertEquals(true, activity.isFinishing()); - db.close(); + database.close(); } @Test diff --git a/app/src/test/java/protect/card_locker/MainActivityTest.java b/app/src/test/java/protect/card_locker/MainActivityTest.java index b1c539153..c2c4129cd 100644 --- a/app/src/test/java/protect/card_locker/MainActivityTest.java +++ b/app/src/test/java/protect/card_locker/MainActivityTest.java @@ -3,6 +3,7 @@ package protect.card_locker; import android.app.Activity; import android.content.ComponentName; import android.content.SharedPreferences; +import android.database.sqlite.SQLiteDatabase; import android.graphics.Color; import android.view.Menu; import android.view.View; @@ -92,8 +93,8 @@ public class MainActivityTest { assertEquals(0, list.getAdapter().getItemCount()); - DBHelper db = TestHelpers.getEmptyDb(mainActivity); - db.insertLoyaltyCard("store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); + SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase(); + DBHelper.insertLoyaltyCard(database, "store", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); assertEquals(View.VISIBLE, helpText.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); @@ -108,7 +109,7 @@ public class MainActivityTest { assertEquals(1, list.getAdapter().getItemCount()); - db.close(); + database.close(); } @Test @@ -127,11 +128,11 @@ public class MainActivityTest { assertEquals(0, list.getAdapter().getItemCount()); - DBHelper db = TestHelpers.getEmptyDb(mainActivity); - db.insertLoyaltyCard("storeB", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); - db.insertLoyaltyCard("storeA", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); - db.insertLoyaltyCard("storeD", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null); - db.insertLoyaltyCard("storeC", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null); + SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase(); + DBHelper.insertLoyaltyCard(database, "storeB", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); + DBHelper.insertLoyaltyCard(database, "storeA", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); + DBHelper.insertLoyaltyCard(database, "storeD", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null); + DBHelper.insertLoyaltyCard(database, "storeC", "note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 1, null); assertEquals(View.VISIBLE, helpText.getVisibility()); assertEquals(View.GONE, noMatchingCardsText.getVisibility()); @@ -156,7 +157,7 @@ public class MainActivityTest { assertEquals("storeA", ((TextView) list.findViewHolderForAdapterPosition(2).itemView.findViewById(R.id.store)).getText()); assertEquals("storeB", ((TextView) list.findViewHolderForAdapterPosition(3).itemView.findViewById(R.id.store)).getText()); - db.close(); + database.close(); } @Test @@ -167,7 +168,7 @@ public class MainActivityTest { activityController.start(); activityController.resume(); - DBHelper db = TestHelpers.getEmptyDb(mainActivity); + SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase(); TabLayout groupTabs = mainActivity.findViewById(R.id.groups); @@ -175,7 +176,7 @@ public class MainActivityTest { assertEquals(0, groupTabs.getTabCount()); // Having at least one group should create two tabs: One all and one for each group - db.insertGroup("One"); + DBHelper.insertGroup(database, "One"); activityController.pause(); activityController.resume(); assertEquals(2, groupTabs.getTabCount()); @@ -183,7 +184,7 @@ public class MainActivityTest { assertEquals("One", groupTabs.getTabAt(1).getText().toString()); // Adding another group should have it added to the end - db.insertGroup("Alphabetical two"); + DBHelper.insertGroup(database, "Alphabetical two"); activityController.pause(); activityController.resume(); assertEquals(3, groupTabs.getTabCount()); @@ -192,7 +193,7 @@ public class MainActivityTest { assertEquals("Alphabetical two", groupTabs.getTabAt(2).getText().toString()); // Removing a group should also change the list - db.deleteGroup("Alphabetical two"); + DBHelper.deleteGroup(database, "Alphabetical two"); activityController.pause(); activityController.resume(); assertEquals(2, groupTabs.getTabCount()); @@ -200,12 +201,12 @@ public class MainActivityTest { assertEquals("One", groupTabs.getTabAt(1).getText().toString()); // Removing the last group should make the tabs disappear - db.deleteGroup("One"); + DBHelper.deleteGroup(database, "One"); activityController.pause(); activityController.resume(); assertEquals(0, groupTabs.getTabCount()); - db.close(); + database.close(); } @Test @@ -221,14 +222,14 @@ public class MainActivityTest { RecyclerView list = mainActivity.findViewById(R.id.list); TabLayout groupTabs = mainActivity.findViewById(R.id.groups); - DBHelper db = TestHelpers.getEmptyDb(mainActivity); - db.insertLoyaltyCard("The First Store", "Initial note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); - db.insertLoyaltyCard("The Second Store", "Secondary note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); + SQLiteDatabase database = TestHelpers.getEmptyDb(mainActivity).getWritableDatabase(); + DBHelper.insertLoyaltyCard(database, "The First Store", "Initial note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); + DBHelper.insertLoyaltyCard(database, "The Second Store", "Secondary note", null, new BigDecimal("0"), null, "cardId", null, CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A), Color.BLACK, 0, null); - db.insertGroup("Group one"); + DBHelper.insertGroup(database, "Group one"); List groups = new ArrayList<>(); - groups.add(db.getGroup("Group one")); - db.setLoyaltyCardGroups(1, groups); + groups.add(DBHelper.getGroup(database, "Group one")); + DBHelper.setLoyaltyCardGroups(database, 1, groups); activityController.pause(); activityController.resume(); @@ -441,6 +442,6 @@ public class MainActivityTest { assertEquals(2, list.getAdapter().getItemCount()); - db.close(); + database.close(); } } \ No newline at end of file diff --git a/app/src/test/java/protect/card_locker/TestHelpers.java b/app/src/test/java/protect/card_locker/TestHelpers.java index d6b6747f7..54d9381d3 100644 --- a/app/src/test/java/protect/card_locker/TestHelpers.java +++ b/app/src/test/java/protect/card_locker/TestHelpers.java @@ -9,9 +9,10 @@ import java.io.FileNotFoundException; public class TestHelpers { static public DBHelper getEmptyDb(Activity activity) { DBHelper db = new DBHelper(activity); + SQLiteDatabase database = db.getWritableDatabase(); // Make sure no files remain - Cursor cursor = db.getLoyaltyCardCursor(); + Cursor cursor = DBHelper.getLoyaltyCardCursor(database); cursor.moveToFirst(); while (!cursor.isAfterLast()) { int cardID = cursor.getColumnIndex(DBHelper.LoyaltyCardDbIds.ID); @@ -27,11 +28,9 @@ public class TestHelpers { } // Make sure DB is empty - SQLiteDatabase database = db.getWritableDatabase(); database.execSQL("delete from " + DBHelper.LoyaltyCardDbIds.TABLE); database.execSQL("delete from " + DBHelper.LoyaltyCardDbGroups.TABLE); database.execSQL("delete from " + DBHelper.LoyaltyCardDbIdsGroups.TABLE); - database.close(); return db; } diff --git a/build.gradle b/build.gradle index 37a0187d5..760ab47c1 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.0.3' + classpath 'com.android.tools.build:gradle:7.0.4' classpath 'gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.7.5' // NOTE: Do not place your application dependencies here; they belong diff --git a/docs/README.md b/docs/README.md index 774ecac2c..7a8c215a4 100644 --- a/docs/README.md +++ b/docs/README.md @@ -29,6 +29,7 @@ Supported barcodes: - AZTEC - CODABAR - CODE_39 +- CODE_93 - CODE_128 - DATA_MATRIX - EAN_8 diff --git a/fastlane/metadata/android/bg/title.txt b/fastlane/metadata/android/bg/title.txt deleted file mode 100644 index 18f2dacb9..000000000 --- a/fastlane/metadata/android/bg/title.txt +++ /dev/null @@ -1 +0,0 @@ -Catima - Портфейлът за карти Libre diff --git a/fastlane/metadata/android/de-DE/full_description.txt b/fastlane/metadata/android/de-DE/full_description.txt index 7d0abf6ae..c449e63c2 100644 --- a/fastlane/metadata/android/de-DE/full_description.txt +++ b/fastlane/metadata/android/de-DE/full_description.txt @@ -3,13 +3,13 @@ Schluss mit der Suche nach Plastik-Belohnungskarten beim Bezahlen im Geschäft o Du brauchst keine Geldbörse, oder mach sie federleicht für Wertsachen. -Mit diesem unverzichtbaren (EDC)Werkzeug kannst du nutzloses Plastik durch Bargeld ersetzen. +Mit diesem unverzichtbaren (EDC) Werkzeug kannst du nutzloses Plastik durch Bargeld ersetzen. - Vermeide Spionage mit sehr wenigen Berechtigungen. Kein Internetzugang und keine Werbung. - Füge Karten oder Codes mit Namen und anpassbaren Farben hinzu. - Manuelle Code-Eingabe, wenn kein Barcode gespeichert ist oder nicht funktioniert. -- Importiere Karten und Codes aus Dateien, Catima, Loyalty Card Keychain, Voucher Vault und FidMe. -- Erstelle ein Backup aller Karten und übertrage diese auf ein neues Gerät, wenn du möchtest. +- Importiere Karten und Codes aus Dateien, Catima, Loyalty Card Keychain, Stocard, Voucher Vault und FidMe. +- Erstelle ein Backup aller Karten und übertrage diese auf ein neues Gerät. - Teile Gutscheine, exklusive Angebote, Werbeaktionscodes oder Karten und Codes mit jeder Applikation. - Dunkler Modus und Zugänglichkeitsoptionen für sehbehinderte Nutzer. - Von der Freien-Software-Gemeinschaft für alle Menschen gemacht. @@ -20,4 +20,3 @@ Mit diesem unverzichtbaren (EDC)Werkzeug kannst du nutzloses Plastik durch Barge Vereinfache dein Leben und Einkäufe, und verliere nie wieder eine Papierrechung, eine Geschenkkarte für die Bezahlung im Geschäft oder ein Flugticket. Habe deine Prämien und Boni immer bei der Hand, und spare unterwegs. - diff --git a/fastlane/metadata/android/de-DE/title.txt b/fastlane/metadata/android/de-DE/title.txt index 015d34130..cf92bb044 100644 --- a/fastlane/metadata/android/de-DE/title.txt +++ b/fastlane/metadata/android/de-DE/title.txt @@ -1 +1 @@ -Catima — Das Open Source Kartenetui +Catima — Das Kartenetui diff --git a/fastlane/metadata/android/en-US/changelogs/93.txt b/fastlane/metadata/android/en-US/changelogs/93.txt index 46a3c1431..1303b2d8a 100644 --- a/fastlane/metadata/android/en-US/changelogs/93.txt +++ b/fastlane/metadata/android/en-US/changelogs/93.txt @@ -1 +1,2 @@ -- Add Catima to Quick Access Device Controls (https://developer.android.com/guide/topics/ui/device-control) \ No newline at end of file +- Add Catima to Quick Access Device Controls (https://developer.android.com/guide/topics/ui/device-control) +- Fix some groups not showing up correctly in group management screen \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/94.txt b/fastlane/metadata/android/en-US/changelogs/94.txt new file mode 100644 index 000000000..17b032f5e --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/94.txt @@ -0,0 +1,3 @@ +- Fix blurriness of main screen letter icons +- Fix icons sometimes disappearing after selection +- Fix status bar icons possibly being invisible on Android 5 \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/95.txt b/fastlane/metadata/android/en-US/changelogs/95.txt new file mode 100644 index 000000000..973efa9f8 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/95.txt @@ -0,0 +1 @@ +- Fix crash on sharing card \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/96.txt b/fastlane/metadata/android/en-US/changelogs/96.txt new file mode 100644 index 000000000..87c8440b1 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/96.txt @@ -0,0 +1 @@ +- Add CODE 93 support \ No newline at end of file diff --git a/fastlane/metadata/android/fr-FR/changelogs/10.txt b/fastlane/metadata/android/fr-FR/changelogs/10.txt new file mode 100644 index 000000000..d2f191e1f --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/10.txt @@ -0,0 +1,3 @@ +- Modification du nom de fichier d'importation/exportation par défaut. (pull #84 (https://github.com/brarcher/loyalty-card-locker/pull/84)) +- Correction d'un titre sur la page d'importation/exportation. (pull #87 (https://github.com/brarcher/loyalty-card-locker/pull/87)) +- Amélioration de la mise en page de la page d'affichage des cartes. Le texte devrait être plus facile à lire, et est sélectionnable avec un appui long. (pull #91 (https://github.com/brarcher/loyalty-card-locker/pull/91)) diff --git a/fastlane/metadata/android/fr-FR/changelogs/96.txt b/fastlane/metadata/android/fr-FR/changelogs/96.txt new file mode 100644 index 000000000..a22217e91 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/96.txt @@ -0,0 +1 @@ +- Ajoute la prise en charge de CODE 93 diff --git a/fastlane/metadata/android/fr-FR/full_description.txt b/fastlane/metadata/android/fr-FR/full_description.txt index 82611230c..6078107df 100644 --- a/fastlane/metadata/android/fr-FR/full_description.txt +++ b/fastlane/metadata/android/fr-FR/full_description.txt @@ -20,4 +20,3 @@ Avec cet outil essentiel à emporter au quotidien, vous pouvez remplacer le plas Simplifiez votre vie et vos achats, et ne perdez plus jamais un reçu papier, une carte cadeau de paiement en magasin ou un billet d'avion. Emportez toutes vos récompenses et primes avec vous, et économisez au fur et à mesure. - diff --git a/fastlane/metadata/android/fr-FR/title.txt b/fastlane/metadata/android/fr-FR/title.txt index 36ab0fea7..4027bcef2 100644 --- a/fastlane/metadata/android/fr-FR/title.txt +++ b/fastlane/metadata/android/fr-FR/title.txt @@ -1 +1 @@ -Catima – Le porte-cartes Open Source +Catima — Le porte-cartes diff --git a/fastlane/metadata/android/it-IT/changelogs/10.txt b/fastlane/metadata/android/it-IT/changelogs/10.txt new file mode 100644 index 000000000..7d82060a3 --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/10.txt @@ -0,0 +1,3 @@ +- Cambiato il nome del file predefinito per l'importazione/esportazione. (pull #84 (https://github.com/brarcher/loyalty-card-locker/pull/84)) +- Corretta la stringa nella pagina dell'importazione/esportazione. (pull #87 (https://github.com/brarcher/loyalty-card-locker/pull/87)) +- Migliorato il layout della pagina di visualizzazione della carta. Il testo è ora più facile da leggere ed è selezionabile tenendo premuto a lungo. (pull #91 (https://github.com/brarcher/loyalty-card-locker/pull/91)) diff --git a/fastlane/metadata/android/it-IT/full_description.txt b/fastlane/metadata/android/it-IT/full_description.txt index cb035ba66..763bc5d85 100644 --- a/fastlane/metadata/android/it-IT/full_description.txt +++ b/fastlane/metadata/android/it-IT/full_description.txt @@ -1,23 +1,22 @@ Basta con la ricerca di carte premio di plastica quando esci dal negozio. -Scannerizza i codici a barre sul tuo dispositivo usando la sua fotocamera, dimentica le carte. +Scannerizza i codici a barre sul tuo dispositivo usando la tua fotocamera, dimentica le carte. -Dimentica il tuo portafoglio, o tienilo ultraleggero per gli oggetti di valore. +Dimentica il tuo portafoglio o tienilo ultraleggero per gli oggetti di valore. -Con questo strumento essenziale per il trasporto quotidiano, puoi sostituire la plastica inutile con i contanti. +Con questo strumento essenziale per il trasporto quotidiano puoi sostituire la plastica inutile con i contanti. -- Evita di spiare con pochissimi permessi. Nessun accesso a Internet e nessuna pubblicità. +- Evita di essere spiati con pochissimi permessi. Nessun accesso a Internet e nessuna pubblicità. - Aggiungi carte o codici con nomi e colori personalizzabili. -- Inserimento manuale del codice se non c'è un codice a barre da memorizzare o non può essere utilizzato. +- Inserisci manualmente il codice se non c'è un codice a barre da memorizzare o non può essere utilizzato. - Importa carte e codici da file, Catima, Portachiavi delle carte fedeltà, Voucher Vault e FidMe. -- Fai un backup di tutte le tue carte e trasferiscile su un nuovo dispositivo se vuoi. +- Fai un backup di tutte le tue carte e trasferiscile su un nuovo dispositivo, se vuoi. - Condividi coupon, offerte esclusive, codici promozionali o carte e codici utilizzando qualsiasi app. - Tema scuro e opzioni di accessibilità per gli utenti con problemi di vista. - Fatto per tutti dalla comunità del software libero. - Traduzioni localizzate a mano per 20+ lingue. - Gratis, supportato dai contributi della comunità. -- Usalo, studialo, cambialo e condividilo come vuoi; con tutti. -- Non solo un software libero. Copylefted software libero (GPLv3+) gestione schede. - -Semplifica la tua vita e gli acquisti, e non perdere mai più una ricevuta cartacea, una carta regalo con pagamento in negozio o un biglietto aereo. -Porta con te tutti i tuoi premi e bonus, e risparmia mentre vai. +- Usala, studiala, cambiala e condividila come vuoi; con tutti. +- Non solo un software libero. Copylefted software libero (GPLv3+). +Semplifica la tua vita e gli acquisti e non perdere mai più una ricevuta cartacea, una carta regalo con pagamento in negozio o un biglietto aereo. +Porta con te tutti i tuoi premi e bonus e risparmia mentre vai. diff --git a/fastlane/metadata/android/it-IT/title.txt b/fastlane/metadata/android/it-IT/title.txt index 3ebd1f498..88cfe5bcd 100644 --- a/fastlane/metadata/android/it-IT/title.txt +++ b/fastlane/metadata/android/it-IT/title.txt @@ -1 +1 @@ -Catima — Il portafoglio di carte Open Source +Catima — Portafoglio di carte diff --git a/fastlane/metadata/android/nb-NO/changelogs/93.txt b/fastlane/metadata/android/nb-NO/changelogs/93.txt new file mode 100644 index 000000000..ad347901b --- /dev/null +++ b/fastlane/metadata/android/nb-NO/changelogs/93.txt @@ -0,0 +1,2 @@ +- Catima lagt til i hurtigtilgang til kontroller for enheter (https://developer.android.com/guide/topics/ui/device-control) +- Grupper vises nå riktig i gruppehåndtering diff --git a/fastlane/metadata/android/nb-NO/full_description.txt b/fastlane/metadata/android/nb-NO/full_description.txt index f48ac9ae6..66dd83116 100644 --- a/fastlane/metadata/android/nb-NO/full_description.txt +++ b/fastlane/metadata/android/nb-NO/full_description.txt @@ -8,7 +8,7 @@ Med dette essensielle verktøyet kan du erstatte unyttig plast med kontanter. - Unngå spionasje med veldig få tilganger. Ingen tilgang til Internett, og ingen reklame. - Legg til kort eller koder med navn og egne farger. - Manuell kodeinnskriving hvis det ikke er noen strekkode å lagre, eller den ikke kan brukes. -- Importer kort og koder fra filer ,Catima, FidMe, Kundekortknippe, Stocard og Voucher Vault. +- Importer kort og koder fra filer, Catima, FidMe, Kundekortknippe, Stocard og Voucher Vault. - Lag en sikkerhetskopi av alle kortene dine og overfør dem til en ny enhet hvis du ønsker det. - Del kupponger, eksklusive tilbud, promokoder eller kort og koder ved bruk av ethvert program. - Mørk drakt og tilgjengelighetsvalg for synshemmede brukere. diff --git a/fastlane/metadata/android/tr-TR/changelogs/10.txt b/fastlane/metadata/android/tr-TR/changelogs/10.txt new file mode 100644 index 000000000..4f2c174c3 --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/10.txt @@ -0,0 +1,3 @@ +- Öntanımlı içe/dışa aktarma dosya adı değiştirildi. (https://github.com/brarcher/loyalty-card-locker/pull/84) +- İçe/dışa aktarma sayfasındaki dizge düzeltildi. (https://github.com/brarcher/loyalty-card-locker/pull/87) +- Kart görünümü sayfasının düzeni iyileştirildi. Metnin okunması daha kolay olmalı ve uzun bir tıklama ile seçilebilir olmalıdır. https://github.com/brarcher/loyalty-card-locker/pull/91) diff --git a/fastlane/metadata/android/tr-TR/changelogs/12.txt b/fastlane/metadata/android/tr-TR/changelogs/12.txt new file mode 100644 index 000000000..a8fb75932 --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/12.txt @@ -0,0 +1 @@ +- İlk çalıştırma giriş sihirbazında ekranı döndürürken oluşan çökmeyi önle. diff --git a/fastlane/metadata/android/tr-TR/changelogs/19.txt b/fastlane/metadata/android/tr-TR/changelogs/19.txt new file mode 100644 index 000000000..b9c1c4f63 --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/19.txt @@ -0,0 +1,3 @@ +- Belirli türdeki bozuk CSV dosyalarını içe aktarırken oluşan çökme düzeltildi. (https://github.com/brarcher/loyalty-card-locker/pull/177) +- Yedekleri doğrudan dosya sisteminden içe aktarma düzeltildi. (https://github.com/brarcher/loyalty-card-locker/pull/180) +- Belirli içerik sağlayıcı türlerinden yedekleri içe aktarma düzeltildi. (https://github.com/brarcher/loyalty-card-locker/pull/179) diff --git a/fastlane/metadata/android/tr-TR/changelogs/2.txt b/fastlane/metadata/android/tr-TR/changelogs/2.txt new file mode 100644 index 000000000..cc86141d3 --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/2.txt @@ -0,0 +1,3 @@ +- İtalyanca çeviri +- Tüm 1B barkod türleri için destek. (Başlangıçta yalnızca ürün 1B barkodları destekleniyordu) +- Başlangıçta eksik olan gerekli kamera izni eklendi. diff --git a/fastlane/metadata/android/tr-TR/changelogs/21.txt b/fastlane/metadata/android/tr-TR/changelogs/21.txt new file mode 100644 index 000000000..e5995f1b9 --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/21.txt @@ -0,0 +1,2 @@ +- Kart listesi düzeni iyileştirildi. (https://github.com/brarcher/loyalty-card-locker/pull/188) +- Kartı görüntüleme düzeni iyileştirildi. (https://github.com/brarcher/loyalty-card-locker/pull/190) diff --git a/fastlane/metadata/android/tr-TR/changelogs/86.txt b/fastlane/metadata/android/tr-TR/changelogs/86.txt index 193895b7d..baa7c6220 100644 --- a/fastlane/metadata/android/tr-TR/changelogs/86.txt +++ b/fastlane/metadata/android/tr-TR/changelogs/86.txt @@ -1 +1 @@ -- Boşluklu aramaları iyileştir +- Boşluklu aramalar iyileştirildi diff --git a/fastlane/metadata/android/tr-TR/changelogs/89.txt b/fastlane/metadata/android/tr-TR/changelogs/89.txt index 3670291e1..ad9ed387b 100644 --- a/fastlane/metadata/android/tr-TR/changelogs/89.txt +++ b/fastlane/metadata/android/tr-TR/changelogs/89.txt @@ -1,5 +1,5 @@ - Gruplar arasında kaydırmanın boş bir grup üzerinde çalışmaması düzeltildi - Parola korumalı dışa aktarmalara izin ver -- QR kodları için boşluk kullanımını iyileştir +- QR kodları için boşluk kullanımı iyileştirildi - Kart başına en son kullanılan yakınlaştırma seviyesini kaydet -- Dokunduktan sonra sağa kaydırmada çökmeyi düzelt +- Dokunduktan sonra sağa kaydırmada çökme düzeltildi diff --git a/fastlane/metadata/android/tr-TR/changelogs/90.txt b/fastlane/metadata/android/tr-TR/changelogs/90.txt index a06d609b7..df07bfecc 100644 --- a/fastlane/metadata/android/tr-TR/changelogs/90.txt +++ b/fastlane/metadata/android/tr-TR/changelogs/90.txt @@ -1,4 +1,4 @@ -- Temayı elle değiştirirken kart görünümündeki noktaların yanlış renge sahip olmasını düzelt -- Döndürme/tema değişikliğinde kart görünümündeki çökmeyi düzelt -- Kart listesinin yanıp sönmesini düzelt -- Metnin yıldız simgesinin üzerine binmesini düzelt +- Temayı elle değiştirirken kart görünümündeki noktaların yanlış renge sahip olması düzeltildi +- Döndürme/tema değişikliğinde kart görünümündeki çökme düzeltildi +- Kart listesinin yanıp sönmesi düzeltildi +- Metnin yıldız simgesinin üzerine binmesi düzeltildi diff --git a/fastlane/metadata/android/tr-TR/changelogs/92.txt b/fastlane/metadata/android/tr-TR/changelogs/92.txt index 87c0cbdb2..91785f2f7 100644 --- a/fastlane/metadata/android/tr-TR/changelogs/92.txt +++ b/fastlane/metadata/android/tr-TR/changelogs/92.txt @@ -1,2 +1,2 @@ - Yeni ana ekran düzeni -- Tam ekrana girip çıkarken alt sayfa boyutlandırma sorunlarını düzelt +- Tam ekrana girip çıkarken alt sayfa boyutlandırma sorunları düzeltildi diff --git a/fastlane/metadata/android/tr-TR/changelogs/93.txt b/fastlane/metadata/android/tr-TR/changelogs/93.txt new file mode 100644 index 000000000..d5d54837e --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/93.txt @@ -0,0 +1,2 @@ +- Catima Hızlı Erişim Aygıt Denetimlerine eklendi (https://developer.android.com/guide/topics/ui/device-control) +- Grup yönetimi ekranında bazı grupların doğru görünmemesi düzeltildi diff --git a/fastlane/metadata/android/tr-TR/changelogs/94.txt b/fastlane/metadata/android/tr-TR/changelogs/94.txt new file mode 100644 index 000000000..0600694e9 --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/94.txt @@ -0,0 +1,3 @@ +- Ana ekran harf simgelerinin bulanıklığı düzeltildi +- Simgelerin seçtikten sonra bazen kaybolması düzeltildi +- Android 5'te bazen görünmez olan durum çubuğu simgeleri düzeltildi diff --git a/fastlane/metadata/android/tr-TR/changelogs/95.txt b/fastlane/metadata/android/tr-TR/changelogs/95.txt new file mode 100644 index 000000000..25da0be79 --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/95.txt @@ -0,0 +1 @@ +- Kart paylaşırken oluşan çökme düzeltildi diff --git a/fastlane/metadata/android/tr-TR/changelogs/96.txt b/fastlane/metadata/android/tr-TR/changelogs/96.txt new file mode 100644 index 000000000..f5d3cb58c --- /dev/null +++ b/fastlane/metadata/android/tr-TR/changelogs/96.txt @@ -0,0 +1 @@ +- CODE 93 desteği eklendi