From 158e424a4791de53d8ca3cce34c90d315077cb48 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Fri, 27 Nov 2020 12:58:55 +0100 Subject: [PATCH] Add dialog giving the user scan/manually enter options (#111) --- .../protect/card_locker/BarcodeValues.java | 23 ++++ .../card_locker/LoyaltyCardEditActivity.java | 97 +++++----------- .../protect/card_locker/MainActivity.java | 39 +++++-- .../main/java/protect/card_locker/Utils.java | 108 ++++++++++++++++++ .../res/drawable-hdpi/ic_camera_white.png | Bin 0 -> 327 bytes .../res/drawable-mdpi/ic_camera_white.png | Bin 0 -> 217 bytes .../res/drawable-xhdpi/ic_camera_white.png | Bin 0 -> 375 bytes .../res/drawable-xxhdpi/ic_camera_white.png | Bin 0 -> 523 bytes app/src/main/res/layout/dialog_create.xml | 44 +++++++ .../res/layout/loyalty_card_edit_activity.xml | 6 - app/src/main/res/values/strings.xml | 2 + .../LoyaltyCardViewActivityTest.java | 39 ++++--- .../protect/card_locker/MainActivityTest.java | 11 +- 13 files changed, 261 insertions(+), 108 deletions(-) create mode 100644 app/src/main/java/protect/card_locker/BarcodeValues.java create mode 100644 app/src/main/res/drawable-hdpi/ic_camera_white.png create mode 100644 app/src/main/res/drawable-mdpi/ic_camera_white.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_camera_white.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_camera_white.png create mode 100644 app/src/main/res/layout/dialog_create.xml 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 0000000000000000000000000000000000000000..7a95405cca20ec374f12714eafedb03b0b8e6a8e GIT binary patch literal 327 zcmV-N0l5B&P)F7urUK?0|X#|6958M0eIrpWS2Axw=dR>kTrS#kV2nz^rLC2J>8Du zXq6VF-68a8?*hXQ6#sndjQS82Y3w7?XFB3KQ%bo1N%>XR`&1*CQI4>$~m+# zO779I1dNU)*KoyCzZ}C=mRLV9=t$O&F$9DIh}1CrEsI@c;k+eGWBj z?BA9yeYhl&DI|mE$m|Y-2?A_06MN1!oeeRN$>TKRJ{KT7Im=Oh)Aof2Ehk5b{ZLvt zkttE7PHL&xmq#89A3Baa6;9GMI5wHVOfk}L9;?T}ChZ?fKD?Bz;O1btn6_dLv#Qt^ zg;wKDsY+WJe|UI*f?|M#T8*8G7A>5&Mp+aenlhDJXv?0`@sfAhL~@CTiP{+ Rt$=Q2@O1TaS?83{1ON;cQN;iN literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..40d34844daa29a3756ceba3c1fc4fbc9e570138d GIT binary patch literal 375 zcmV--0f_#IP)cNHK3gy*MoD{4wx4hhiarh%V+u1@?H z!1L)c0C?$l-wjZG3Kec*jbRg4e~eaN$gJc=D-lX3ebGut%*|ZqgtnPGHDt8Y1Ga%i zCJZzZ^GIof>jNWYUlKSC^)&%(hynB~t`-^6RoGH*s8wQvc3axS-Z_zxk&%(T&%TCz VsT9l1a`pfK002ovPDHLkV1l0sm;(R+ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..11dcfb087bad857f06e65ac65150b4bcc6f3c827 GIT binary patch literal 523 zcmV+m0`&cfP)foyfUF?{yq$dbLS9T$q!te4`2XaRCZ<>UatGW& zZ#M{nAP9myT9&0Z_7ll^z$pb15gZm8K%C+HL%QPfd^PJ4J+Y&xAUJ;pKmY_lMFLXB24n5ET(CRw);?3E z0n*0Akqw&Nu!<4@jUhGD`d#aTB_I*8HWb_d^#lcU&jpZpGj+afWC;7YP8msO0UABO z(Runt>$A?|W6Twhc13|*mE-|m(zWW@=*tq2*nu;D*fp%EQtb>t6+ueK9q3sB`resy zLcwKFdooB%aM>E%o_Tj1saC_#B3QoJ(&A;mCB zXFEw#F7ukhGC!TLQJhd}IJyHlmKwfdRe#tWU{$Qno_5E0u$RrQ-QldhpXMa(i5g$S zOqSAe?KUmfu9TK5n)W#MiEA>#!J(vhx2v7aao$d + + + + + + + + + + + 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"> -