diff --git a/app/src/main/java/protect/card_locker/CsvDatabaseExporter.java b/app/src/main/java/protect/card_locker/CsvDatabaseExporter.java index ef30a68e0..b43e38cc2 100644 --- a/app/src/main/java/protect/card_locker/CsvDatabaseExporter.java +++ b/app/src/main/java/protect/card_locker/CsvDatabaseExporter.java @@ -51,7 +51,6 @@ public class CsvDatabaseExporter implements DatabaseExporter DBHelper.LoyaltyCardDbIds.NOTE, DBHelper.LoyaltyCardDbIds.CARD_ID, DBHelper.LoyaltyCardDbIds.HEADER_COLOR, - DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR, DBHelper.LoyaltyCardDbIds.BARCODE_TYPE, DBHelper.LoyaltyCardDbIds.STAR_STATUS); @@ -66,7 +65,6 @@ public class CsvDatabaseExporter implements DatabaseExporter card.note, card.cardId, card.headerColor, - card.headerTextColor, card.barcodeType, card.starStatus); diff --git a/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java b/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java index e4fd6e271..400436ec5 100644 --- a/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java +++ b/app/src/main/java/protect/card_locker/CsvDatabaseImporter.java @@ -274,13 +274,10 @@ public class CsvDatabaseImporter implements DatabaseImporter String barcodeType = extractString(DBHelper.LoyaltyCardDbIds.BARCODE_TYPE, record, ""); Integer headerColor = null; - Integer headerTextColor = null; - if(record.isMapped(DBHelper.LoyaltyCardDbIds.HEADER_COLOR) && - record.isMapped(DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR)) + if(record.isMapped(DBHelper.LoyaltyCardDbIds.HEADER_COLOR)) { headerColor = extractInt(DBHelper.LoyaltyCardDbIds.HEADER_COLOR, record, true); - headerTextColor = extractInt(DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR, record, true); } int starStatus = 0; @@ -291,7 +288,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, headerTextColor, starStatus); + helper.insertLoyaltyCard(database, id, store, note, 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 5fa3020fa..4894d8674 100644 --- a/app/src/main/java/protect/card_locker/DBHelper.java +++ b/app/src/main/java/protect/card_locker/DBHelper.java @@ -5,6 +5,7 @@ import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; +import android.graphics.Color; import java.util.ArrayList; import java.util.List; @@ -112,7 +113,7 @@ public class DBHelper extends SQLiteOpenHelper public long insertLoyaltyCard(final String store, final String note, final String cardId, final String barcodeType, final Integer headerColor, - final Integer headerTextColor, final int starStatus) + final int starStatus) { SQLiteDatabase db = getWritableDatabase(); ContentValues contentValues = new ContentValues(); @@ -121,7 +122,7 @@ public class DBHelper extends SQLiteOpenHelper contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId); contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType); contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); - contentValues.put(LoyaltyCardDbIds.HEADER_TEXT_COLOR, headerTextColor); + contentValues.put(LoyaltyCardDbIds.HEADER_TEXT_COLOR, Color.WHITE); contentValues.put(LoyaltyCardDbIds.STAR_STATUS, starStatus); final long newId = db.insert(LoyaltyCardDbIds.TABLE, null, contentValues); return newId; @@ -130,7 +131,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 barcodeType, final Integer headerColor, - final Integer headerTextColor, final int starStatus) + final int starStatus) { ContentValues contentValues = new ContentValues(); contentValues.put(LoyaltyCardDbIds.ID, id); @@ -139,7 +140,7 @@ public class DBHelper extends SQLiteOpenHelper contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId); contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType); contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); - contentValues.put(LoyaltyCardDbIds.HEADER_TEXT_COLOR, headerTextColor); + contentValues.put(LoyaltyCardDbIds.HEADER_TEXT_COLOR, Color.WHITE); contentValues.put(LoyaltyCardDbIds.STAR_STATUS,starStatus); final long newId = db.insert(LoyaltyCardDbIds.TABLE, null, contentValues); return (newId != -1); @@ -147,7 +148,7 @@ 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 Integer headerTextColor) + final Integer headerColor) { SQLiteDatabase db = getWritableDatabase(); ContentValues contentValues = new ContentValues(); @@ -156,7 +157,7 @@ public class DBHelper extends SQLiteOpenHelper contentValues.put(LoyaltyCardDbIds.CARD_ID, cardId); contentValues.put(LoyaltyCardDbIds.BARCODE_TYPE, barcodeType); contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); - contentValues.put(LoyaltyCardDbIds.HEADER_TEXT_COLOR, headerTextColor); + contentValues.put(LoyaltyCardDbIds.HEADER_TEXT_COLOR, Color.WHITE); int rowsUpdated = db.update(LoyaltyCardDbIds.TABLE, contentValues, LoyaltyCardDbIds.ID + "=?", new String[]{Integer.toString(id)}); diff --git a/app/src/main/java/protect/card_locker/ImportURIHelper.java b/app/src/main/java/protect/card_locker/ImportURIHelper.java index 0586a3527..8601a9e9c 100644 --- a/app/src/main/java/protect/card_locker/ImportURIHelper.java +++ b/app/src/main/java/protect/card_locker/ImportURIHelper.java @@ -12,9 +12,6 @@ public class ImportURIHelper { private static final String BARCODE_TYPE = DBHelper.LoyaltyCardDbIds.BARCODE_TYPE; private static final String HEADER_COLOR = DBHelper.LoyaltyCardDbIds.HEADER_COLOR; - private static final String HEADER_TEXT_COLOR = DBHelper.LoyaltyCardDbIds.HEADER_TEXT_COLOR; - - private final Context context; private final String host; @@ -57,11 +54,6 @@ public class ImportURIHelper { { headerColor = Integer.parseInt(unparsedHeaderColor); } - String unparsedHeaderTextColor = uri.getQueryParameter(HEADER_TEXT_COLOR); - if(unparsedHeaderTextColor != null) - { - headerTextColor = Integer.parseInt(unparsedHeaderTextColor); - } return new LoyaltyCard(-1, store, note, cardId, barcodeType, headerColor, headerTextColor, 0); } catch (NullPointerException | NumberFormatException ex) { @@ -83,10 +75,6 @@ public class ImportURIHelper { { uriBuilder.appendQueryParameter(HEADER_COLOR, loyaltyCard.headerColor.toString()); } - if(loyaltyCard.headerTextColor != null) - { - uriBuilder.appendQueryParameter(HEADER_TEXT_COLOR, loyaltyCard.headerTextColor.toString()); - } //StarStatus will not be exported return uriBuilder.build(); } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java index 53757fbbe..169cd6612 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java @@ -71,13 +71,6 @@ class LoyaltyCardCursorAdapter extends CursorAdapter if (loyaltyCard.starStatus!=0) star.setVisibility(View.VISIBLE); else star.setVisibility(View.GONE); - int tileLetterFontSize = context.getResources().getDimensionPixelSize(R.dimen.tileLetterFontSize); - int pixelSize = context.getResources().getDimensionPixelSize(R.dimen.cardThumbnailSize); - - Integer letterBackgroundColor = loyaltyCard.headerColor; - Integer letterTextColor = loyaltyCard.headerTextColor; - LetterBitmap letterBitmap = new LetterBitmap(context, loyaltyCard.store, loyaltyCard.store, - tileLetterFontSize, pixelSize, pixelSize, letterBackgroundColor, letterTextColor); - thumbnail.setImageBitmap(letterBitmap.getLetterTile()); + thumbnail.setImageBitmap(Utils.generateIcon(context, loyaltyCard.store, loyaltyCard.headerColor).getLetterTile()); } } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java index 8af102bf8..51edd25ed 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java @@ -17,11 +17,17 @@ import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; + +import android.text.Editable; +import android.text.TextWatcher; import android.util.Log; +import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewTreeObserver; +import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; @@ -41,21 +47,17 @@ import java.util.List; public class LoyaltyCardEditActivity extends AppCompatActivity { private static final String TAG = "Catima"; - protected static final String NO_BARCODE = "_NO_BARCODE_"; protected static final int SELECT_BARCODE_REQUEST = 1; + ImageView thumbnail; EditText storeFieldEdit; EditText noteFieldEdit; ChipGroup groupsChips; - ImageView headingColorSample; - Button headingColorSelectButton; - ImageView headingStoreTextColorSample; - Button headingStoreTextColorSelectButton; + View cardAndBarcodeLayout; TextView cardIdFieldView; - View cardIdDivider; - View cardIdTableRow; - TextView barcodeTypeField; + View barcodeTypeView; + AutoCompleteTextView barcodeTypeField; ImageView barcodeImage; View barcodeImageLayout; View barcodeCaptureLayout; @@ -67,7 +69,6 @@ public class LoyaltyCardEditActivity extends AppCompatActivity boolean updateLoyaltyCard; Uri importLoyaltyCardUri = null; Integer headingColorValue = null; - Integer headingStoreTextColorValue = null; DBHelper db; ImportURIHelper importUriHelper; @@ -102,23 +103,73 @@ public class LoyaltyCardEditActivity extends AppCompatActivity db = new DBHelper(this); importUriHelper = new ImportURIHelper(this); + thumbnail = findViewById(R.id.thumbnail); storeFieldEdit = findViewById(R.id.storeNameEdit); noteFieldEdit = findViewById(R.id.noteEdit); groupsChips = findViewById(R.id.groupChips); - headingColorSample = findViewById(R.id.headingColorSample); - headingColorSelectButton = findViewById(R.id.headingColorSelectButton); - headingStoreTextColorSample = findViewById(R.id.headingStoreTextColorSample); - headingStoreTextColorSelectButton = findViewById(R.id.headingStoreTextColorSelectButton); + cardAndBarcodeLayout = findViewById(R.id.cardAndBarcodeLayout); cardIdFieldView = findViewById(R.id.cardIdView); - cardIdDivider = findViewById(R.id.cardIdDivider); - cardIdTableRow = findViewById(R.id.cardIdTableRow); - barcodeTypeField = findViewById(R.id.barcodeTypeView); + barcodeTypeView = findViewById(R.id.barcodeTypeView); + barcodeTypeField = findViewById(R.id.barcodeTypeField); barcodeImage = findViewById(R.id.barcode); barcodeImageLayout = findViewById(R.id.barcodeLayout); barcodeCaptureLayout = findViewById(R.id.barcodeCaptureLayout); captureButton = findViewById(R.id.captureButton); enterButton = findViewById(R.id.enterButton); + + storeFieldEdit.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + generateIcon(s.toString()); + } + + @Override + public void afterTextChanged(Editable s) { } + }); + + cardIdFieldView.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + String formatString = barcodeTypeField.getText().toString(); + + if (!formatString.isEmpty()) { + if (formatString.equals(getString(R.string.noBarcode))) { + hideBarcode(); + } else { + generateBarcode(s.toString(), BarcodeFormat.valueOf(formatString)); + } + } + } + + @Override + public void afterTextChanged(Editable s) { } + }); + + barcodeTypeField.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if (!s.toString().isEmpty()) { + if (s.toString().equals(getString(R.string.noBarcode))) { + hideBarcode(); + } else { + generateBarcode(cardIdFieldView.getText().toString(), BarcodeFormat.valueOf(s.toString())); + } + } + } + + @Override + public void afterTextChanged(Editable s) { } + }); } @Override @@ -171,7 +222,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity if(barcodeTypeField.getText().length() == 0) { - barcodeTypeField.setText(loyaltyCard.barcodeType.isEmpty() ? LoyaltyCardEditActivity.NO_BARCODE : loyaltyCard.barcodeType); + barcodeTypeField.setText(loyaltyCard.barcodeType.isEmpty() ? getString(R.string.noBarcode) : loyaltyCard.barcodeType); } if(headingColorValue == null) @@ -183,15 +234,6 @@ public class LoyaltyCardEditActivity extends AppCompatActivity } } - if(headingStoreTextColorValue == null) - { - headingStoreTextColorValue = loyaltyCard.headerTextColor; - if(headingStoreTextColorValue == null) - { - headingStoreTextColorValue = Color.WHITE; - } - } - setTitle(R.string.editCardTitle); } else if(importLoyaltyCardUri != null) @@ -211,7 +253,6 @@ public class LoyaltyCardEditActivity extends AppCompatActivity cardIdFieldView.setText(importCard.cardId); barcodeTypeField.setText(importCard.barcodeType); headingColorValue = importCard.headerColor; - headingStoreTextColorValue = importCard.headerTextColor; } else { @@ -225,15 +266,10 @@ public class LoyaltyCardEditActivity extends AppCompatActivity List loyaltyCardGroups = db.getLoyaltyCardGroups(loyaltyCardId); - View groupsView = findViewById(R.id.groupsView); - View groupsTableRow = findViewById(R.id.groupsTableRow); - if (existingGroups.isEmpty()) { - groupsView.setVisibility(View.GONE); - groupsTableRow.setVisibility(View.GONE); + groupsChips.setVisibility(View.GONE); } else { - groupsView.setVisibility(View.VISIBLE); - groupsTableRow.setVisibility(View.VISIBLE); + groupsChips.setVisibility(View.VISIBLE); } for (Group group : db.getGroups()) { @@ -262,59 +298,22 @@ public class LoyaltyCardEditActivity extends AppCompatActivity colors.recycle(); } - if(headingStoreTextColorValue == null) { - headingStoreTextColorValue = Color.WHITE; - } - - headingColorSample.setBackgroundColor(headingColorValue); - headingStoreTextColorSample.setBackgroundColor(headingStoreTextColorValue); - headingColorSelectButton.setOnClickListener(new ColorSelectListener(headingColorValue, true)); - headingStoreTextColorSelectButton.setOnClickListener(new ColorSelectListener(headingStoreTextColorValue, false)); + thumbnail.setOnClickListener(new ColorSelectListener(headingColorValue)); if(cardIdFieldView.getText().length() > 0 && barcodeTypeField.getText().length() > 0) { - if(barcodeTypeField.getText().toString().equals(NO_BARCODE)) + String formatString = barcodeTypeField.getText().toString(); + + if(formatString.isEmpty() || formatString.equals(getString(R.string.noBarcode))) { hideBarcode(); } else { - String formatString = barcodeTypeField.getText().toString(); final BarcodeFormat format = BarcodeFormat.valueOf(formatString); final String cardIdString = cardIdFieldView.getText().toString(); - if(barcodeImage.getHeight() == 0) - { - Log.d(TAG, "ImageView size is not known known at start, waiting for load"); - // The size of the ImageView is not yet available as it has not - // yet been drawn. Wait for it to be drawn so the size is available. - barcodeImage.getViewTreeObserver().addOnGlobalLayoutListener( - new ViewTreeObserver.OnGlobalLayoutListener() - { - @Override - public void onGlobalLayout() - { - if (Build.VERSION.SDK_INT < 16) - { - barcodeImage.getViewTreeObserver().removeGlobalOnLayoutListener(this); - } - else - { - barcodeImage.getViewTreeObserver().removeOnGlobalLayoutListener(this); - } - - Log.d(TAG, "ImageView size now known"); - new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute(); - } - }); - } - else - { - Log.d(TAG, "ImageView size known known, creating barcode"); - new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute(); - } - - showBarcode(); + generateBarcode(cardIdString, format); } } @@ -335,38 +334,25 @@ public class LoyaltyCardEditActivity extends AppCompatActivity captureButton.setOnClickListener(captureCallback); - enterButton.setOnClickListener(new View.OnClickListener() - { - @Override - public void onClick(View v) - { - Intent i = new Intent(getApplicationContext(), BarcodeSelectorActivity.class); - - String cardId = cardIdFieldView.getText().toString(); - if(cardId.length() > 0) - { - final Bundle b = new Bundle(); - b.putString("initialCardId", cardId); - i.putExtras(b); - } - - startActivityForResult(i, SELECT_BARCODE_REQUEST); - } - }); + enterButton.setOnClickListener(new EditCardIdAndBarcode()); + barcodeImage.setOnClickListener(new EditCardIdAndBarcode()); if(cardIdFieldView.getText().length() > 0) { - cardIdDivider.setVisibility(View.VISIBLE); - cardIdTableRow.setVisibility(View.VISIBLE); + cardAndBarcodeLayout.setVisibility(View.VISIBLE); enterButton.setText(R.string.editCard); } else { - cardIdDivider.setVisibility(View.GONE); - cardIdTableRow.setVisibility(View.GONE); + cardAndBarcodeLayout.setVisibility(View.GONE); enterButton.setText(R.string.enterCard); } + ArrayList barcodeList = new ArrayList<>(BarcodeSelectorActivity.SUPPORTED_BARCODE_TYPES); + barcodeList.add(0, getString(R.string.noBarcode)); + ArrayAdapter barcodeAdapter = new ArrayAdapter<>(this, android.R.layout.select_dialog_item, barcodeList); + barcodeTypeField.setAdapter(barcodeAdapter); + FloatingActionButton saveButton = findViewById(R.id.fabSave); saveButton.setOnClickListener(new View.OnClickListener() { @Override @@ -374,17 +360,36 @@ public class LoyaltyCardEditActivity extends AppCompatActivity doSave(); } }); + + generateIcon(storeFieldEdit.getText().toString()); + } + + class EditCardIdAndBarcode implements View.OnClickListener + { + @Override + public void onClick(View v) + { + Intent i = new Intent(getApplicationContext(), BarcodeSelectorActivity.class); + + String cardId = cardIdFieldView.getText().toString(); + if(cardId.length() > 0) + { + final Bundle b = new Bundle(); + b.putString("initialCardId", cardId); + i.putExtras(b); + } + + startActivityForResult(i, SELECT_BARCODE_REQUEST); + } } class ColorSelectListener implements View.OnClickListener { final int defaultColor; - final boolean isBackgroundColor; - ColorSelectListener(int defaultColor, boolean isBackgroundColor) + ColorSelectListener(int defaultColor) { this.defaultColor = defaultColor; - this.isBackgroundColor = isBackgroundColor; } @Override @@ -396,16 +401,9 @@ public class LoyaltyCardEditActivity extends AppCompatActivity @Override public void onColorSelected(int dialogId, int color) { - if(isBackgroundColor) - { - headingColorSample.setBackgroundColor(color); - headingColorValue = color; - } - else - { - headingStoreTextColorSample.setBackgroundColor(color); - headingStoreTextColorValue = color; - } + headingColorValue = color; + + generateIcon(storeFieldEdit.getText().toString()); } @Override @@ -427,7 +425,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity // We do not want to save the no barcode string to the database // it is simply an empty there for no barcode - if(barcodeType.equals(NO_BARCODE)) + if(barcodeType.equals(getString(R.string.noBarcode))) { barcodeType = ""; } @@ -453,12 +451,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, headingStoreTextColorValue); + db.updateLoyaltyCard(loyaltyCardId, store, note, cardId, barcodeType, headingColorValue); Log.i(TAG, "Updated " + loyaltyCardId + " to " + cardId); } else { - loyaltyCardId = (int)db.insertLoyaltyCard(store, note, cardId, barcodeType, headingColorValue, headingStoreTextColorValue, 0); + loyaltyCardId = (int)db.insertLoyaltyCard(store, note, cardId, barcodeType, headingColorValue, 0); } db.setLoyaltyCardGroups(loyaltyCardId, selectedGroups); @@ -564,20 +562,61 @@ public class LoyaltyCardEditActivity extends AppCompatActivity cardIdView.setText(contents); // Set special NO_BARCODE value to prevent onResume from overwriting it - barcodeTypeField.setText(format.isEmpty() ? LoyaltyCardEditActivity.NO_BARCODE : format); + barcodeTypeField.setText(format.isEmpty() ? getString(R.string.noBarcode) : format); onResume(); } } private void showBarcode() { barcodeImageLayout.setVisibility(View.VISIBLE); - findViewById(R.id.barcodeTypeDivider).setVisibility(View.VISIBLE); - findViewById(R.id.barcodeTypeTableRow).setVisibility(View.VISIBLE); } private void hideBarcode() { barcodeImageLayout.setVisibility(View.GONE); - findViewById(R.id.barcodeTypeDivider).setVisibility(View.GONE); - findViewById(R.id.barcodeTypeTableRow).setVisibility(View.GONE); + } + + private void generateBarcode(final String cardId, final BarcodeFormat barcodeFormat) { + if (barcodeImage.getHeight() == 0) { + Log.d(TAG, "ImageView size is not known known at start, waiting for load"); + // The size of the ImageView is not yet available as it has not + // yet been drawn. Wait for it to be drawn so the size is available. + barcodeImage.getViewTreeObserver().addOnGlobalLayoutListener( + new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + if (Build.VERSION.SDK_INT < 16) { + barcodeImage.getViewTreeObserver().removeGlobalOnLayoutListener(this); + } else { + barcodeImage.getViewTreeObserver().removeOnGlobalLayoutListener(this); + } + + Log.d(TAG, "ImageView size now known"); + new BarcodeImageWriterTask(barcodeImage, cardId, barcodeFormat).execute(); + } + }); + } else { + Log.d(TAG, "ImageView size known known, creating barcode"); + new BarcodeImageWriterTask(barcodeImage, cardId, barcodeFormat).execute(); + } + + showBarcode(); + } + + private void generateIcon(String store) { + if (headingColorValue == null) { + return; + } + + thumbnail.setBackgroundColor(headingColorValue); + + LetterBitmap letterBitmap = Utils.generateIcon(this, store, headingColorValue); + + if (letterBitmap != null) { + thumbnail.setImageBitmap(letterBitmap.getLetterTile()); + } else { + thumbnail.setImageBitmap(null); + } + + thumbnail.setMinimumWidth(thumbnail.getHeight()); } } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java index 7faada421..d17509463 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java @@ -8,7 +8,6 @@ import android.os.Build; import android.os.Bundle; import androidx.constraintlayout.widget.ConstraintLayout; -import androidx.core.graphics.ColorUtils; import androidx.core.graphics.drawable.DrawableCompat; import androidx.core.widget.TextViewCompat; import androidx.appcompat.app.ActionBar; @@ -36,7 +35,6 @@ import protect.card_locker.preferences.Settings; public class LoyaltyCardViewActivity extends AppCompatActivity { private static final String TAG = "Catima"; - private static final double LUMINANCE_MIDPOINT = 0.5; TextView cardIdFieldView; TextView noteView; @@ -199,17 +197,6 @@ public class LoyaltyCardViewActivity extends AppCompatActivity storeName.setText(loyaltyCard.store); storeName.setTextSize(settings.getCardTitleFontSize()); - int textColor; - if(loyaltyCard.headerTextColor != null) - { - textColor = loyaltyCard.headerTextColor; - } - else - { - textColor = Color.WHITE; - } - storeName.setTextColor(textColor); - int backgroundHeaderColor; if(loyaltyCard.headerColor != null) { @@ -222,8 +209,19 @@ public class LoyaltyCardViewActivity extends AppCompatActivity collapsingToolbarLayout.setBackgroundColor(backgroundHeaderColor); + int textColor; + if(Utils.needsDarkForeground(backgroundHeaderColor)) + { + textColor = Color.BLACK; + } + else + { + textColor = Color.WHITE; + } + storeName.setTextColor(textColor); + // If the background is very bright, we should use dark icons - backgroundNeedsDarkIcons = (ColorUtils.calculateLuminance(backgroundHeaderColor) > LUMINANCE_MIDPOINT); + backgroundNeedsDarkIcons = Utils.needsDarkForeground(backgroundHeaderColor); ActionBar actionBar = getSupportActionBar(); if(actionBar != null) { diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index e779fed9f..60547508a 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -486,5 +486,4 @@ public class MainActivity extends AppCompatActivity int currentNightMode = config.uiMode & Configuration.UI_MODE_NIGHT_MASK; return (currentNightMode == Configuration.UI_MODE_NIGHT_YES); } - } \ No newline at end of file diff --git a/app/src/main/java/protect/card_locker/Utils.java b/app/src/main/java/protect/card_locker/Utils.java new file mode 100644 index 000000000..ded12e37c --- /dev/null +++ b/app/src/main/java/protect/card_locker/Utils.java @@ -0,0 +1,26 @@ +package protect.card_locker; + +import android.content.Context; +import android.graphics.Color; + +import androidx.core.graphics.ColorUtils; + +public class Utils { + static final double LUMINANCE_MIDPOINT = 0.5; + + static public LetterBitmap generateIcon(Context context, String store, Integer backgroundColor) { + if (store.length() == 0) { + return null; + } + + int tileLetterFontSize = context.getResources().getDimensionPixelSize(R.dimen.tileLetterFontSize); + int pixelSize = context.getResources().getDimensionPixelSize(R.dimen.cardThumbnailSize); + + return new LetterBitmap(context, store, store, + tileLetterFontSize, pixelSize, pixelSize, backgroundColor, needsDarkForeground(backgroundColor) ? Color.BLACK : Color.WHITE); + } + + static public boolean needsDarkForeground(Integer backgroundColor) { + return ColorUtils.calculateLuminance(backgroundColor) > LUMINANCE_MIDPOINT; + } +} 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 7ace87adb..8b71c8c99 100644 --- a/app/src/main/res/layout/loyalty_card_edit_activity.xml +++ b/app/src/main/res/layout/loyalty_card_edit_activity.xml @@ -32,478 +32,191 @@ android:layout_height="wrap_content" android:background="@color/inputContrastBackground" app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"> - - - - - - + + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - + android:hint="@string/storeName"> - + /> - + + - - + + - - - - - - - - + android:layout_height="wrap_content" + android:hint="@string/note"> - + /> - + + - - - + + -