Skip to content

Commit

Permalink
Basic selector when multiple barcodes found
Browse files Browse the repository at this point in the history
  • Loading branch information
TheLastProject committed Mar 23, 2024
1 parent cbc8886 commit e5c0d5f
Show file tree
Hide file tree
Showing 6 changed files with 134 additions and 62 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package protect.card_locker;

public interface BarcodeValuesListDisambiguatorCallback {
void onUserChoseBarcode(BarcodeValues barcodeValues);
void onUserDismissedSelector();
}
19 changes: 15 additions & 4 deletions app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -646,11 +646,22 @@ public void onTabReselected(TabLayout.Tab tab) {
Log.d("barcode card id editor", "barcode and card id editor picker returned without an intent");
return;
}
BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(Utils.BARCODE_SCAN, result.getResultCode(), intent, getApplicationContext());

cardId = barcodeValues.content();
barcodeType = barcodeValues.format();
barcodeId = "";
List<BarcodeValues> barcodeValues = Utils.parseSetBarcodeActivityResult(Utils.BARCODE_SCAN, result.getResultCode(), intent, getApplicationContext());

Utils.makeUserChooseBarcodeFromList(this, barcodeValues, new BarcodeValuesListDisambiguatorCallback() {
@Override
public void onUserChoseBarcode(BarcodeValues barcodeValues) {
cardId = barcodeValues.content();
barcodeType = barcodeValues.format();
barcodeId = "";
}

@Override
public void onUserDismissedSelector() {

}
});
}
});

Expand Down
51 changes: 31 additions & 20 deletions app/src/main/java/protect/card_locker/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
import android.content.SharedPreferences;
import android.database.CursorIndexOutOfBoundsException;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
Expand All @@ -33,7 +31,6 @@
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.tabs.TabLayout;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
Expand Down Expand Up @@ -195,10 +192,12 @@ public void onDestroyActionMode(ActionMode inputMode) {

@Override
protected void onCreate(Bundle inputSavedInstanceState) {
extractIntentFields(getIntent());
SplashScreen.installSplashScreen(this);
super.onCreate(inputSavedInstanceState);

// We should extract the share intent after we called the super.onCreate as it may need to spawn a dialog window and the app needs to be initialized to not crash
extractIntentFields(getIntent());

binding = MainActivityBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbar);
Expand Down Expand Up @@ -288,11 +287,11 @@ public void onClick(DialogInterface dialog, int whichButton) {
}

Intent intent = result.getData();
BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(Utils.BARCODE_SCAN, result.getResultCode(), intent, this);
List<BarcodeValues> barcodeValues = Utils.parseSetBarcodeActivityResult(Utils.BARCODE_SCAN, result.getResultCode(), intent, this);

Bundle inputBundle = intent.getExtras();
String group = inputBundle != null ? inputBundle.getString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP) : null;
processBarcodeValues(barcodeValues, group);
processBarcodeValues(barcodeValues, group, false);
});

mSettingsLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
Expand Down Expand Up @@ -447,20 +446,32 @@ private void updateLoyaltyCardList(boolean updateCount) {
}
}

private void processBarcodeValues(BarcodeValues barcodeValues, String group) {
private void processBarcodeValues(List<BarcodeValues> barcodeValues, String group, boolean closeAppOnNoBarcode) {
if (barcodeValues.isEmpty()) {
throw new IllegalArgumentException("barcodesValues may not be empty");
}

Intent newIntent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
Bundle newBundle = new Bundle();
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_BARCODETYPE, barcodeValues.format());
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_CARDID, barcodeValues.content());
if (group != null) {
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, group);
}
newIntent.putExtras(newBundle);
startActivity(newIntent);
Utils.makeUserChooseBarcodeFromList(MainActivity.this, barcodeValues, new BarcodeValuesListDisambiguatorCallback() {
@Override
public void onUserChoseBarcode(BarcodeValues barcodeValues) {
Intent newIntent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
Bundle newBundle = new Bundle();
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_BARCODETYPE, barcodeValues.format());
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_CARDID, barcodeValues.content());
if (group != null) {
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, group);
}
newIntent.putExtras(newBundle);
startActivity(newIntent);
}

@Override
public void onUserDismissedSelector() {
if (closeAppOnNoBarcode) {
finish();
}
}
});
}

private void onSharedIntent(Intent intent) {
Expand All @@ -469,12 +480,12 @@ private void onSharedIntent(Intent intent) {

// Check if an image or file was shared to us
if (Intent.ACTION_SEND.equals(receivedAction)) {
BarcodeValues barcodeValues;
List<BarcodeValues> barcodeValues;

if (receivedType.startsWith("image/")) {
barcodeValues = Utils.retrieveBarcodeFromImage(this, intent.getParcelableExtra(Intent.EXTRA_STREAM));
barcodeValues = Utils.retrieveBarcodesFromImage(this, intent.getParcelableExtra(Intent.EXTRA_STREAM));
} else if (receivedType.equals("application/pdf")) {
barcodeValues = Utils.retrieveBarcodeFromPdf(this, intent.getParcelableExtra(Intent.EXTRA_STREAM));
barcodeValues = Utils.retrieveBarcodesFromPdf(this, intent.getParcelableExtra(Intent.EXTRA_STREAM));
} else {
Log.e(TAG, "Wrong mime-type");
return;
Expand All @@ -485,7 +496,7 @@ private void onSharedIntent(Intent intent) {
return;
}

processBarcodeValues(barcodeValues, null);
processBarcodeValues(barcodeValues, null, true);
}
}

Expand Down
14 changes: 12 additions & 2 deletions app/src/main/java/protect/card_locker/ScanActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -275,14 +275,24 @@ private void returnResult(String barcodeContents, String barcodeFormat) {
private void handleActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);

BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent, this);
List<BarcodeValues> barcodeValues = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent, this);

if (barcodeValues.isEmpty()) {
setScannerActive(true);
return;
}

returnResult(barcodeValues.content(), barcodeValues.format());
Utils.makeUserChooseBarcodeFromList(this, barcodeValues, new BarcodeValuesListDisambiguatorCallback() {
@Override
public void onUserChoseBarcode(BarcodeValues barcodeValues) {
returnResult(barcodeValues.content(), barcodeValues.format());
}

@Override
public void onUserDismissedSelector() {
setScannerActive(true);
}
});
}

private void addWithoutBarcode() {
Expand Down
Loading

0 comments on commit e5c0d5f

Please sign in to comment.