Add dialog giving the user scan/manually enter options (#111)

This commit is contained in:
Sylvia van Os
2020-11-27 12:58:55 +01:00
committed by GitHub
parent 133fa13d3b
commit 158e424a47
13 changed files with 261 additions and 108 deletions

View File

@@ -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;
}
}

View File

@@ -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() {

View File

@@ -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;
}

View File

@@ -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);
}
}