diff --git a/app/src/main/java/protect/card_locker/BarcodeValues.java b/app/src/main/java/protect/card_locker/BarcodeValues.java new file mode 100644 index 000000000..681d1572f --- /dev/null +++ b/app/src/main/java/protect/card_locker/BarcodeValues.java @@ -0,0 +1,23 @@ +package protect.card_locker; + +public class BarcodeValues { + private final String mFormat; + private final String mContent; + + public BarcodeValues(String format, String content) { + mFormat = format; + mContent = content; + } + + public String format() { + return mFormat; + } + + public String content() { + return mContent; + } + + public boolean isEmpty() { + return mFormat == null && mContent == null; + } +} diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java index 5f50c3541..9c9c2e5c8 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java @@ -48,8 +48,6 @@ public class LoyaltyCardEditActivity extends AppCompatActivity { private static final String TAG = "Catima"; - protected static final int SELECT_BARCODE_REQUEST = 1; - ImageView thumbnail; EditText storeFieldEdit; EditText noteFieldEdit; @@ -62,11 +60,13 @@ public class LoyaltyCardEditActivity extends AppCompatActivity View barcodeImageLayout; View barcodeCaptureLayout; - Button captureButton; Button enterButton; int loyaltyCardId; boolean updateLoyaltyCard; + String barcodeType; + String cardId; + Uri importLoyaltyCardUri = null; Integer headingColorValue = null; @@ -82,6 +82,10 @@ public class LoyaltyCardEditActivity extends AppCompatActivity final Bundle b = intent.getExtras(); loyaltyCardId = b != null ? b.getInt("id") : 0; updateLoyaltyCard = b != null && b.getBoolean("update", false); + + barcodeType = b != null ? b.getString("barcodeType") : null; + cardId = b != null ? b.getString("cardId") : null; + importLoyaltyCardUri = intent.getData(); Log.d(TAG, "View activity: id=" + loyaltyCardId @@ -119,7 +123,6 @@ public class LoyaltyCardEditActivity extends AppCompatActivity barcodeImageLayout = findViewById(R.id.barcodeLayout); barcodeCaptureLayout = findViewById(R.id.barcodeCaptureLayout); - captureButton = findViewById(R.id.captureButton); enterButton = findViewById(R.id.enterButton); storeFieldEdit.addTextChangedListener(new TextWatcher() { @@ -318,6 +321,21 @@ public class LoyaltyCardEditActivity extends AppCompatActivity thumbnail.setOnClickListener(new ColorSelectListener(headingColorValue)); + if (!initDone) { + hasChanged = false; + initDone = true; + } + + // Update from intent + if (barcodeType != null) { + barcodeTypeField.setText(barcodeType.isEmpty() ? getString(R.string.noBarcode) : barcodeType); + barcodeType = null; + } + if (cardId != null) { + cardIdFieldView.setText(cardId); + cardId = null; + } + if(cardIdFieldView.getText().length() > 0 && barcodeTypeField.getText().length() > 0) { String formatString = barcodeTypeField.getText().toString(); @@ -335,23 +353,6 @@ public class LoyaltyCardEditActivity extends AppCompatActivity } } - 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.setBeepEnabled(false); - integrator.initiateScan(); - } - }; - - captureButton.setOnClickListener(captureCallback); - enterButton.setOnClickListener(new EditCardIdAndBarcode()); barcodeImage.setOnClickListener(new EditCardIdAndBarcode()); @@ -380,11 +381,6 @@ public class LoyaltyCardEditActivity extends AppCompatActivity }); generateIcon(storeFieldEdit.getText().toString()); - - if (!initDone) { - hasChanged = false; - initDone = true; - } } @Override @@ -425,17 +421,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity @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); + Utils.createSetBarcodeDialog(LoyaltyCardEditActivity.this, LoyaltyCardEditActivity.this, true, cardIdFieldView.getText().toString()); } } @@ -590,41 +576,12 @@ public class LoyaltyCardEditActivity extends AppCompatActivity { super.onActivityResult(requestCode, resultCode, intent); - String contents = null; - String format = null; + BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent); - IntentResult result = - IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); - if (result != null) - { - Log.i(TAG, "Received barcode information from capture"); - contents = result.getContents(); - format = result.getFormatName(); - } + barcodeType = barcodeValues.format(); + cardId = barcodeValues.content(); - if(requestCode == SELECT_BARCODE_REQUEST && resultCode == Activity.RESULT_OK) - { - Log.i(TAG, "Received barcode information from typing it"); - - contents = intent.getStringExtra(BarcodeSelectorActivity.BARCODE_CONTENTS); - format = intent.getStringExtra(BarcodeSelectorActivity.BARCODE_FORMAT); - } - - if(contents != null && contents.isEmpty() == false && - format != null) - { - Log.i(TAG, "Read barcode id: " + contents); - Log.i(TAG, "Read format: " + format); - - TextView cardIdView = findViewById(R.id.cardIdView); - cardIdView.setText(contents); - - // Set special NO_BARCODE value to prevent onResume from overwriting it - barcodeTypeField.setText(format.isEmpty() ? getString(R.string.noBarcode) : format); - onResume(); - - hasChanged = true; - } + onResume(); } private void showBarcode() { diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index e3f5d3b6f..93760e4b1 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -1,9 +1,11 @@ package protect.card_locker; +import android.app.AlertDialog; import android.app.SearchManager; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; @@ -15,6 +17,7 @@ import androidx.appcompat.widget.Toolbar; import android.util.Log; import android.view.ContextMenu; import android.view.GestureDetector; +import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -26,6 +29,8 @@ import android.widget.TextView; import android.widget.Toast; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.tabs.TabLayout; +import com.google.zxing.integration.android.IntentIntegrator; +import com.google.zxing.integration.android.IntentResult; import java.util.List; import protect.card_locker.preferences.SettingsActivity; @@ -33,7 +38,6 @@ import protect.card_locker.preferences.SettingsActivity; public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener { private static final String TAG = "Catima"; - private static final int MAIN_REQUEST_CODE = 1; private Menu menu; private GestureDetector gestureDetector; @@ -137,18 +141,16 @@ public class MainActivity extends AppCompatActivity implements GestureDetector.O addButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Intent i = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class); - startActivityForResult(i, MAIN_REQUEST_CODE); + Utils.createSetBarcodeDialog(MainActivity.this, MainActivity.this, false, null); } }); } @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); + protected void onActivityResult(int requestCode, int resultCode, Intent intent) { + super.onActivityResult(requestCode, resultCode, intent); - if (requestCode == MAIN_REQUEST_CODE) - { + if (requestCode == Utils.MAIN_REQUEST) { // We're coming back from another view so clear the search // We only do this now to prevent a flash of all entries right after picking one filter = ""; @@ -160,6 +162,19 @@ public class MainActivity extends AppCompatActivity implements GestureDetector.O // In case the theme changed recreate(); + + return; + } + + BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent); + + if(!barcodeValues.isEmpty()) { + Intent newIntent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class); + Bundle newBundle = new Bundle(); + newBundle.putString("barcodeType", barcodeValues.format()); + newBundle.putString("cardId", barcodeValues.content()); + newIntent.putExtras(newBundle); + startActivity(newIntent); } } @@ -245,7 +260,7 @@ public class MainActivity extends AppCompatActivity implements GestureDetector.O ShortcutHelper.updateShortcuts(MainActivity.this, loyaltyCard, i); - startActivityForResult(i, MAIN_REQUEST_CODE); + startActivityForResult(i, Utils.MAIN_REQUEST); } }); } @@ -368,28 +383,28 @@ public class MainActivity extends AppCompatActivity implements GestureDetector.O if (id == R.id.action_manage_groups) { Intent i = new Intent(getApplicationContext(), ManageGroupsActivity.class); - startActivityForResult(i, MAIN_REQUEST_CODE); + startActivityForResult(i, Utils.MAIN_REQUEST); return true; } if(id == R.id.action_import_export) { Intent i = new Intent(getApplicationContext(), ImportExportActivity.class); - startActivityForResult(i, MAIN_REQUEST_CODE); + startActivityForResult(i, Utils.MAIN_REQUEST); return true; } if(id == R.id.action_settings) { Intent i = new Intent(getApplicationContext(), SettingsActivity.class); - startActivityForResult(i, MAIN_REQUEST_CODE); + startActivityForResult(i, Utils.MAIN_REQUEST); return true; } if(id == R.id.action_about) { Intent i = new Intent(getApplicationContext(), AboutActivity.class); - startActivityForResult(i, MAIN_REQUEST_CODE); + startActivityForResult(i, Utils.MAIN_REQUEST); return true; } diff --git a/app/src/main/java/protect/card_locker/Utils.java b/app/src/main/java/protect/card_locker/Utils.java index eea4ee41a..4ad19cd32 100644 --- a/app/src/main/java/protect/card_locker/Utils.java +++ b/app/src/main/java/protect/card_locker/Utils.java @@ -1,11 +1,31 @@ package protect.card_locker; +import android.app.Activity; +import android.app.AlertDialog; import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; import android.graphics.Color; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; + +import com.google.zxing.integration.android.IntentIntegrator; +import com.google.zxing.integration.android.IntentResult; import androidx.core.graphics.ColorUtils; public class Utils { + private static final String TAG = "Catima"; + + // Barcode config dialog + public static AlertDialog setBarcodeDialog; + + // Activity request codes + public static final int MAIN_REQUEST = 1; + public static final int SELECT_BARCODE_REQUEST = 2; + static final double LUMINANCE_MIDPOINT = 0.5; static public LetterBitmap generateIcon(Context context, String store, Integer backgroundColor) { @@ -27,4 +47,92 @@ public class Utils { static public boolean needsDarkForeground(Integer backgroundColor) { return ColorUtils.calculateLuminance(backgroundColor) > LUMINANCE_MIDPOINT; } + + static public void startCameraBarcodeScan(Context context, Activity activity) { + IntentIntegrator integrator = new IntentIntegrator(activity); + integrator.setDesiredBarcodeFormats(BarcodeSelectorActivity.SUPPORTED_BARCODE_TYPES); + + String prompt = context.getResources().getString(R.string.scanCardBarcode); + integrator.setPrompt(prompt); + integrator.setBeepEnabled(false); + integrator.initiateScan(); + } + + static public void createSetBarcodeDialog(final Context context, final Activity activity, boolean isUpdate, final String initialCardId) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + // Get the layout inflater + LayoutInflater inflater = activity.getLayoutInflater(); + + // Inflate and set the layout for the dialog + // Pass null as the parent view because its going in the dialog layout + builder.setView(inflater.inflate(R.layout.dialog_create, null)); + + if (isUpdate) { + builder.setTitle(context.getString(R.string.editCardTitle)); + } else { + builder.setTitle(context.getString(R.string.addCardTitle)); + } + + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + setBarcodeDialog.cancel(); + } + }); + setBarcodeDialog = builder.create(); + setBarcodeDialog.show(); + + View addFromCamera = setBarcodeDialog.getWindow().findViewById(R.id.add_from_camera); + View addManually = setBarcodeDialog.getWindow().findViewById(R.id.add_manually); + + addFromCamera.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Utils.startCameraBarcodeScan(context, activity); + + setBarcodeDialog.hide(); + } + }); + + addManually.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent i = new Intent(context, BarcodeSelectorActivity.class); + if (initialCardId != null) { + final Bundle b = new Bundle(); + b.putString("initialCardId", initialCardId); + i.putExtras(b); + } + activity.startActivityForResult(i, Utils.SELECT_BARCODE_REQUEST); + + setBarcodeDialog.hide(); + } + }); + } + + static public BarcodeValues parseSetBarcodeActivityResult(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 == Utils.SELECT_BARCODE_REQUEST && resultCode == Activity.RESULT_OK) + { + Log.i(TAG, "Received barcode information from typing it"); + + contents = intent.getStringExtra(BarcodeSelectorActivity.BARCODE_CONTENTS); + format = intent.getStringExtra(BarcodeSelectorActivity.BARCODE_FORMAT); + } + + Log.i(TAG, "Read barcode id: " + contents); + Log.i(TAG, "Read format: " + format); + + return new BarcodeValues(format, contents); + } } diff --git a/app/src/main/res/drawable-hdpi/ic_camera_white.png b/app/src/main/res/drawable-hdpi/ic_camera_white.png new file mode 100644 index 000000000..7a95405cc Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_camera_white.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_camera_white.png b/app/src/main/res/drawable-mdpi/ic_camera_white.png new file mode 100644 index 000000000..77cda3d9c Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_camera_white.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_camera_white.png b/app/src/main/res/drawable-xhdpi/ic_camera_white.png new file mode 100644 index 000000000..40d34844d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_camera_white.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_camera_white.png b/app/src/main/res/drawable-xxhdpi/ic_camera_white.png new file mode 100644 index 000000000..11dcfb087 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_camera_white.png differ diff --git a/app/src/main/res/layout/dialog_create.xml b/app/src/main/res/layout/dialog_create.xml new file mode 100644 index 000000000..75f46edef --- /dev/null +++ b/app/src/main/res/layout/dialog_create.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + 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 8b71c8c99..5f114ba3b 100644 --- a/app/src/main/res/layout/loyalty_card_edit_activity.xml +++ b/app/src/main/res/layout/loyalty_card_edit_activity.xml @@ -136,12 +136,6 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/barcodeCaptureLayout"> -