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">
-