diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7306a766f..264f0fe05 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -35,6 +35,13 @@ + diff --git a/app/src/main/java/protect/card_locker/LetterBitmap.java b/app/src/main/java/protect/card_locker/LetterBitmap.java index e8046c57d..a15fbbaa3 100644 --- a/app/src/main/java/protect/card_locker/LetterBitmap.java +++ b/app/src/main/java/protect/card_locker/LetterBitmap.java @@ -26,81 +26,74 @@ class LetterBitmap * The number of available tile colors */ private static final int NUM_OF_TILE_COLORS = 8; - /** - * The {@link TextPaint} used to draw the letter onto the tile + * The letter bitmap */ - private final TextPaint mPaint = new TextPaint(); + private final Bitmap mBitmap; /** - * The bounds that enclose the letter + * The background color of the letter bitmap */ - private final Rect mBounds = new Rect(); - /** - * The {@link Canvas} to draw on - */ - private final Canvas mCanvas = new Canvas(); - /** - * The first char of the name being displayed - */ - private final char[] mFirstChar = new char[1]; - - /** - * The background colors of the tile - */ - private final TypedArray mColors; - /** - * The font size used to display the letter - */ - private final int mTileLetterFontSize; - /** - * The default image to display - */ - private final Bitmap mDefaultBitmap; + private final Integer mColor; /** * Constructor for LetterTileProvider * * @param context The {@link Context} to use + * @param displayName The name used to create the letter for the tile + * @param key The key used to generate the background color for the tile + * @param tileLetterFontSize The font size used to display the letter + * @param width The desired width of the tile + * @param height The desired height of the tile */ - public LetterBitmap(Context context) + public LetterBitmap(Context context, String displayName, String key, int tileLetterFontSize, int width, int height) { final Resources res = context.getResources(); - mPaint.setTypeface(Typeface.create("sans-serif-light", Typeface.BOLD)); - mPaint.setColor(Color.WHITE); - mPaint.setTextAlign(Paint.Align.CENTER); - mPaint.setAntiAlias(true); + TextPaint paint = new TextPaint(); + paint.setTypeface(Typeface.create("sans-serif-light", Typeface.BOLD)); + paint.setColor(Color.WHITE); + paint.setTextAlign(Paint.Align.CENTER); + paint.setAntiAlias(true); - mColors = res.obtainTypedArray(R.array.letter_tile_colors); - mTileLetterFontSize = res.getDimensionPixelSize(R.dimen.tile_letter_font_size); + TypedArray colors = res.obtainTypedArray(R.array.letter_tile_colors); + mColor = pickColor(key, colors); + colors.recycle(); - mDefaultBitmap = BitmapFactory.decodeResource(res, android.R.drawable.sym_def_app_icon); + mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + String firstChar = displayName.substring(0, 1); + + final Canvas c = new Canvas(); + c.setBitmap(mBitmap); + c.drawColor(mColor); + + char [] firstCharArray = new char[1]; + firstCharArray[0] = firstChar.toUpperCase().charAt(0); + paint.setTextSize(tileLetterFontSize); + + // The bounds that enclose the letter + Rect bounds = new Rect(); + + paint.getTextBounds(firstCharArray, 0, 1, bounds); + c.drawText(firstCharArray, 0, 1, width / 2.0f, height / 2.0f + + (bounds.bottom - bounds.top) / 2.0f, paint); } /** - * @param displayName The name used to create the letter for the tile - * @param key The key used to generate the background color for the tile - * @param width The desired width of the tile - * @param height The desired height of the tile * @return A {@link Bitmap} that contains a letter used in the English * alphabet or digit, if there is no letter or digit available, a * default image is shown instead */ - public Bitmap getLetterTile(String displayName, String key, int width, int height) + public Bitmap getLetterTile() { - final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - String firstChar = displayName.substring(0, 1); + return mBitmap; + } - final Canvas c = mCanvas; - c.setBitmap(bitmap); - c.drawColor(pickColor(key)); - - mFirstChar[0] = firstChar.toUpperCase().charAt(0); - mPaint.setTextSize(mTileLetterFontSize); - mPaint.getTextBounds(mFirstChar, 0, 1, mBounds); - c.drawText(mFirstChar, 0, 1, width / 2.0f, height / 2.0f - + (mBounds.bottom - mBounds.top) / 2.0f, mPaint); - return bitmap; + /** + * @return background color used for letter title. + */ + public int getBackgroundColor() + { + return mColor; } /** @@ -108,18 +101,11 @@ class LetterBitmap * @return A new or previously chosen color for key used as the * tile background color */ - private int pickColor(String key) + private int pickColor(String key, TypedArray colors) { // String.hashCode() is not supposed to change across java versions, so // this should guarantee the same key always maps to the same color final int color = Math.abs(key.hashCode()) % NUM_OF_TILE_COLORS; - try - { - return mColors.getColor(color, Color.BLACK); - } - finally - { - mColors.recycle(); - } + return colors.getColor(color, Color.BLACK); } } \ No newline at end of file diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java index 32e4f3797..8c8968b7f 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java @@ -52,8 +52,9 @@ class LoyaltyCardCursorAdapter extends CursorAdapter String cardIdText = String.format(cardIdFormat, cardIdLabel, loyaltyCard.cardId); cardIdField.setText(cardIdText); - LetterBitmap letterBitmap = new LetterBitmap(context); + int tileLetterFontSize = context.getResources().getDimensionPixelSize(R.dimen.tileLetterFontSize); int pixelSize = context.getResources().getDimensionPixelSize(R.dimen.cardThumbnailSize); - thumbnail.setImageBitmap(letterBitmap.getLetterTile(loyaltyCard.store, loyaltyCard.store, pixelSize, pixelSize)); + LetterBitmap letterBitmap = new LetterBitmap(context, loyaltyCard.store, loyaltyCard.store, tileLetterFontSize, pixelSize, pixelSize); + thumbnail.setImageBitmap(letterBitmap.getLetterTile()); } } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java new file mode 100644 index 000000000..70393dc9f --- /dev/null +++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java @@ -0,0 +1,401 @@ +package protect.card_locker; + +import android.app.Activity; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.support.design.widget.Snackbar; +import android.support.v7.app.ActionBar; +import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewTreeObserver; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.integration.android.IntentIntegrator; +import com.google.zxing.integration.android.IntentResult; + +public class LoyaltyCardEditActivity extends AppCompatActivity +{ + private static final String TAG = "CardLocker"; + + private static final int SELECT_BARCODE_REQUEST = 1; + + EditText storeFieldEdit; + TextView storeFieldView; + EditText noteFieldEdit; + TextView noteFieldView; + TextView cardIdFieldView; + View cardIdDivider; + View cardIdTableRow; + TextView barcodeTypeField; + ImageView barcodeImage; + View barcodeImageLayout; + View barcodeCaptureLayout; + + Button captureButton; + Button enterButton; + + int loyaltyCardId; + boolean updateLoyaltyCard; + + DBHelper db; + + private void extractIntentFields(Intent intent) + { + final Bundle b = intent.getExtras(); + loyaltyCardId = b != null ? b.getInt("id") : 0; + updateLoyaltyCard = b != null && b.getBoolean("update", false); + + Log.d(TAG, "View activity: id=" + loyaltyCardId + + ", updateLoyaltyCard=" + Boolean.toString(updateLoyaltyCard)); + } + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + + setContentView(R.layout.loyalty_card_edit_activity); + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + ActionBar actionBar = getSupportActionBar(); + if(actionBar != null) + { + actionBar.setDisplayHomeAsUpEnabled(true); + } + + extractIntentFields(getIntent()); + + db = new DBHelper(this); + + storeFieldEdit = (EditText) findViewById(R.id.storeNameEdit); + storeFieldView = (TextView) findViewById(R.id.storeNameView); + noteFieldEdit = (EditText) findViewById(R.id.noteEdit); + noteFieldView = (TextView) findViewById(R.id.noteView); + cardIdFieldView = (TextView) findViewById(R.id.cardIdView); + cardIdDivider = findViewById(R.id.cardIdDivider); + cardIdTableRow = findViewById(R.id.cardIdTableRow); + barcodeTypeField = (TextView) findViewById(R.id.barcodeType); + barcodeImage = (ImageView) findViewById(R.id.barcode); + barcodeImageLayout = findViewById(R.id.barcodeLayout); + barcodeCaptureLayout = findViewById(R.id.barcodeCaptureLayout); + + captureButton = (Button) findViewById(R.id.captureButton); + enterButton = (Button) findViewById(R.id.enterButton); + } + + @Override + public void onNewIntent(Intent intent) + { + Log.i(TAG, "Received new intent"); + extractIntentFields(intent); + + // Reset these fields, so they are re-populated in onResume(). + storeFieldEdit.setText(""); + noteFieldEdit.setText(""); + cardIdFieldView.setText(""); + barcodeTypeField.setText(""); + } + + @Override + public void onResume() + { + super.onResume(); + + Log.i(TAG, "To view card: " + loyaltyCardId); + + if(updateLoyaltyCard) + { + final LoyaltyCard loyaltyCard = db.getLoyaltyCard(loyaltyCardId); + if(loyaltyCard == null) + { + Log.w(TAG, "Could not lookup loyalty card " + loyaltyCardId); + Toast.makeText(this, R.string.noCardExistsError, Toast.LENGTH_LONG).show(); + finish(); + return; + } + + if(storeFieldEdit.getText().length() == 0) + { + storeFieldEdit.setText(loyaltyCard.store); + storeFieldView.setText(loyaltyCard.store); + } + + if(noteFieldEdit.getText().length() == 0) + { + noteFieldEdit.setText(loyaltyCard.note); + noteFieldView.setText(loyaltyCard.note); + } + + if(cardIdFieldView.getText().length() == 0) + { + cardIdFieldView.setText(loyaltyCard.cardId); + } + + if(barcodeTypeField.getText().length() == 0) + { + barcodeTypeField.setText(loyaltyCard.barcodeType); + } + + if(updateLoyaltyCard) + { + setTitle(R.string.editCardTitle); + + storeFieldView.setVisibility(View.GONE); + noteFieldView.setVisibility(View.GONE); + } + else + { + barcodeCaptureLayout.setVisibility(View.GONE); + captureButton.setVisibility(View.GONE); + setTitle(R.string.viewCardTitle); + + storeFieldEdit.setVisibility(View.GONE); + noteFieldEdit.setVisibility(View.GONE); + } + } + else + { + setTitle(R.string.addCardTitle); + + storeFieldView.setVisibility(View.GONE); + noteFieldView.setVisibility(View.GONE); + } + + if(cardIdFieldView.getText().length() > 0 && barcodeTypeField.getText().length() > 0) + { + 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(); + } + + barcodeImageLayout.setVisibility(View.VISIBLE); + } + + View.OnClickListener captureCallback = new View.OnClickListener() + { + @Override + public void onClick(View v) + { + IntentIntegrator integrator = new IntentIntegrator(LoyaltyCardEditActivity.this); + integrator.setDesiredBarcodeFormats(BarcodeSelectorActivity.SUPPORTED_BARCODE_TYPES); + + String prompt = getResources().getString(R.string.scanCardBarcode); + integrator.setPrompt(prompt); + integrator.initiateScan(); + } + }; + + 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); + } + }); + + if(cardIdFieldView.getText().length() > 0) + { + cardIdDivider.setVisibility(View.VISIBLE); + cardIdTableRow.setVisibility(View.VISIBLE); + enterButton.setText(R.string.editCard); + } + else + { + cardIdDivider.setVisibility(View.GONE); + cardIdTableRow.setVisibility(View.GONE); + enterButton.setText(R.string.enterCard); + } + } + + private void doSave() + { + String store = storeFieldEdit.getText().toString(); + String note = noteFieldEdit.getText().toString(); + String cardId = cardIdFieldView.getText().toString(); + String barcodeType = barcodeTypeField.getText().toString(); + + if(store.isEmpty()) + { + Snackbar.make(storeFieldEdit, R.string.noStoreError, Snackbar.LENGTH_LONG).show(); + return; + } + + if(cardId.isEmpty() || barcodeType.isEmpty()) + { + Snackbar.make(cardIdFieldView, R.string.noCardIdError, Snackbar.LENGTH_LONG).show(); + return; + } + + if(updateLoyaltyCard) + { + db.updateLoyaltyCard(loyaltyCardId, store, note, cardId, barcodeType); + Log.i(TAG, "Updated " + loyaltyCardId + " to " + cardId); + } + else + { + loyaltyCardId = (int)db.insertLoyaltyCard(store, note, cardId, barcodeType); + } + + finish(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) + { + if(updateLoyaltyCard) + { + getMenuInflater().inflate(R.menu.card_update_menu, menu); + } + else + { + getMenuInflater().inflate(R.menu.card_add_menu, menu); + } + + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) + { + int id = item.getItemId(); + + switch(id) + { + case android.R.id.home: + finish(); + break; + + case R.id.action_delete: + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.deleteTitle); + builder.setMessage(R.string.deleteConfirmation); + builder.setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface dialog, int which) + { + Log.e(TAG, "Deleting card: " + loyaltyCardId); + + DBHelper db = new DBHelper(LoyaltyCardEditActivity.this); + db.deleteLoyaltyCard(loyaltyCardId); + + ShortcutHelper.removeShortcut(LoyaltyCardEditActivity.this, loyaltyCardId); + + finish(); + dialog.dismiss(); + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface dialog, int which) + { + dialog.dismiss(); + } + }); + AlertDialog dialog = builder.create(); + dialog.show(); + + return true; + + case R.id.action_save: + doSave(); + return true; + } + + return super.onOptionsItemSelected(item); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent intent) + { + String contents = null; + String format = null; + + IntentResult result = + IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); + if (result != null) + { + Log.i(TAG, "Received barcode information from capture"); + contents = result.getContents(); + format = result.getFormatName(); + } + + if(requestCode == SELECT_BARCODE_REQUEST && resultCode == Activity.RESULT_OK) + { + Log.i(TAG, "Received barcode information from capture"); + + contents = intent.getStringExtra(BarcodeSelectorActivity.BARCODE_CONTENTS); + format = intent.getStringExtra(BarcodeSelectorActivity.BARCODE_FORMAT); + } + + if(contents != null && contents.isEmpty() == false && + format != null && format.isEmpty() == false) + { + Log.i(TAG, "Read barcode id: " + contents); + Log.i(TAG, "Read format: " + format); + + TextView cardIdView = (TextView)findViewById(R.id.cardIdView); + cardIdView.setText(contents); + + final TextView barcodeTypeField = (TextView) findViewById(R.id.barcodeType); + barcodeTypeField.setText(format); + onResume(); + } + } +} diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java index 03bb5656d..d0940a0c6 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java @@ -2,11 +2,9 @@ package protect.card_locker; import android.app.Activity; -import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ActivityInfo; -import android.content.res.Configuration; import android.os.Build; import android.os.Bundle; import android.support.design.widget.Snackbar; @@ -22,56 +20,31 @@ import android.view.ViewTreeObserver; import android.view.Window; import android.view.WindowManager; import android.widget.Button; -import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.google.zxing.BarcodeFormat; -import com.google.zxing.integration.android.IntentIntegrator; -import com.google.zxing.integration.android.IntentResult; public class LoyaltyCardViewActivity extends AppCompatActivity { private static final String TAG = "CardLocker"; - private static final int SELECT_BARCODE_REQUEST = 1; - - EditText storeFieldEdit; - TextView storeFieldView; - EditText noteFieldEdit; - TextView noteFieldView; TextView cardIdFieldView; - View cardIdDivider; - View cardIdTableRow; - TextView barcodeTypeField; ImageView barcodeImage; - View barcodeImageLayout; - View barcodeCaptureLayout; - - Button captureButton; - Button enterButton; - + ImageView storeLogo; + View collapsingToolbarLayout; int loyaltyCardId; - boolean updateLoyaltyCard; - boolean viewLoyaltyCard; - boolean rotationEnabled; - DBHelper db; private void extractIntentFields(Intent intent) { final Bundle b = intent.getExtras(); loyaltyCardId = b != null ? b.getInt("id") : 0; - updateLoyaltyCard = b != null && b.getBoolean("update", false); - viewLoyaltyCard = b != null && b.getBoolean("view", false); - - Log.d(TAG, "View activity: id=" + loyaltyCardId - + ", updateLoyaltyCard=" + Boolean.toString(updateLoyaltyCard) - + ", viewLoyaltyCard=" + Boolean.toString(viewLoyaltyCard)); + Log.d(TAG, "View activity: id=" + loyaltyCardId); } @Override @@ -79,8 +52,11 @@ public class LoyaltyCardViewActivity extends AppCompatActivity { super.onCreate(savedInstanceState); - setContentView(R.layout.loyalty_card_view_activity); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + extractIntentFields(getIntent()); + + setContentView(R.layout.loyalty_card_view_layout); + + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); if(actionBar != null) @@ -88,24 +64,12 @@ public class LoyaltyCardViewActivity extends AppCompatActivity actionBar.setDisplayHomeAsUpEnabled(true); } - extractIntentFields(getIntent()); - db = new DBHelper(this); - storeFieldEdit = (EditText) findViewById(R.id.storeNameEdit); - storeFieldView = (TextView) findViewById(R.id.storeNameView); - noteFieldEdit = (EditText) findViewById(R.id.noteEdit); - noteFieldView = (TextView) findViewById(R.id.noteView); - cardIdFieldView = (TextView) findViewById(R.id.cardIdView); - cardIdDivider = findViewById(R.id.cardIdDivider); - cardIdTableRow = findViewById(R.id.cardIdTableRow); - barcodeTypeField = (TextView) findViewById(R.id.barcodeType); - barcodeImage = (ImageView) findViewById(R.id.barcode); - barcodeImageLayout = findViewById(R.id.barcodeLayout); - barcodeCaptureLayout = findViewById(R.id.barcodeCaptureLayout); - - captureButton = (Button) findViewById(R.id.captureButton); - enterButton = (Button) findViewById(R.id.enterButton); + cardIdFieldView = findViewById(R.id.cardIdView); + barcodeImage = findViewById(R.id.barcode); + storeLogo = findViewById(R.id.storeLogo); + collapsingToolbarLayout = findViewById(R.id.collapsingToolbarLayout); } @Override @@ -113,12 +77,6 @@ public class LoyaltyCardViewActivity extends AppCompatActivity { Log.i(TAG, "Received new intent"); extractIntentFields(intent); - - // Reset these fields, so they are re-populated in onResume(). - storeFieldEdit.setText(""); - noteFieldEdit.setText(""); - cardIdFieldView.setText(""); - barcodeTypeField.setText(""); } @Override @@ -128,90 +86,44 @@ public class LoyaltyCardViewActivity extends AppCompatActivity Log.i(TAG, "To view card: " + loyaltyCardId); - if(viewLoyaltyCard) + // The brightness value is on a scale from [0, ..., 1], where + // '1' is the brightest. We attempt to maximize the brightness + // to help barcode readers scan the barcode. + Window window = getWindow(); + if(window != null) { - // The brightness value is on a scale from [0, ..., 1], where - // '1' is the brightest. We attempt to maximize the brightness - // to help barcode readers scan the barcode. - Window window = getWindow(); - if(window != null) - { - WindowManager.LayoutParams attributes = window.getAttributes(); - attributes.screenBrightness = 1F; - window.setAttributes(attributes); - } + WindowManager.LayoutParams attributes = window.getAttributes(); + attributes.screenBrightness = 1F; + window.setAttributes(attributes); } - if(updateLoyaltyCard || viewLoyaltyCard) + final LoyaltyCard loyaltyCard = db.getLoyaltyCard(loyaltyCardId); + if(loyaltyCard == null) { - final LoyaltyCard loyaltyCard = db.getLoyaltyCard(loyaltyCardId); - if(loyaltyCard == null) - { - Log.w(TAG, "Could not lookup loyalty card " + loyaltyCardId); - Toast.makeText(this, R.string.noCardExistsError, Toast.LENGTH_LONG).show(); - finish(); - return; - } - - if(storeFieldEdit.getText().length() == 0) - { - storeFieldEdit.setText(loyaltyCard.store); - storeFieldView.setText(loyaltyCard.store); - } - - if(noteFieldEdit.getText().length() == 0) - { - noteFieldEdit.setText(loyaltyCard.note); - noteFieldView.setText(loyaltyCard.note); - } - - if(cardIdFieldView.getText().length() == 0) - { - cardIdFieldView.setText(loyaltyCard.cardId); - } - - if(barcodeTypeField.getText().length() == 0) - { - barcodeTypeField.setText(loyaltyCard.barcodeType); - } - - if(updateLoyaltyCard) - { - setTitle(R.string.editCardTitle); - - storeFieldView.setVisibility(View.GONE); - noteFieldView.setVisibility(View.GONE); - } - else - { - barcodeCaptureLayout.setVisibility(View.GONE); - captureButton.setVisibility(View.GONE); - setTitle(R.string.viewCardTitle); - - storeFieldEdit.setVisibility(View.GONE); - noteFieldEdit.setVisibility(View.GONE); - } - } - else - { - setTitle(R.string.addCardTitle); - - storeFieldView.setVisibility(View.GONE); - noteFieldView.setVisibility(View.GONE); + Log.w(TAG, "Could not lookup loyalty card " + loyaltyCardId); + Toast.makeText(this, R.string.noCardExistsError, Toast.LENGTH_LONG).show(); + finish(); + return; } - if(cardIdFieldView.getText().length() > 0 && barcodeTypeField.getText().length() > 0) - { - String formatString = barcodeTypeField.getText().toString(); - final BarcodeFormat format = BarcodeFormat.valueOf(formatString); - final String cardIdString = cardIdFieldView.getText().toString(); + String formatString = loyaltyCard.barcodeType; + final BarcodeFormat format = BarcodeFormat.valueOf(formatString); + final String cardIdString = loyaltyCard.cardId; - 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( + cardIdFieldView.setText(loyaltyCard.cardId); + + int cardViewLetterFontSize = getResources().getDimensionPixelSize(R.dimen.cardViewLetterFontSize); + int pixelSize = getResources().getDimensionPixelSize(R.dimen.cardThumbnailSizeLarge); + LetterBitmap letterBitmap = new LetterBitmap(this, loyaltyCard.store, loyaltyCard.store, cardViewLetterFontSize, pixelSize, pixelSize); + storeLogo.setImageBitmap(letterBitmap.getLetterTile()); + collapsingToolbarLayout.setBackgroundColor(letterBitmap.getBackgroundColor()); + + 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 @@ -230,112 +142,19 @@ public class LoyaltyCardViewActivity extends AppCompatActivity new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute(); } }); - } - else - { - Log.d(TAG, "ImageView size known known, creating barcode"); - new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute(); - } - - barcodeImageLayout.setVisibility(View.VISIBLE); - } - - View.OnClickListener captureCallback = new View.OnClickListener() - { - @Override - public void onClick(View v) - { - IntentIntegrator integrator = new IntentIntegrator(LoyaltyCardViewActivity.this); - integrator.setDesiredBarcodeFormats(BarcodeSelectorActivity.SUPPORTED_BARCODE_TYPES); - - String prompt = getResources().getString(R.string.scanCardBarcode); - integrator.setPrompt(prompt); - integrator.initiateScan(); - } - }; - - 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); - } - }); - - if(cardIdFieldView.getText().length() > 0) - { - cardIdDivider.setVisibility(View.VISIBLE); - cardIdTableRow.setVisibility(View.VISIBLE); - enterButton.setText(R.string.editCard); } else { - cardIdDivider.setVisibility(View.GONE); - cardIdTableRow.setVisibility(View.GONE); - enterButton.setText(R.string.enterCard); - } - } - - private void doSave() - { - String store = storeFieldEdit.getText().toString(); - String note = noteFieldEdit.getText().toString(); - String cardId = cardIdFieldView.getText().toString(); - String barcodeType = barcodeTypeField.getText().toString(); - - if(store.isEmpty()) - { - Snackbar.make(storeFieldEdit, R.string.noStoreError, Snackbar.LENGTH_LONG).show(); - return; + Log.d(TAG, "ImageView size known known, creating barcode"); + new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute(); } - if(cardId.isEmpty() || barcodeType.isEmpty()) - { - Snackbar.make(cardIdFieldView, R.string.noCardIdError, Snackbar.LENGTH_LONG).show(); - return; - } - - if(updateLoyaltyCard) - { - db.updateLoyaltyCard(loyaltyCardId, store, note, cardId, barcodeType); - Log.i(TAG, "Updated " + loyaltyCardId + " to " + cardId); - } - else - { - loyaltyCardId = (int)db.insertLoyaltyCard(store, note, cardId, barcodeType); - } - - finish(); } @Override public boolean onCreateOptionsMenu(Menu menu) { - if(viewLoyaltyCard) - { - getMenuInflater().inflate(R.menu.card_view_menu, menu); - } - else if(updateLoyaltyCard) - { - getMenuInflater().inflate(R.menu.card_update_menu, menu); - } - else - { - getMenuInflater().inflate(R.menu.card_add_menu, menu); - } + getMenuInflater().inflate(R.menu.card_view_menu, menu); rotationEnabled = true; @@ -353,40 +172,8 @@ public class LoyaltyCardViewActivity extends AppCompatActivity finish(); break; - case R.id.action_delete: - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(R.string.deleteTitle); - builder.setMessage(R.string.deleteConfirmation); - builder.setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dialog, int which) - { - Log.e(TAG, "Deleting card: " + loyaltyCardId); - - DBHelper db = new DBHelper(LoyaltyCardViewActivity.this); - db.deleteLoyaltyCard(loyaltyCardId); - - ShortcutHelper.removeShortcut(LoyaltyCardViewActivity.this, loyaltyCardId); - - finish(); - dialog.dismiss(); - } - }); - builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dialog, int which) - { - dialog.dismiss(); - } - }); - AlertDialog dialog = builder.create(); - dialog.show(); - - return true; case R.id.action_edit: - Intent intent = new Intent(getApplicationContext(), LoyaltyCardViewActivity.class); + Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class); Bundle bundle = new Bundle(); bundle.putInt("id", loyaltyCardId); bundle.putBoolean("update", true); @@ -410,50 +197,8 @@ public class LoyaltyCardViewActivity extends AppCompatActivity } rotationEnabled = !rotationEnabled; return true; - - case R.id.action_save: - doSave(); - return true; } return super.onOptionsItemSelected(item); } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent intent) - { - String contents = null; - String format = null; - - IntentResult result = - IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); - if (result != null) - { - Log.i(TAG, "Received barcode information from capture"); - contents = result.getContents(); - format = result.getFormatName(); - } - - if(requestCode == SELECT_BARCODE_REQUEST && resultCode == Activity.RESULT_OK) - { - Log.i(TAG, "Received barcode information from capture"); - - contents = intent.getStringExtra(BarcodeSelectorActivity.BARCODE_CONTENTS); - format = intent.getStringExtra(BarcodeSelectorActivity.BARCODE_FORMAT); - } - - if(contents != null && contents.isEmpty() == false && - format != null && format.isEmpty() == false) - { - Log.i(TAG, "Read barcode id: " + contents); - Log.i(TAG, "Read format: " + format); - - TextView cardIdView = (TextView)findViewById(R.id.cardIdView); - cardIdView.setText(contents); - - final TextView barcodeTypeField = (TextView) findViewById(R.id.barcodeType); - barcodeTypeField.setText(format); - onResume(); - } - } } \ No newline at end of file diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index 1fcc445ff..39bd3f492 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -96,7 +96,6 @@ public class MainActivity extends AppCompatActivity i.setAction(""); final Bundle b = new Bundle(); b.putInt("id", loyaltyCard.id); - b.putBoolean("view", true); i.putExtras(b); ShortcutHelper.updateShortcuts(MainActivity.this, loyaltyCard, i); @@ -153,7 +152,7 @@ public class MainActivity extends AppCompatActivity if (id == R.id.action_add) { - Intent i = new Intent(getApplicationContext(), LoyaltyCardViewActivity.class); + Intent i = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class); startActivity(i); return true; } diff --git a/app/src/main/res/layout/loyalty_card_view_activity.xml b/app/src/main/res/layout/loyalty_card_edit_activity.xml similarity index 100% rename from app/src/main/res/layout/loyalty_card_view_activity.xml rename to app/src/main/res/layout/loyalty_card_edit_activity.xml diff --git a/app/src/main/res/layout/loyalty_card_view_layout.xml b/app/src/main/res/layout/loyalty_card_view_layout.xml new file mode 100644 index 000000000..7ab5423bb --- /dev/null +++ b/app/src/main/res/layout/loyalty_card_view_layout.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index aed951295..ac36b9748 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -17,10 +17,12 @@ 18sp 46dp + 200dp 8dp 16dp - 33sp + 33sp + 100sp diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index c4d5ff2e8..d7c6cc296 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -17,6 +17,11 @@ +