feat: split complex loyaltyCardViewActivity (#3072)

This commit is contained in:
NightShiftNexus
2026-05-02 16:10:03 +02:00
committed by GitHub
parent 090e85ea1c
commit dfa1c29fa0
13 changed files with 1150 additions and 807 deletions

View File

@@ -98,7 +98,7 @@
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="adjustResize"/>
<activity
android:name=".LoyaltyCardViewActivity"
android:name=".cardview.LoyaltyCardViewActivity"
android:exported="true"
android:theme="@style/AppTheme.NoActionBar" />
<activity

View File

@@ -57,7 +57,7 @@ public class BarcodeImageWriterTask implements CompatCallable<Bitmap> {
private final boolean showFallback;
private final BarcodeImageWriterResultCallback callback;
BarcodeImageWriterTask(
public BarcodeImageWriterTask(
Context context, ImageView imageView, String cardIdString,
CatimaBarcode barcodeFormat, @NonNull Charset barcodeEncoding, TextView textView,
boolean showFallback, BarcodeImageWriterResultCallback callback, boolean roundCornerPadding, boolean isFullscreen

View File

@@ -22,6 +22,8 @@ import java.util.List;
import java.util.concurrent.Flow;
import java.util.function.Consumer;
import protect.card_locker.cardview.LoyaltyCardViewActivity;
@RequiresApi(Build.VERSION_CODES.R)
public class CardsOnPowerScreenService extends ControlsProviderService {

View File

@@ -13,6 +13,7 @@ import android.view.View
import android.widget.RemoteViews
import androidx.core.widget.RemoteViewsCompat
import protect.card_locker.DBHelper.LoyaltyCardArchiveFilter
import protect.card_locker.cardview.LoyaltyCardViewActivity
class ListWidget : AppWidgetProvider() {
fun updateAll(context: Context) {
@@ -129,4 +130,4 @@ class ListWidget : AppWidgetProvider() {
return remoteViews
}
}
}

View File

@@ -719,6 +719,14 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
});
}
@Override
protected void onDestroy() {
if (mDatabase != null && mDatabase.isOpen()) {
mDatabase.close();
}
super.onDestroy();
}
private void selectTab(int index) {
binding.tabs.selectTab(binding.tabs.getTabAt(index));
viewModel.setTabIndex(index);

View File

@@ -31,6 +31,7 @@ import com.google.android.material.tabs.TabLayout.OnTabSelectedListener
import protect.card_locker.DBHelper.LoyaltyCardOrder
import protect.card_locker.DBHelper.LoyaltyCardOrderDirection
import protect.card_locker.LoyaltyCardCursorAdapter.CardAdapterListener
import protect.card_locker.cardview.LoyaltyCardViewActivity
import protect.card_locker.databinding.ContentMainBinding
import protect.card_locker.databinding.MainActivityBinding
import protect.card_locker.databinding.SortingOptionBinding

View File

@@ -15,11 +15,11 @@ import androidx.core.content.pm.ShortcutManagerCompat;
import androidx.core.graphics.drawable.IconCompat;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.LinkedList;
class ShortcutHelper {
import protect.card_locker.cardview.LoyaltyCardViewActivity;
public class ShortcutHelper {
/**
* This variable controls the maximum number of shortcuts available.
* It is made public only to make testing easier and should not be
@@ -43,33 +43,36 @@ class ShortcutHelper {
* based on the lastUsed field. Archived cards are excluded from the shortcuts
* list. The list keeps at most maxShortcuts number of elements.
*/
static void updateShortcuts(Context context) {
public static void updateShortcuts(Context context) {
if (maxShortcuts == -1) {
maxShortcuts = ShortcutManagerCompat.getMaxShortcutCountPerActivity(context);
}
LinkedList<ShortcutInfoCompat> finalList = new LinkedList<>();
SQLiteDatabase database = new DBHelper(context).getReadableDatabase();
Cursor loyaltyCardCursor = DBHelper.getLoyaltyCardCursor(
DBHelper dbHelper = new DBHelper(context);
SQLiteDatabase database = dbHelper.getReadableDatabase();
try (Cursor loyaltyCardCursor = DBHelper.getLoyaltyCardCursor(
database,
"",
null,
DBHelper.LoyaltyCardOrder.LastUsed,
DBHelper.LoyaltyCardOrderDirection.Ascending,
DBHelper.LoyaltyCardArchiveFilter.Unarchived
);
)) {
int rank = 0;
int rank = 0;
while (rank < maxShortcuts && loyaltyCardCursor.moveToNext()) {
int id = loyaltyCardCursor.getInt(loyaltyCardCursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID));
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(context, database, id);
while (rank < maxShortcuts && loyaltyCardCursor.moveToNext()) {
int id = loyaltyCardCursor.getInt(loyaltyCardCursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID));
LoyaltyCard loyaltyCard = DBHelper.getLoyaltyCard(context, database, id);
ShortcutInfoCompat updatedShortcut = createShortcutBuilder(context, loyaltyCard)
.setRank(rank)
.build();
ShortcutInfoCompat updatedShortcut = createShortcutBuilder(context, loyaltyCard)
.setRank(rank)
.build();
finalList.addLast(updatedShortcut);
rank++;
finalList.addLast(updatedShortcut);
rank++;
}
} finally {
dbHelper.close();
}
ShortcutManagerCompat.setDynamicShortcuts(context, finalList);
@@ -110,4 +113,4 @@ class ShortcutHelper {
.setIntent(intent)
.setIcon(icon);
}
}
}

View File

@@ -0,0 +1,103 @@
package protect.card_locker.cardview;
import java.util.ArrayList;
import java.util.List;
final class LoyaltyCardImageNavigator {
private final List<LoyaltyCardImageType> imageTypes;
private int currentIndex;
LoyaltyCardImageNavigator(List<LoyaltyCardImageType> imageTypes, int currentIndex) {
this.imageTypes = new ArrayList<>(imageTypes);
this.currentIndex = clampIndex(currentIndex);
}
LoyaltyCardImageType getCurrent() {
if (isEmpty()) {
return LoyaltyCardImageType.NONE;
}
return imageTypes.get(currentIndex);
}
boolean isEmpty() {
return imageTypes.isEmpty();
}
int size() {
return imageTypes.size();
}
boolean remove(LoyaltyCardImageType type) {
int removedIndex = imageTypes.indexOf(type);
if (removedIndex == -1) {
return false;
}
imageTypes.remove(removedIndex);
currentIndex = clampIndex(currentIndex);
return true;
}
boolean canGoPrevious() {
return currentIndex > 0;
}
boolean canGoNext() {
return currentIndex < imageTypes.size() - 1;
}
boolean movePrevious() {
if (!canGoPrevious()) {
return false;
}
currentIndex--;
return true;
}
boolean moveNext(boolean overflow) {
if (isEmpty()) {
return false;
}
if (canGoNext()) {
currentIndex++;
return true;
}
if (overflow) {
currentIndex = 0;
return true;
}
return false;
}
int getCurrentIndex() {
return currentIndex;
}
LoyaltyCardImageType peekNext(boolean overflow) {
if (isEmpty()) {
return LoyaltyCardImageType.NONE;
}
if (canGoNext()) {
return imageTypes.get(currentIndex + 1);
}
return overflow ? imageTypes.get(0) : getCurrent();
}
private int clampIndex(int index) {
if (imageTypes.isEmpty()) {
return 0;
}
return Math.max(0, Math.min(index, imageTypes.size() - 1));
}
}
enum LoyaltyCardImageType {
NONE,
ICON,
BARCODE,
IMAGE_FRONT,
IMAGE_BACK
}

View File

@@ -0,0 +1,183 @@
package protect.card_locker.cardview;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.TextView;
import com.google.android.material.card.MaterialCardView;
import com.google.android.material.color.MaterialColors;
import java.nio.charset.Charset;
import protect.card_locker.*;
import protect.card_locker.async.TaskHandler;
final class LoyaltyCardMainImageRenderer {
private final Context context;
private final TaskHandler tasks = new TaskHandler();
private final BarcodeImageWriterResultCallback barcodeCallback;
LoyaltyCardMainImageRenderer(
Context context,
BarcodeImageWriterResultCallback barcodeCallback
) {
this.context = context;
this.barcodeCallback = barcodeCallback;
}
void renderCurrent(
LoyaltyCardImageType imageType,
Bitmap frontImageBitmap,
Bitmap backImageBitmap,
CatimaBarcode format,
Charset barcodeEncoding,
String cardIdString,
String barcodeIdString,
ImageView barcodeRenderTarget,
TextView mainImageDescription,
MaterialCardView mainCardView,
boolean isFullscreen,
boolean waitForResize
) {
if (imageType == LoyaltyCardImageType.NONE) {
// With no renderable media left, show the raw card ID instead of an empty card area.
barcodeRenderTarget.setVisibility(View.GONE);
mainCardView.setCardBackgroundColor(Color.TRANSPARENT);
mainImageDescription.setTextColor(
MaterialColors.getColor(
mainImageDescription,
com.google.android.material.R.attr.colorOnSurfaceVariant
)
);
mainImageDescription.setText(cardIdString);
return;
}
if (imageType == LoyaltyCardImageType.BARCODE) {
barcodeRenderTarget.setBackgroundColor(Color.WHITE);
mainCardView.setCardBackgroundColor(Color.WHITE);
mainImageDescription.setTextColor(context.getResources().getColor(R.color.md_theme_light_onSurfaceVariant));
if (waitForResize) {
redrawBarcodeAfterResize(
barcodeRenderTarget,
barcodeIdString,
cardIdString,
format,
barcodeEncoding,
!isFullscreen,
isFullscreen
);
} else {
drawBarcode(
barcodeRenderTarget,
barcodeIdString,
cardIdString,
format,
barcodeEncoding,
!isFullscreen,
isFullscreen
);
}
mainImageDescription.setText(cardIdString);
barcodeRenderTarget.setContentDescription(
context.getString(R.string.barcodeImageDescriptionWithType, format.prettyName())
);
} else if (imageType == LoyaltyCardImageType.IMAGE_FRONT) {
barcodeRenderTarget.setImageBitmap(frontImageBitmap);
barcodeRenderTarget.setBackgroundColor(Color.TRANSPARENT);
mainCardView.setCardBackgroundColor(Color.TRANSPARENT);
mainImageDescription.setTextColor(
MaterialColors.getColor(
mainImageDescription,
com.google.android.material.R.attr.colorOnSurfaceVariant
)
);
mainImageDescription.setText(context.getString(R.string.frontImageDescription));
barcodeRenderTarget.setContentDescription(context.getString(R.string.frontImageDescription));
} else if (imageType == LoyaltyCardImageType.IMAGE_BACK) {
barcodeRenderTarget.setImageBitmap(backImageBitmap);
barcodeRenderTarget.setBackgroundColor(Color.TRANSPARENT);
mainCardView.setCardBackgroundColor(Color.TRANSPARENT);
mainImageDescription.setTextColor(
MaterialColors.getColor(
mainImageDescription,
com.google.android.material.R.attr.colorOnSurfaceVariant
)
);
mainImageDescription.setText(context.getString(R.string.backImageDescription));
barcodeRenderTarget.setContentDescription(context.getString(R.string.backImageDescription));
} else {
throw new IllegalArgumentException("Unknown image type: " + imageType);
}
barcodeRenderTarget.setVisibility(View.VISIBLE);
}
private void redrawBarcodeAfterResize(
ImageView barcodeRenderTarget,
String barcodeIdString,
String cardIdString,
CatimaBarcode format,
Charset barcodeEncoding,
boolean addPadding,
boolean isFullscreen
) {
if (format == null) {
return;
}
// Barcode dimensions depend on the final ImageView size, so wait for layout before rendering.
barcodeRenderTarget.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
barcodeRenderTarget.getViewTreeObserver().removeOnGlobalLayoutListener(this);
drawBarcode(
barcodeRenderTarget,
barcodeIdString,
cardIdString,
format,
barcodeEncoding,
addPadding,
isFullscreen
);
}
});
}
private void drawBarcode(
ImageView barcodeRenderTarget,
String barcodeIdString,
String cardIdString,
CatimaBarcode format,
Charset barcodeEncoding,
boolean addPadding,
boolean isFullscreen
) {
// Barcodes are regenerated eagerly because zoom/fullscreen changes affect the output bitmap.
tasks.flushTaskList(TaskHandler.TYPE.BARCODE, true, false, false);
if (format == null) {
return;
}
BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(
context.getApplicationContext(),
barcodeRenderTarget,
barcodeIdString != null ? barcodeIdString : cardIdString,
format,
barcodeEncoding,
null,
false,
barcodeCallback,
addPadding,
isFullscreen
);
tasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter);
}
}

View File

@@ -0,0 +1,246 @@
package protect.card_locker.cardview;
import android.content.Context;
import android.graphics.Color;
import android.text.InputType;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.method.DigitsKeyListener;
import android.text.style.ForegroundColorSpan;
import android.text.util.Linkify;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.textfield.TextInputEditText;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.function.Predicate;
import protect.card_locker.*;
final class LoyaltyCardViewDialogs {
interface BalanceUpdateListener {
void onBalanceUpdated(BigDecimal newBalance);
}
void showInfoDialog(Context context, LoyaltyCard loyaltyCard, List<Group> loyaltyCardGroups) {
AlertDialog.Builder infoDialog = new MaterialAlertDialogBuilder(context);
int dialogContentPadding = context.getResources().getDimensionPixelSize(R.dimen.alert_dialog_content_padding);
infoDialog.setTitle(loyaltyCard.store);
TextView infoTextview = new TextView(context);
infoTextview.setPadding(
dialogContentPadding,
dialogContentPadding / 2,
dialogContentPadding,
0
);
infoTextview.setAutoLinkMask(Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS | Linkify.WEB_URLS);
infoTextview.setTextIsSelectable(true);
SpannableStringBuilder infoText = new SpannableStringBuilder();
if (!loyaltyCard.note.isEmpty()) {
infoText.append(loyaltyCard.note);
}
if (!loyaltyCardGroups.isEmpty()) {
List<String> groupNames = new ArrayList<>();
for (Group group : loyaltyCardGroups) {
groupNames.add(group._id);
}
padSpannableString(infoText);
infoText.append(context.getString(R.string.groupsList, TextUtils.join(", ", groupNames)));
}
if (hasBalance(loyaltyCard)) {
padSpannableString(infoText);
infoText.append(context.getString(
R.string.balanceSentence,
Utils.formatBalance(context, loyaltyCard.balance, loyaltyCard.balanceType)
));
}
appendDateInfo(
context,
infoText,
loyaltyCard.validFrom,
Utils::isNotYetValid,
R.string.validFromSentence,
R.string.validFromSentence
);
appendDateInfo(
context,
infoText,
loyaltyCard.expiry,
Utils::hasExpired,
R.string.expiryStateSentenceExpired,
R.string.expiryStateSentence
);
infoTextview.setText(infoText);
infoDialog.setView(infoTextview);
infoDialog.setPositiveButton(R.string.ok, (dialogInterface, i) -> dialogInterface.dismiss());
infoDialog.create().show();
}
void showBalanceUpdateDialog(
Context context,
LoyaltyCard loyaltyCard,
BalanceUpdateListener balanceUpdateListener
) {
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(context);
builder.setTitle(R.string.updateBalanceTitle);
FrameLayout container = new FrameLayout(context);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
);
int contentPadding = context.getResources().getDimensionPixelSize(R.dimen.alert_dialog_content_padding);
params.leftMargin = contentPadding;
params.topMargin = contentPadding / 2;
params.rightMargin = contentPadding;
LinearLayout layout = new LinearLayout(context);
layout.setOrientation(LinearLayout.VERTICAL);
TextView currentTextview = new TextView(context);
currentTextview.setText(context.getString(
R.string.currentBalanceSentence,
Utils.formatBalance(context, loyaltyCard.balance, loyaltyCard.balanceType)
));
layout.addView(currentTextview);
final TextInputEditText input = new TextInputEditText(context);
input.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
input.setKeyListener(DigitsKeyListener.getInstance("0123456789,."));
input.setHint(R.string.updateBalanceHint);
layout.addView(input);
layout.setLayoutParams(params);
container.addView(layout);
builder.setView(container);
builder.setPositiveButton(R.string.spend, (dialogInterface, i) -> {
try {
BigDecimal balanceChange = Utils.parseBalance(input.getText().toString(), loyaltyCard.balanceType);
BigDecimal newBalance = loyaltyCard.balance.subtract(balanceChange).max(new BigDecimal(0));
balanceUpdateListener.onBalanceUpdated(newBalance);
Toast.makeText(
context,
context.getString(
R.string.newBalanceSentence,
Utils.formatBalance(context, newBalance, loyaltyCard.balanceType)
),
Toast.LENGTH_LONG
).show();
} catch (ParseException e) {
Toast.makeText(context, R.string.amountParsingFailed, Toast.LENGTH_LONG).show();
}
});
builder.setNegativeButton(R.string.receive, (dialogInterface, i) -> {
try {
BigDecimal balanceChange = Utils.parseBalance(input.getText().toString(), loyaltyCard.balanceType);
BigDecimal newBalance = loyaltyCard.balance.add(balanceChange);
balanceUpdateListener.onBalanceUpdated(newBalance);
Toast.makeText(
context,
context.getString(
R.string.newBalanceSentence,
Utils.formatBalance(context, newBalance, loyaltyCard.balanceType)
),
Toast.LENGTH_LONG
).show();
} catch (ParseException e) {
Toast.makeText(context, R.string.amountParsingFailed, Toast.LENGTH_LONG).show();
}
});
builder.setNeutralButton(context.getString(R.string.cancel), (dialog, which) -> dialog.cancel());
AlertDialog dialog = builder.create();
// Button state depends on the parsed input, so listeners must be bound after the dialog exists.
input.addTextChangedListener(new SimpleTextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
BigDecimal balanceChange;
try {
balanceChange = Utils.parseBalance(s.toString(), loyaltyCard.balanceType);
} catch (ParseException e) {
input.setError(context.getString(R.string.amountParsingFailed));
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false);
return;
}
input.setError(null);
boolean hasNonZeroValue = !balanceChange.equals(new BigDecimal(0));
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(hasNonZeroValue);
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(hasNonZeroValue);
}
});
dialog.show();
// Touching dialog buttons before show() can crash because they are not created yet.
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false);
if (dialog.getWindow() != null) {
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
// Focus immediately so the keyboard opens on the amount field.
input.requestFocus();
}
private boolean hasBalance(LoyaltyCard loyaltyCard) {
return !loyaltyCard.balance.equals(new BigDecimal(0));
}
private SpannableStringBuilder padSpannableString(SpannableStringBuilder spannableStringBuilder) {
if (spannableStringBuilder.length() > 0) {
spannableStringBuilder.append("\n\n");
}
return spannableStringBuilder;
}
private void appendDateInfo(
Context context,
SpannableStringBuilder infoText,
Date date,
Predicate<Date> dateCheck,
@StringRes int dateCheckTrueString,
@StringRes int dateCheckFalseString
) {
if (date == null) {
return;
}
String formattedDate = DateFormat.getDateInstance(DateFormat.LONG).format(date);
padSpannableString(infoText);
if (dateCheck.test(date)) {
int start = infoText.length();
infoText.append(context.getString(dateCheckTrueString, formattedDate));
infoText.setSpan(new ForegroundColorSpan(Color.RED), start, infoText.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
} else {
infoText.append(context.getString(dateCheckFalseString, formattedDate));
}
}
}

View File

@@ -51,6 +51,7 @@ import com.google.android.material.textfield.TextInputLayout;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.client.android.Intents;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -71,13 +72,19 @@ import java.text.DateFormat;
import java.text.ParseException;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Currency;
import java.util.Date;
import java.util.List;
import protect.card_locker.cardview.LoyaltyCardViewActivity;
@RunWith(RobolectricTestRunner.class)
public class LoyaltyCardViewActivityTest {
private final String BARCODE_DATA = "428311627547";
private final CatimaBarcode BARCODE_TYPE = CatimaBarcode.fromBarcode(BarcodeFormat.UPC_A);
private final List<ActivityController<? extends Activity>> activityControllers = new ArrayList<>();
private final List<DBHelper> dbHelpers = new ArrayList<>();
private final String EAN_BARCODE_DATA = "4763705295336";
private final CatimaBarcode EAN_BARCODE_TYPE = CatimaBarcode.fromBarcode(BarcodeFormat.EAN_13);
@@ -101,6 +108,30 @@ public class LoyaltyCardViewActivityTest {
ShadowLog.stream = System.out;
}
@After
public void tearDown() {
for (int index = activityControllers.size() - 1; index >= 0; index--) {
ActivityController<? extends Activity> activityController = activityControllers.get(index);
try {
activityController.pause().stop().destroy();
} catch (RuntimeException ignored) {
try {
activityController.destroy();
} catch (RuntimeException ignoredAgain) {
}
}
}
activityControllers.clear();
for (int index = dbHelpers.size() - 1; index >= 0; index--) {
try {
dbHelpers.get(index).close();
} catch (RuntimeException ignored) {
}
}
dbHelpers.clear();
}
/**
* Register a handler in the package manager for a image capture intent
*/
@@ -137,87 +168,110 @@ public class LoyaltyCardViewActivityTest {
final String barcodeType,
final String barcodeEncoding,
boolean creatingNewCard) throws ParseException {
SQLiteDatabase database = new DBHelper(activity).getWritableDatabase();
if (creatingNewCard) {
assertEquals(0, DBHelper.getLoyaltyCardCount(database));
} else {
DBHelper dbHelper = new DBHelper(activity);
SQLiteDatabase database = dbHelper.getWritableDatabase();
try {
if (creatingNewCard) {
assertEquals(0, DBHelper.getLoyaltyCardCount(database));
} else {
assertEquals(1, DBHelper.getLoyaltyCardCount(database));
}
final EditText storeField = activity.findViewById(R.id.storeNameEdit);
final EditText noteField = activity.findViewById(R.id.noteEdit);
final TextInputLayout validFromView = activity.findViewById(R.id.validFromView);
final TextInputLayout expiryView = activity.findViewById(R.id.expiryView);
final EditText balanceView = activity.findViewById(R.id.balanceField);
final EditText balanceCurrencyField = activity.findViewById(R.id.balanceCurrencyField);
final TextView cardIdField = activity.findViewById(R.id.cardIdView);
final TextView barcodeIdField = activity.findViewById(R.id.barcodeIdField);
final TextView barcodeTypeField = activity.findViewById(R.id.barcodeTypeField);
final TextView barcodeEncodingField = activity.findViewById(R.id.barcodeEncodingField);
storeField.setText(store);
noteField.setText(note);
validFromView.setTag(validFrom);
expiryView.setTag(expiry);
balanceView.setText(balance.toPlainString());
balanceCurrencyField.setText(balanceType);
cardIdField.setText(cardId);
barcodeIdField.setText(barcodeId);
barcodeTypeField.setText(barcodeType);
barcodeEncodingField.setText(barcodeEncoding);
assertEquals(false, activity.isFinishing());
activity.findViewById(R.id.fabSave).performClick();
assertEquals(true, activity.isFinishing());
assertEquals(1, DBHelper.getLoyaltyCardCount(database));
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), database, 1);
assertEquals(store, card.store);
assertEquals(note, card.note);
assertEquals(balance, card.balance);
// The special "Any date" string shouldn't actually be written to the loyalty card
if (validFrom.equals(activity.getApplicationContext().getString(R.string.anyDate))) {
assertEquals(null, card.validFrom);
} else {
assertEquals(DateFormat.getDateInstance().parse(validFrom), card.validFrom);
}
// The special "Never" string shouldn't actually be written to the loyalty card
if (expiry.equals(activity.getApplicationContext().getString(R.string.never))) {
assertEquals(null, card.expiry);
} else {
assertEquals(DateFormat.getDateInstance().parse(expiry), card.expiry);
}
// The special "Points" string shouldn't actually be written to the loyalty card
if (balanceType.equals(activity.getApplicationContext().getString(R.string.points))) {
assertEquals(null, card.balanceType);
} else {
assertEquals(Currency.getInstance(balanceType), card.balanceType);
}
assertEquals(cardId, card.cardId);
// The special "Same as barcode ID" string shouldn't actually be written to the loyalty card
if (barcodeId.equals(activity.getApplicationContext().getString(R.string.sameAsCardId))) {
assertEquals(null, card.barcodeId);
} else {
assertEquals(barcodeId, card.barcodeId);
}
// The special "No barcode" string shouldn't actually be written to the loyalty card
if (barcodeType.equals(activity.getApplicationContext().getString(R.string.noBarcode))) {
assertEquals(null, card.barcodeType);
} else {
assertEquals(CatimaBarcode.fromName(barcodeType).format(), card.barcodeType.format());
}
assertEquals(Charset.forName(barcodeEncoding), card.barcodeEncoding);
assertNotNull(card.headerColor);
} finally {
dbHelper.close();
}
}
final EditText storeField = activity.findViewById(R.id.storeNameEdit);
final EditText noteField = activity.findViewById(R.id.noteEdit);
final TextInputLayout validFromView = activity.findViewById(R.id.validFromView);
final TextInputLayout expiryView = activity.findViewById(R.id.expiryView);
final EditText balanceView = activity.findViewById(R.id.balanceField);
final EditText balanceCurrencyField = activity.findViewById(R.id.balanceCurrencyField);
final TextView cardIdField = activity.findViewById(R.id.cardIdView);
final TextView barcodeIdField = activity.findViewById(R.id.barcodeIdField);
final TextView barcodeTypeField = activity.findViewById(R.id.barcodeTypeField);
final TextView barcodeEncodingField = activity.findViewById(R.id.barcodeEncodingField);
private SQLiteDatabase getWritableEmptyDatabase(Context context) {
DBHelper dbHelper = TestHelpers.getEmptyDb(context);
dbHelpers.add(dbHelper);
return dbHelper.getWritableDatabase();
}
storeField.setText(store);
noteField.setText(note);
validFromView.setTag(validFrom);
expiryView.setTag(expiry);
balanceView.setText(balance.toPlainString());
balanceCurrencyField.setText(balanceType);
cardIdField.setText(cardId);
barcodeIdField.setText(barcodeId);
barcodeTypeField.setText(barcodeType);
barcodeEncodingField.setText(barcodeEncoding);
private <T extends Activity> ActivityController<T> trackActivityController(ActivityController<T> activityController) {
activityControllers.add(activityController);
return activityController;
}
assertEquals(false, activity.isFinishing());
activity.findViewById(R.id.fabSave).performClick();
assertEquals(true, activity.isFinishing());
assertEquals(1, DBHelper.getLoyaltyCardCount(database));
LoyaltyCard card = DBHelper.getLoyaltyCard(activity.getApplicationContext(), database, 1);
assertEquals(store, card.store);
assertEquals(note, card.note);
assertEquals(balance, card.balance);
// The special "Any date" string shouldn't actually be written to the loyalty card
if (validFrom.equals(activity.getApplicationContext().getString(R.string.anyDate))) {
assertEquals(null, card.validFrom);
private void checkFieldType(final Activity activity, final int id, FieldTypeView fieldTypeView) {
final View view = activity.findViewById(id);
if (fieldTypeView == FieldTypeView.TextView) {
assertTrue(view instanceof TextView);
} else {
assertEquals(DateFormat.getDateInstance().parse(validFrom), card.validFrom);
assertTrue(view instanceof TextInputLayout || view instanceof ImageView);
}
// The special "Never" string shouldn't actually be written to the loyalty card
if (expiry.equals(activity.getApplicationContext().getString(R.string.never))) {
assertEquals(null, card.expiry);
} else {
assertEquals(DateFormat.getDateInstance().parse(expiry), card.expiry);
}
// The special "Points" string shouldn't actually be written to the loyalty card
if (balanceType.equals(activity.getApplicationContext().getString(R.string.points))) {
assertEquals(null, card.balanceType);
} else {
assertEquals(Currency.getInstance(balanceType), card.balanceType);
}
assertEquals(cardId, card.cardId);
// The special "Same as barcode ID" string shouldn't actually be written to the loyalty card
if (barcodeId.equals(activity.getApplicationContext().getString(R.string.sameAsCardId))) {
assertEquals(null, card.barcodeId);
} else {
assertEquals(barcodeId, card.barcodeId);
}
// The special "No barcode" string shouldn't actually be written to the loyalty card
if (barcodeType.equals(activity.getApplicationContext().getString(R.string.noBarcode))) {
assertEquals(null, card.barcodeType);
} else {
assertEquals(CatimaBarcode.fromName(barcodeType).format(), card.barcodeType.format());
}
assertEquals(Charset.forName(barcodeEncoding), card.barcodeEncoding);
assertNotNull(card.headerColor);
database.close();
}
/**
@@ -357,7 +411,7 @@ public class LoyaltyCardViewActivityTest {
@Test
@Config(qualifiers="de")
public void noCrashOnRegionlessLocale() {
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class).create();
ActivityController activityController = trackActivityController(Robolectric.buildActivity(LoyaltyCardEditActivity.class).create());
LoyaltyCardEditActivity activity = (LoyaltyCardEditActivity) activityController.get();
final Context context = activity.getApplicationContext();
@@ -375,107 +429,110 @@ public class LoyaltyCardViewActivityTest {
@Test
public void noDataLossOnResumeOrRotate() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
try {
registerMediaStoreIntentHandler();
registerMediaStoreIntentHandler();
Integer cardId;
Integer cardId;
for (boolean newCard : new boolean[]{false, true}) {
System.out.println();
System.out.println("=====");
System.out.println("New card? " + newCard);
System.out.println("=====");
System.out.println();
for (boolean newCard : new boolean[]{false, true}) {
System.out.println();
System.out.println("=====");
System.out.println("New card? " + newCard);
System.out.println("=====");
System.out.println();
if (!newCard) {
cardId = (int) DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.UTF_8, Color.BLACK, 0, null, 0);
} else {
cardId = null;
}
if (!newCard) {
cardId = (int) DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.UTF_8, Color.BLACK, 0, null, 0);
} else {
cardId = null;
ActivityController activityController = createActivityWithLoyaltyCard(true, cardId);
LoyaltyCardEditActivity activity = (LoyaltyCardEditActivity) activityController.get();
activityController.start();
activityController.visible();
activityController.resume();
shadowOf(getMainLooper()).idle();
// Check default settings
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, newCard ? "" : "store", newCard ? "" : "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), newCard ? "" : EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), newCard ? context.getString(R.string.noBarcode) : EAN_BARCODE_TYPE.prettyName(), newCard ? "ISO-8859-1" : "UTF-8", null, null);
// Change everything
final EditText storeField = activity.findViewById(R.id.storeNameEdit);
final EditText noteField = activity.findViewById(R.id.noteEdit);
final EditText validFromField = activity.findViewById(R.id.validFromField);
final EditText expiryField = activity.findViewById(R.id.expiryField);
final EditText balanceField = activity.findViewById(R.id.balanceField);
final EditText balanceTypeField = activity.findViewById(R.id.balanceCurrencyField);
final EditText cardIdField = activity.findViewById(R.id.cardIdView);
final EditText barcodeField = activity.findViewById(R.id.barcodeIdField);
final EditText barcodeTypeField = activity.findViewById(R.id.barcodeTypeField);
final EditText barcodeEncodingField = activity.findViewById(R.id.barcodeEncodingField);
final ImageView frontImageView = activity.findViewById(R.id.frontImage);
final ImageView backImageView = activity.findViewById(R.id.backImage);
Currency currency = Currency.getInstance("EUR");
Date validFromDate = Date.from(Instant.now().minus(20, ChronoUnit.DAYS));
Date expiryDate = new Date();
Bitmap frontBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.circle);
Bitmap backBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_done);
storeField.setText("correct store");
noteField.setText("correct note");
LoyaltyCardEditActivity.formatDateField(context, validFromField, validFromDate);
activity.setLoyaltyCardValidFrom(validFromDate);
LoyaltyCardEditActivity.formatDateField(context, expiryField, expiryDate);
activity.setLoyaltyCardExpiry(expiryDate);
balanceField.setText("100");
balanceTypeField.setText(currency.getSymbol());
cardIdField.setText("12345678");
barcodeField.setText("87654321");
barcodeTypeField.setText(CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName());
barcodeEncodingField.setText(StandardCharsets.ISO_8859_1.name());
activity.setCardImage(ImageLocationType.front, frontImageView, frontBitmap, true);
activity.setCardImage(ImageLocationType.back, backImageView, backBitmap, true);
shadowOf(getMainLooper()).idle();
// Check if changed
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap);
// Resume
activityController.pause();
activityController.resume();
shadowOf(getMainLooper()).idle();
// Check if no changes lost
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap);
// Rotate to landscape
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
activity.recreate();
shadowOf(getMainLooper()).idle();
// Check if no changes lost
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap);
// Rotate to portrait
shadowOf(getMainLooper()).idle();
activity.recreate();
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
// Check if no changes lost
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap);
}
ActivityController activityController = createActivityWithLoyaltyCard(true, cardId);
LoyaltyCardEditActivity activity = (LoyaltyCardEditActivity) activityController.get();
activityController.start();
activityController.visible();
activityController.resume();
shadowOf(getMainLooper()).idle();
// Check default settings
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, newCard ? "" : "store", newCard ? "" : "note", context.getString(R.string.anyDate), context.getString(R.string.never), "0", context.getString(R.string.points), newCard ? "" : EAN_BARCODE_DATA, context.getString(R.string.sameAsCardId), newCard ? context.getString(R.string.noBarcode) : EAN_BARCODE_TYPE.prettyName(), newCard ? "ISO-8859-1" : "UTF-8", null, null);
// Change everything
final EditText storeField = activity.findViewById(R.id.storeNameEdit);
final EditText noteField = activity.findViewById(R.id.noteEdit);
final EditText validFromField = activity.findViewById(R.id.validFromField);
final EditText expiryField = activity.findViewById(R.id.expiryField);
final EditText balanceField = activity.findViewById(R.id.balanceField);
final EditText balanceTypeField = activity.findViewById(R.id.balanceCurrencyField);
final EditText cardIdField = activity.findViewById(R.id.cardIdView);
final EditText barcodeField = activity.findViewById(R.id.barcodeIdField);
final EditText barcodeTypeField = activity.findViewById(R.id.barcodeTypeField);
final EditText barcodeEncodingField = activity.findViewById(R.id.barcodeEncodingField);
final ImageView frontImageView = activity.findViewById(R.id.frontImage);
final ImageView backImageView = activity.findViewById(R.id.backImage);
Currency currency = Currency.getInstance("EUR");
Date validFromDate = Date.from(Instant.now().minus(20, ChronoUnit.DAYS));
Date expiryDate = new Date();
Bitmap frontBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.circle);
Bitmap backBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_done);
storeField.setText("correct store");
noteField.setText("correct note");
LoyaltyCardEditActivity.formatDateField(context, validFromField, validFromDate);
activity.setLoyaltyCardValidFrom(validFromDate);
LoyaltyCardEditActivity.formatDateField(context, expiryField, expiryDate);
activity.setLoyaltyCardExpiry(expiryDate);
balanceField.setText("100");
balanceTypeField.setText(currency.getSymbol());
cardIdField.setText("12345678");
barcodeField.setText("87654321");
barcodeTypeField.setText(CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName());
barcodeEncodingField.setText(StandardCharsets.ISO_8859_1.name());
activity.setCardImage(ImageLocationType.front, frontImageView, frontBitmap, true);
activity.setCardImage(ImageLocationType.back, backImageView, backBitmap, true);
shadowOf(getMainLooper()).idle();
// Check if changed
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap);
// Resume
activityController.pause();
activityController.resume();
shadowOf(getMainLooper()).idle();
// Check if no changes lost
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap);
// Rotate to landscape
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
activity.recreate();
shadowOf(getMainLooper()).idle();
// Check if no changes lost
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap);
// Rotate to portrait
shadowOf(getMainLooper()).idle();
activity.recreate();
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
// Check if no changes lost
checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(validFromDate), DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", CatimaBarcode.fromBarcode(BarcodeFormat.QR_CODE).prettyName(), StandardCharsets.ISO_8859_1.name(), frontBitmap, backBitmap);
} finally {
database.close();
}
}
@Test
public void startWithoutParametersCheckFieldsAvailable() {
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class).create();
ActivityController activityController = trackActivityController(Robolectric.buildActivity(LoyaltyCardEditActivity.class).create());
activityController.start();
activityController.visible();
activityController.resume();
@@ -489,9 +546,9 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithoutParametersCannotCreateLoyaltyCard() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class).create();
ActivityController activityController = trackActivityController(Robolectric.buildActivity(LoyaltyCardEditActivity.class).create());
activityController.start();
activityController.visible();
activityController.resume();
@@ -519,7 +576,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithoutParametersBack() {
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class).create();
ActivityController activityController = trackActivityController(Robolectric.buildActivity(LoyaltyCardEditActivity.class).create());
activityController.start();
activityController.visible();
activityController.resume();
@@ -535,7 +592,7 @@ public class LoyaltyCardViewActivityTest {
public void startWithoutParametersCaptureBarcodeCreateLoyaltyCard() throws IOException, ParseException {
registerMediaStoreIntentHandler();
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class).create();
ActivityController activityController = trackActivityController(Robolectric.buildActivity(LoyaltyCardEditActivity.class).create());
activityController.start();
activityController.visible();
activityController.resume();
@@ -559,7 +616,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithoutParametersCaptureBarcodeFailure() throws IOException {
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class).create();
ActivityController activityController = trackActivityController(Robolectric.buildActivity(LoyaltyCardEditActivity.class).create());
activityController.start();
activityController.visible();
activityController.resume();
@@ -580,7 +637,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithoutParametersCaptureBarcodeCancel() throws IOException {
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class).create();
ActivityController activityController = trackActivityController(Robolectric.buildActivity(LoyaltyCardEditActivity.class).create());
activityController.start();
activityController.visible();
activityController.resume();
@@ -631,13 +688,13 @@ public class LoyaltyCardViewActivityTest {
intent.putExtras(bundle);
return Robolectric.buildActivity(clazz, intent).create();
return trackActivityController(Robolectric.buildActivity(clazz, intent).create());
}
@Test
public void startWithLoyaltyCardEditModeCheckDisplay() throws IOException {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -656,7 +713,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardViewModeCheckDisplay() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, StandardCharsets.UTF_8, Color.BLACK, 0, null, 0);
@@ -675,7 +732,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardWithBarcodeUpdateBarcode() throws IOException {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.UTF_8, Color.BLACK, 0, null, 0);
@@ -700,7 +757,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardWithReceiptUpdateReceiptCancel() throws IOException {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -739,7 +796,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardNoExpirySetExpiry() throws IOException {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -772,7 +829,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardExpirySetNoExpiry() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, new Date(), new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -797,7 +854,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardNoBalanceSetBalance() throws IOException {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -848,7 +905,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardBalanceSetNoBalance() throws IOException {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("10.00"), Currency.getInstance("USD"), EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -889,7 +946,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardSameAsCardIDUpdateBarcodeID() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -921,7 +978,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardSameAsCardIDUpdateCardID() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, null, EAN_BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -955,7 +1012,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardDifferentFromCardIDUpdateCardIDUpdate() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -992,7 +1049,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithLoyaltyCardDifferentFromCardIDUpdateCardIDDoNotUpdate() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, EAN_BARCODE_DATA, "123456", EAN_BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -1029,7 +1086,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void checkMenu() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -1074,7 +1131,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithoutParametersViewBack() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -1095,7 +1152,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startWithoutColors() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, StandardCharsets.ISO_8859_1, null, 0, null, 0);
@@ -1116,7 +1173,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startLoyaltyCardWithoutColorsSave() throws IOException, ParseException {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, StandardCharsets.ISO_8859_1, null, 0, null, 0);
@@ -1136,7 +1193,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void startLoyaltyCardWithExplicitNoBarcodeSave() throws IOException, ParseException {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, null, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -1156,7 +1213,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void removeBarcodeFromLoyaltyCard() throws IOException, ParseException {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -1187,7 +1244,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void checkPushStarIcon() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -1224,7 +1281,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void checkBarcodeFullscreenWorkflow() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, BARCODE_TYPE, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -1320,7 +1377,7 @@ public class LoyaltyCardViewActivityTest {
@Test
public void checkNoBarcodeFullscreenWorkflow() {
final Context context = ApplicationProvider.getApplicationContext();
SQLiteDatabase database = TestHelpers.getEmptyDb(context).getWritableDatabase();
SQLiteDatabase database = getWritableEmptyDatabase(context);
long cardId = DBHelper.insertLoyaltyCard(database, "store", "note", null, null, new BigDecimal("0"), null, BARCODE_DATA, null, null, StandardCharsets.ISO_8859_1, Color.BLACK, 0, null, 0);
@@ -1366,7 +1423,7 @@ public class LoyaltyCardViewActivityTest {
Intent intent = new Intent();
intent.setData(importUri);
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class, intent).create();
ActivityController activityController = trackActivityController(Robolectric.buildActivity(LoyaltyCardEditActivity.class, intent).create());
activityController.start();
activityController.visible();
@@ -1388,7 +1445,7 @@ public class LoyaltyCardViewActivityTest {
Intent intent = new Intent();
intent.setData(importUri);
ActivityController activityController = Robolectric.buildActivity(LoyaltyCardEditActivity.class, intent).create();
ActivityController activityController = trackActivityController(Robolectric.buildActivity(LoyaltyCardEditActivity.class, intent).create());
activityController.start();
activityController.visible();

View File

@@ -22,19 +22,20 @@ public class TestHelpers {
SQLiteDatabase database = db.getWritableDatabase();
// Make sure no files remain
Cursor cursor = DBHelper.getLoyaltyCardCursor(database);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
int cardID = cursor.getColumnIndex(DBHelper.LoyaltyCardDbIds.ID);
try (Cursor cursor = DBHelper.getLoyaltyCardCursor(database)) {
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
int cardID = cursor.getColumnIndex(DBHelper.LoyaltyCardDbIds.ID);
for (ImageLocationType imageLocationType : ImageLocationType.values()) {
try {
Utils.saveCardImage(context.getApplicationContext(), null, cardID, imageLocationType);
} catch (FileNotFoundException ignored) {
for (ImageLocationType imageLocationType : ImageLocationType.values()) {
try {
Utils.saveCardImage(context.getApplicationContext(), null, cardID, imageLocationType);
} catch (FileNotFoundException ignored) {
}
}
}
cursor.moveToNext();
cursor.moveToNext();
}
}
// Make sure DB is empty