diff --git a/app/src/main/java/protect/card_locker/CsvDatabaseExporter.java b/app/src/main/java/protect/card_locker/CsvDatabaseExporter.java index b43e38cc2..a4c8fdb28 100644 --- a/app/src/main/java/protect/card_locker/CsvDatabaseExporter.java +++ b/app/src/main/java/protect/card_locker/CsvDatabaseExporter.java @@ -49,6 +49,7 @@ public class CsvDatabaseExporter implements DatabaseExporter printer.printRecord(DBHelper.LoyaltyCardDbIds.ID, DBHelper.LoyaltyCardDbIds.STORE, DBHelper.LoyaltyCardDbIds.NOTE, + DBHelper.LoyaltyCardDbIds.EXPIRY, DBHelper.LoyaltyCardDbIds.CARD_ID, DBHelper.LoyaltyCardDbIds.HEADER_COLOR, DBHelper.LoyaltyCardDbIds.BARCODE_TYPE, @@ -63,6 +64,7 @@ public class CsvDatabaseExporter implements DatabaseExporter printer.printRecord(card.id, card.store, card.note, + card.expiry != null ? card.expiry.getTime() : "", card.cardId, card.headerColor, card.barcodeType, diff --git a/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java b/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java index 6f68d318a..5040ddfcd 100644 --- a/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java +++ b/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java @@ -10,6 +10,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.StringReader; +import java.util.Date; import java.util.List; /** @@ -249,6 +250,36 @@ public class CsvDatabaseImporter implements DatabaseImporter } } + /** + * Extract a long from the items array. The index into the array + * is determined by looking up the index in the fields map using the + * "key" as the key. If no such key exists, or the data is not a valid + * int, a FormatException is thrown. + */ + private Long extractLong(String key, CSVRecord record, boolean nullIsOk) + throws FormatException + { + if(record.isMapped(key) == false) + { + throw new FormatException("Field not used but expected: " + key); + } + + String value = record.get(key); + if(value.isEmpty() && nullIsOk) + { + return null; + } + + try + { + return Long.parseLong(record.get(key)); + } + catch(NumberFormatException e) + { + throw new FormatException("Failed to parse field: " + key, e); + } + } + /** * Import a single loyalty card into the database using the given * session. @@ -265,6 +296,10 @@ public class CsvDatabaseImporter implements DatabaseImporter } String note = extractString(DBHelper.LoyaltyCardDbIds.NOTE, record, ""); + Date expiry = null; + try { + expiry = new Date(extractLong(DBHelper.LoyaltyCardDbIds.EXPIRY, record, true)); + } catch (NullPointerException | FormatException e) { } String cardId = extractString(DBHelper.LoyaltyCardDbIds.CARD_ID, record, ""); if(cardId.isEmpty()) @@ -289,7 +324,7 @@ public class CsvDatabaseImporter implements DatabaseImporter // We catch this exception so we can still import old backups } if (starStatus != 1) starStatus = 0; - helper.insertLoyaltyCard(database, id, store, note, cardId, barcodeType, headerColor, starStatus); + helper.insertLoyaltyCard(database, id, store, note, expiry, cardId, barcodeType, headerColor, starStatus); } /** diff --git a/app/src/main/java/protect/card_locker/DBHelper.java b/app/src/main/java/protect/card_locker/DBHelper.java index 5536eaaa6..1f0506054 100644 --- a/app/src/main/java/protect/card_locker/DBHelper.java +++ b/app/src/main/java/protect/card_locker/DBHelper.java @@ -7,6 +7,7 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.graphics.Color; +import java.util.Date; import java.util.ArrayList; import java.util.List; @@ -14,7 +15,7 @@ public class DBHelper extends SQLiteOpenHelper { public static final String DATABASE_NAME = "Catima.db"; public static final int ORIGINAL_DATABASE_VERSION = 1; - public static final int DATABASE_VERSION = 6; + public static final int DATABASE_VERSION = 7; static class LoyaltyCardDbGroups { @@ -28,6 +29,7 @@ public class DBHelper extends SQLiteOpenHelper public static final String TABLE = "cards"; public static final String ID = "_id"; public static final String STORE = "store"; + public static final String EXPIRY = "expiry"; public static final String NOTE = "note"; public static final String HEADER_COLOR = "headercolor"; public static final String HEADER_TEXT_COLOR = "headertextcolor"; @@ -61,6 +63,7 @@ public class DBHelper extends SQLiteOpenHelper LoyaltyCardDbIds.ID + " INTEGER primary key autoincrement," + LoyaltyCardDbIds.STORE + " TEXT not null," + LoyaltyCardDbIds.NOTE + " TEXT not null," + + LoyaltyCardDbIds.EXPIRY + " INTEGER," + LoyaltyCardDbIds.HEADER_COLOR + " INTEGER," + LoyaltyCardDbIds.HEADER_TEXT_COLOR + " INTEGER," + LoyaltyCardDbIds.CARD_ID + " TEXT not null," + @@ -118,16 +121,23 @@ public class DBHelper extends SQLiteOpenHelper db.execSQL("ALTER TABLE " + LoyaltyCardDbGroups.TABLE + " ADD COLUMN " + LoyaltyCardDbGroups.ORDER + " INTEGER DEFAULT '0'"); } + + if(oldVersion < 7 && newVersion >= 7) + { + db.execSQL("ALTER TABLE " + LoyaltyCardDbIds.TABLE + + " ADD COLUMN " + LoyaltyCardDbIds.EXPIRY + " INTEGER"); + } } - public long insertLoyaltyCard(final String store, final String note, final String cardId, - final String barcodeType, final Integer headerColor, - final int starStatus) + public long insertLoyaltyCard(final String store, final String note, final Date expiry, + final String cardId, final String barcodeType, + final Integer headerColor, final int starStatus) { SQLiteDatabase db = getWritableDatabase(); 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.CARD_ID, cardId); contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType); contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); @@ -138,7 +148,7 @@ public class DBHelper extends SQLiteOpenHelper } public boolean insertLoyaltyCard(final SQLiteDatabase db, final int id, final String store, - final String note, final String cardId, + final String note, final Date expiry, final String cardId, final String barcodeType, final Integer headerColor, final int starStatus) { @@ -146,6 +156,7 @@ public class DBHelper extends SQLiteOpenHelper contentValues.put(LoyaltyCardDbIds.ID, id); contentValues.put(LoyaltyCardDbIds.STORE, store); contentValues.put(LoyaltyCardDbIds.NOTE, note); + contentValues.put(LoyaltyCardDbIds.EXPIRY, expiry != null ? expiry.getTime() : null); contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId); contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType); contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); @@ -156,13 +167,14 @@ public class DBHelper extends SQLiteOpenHelper } public boolean updateLoyaltyCard(final int id, final String store, final String note, - final String cardId, final String barcodeType, - final Integer headerColor) + final Date expiry, final String cardId, + final String barcodeType, final Integer headerColor) { SQLiteDatabase db = getWritableDatabase(); 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.CARD_ID, cardId); contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType); contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); diff --git a/app/src/main/java/protect/card_locker/ImportURIHelper.java b/app/src/main/java/protect/card_locker/ImportURIHelper.java index 8601a9e9c..9f9915e3a 100644 --- a/app/src/main/java/protect/card_locker/ImportURIHelper.java +++ b/app/src/main/java/protect/card_locker/ImportURIHelper.java @@ -4,10 +4,12 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; import java.io.InvalidObjectException; +import java.util.Date; public class ImportURIHelper { private static final String STORE = DBHelper.LoyaltyCardDbIds.STORE; private static final String NOTE = DBHelper.LoyaltyCardDbIds.NOTE; + private static final String EXPIRY = DBHelper.LoyaltyCardDbIds.EXPIRY; private static final String CARD_ID = DBHelper.LoyaltyCardDbIds.CARD_ID; private static final String BARCODE_TYPE = DBHelper.LoyaltyCardDbIds.BARCODE_TYPE; @@ -45,6 +47,7 @@ public class ImportURIHelper { String store = uri.getQueryParameter(STORE); String note = uri.getQueryParameter(NOTE); + long expiry = Long.parseLong(uri.getQueryParameter(EXPIRY)); String cardId = uri.getQueryParameter(CARD_ID); String barcodeType = uri.getQueryParameter(BARCODE_TYPE); if (store == null || note == null || cardId == null || barcodeType == null) throw new InvalidObjectException("Not a valid import URI"); @@ -55,7 +58,7 @@ public class ImportURIHelper { headerColor = Integer.parseInt(unparsedHeaderColor); } - return new LoyaltyCard(-1, store, note, cardId, barcodeType, headerColor, headerTextColor, 0); + return new LoyaltyCard(-1, store, note, new Date(expiry), cardId, barcodeType, headerColor, headerTextColor, 0); } catch (NullPointerException | NumberFormatException ex) { throw new InvalidObjectException("Not a valid import URI"); } @@ -69,6 +72,7 @@ public class ImportURIHelper { uriBuilder.path(path); uriBuilder.appendQueryParameter(STORE, loyaltyCard.store); uriBuilder.appendQueryParameter(NOTE, loyaltyCard.note); + uriBuilder.appendQueryParameter(EXPIRY, String.valueOf(loyaltyCard.expiry.getTime())); uriBuilder.appendQueryParameter(CARD_ID, loyaltyCard.cardId); uriBuilder.appendQueryParameter(BARCODE_TYPE, loyaltyCard.barcodeType); if(loyaltyCard.headerColor != null) diff --git a/app/src/main/java/protect/card_locker/LoyaltyCard.java b/app/src/main/java/protect/card_locker/LoyaltyCard.java index 67cb4de64..b8dcaf1d8 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCard.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCard.java @@ -2,6 +2,9 @@ package protect.card_locker; import android.database.Cursor; +import java.text.DateFormat; +import java.util.Date; + import androidx.annotation.Nullable; public class LoyaltyCard @@ -9,6 +12,7 @@ public class LoyaltyCard public final int id; public final String store; public final String note; + public final Date expiry; public final String cardId; public final String barcodeType; @@ -20,13 +24,14 @@ public class LoyaltyCard public final int starStatus; - public LoyaltyCard(final int id, final String store, final String note, final String cardId, + public LoyaltyCard(final int id, final String store, final String note, final Date expiry, final String cardId, final String barcodeType, final Integer headerColor, final Integer headerTextColor, final int starStatus) { this.id = id; this.store = store; this.note = note; + this.expiry = expiry; this.cardId = cardId; this.barcodeType = barcodeType; this.headerColor = headerColor; @@ -39,17 +44,23 @@ public class LoyaltyCard int id = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.ID)); String store = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STORE)); String note = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.NOTE)); + long expiryLong = cursor.getLong(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.EXPIRY)); String cardId = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.CARD_ID)); String barcodeType = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.BARCODE_TYPE)); int starred = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.STAR_STATUS)); - int headerColorColumn = cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.HEADER_COLOR); int headerTextColorColumn = cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR); + Date expiry = null; Integer headerColor = null; Integer headerTextColor = null; + if(expiryLong > 0) + { + expiry = new Date(expiryLong); + } + if(cursor.isNull(headerColorColumn) == false) { headerColor = cursor.getInt(headerColorColumn); @@ -60,6 +71,6 @@ public class LoyaltyCard headerTextColor = cursor.getInt(headerTextColorColumn); } - return new LoyaltyCard(id, store, note, cardId, barcodeType, headerColor, headerTextColor, starred); + return new LoyaltyCard(id, store, note, expiry, cardId, barcodeType, headerColor, headerTextColor, starred); } } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java index 92ceab89c..abe64d58e 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java @@ -8,6 +8,9 @@ import android.view.ViewGroup; import android.widget.CursorAdapter; import android.widget.ImageView; import android.widget.TextView; + +import java.text.DateFormat; + import protect.card_locker.preferences.Settings; class LoyaltyCardCursorAdapter extends CursorAdapter @@ -37,6 +40,7 @@ class LoyaltyCardCursorAdapter extends CursorAdapter ImageView thumbnail = view.findViewById(R.id.thumbnail); TextView storeField = view.findViewById(R.id.store); TextView noteField = view.findViewById(R.id.note); + TextView expiryField = view.findViewById(R.id.expiry); ImageView star = view.findViewById(R.id.star); // Extract properties from cursor @@ -58,6 +62,17 @@ class LoyaltyCardCursorAdapter extends CursorAdapter noteField.setVisibility(View.GONE); } + if(loyaltyCard.expiry != null) + { + expiryField.setVisibility(View.VISIBLE); + expiryField.setText(context.getString(R.string.expiryStateSentence, DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry))); + expiryField.setTextSize(settings.getCardNoteListFontSize()); + } + else + { + expiryField.setVisibility(View.GONE); + } + if (loyaltyCard.starStatus!=0) star.setVisibility(View.VISIBLE); else star.setVisibility(View.GONE); diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java index 73248475b..45c206a3e 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java @@ -1,5 +1,7 @@ package protect.card_locker; +import android.app.DatePickerDialog; +import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.content.res.TypedArray; @@ -15,6 +17,7 @@ import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; +import androidx.fragment.app.DialogFragment; import android.text.Editable; import android.text.TextWatcher; @@ -27,18 +30,25 @@ import android.view.ViewTreeObserver; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.Button; +import android.widget.CalendarView; +import android.widget.DatePicker; import android.widget.EditText; +import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.google.android.material.tabs.TabLayout; +import com.google.android.material.textfield.TextInputLayout; import com.google.zxing.BarcodeFormat; import com.jaredrummler.android.colorpicker.ColorPickerDialog; import com.jaredrummler.android.colorpicker.ColorPickerDialogListener; import java.io.InvalidObjectException; +import java.text.DateFormat; import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; import java.util.List; public class LoyaltyCardEditActivity extends AppCompatActivity @@ -51,9 +61,9 @@ public class LoyaltyCardEditActivity extends AppCompatActivity EditText storeFieldEdit; EditText noteFieldEdit; ChipGroup groupsChips; + AutoCompleteTextView expiryField; View cardAndBarcodeLayout; TextView cardIdFieldView; - View barcodeTypeView; AutoCompleteTextView barcodeTypeField; ImageView barcodeImage; View barcodeImageLayout; @@ -115,9 +125,9 @@ public class LoyaltyCardEditActivity extends AppCompatActivity storeFieldEdit = findViewById(R.id.storeNameEdit); noteFieldEdit = findViewById(R.id.noteEdit); groupsChips = findViewById(R.id.groupChips); + expiryField = findViewById(R.id.expiryField); cardAndBarcodeLayout = findViewById(R.id.cardAndBarcodeLayout); cardIdFieldView = findViewById(R.id.cardIdView); - barcodeTypeView = findViewById(R.id.barcodeTypeView); barcodeTypeField = findViewById(R.id.barcodeTypeField); barcodeImage = findViewById(R.id.barcode); barcodeImageLayout = findViewById(R.id.barcodeLayout); @@ -140,6 +150,37 @@ public class LoyaltyCardEditActivity extends AppCompatActivity public void afterTextChanged(Editable s) { } }); + expiryField.addTextChangedListener(new TextWatcher() { + CharSequence lastValue; + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + lastValue = s; + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + hasChanged = true; + + if (s.toString().equals(getString(R.string.never))) { + expiryField.setTag(null); + } else if (s.toString().equals(getString(R.string.chooseExpiryDate))) { + expiryField.setText(lastValue); + DialogFragment datePickerFragment = new DatePickerFragment(expiryField); + datePickerFragment.show(getSupportFragmentManager(), "datePicker"); + } + } + + @Override + public void afterTextChanged(Editable s) { + ArrayList expiryList = new ArrayList<>(); + expiryList.add(0, getString(R.string.never)); + expiryList.add(1, getString(R.string.chooseExpiryDate)); + ArrayAdapter expiryAdapter = new ArrayAdapter<>(LoyaltyCardEditActivity.this, android.R.layout.select_dialog_item, expiryList); + expiryField.setAdapter(expiryAdapter); + } + }); + cardIdFieldView.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @@ -215,6 +256,8 @@ public class LoyaltyCardEditActivity extends AppCompatActivity // Reset these fields, so they are re-populated in onResume(). storeFieldEdit.setText(""); noteFieldEdit.setText(""); + expiryField.setTag(null); + expiryField.setText(""); cardIdFieldView.setText(""); barcodeTypeField.setText(""); } @@ -247,6 +290,16 @@ public class LoyaltyCardEditActivity extends AppCompatActivity noteFieldEdit.setText(loyaltyCard.note); } + if(expiryField.getText().length() == 0) + { + expiryField.setTag(loyaltyCard.expiry); + if (loyaltyCard.expiry == null) { + expiryField.setText(getString(R.string.never)); + } else { + expiryField.setText(DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry)); + } + } + if(cardIdFieldView.getText().length() == 0) { cardIdFieldView.setText(loyaltyCard.cardId); @@ -282,6 +335,12 @@ public class LoyaltyCardEditActivity extends AppCompatActivity storeFieldEdit.setText(importCard.store); noteFieldEdit.setText(importCard.note); + expiryField.setTag(importCard.expiry); + if (importCard.expiry != null) { + expiryField.setText(DateFormat.getDateInstance(DateFormat.LONG).format(importCard.expiry)); + } else { + expiryField.setText(R.string.never); + } cardIdFieldView.setText(importCard.cardId); barcodeTypeField.setText(importCard.barcodeType); headingColorValue = importCard.headerColor; @@ -473,10 +532,58 @@ public class LoyaltyCardEditActivity extends AppCompatActivity } } + public static class DatePickerFragment extends DialogFragment + implements DatePickerDialog.OnDateSetListener { + + final EditText expiryFieldEdit; + + DatePickerFragment(EditText expiryFieldEdit) { + this.expiryFieldEdit = expiryFieldEdit; + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + // Use the current date as the default date in the picker + final Calendar c = Calendar.getInstance(); + + Date date = (Date) expiryFieldEdit.getTag(); + if (date != null) { + c.setTime(date); + } + + int year = c.get(Calendar.YEAR); + int month = c.get(Calendar.MONTH); + int day = c.get(Calendar.DAY_OF_MONTH); + + // Create a new instance of DatePickerDialog and return it + return new DatePickerDialog(getActivity(), this, year, month, day); + } + + public void onDateSet(DatePicker view, int year, int month, int day) { + Calendar c = Calendar.getInstance(); + c.set(Calendar.YEAR, year); + c.set(Calendar.MONTH, month); + c.set(Calendar.DAY_OF_MONTH, day); + c.set(Calendar.HOUR, 0); + c.set(Calendar.MINUTE, 0); + c.set(Calendar.SECOND, 0); + c.set(Calendar.MILLISECOND, 0); + + long unixTime = c.getTimeInMillis(); + + Date date = new Date(unixTime); + + expiryFieldEdit.setTag(date); + expiryFieldEdit.setText(DateFormat.getDateInstance(DateFormat.LONG).format(date)); + } + } + + private void doSave() { String store = storeFieldEdit.getText().toString(); String note = noteFieldEdit.getText().toString(); + Date expiry = (Date) expiryField.getTag(); String cardId = cardIdFieldView.getText().toString(); String barcodeType = barcodeTypeField.getText().toString(); @@ -508,12 +615,12 @@ public class LoyaltyCardEditActivity extends AppCompatActivity if(updateLoyaltyCard) { //update of "starStatus" not necessary, since it cannot be changed in this activity (only in ViewActivity) - db.updateLoyaltyCard(loyaltyCardId, store, note, cardId, barcodeType, headingColorValue); + db.updateLoyaltyCard(loyaltyCardId, store, note, expiry, cardId, barcodeType, headingColorValue); Log.i(TAG, "Updated " + loyaltyCardId + " to " + cardId); } else { - loyaltyCardId = (int)db.insertLoyaltyCard(store, note, cardId, barcodeType, headingColorValue, 0); + loyaltyCardId = (int)db.insertLoyaltyCard(store, note, expiry, cardId, barcodeType, headingColorValue, 0); } db.setLoyaltyCardGroups(loyaltyCardId, selectedGroups); diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java index 557395972..6b6303e39 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java @@ -32,6 +32,7 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.zxing.BarcodeFormat; +import java.text.DateFormat; import java.util.List; import protect.card_locker.preferences.Settings; @@ -45,6 +46,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity ImageView bottomSheetButton; TextView noteView; TextView groupsView; + TextView expiryView; TextView storeName; ImageView barcodeImage; View collapsingToolbarLayout; @@ -114,6 +116,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity bottomSheetButton = findViewById(R.id.bottomSheetButton); noteView = findViewById(R.id.noteView); groupsView = findViewById(R.id.groupsView); + expiryView = findViewById(R.id.expiryView); storeName = findViewById(R.id.storeName); barcodeImage = findViewById(R.id.barcode); collapsingToolbarLayout = findViewById(R.id.collapsingToolbarLayout); @@ -261,7 +264,16 @@ public class LoyaltyCardViewActivity extends AppCompatActivity groupsView.setVisibility(View.GONE); } - if (noteView.getVisibility() == View.VISIBLE || groupsView.getVisibility() == View.VISIBLE) { + if(loyaltyCard.expiry != null) { + expiryView.setVisibility(View.VISIBLE); + expiryView.setText(getString(R.string.expiryStateSentence, DateFormat.getDateInstance(DateFormat.LONG).format(loyaltyCard.expiry))); + } + else + { + expiryView.setVisibility(View.GONE); + } + + if (noteView.getVisibility() == View.VISIBLE || groupsView.getVisibility() == View.VISIBLE || expiryView.getVisibility() == View.VISIBLE) { bottomSheet.setVisibility(View.VISIBLE); } else diff --git a/app/src/main/res/drawable/ic_baseline_calendar_today_24.xml b/app/src/main/res/drawable/ic_baseline_calendar_today_24.xml new file mode 100644 index 000000000..b6caf720f --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_calendar_today_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/loyalty_card_edit_activity.xml b/app/src/main/res/layout/loyalty_card_edit_activity.xml index 52ea89f09..7e02fb469 100644 --- a/app/src/main/res/layout/loyalty_card_edit_activity.xml +++ b/app/src/main/res/layout/loyalty_card_edit_activity.xml @@ -135,6 +135,31 @@ android:padding="@dimen/inputPadding" android:textSize="@dimen/inputSize" /> + + + + + + + + + + + + + Are you sure you want to leave this screen? Changed made will not be saved. Manually enter card ID Groups: %s + Expires: %s Card Barcode Edit barcode + Expiry date + Never + Choose expiry date