diff --git a/CHANGELOG.md b/CHANGELOG.md index 968c7068d..ff1d21607 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## v2.2.2 (2021-08-08) + +Changes: + +- Fix crash on rotation in loyalty card edit activity + ## v2.2.1 (2021-08-07) Changes: diff --git a/app/build.gradle b/app/build.gradle index 6272418bf..a5ada6698 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { applicationId "me.hackerchick.catima" minSdkVersion 19 targetSdkVersion 30 - versionCode 77 - versionName "2.2.1" + versionCode 78 + versionName "2.2.2" vectorDrawables.useSupportLibrary true multiDexEnabled true diff --git a/app/src/main/java/protect/card_locker/LoyaltyCard.java b/app/src/main/java/protect/card_locker/LoyaltyCard.java index f7f165d25..75b82f87b 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCard.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCard.java @@ -1,6 +1,8 @@ package protect.card_locker; import android.database.Cursor; +import android.os.Parcel; +import android.os.Parcelable; import com.google.zxing.BarcodeFormat; @@ -10,7 +12,7 @@ import java.util.Date; import androidx.annotation.Nullable; -public class LoyaltyCard { +public class LoyaltyCard implements Parcelable { public final int id; public final String store; public final String note; @@ -22,6 +24,7 @@ public class LoyaltyCard { @Nullable public final String barcodeId; + @Nullable public final BarcodeFormat barcodeType; @Nullable @@ -31,7 +34,7 @@ public class LoyaltyCard { public LoyaltyCard(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 BarcodeFormat barcodeType, final Integer headerColor, + @Nullable final String barcodeId, @Nullable final BarcodeFormat barcodeType, @Nullable final Integer headerColor, final int starStatus) { this.id = id; @@ -47,6 +50,38 @@ public class LoyaltyCard { this.starStatus = starStatus; } + protected LoyaltyCard(Parcel in) { + id = in.readInt(); + store = in.readString(); + note = in.readString(); + long tmpExpiry = in.readLong(); + expiry = tmpExpiry != -1 ? new Date(tmpExpiry) : null; + balance = (BigDecimal) in.readValue(BigDecimal.class.getClassLoader()); + balanceType = (Currency) in.readValue(Currency.class.getClassLoader()); + cardId = in.readString(); + barcodeId = in.readString(); + String tmpBarcodeType = in.readString(); + barcodeType = !tmpBarcodeType.isEmpty() ? BarcodeFormat.valueOf(tmpBarcodeType) : null; + int tmpHeaderColor = in.readInt(); + headerColor = tmpHeaderColor != -1 ? tmpHeaderColor : null; + starStatus = in.readInt(); + } + + @Override + public void writeToParcel(Parcel parcel, int i) { + parcel.writeInt(id); + parcel.writeString(store); + parcel.writeString(note); + parcel.writeLong(expiry != null ? expiry.getTime() : -1); + parcel.writeValue(balance); + parcel.writeValue(balanceType); + parcel.writeString(cardId); + parcel.writeString(barcodeId); + parcel.writeString(barcodeType != null ? barcodeType.toString() : ""); + parcel.writeInt(headerColor != null ? headerColor : -1); + parcel.writeInt(starStatus); + } + public static LoyaltyCard toLoyaltyCard(Cursor cursor) { int id = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID)); @@ -89,4 +124,21 @@ public class LoyaltyCard { return new LoyaltyCard(id, store, note, expiry, balance, balanceType, cardId, barcodeId, barcodeType, headerColor, starred); } + + @Override + public int describeContents() { + return id; + } + + public static final Creator CREATOR = new Creator() { + @Override + public LoyaltyCard createFromParcel(Parcel in) { + return new LoyaltyCard(in); + } + + @Override + public LoyaltyCard[] newArray(int size) { + return new LoyaltyCard[size]; + } + }; } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java index e44693cc3..84075b1a3 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java @@ -78,6 +78,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity private static final String TAG = "Catima"; private final String STATE_TAB_INDEX = "savedTab"; + private final String STATE_TEMP_CARD = "tempLoyaltyCard"; private static final int ID_IMAGE_FRONT = 0; private static final int ID_IMAGE_BACK = 1; @@ -185,10 +186,12 @@ public class LoyaltyCardEditActivity extends AppCompatActivity super.onSaveInstanceState(savedInstanceState); tabs = findViewById(R.id.tabs); savedInstanceState.putInt(STATE_TAB_INDEX, tabs.getSelectedTabPosition()); + savedInstanceState.putParcelable(STATE_TEMP_CARD, tempLoyaltyCard); } @Override public void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { + tempLoyaltyCard = savedInstanceState.getParcelable(STATE_TEMP_CARD); super.onRestoreInstanceState(savedInstanceState); tabs = findViewById(R.id.tabs); tabs.selectTab(tabs.getTabAt(savedInstanceState.getInt(STATE_TAB_INDEX))); diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java index 822af12cd..27aaf2f72 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java @@ -344,7 +344,7 @@ public class LoyaltyCardViewActivityTest } @Test - public void noDataLossOnResume() + public void noDataLossOnResumeOrRotate() { registerMediaStoreIntentHandler(); @@ -421,6 +421,22 @@ public class LoyaltyCardViewActivityTest // Check if no changes lost checkAllFields(activity, newCard ? ViewMode.ADD_CARD : ViewMode.UPDATE_CARD, "correct store", "correct note", DateFormat.getDateInstance(DateFormat.LONG).format(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", BarcodeFormat.QR_CODE.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(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", BarcodeFormat.QR_CODE.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(expiryDate), "100.00", currency.getSymbol(), "12345678", "87654321", BarcodeFormat.QR_CODE.name(), frontBitmap, backBitmap); } }