Skip to content

Commit 42d8402

Browse files
committed
Merge branch 'Capture_Trigger_Mode'
2 parents ed9d5fd + 0dec37e commit 42d8402

File tree

7 files changed

+161
-4
lines changed

7 files changed

+161
-4
lines changed

AI_MultiBarcodes_Capture/src/main/java/com/zebra/ai_multibarcodes_capture/helpers/Constants.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,9 @@ public class Constants {
227227
public static final String SHARED_PREFERENCES_FILTERING_REGEX = "SHARED_PREFERENCES_FILTERING_REGEX";
228228
public static final String SHARED_PREFERENCES_FILTERING_REGEX_DEFAULT = "";
229229

230+
// Capture Trigger Mode preferences
231+
public static final String SHARED_PREFERENCES_CAPTURE_TRIGGER_MODE = "SHARED_PREFERENCES_CAPTURE_TRIGGER_MODE";
232+
public static final String SHARED_PREFERENCES_CAPTURE_TRIGGER_MODE_DEFAULT = "press";
230233

231234
public static final int KEYCODE_BUTTON_R1 = 103;
232235
public static final int KEYCODE_SCAN = 10036;

AI_MultiBarcodes_Capture/src/main/java/com/zebra/ai_multibarcodes_capture/java/CameraXLivePreviewActivity.java

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import android.util.Log;
1414
import android.util.Size;
1515
import android.view.Display;
16+
import android.view.KeyEvent;
1617
import android.view.Surface;
1718
import android.view.View;
1819
import android.view.WindowManager;
@@ -44,6 +45,7 @@
4445
import com.zebra.ai_multibarcodes_capture.databinding.ActivityCameraXlivePreviewBinding;
4546
import com.zebra.ai_multibarcodes_capture.helpers.Constants;
4647
import com.zebra.ai_multibarcodes_capture.helpers.ECameraResolution;
48+
import com.zebra.ai_multibarcodes_capture.helpers.ECaptureTriggerMode;
4749
import com.zebra.ai_multibarcodes_capture.helpers.LocaleHelper;
4850
import com.zebra.ai_multibarcodes_capture.helpers.LogUtils;
4951
import com.zebra.ai_multibarcodes_capture.helpers.PreferencesHelper;
@@ -133,6 +135,7 @@ public void run() {
133135
private ImageView flashlightToggleIcon;
134136
private CaptureZoneOverlay captureZoneOverlay;
135137
private boolean isFlashlightOn = false;
138+
private ECaptureTriggerMode captureTriggerMode = ECaptureTriggerMode.CAPTURE_ON_PRESS;
136139

137140
// Filtering settings
138141
private boolean isFilteringEnabled = false;
@@ -389,6 +392,20 @@ private void loadFilteringSettings() {
389392
LogUtils.d(TAG, "=== loadFilteringSettings() END ===");
390393
}
391394

395+
private void loadCaptureModeSettings() {
396+
LogUtils.d(TAG, "=== loadCaptureModeSettings() START ===");
397+
398+
// Get the SharedPreferences object
399+
SharedPreferences sharedPreferences = getSharedPreferences(getPackageName(), Context.MODE_PRIVATE);
400+
401+
// Load capture trigger mode
402+
String captureTriggerModeKey = sharedPreferences.getString(Constants.SHARED_PREFERENCES_CAPTURE_TRIGGER_MODE, Constants.SHARED_PREFERENCES_CAPTURE_TRIGGER_MODE_DEFAULT);
403+
captureTriggerMode = ECaptureTriggerMode.fromKey(captureTriggerModeKey);
404+
405+
LogUtils.d(TAG, "Loaded capture trigger mode: " + captureTriggerMode.toString() + " (" + captureTriggerMode.getDisplayName(this) + ")");
406+
LogUtils.d(TAG, "=== loadCaptureModeSettings() END ===");
407+
}
408+
392409
private boolean isValueMatchingFilteringRegex(String data)
393410
{
394411
if(isFilteringEnabled && filteringRegex.isEmpty() == false)
@@ -742,6 +759,9 @@ public void onResume() {
742759
// Load filtering settings
743760
loadFilteringSettings();
744761

762+
// Load capture mode settings
763+
loadCaptureModeSettings();
764+
745765
// Flashlight settings are now loaded after camera is bound in bindPreviewUseCase()
746766

747767
int currentRotation = getWindowManager().getDefaultDisplay().getRotation();
@@ -831,13 +851,24 @@ private void captureData() {
831851

832852
@Override
833853
public boolean onKeyDown(int keyCode, android.view.KeyEvent event) {
834-
if(keyCode == Constants.KEYCODE_BUTTON_R1 || keyCode == Constants.KEYCODE_SCAN)
835-
{
836-
captureData();
854+
if(captureTriggerMode == ECaptureTriggerMode.CAPTURE_ON_PRESS) {
855+
if (keyCode == Constants.KEYCODE_BUTTON_R1 || keyCode == Constants.KEYCODE_SCAN) {
856+
captureData();
857+
}
837858
}
838859
return super.onKeyDown(keyCode, event);
839860
}
840861

862+
@Override
863+
public boolean onKeyUp(int keyCode, KeyEvent event) {
864+
if(captureTriggerMode == ECaptureTriggerMode.CAPTURE_ON_RELEASE) {
865+
if (keyCode == Constants.KEYCODE_BUTTON_R1 || keyCode == Constants.KEYCODE_SCAN) {
866+
captureData();
867+
}
868+
}
869+
return super.onKeyUp(keyCode, event);
870+
}
871+
841872
@Override
842873
protected void attachBaseContext(Context newBase) {
843874
String languageCode = LocaleHelper.getCurrentLanguageCode(newBase);

AI_MultiBarcodes_Capture/src/main/java/com/zebra/ai_multibarcodes_capture/managedconfig/ManagedConfigurationReceiver.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,15 @@ private void updateSharedPreferences(Context context, Bundle restrictions) {
8080
}
8181
}
8282

83+
// Update capture trigger mode if provided
84+
if (restrictions.containsKey("capture_trigger_mode")) {
85+
String captureTriggerMode = restrictions.getString("capture_trigger_mode");
86+
if (captureTriggerMode != null && !captureTriggerMode.trim().isEmpty()) {
87+
editor.putString(Constants.SHARED_PREFERENCES_CAPTURE_TRIGGER_MODE, captureTriggerMode);
88+
LogUtils.d(TAG, "Updated capture_trigger_mode: " + captureTriggerMode);
89+
}
90+
}
91+
8392
// Update barcode symbologies from nested bundle
8493
if (restrictions.containsKey("barcode_symbologies")) {
8594
Bundle barcodeSymbologies = restrictions.getBundle("barcode_symbologies");

AI_MultiBarcodes_Capture/src/main/java/com/zebra/ai_multibarcodes_capture/settings/SettingsActivity.java

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import com.zebra.ai_multibarcodes_capture.R;
3232
import com.zebra.ai_multibarcodes_capture.adapters.LanguageAdapter;
3333
import com.zebra.ai_multibarcodes_capture.filemanagement.EExportMode;
34+
import com.zebra.ai_multibarcodes_capture.helpers.ECaptureTriggerMode;
3435
import com.zebra.ai_multibarcodes_capture.helpers.EProcessingMode;
3536
import com.zebra.ai_multibarcodes_capture.helpers.LocaleHelper;
3637
import com.zebra.ai_multibarcodes_capture.helpers.LogUtils;
@@ -80,7 +81,7 @@ public class SettingsActivity extends AppCompatActivity {
8081
private boolean isAdvancedExpanded = false;
8182
private boolean isHttpsPostExpanded = false;
8283
private boolean isFilteringExpanded = false;
83-
private Spinner spinnerLanguage, spinnerProcessingMode;
84+
private Spinner spinnerLanguage, spinnerProcessingMode, spinnerCaptureTriggerMode;
8485
private LanguageAdapter languageAdapter;
8586
private List<LanguageItem> languageList;
8687
private String pendingLanguageCode = null; // Track pending language changes
@@ -164,13 +165,17 @@ protected void onCreate(Bundle savedInstanceState) {
164165
tvSymbologiesBadge = findViewById(R.id.tvSymbologiesBadge);
165166
spinnerLanguage = findViewById(R.id.spinnerLanguage);
166167
spinnerProcessingMode = findViewById(R.id.spinnerProcessingMode);
168+
spinnerCaptureTriggerMode = findViewById(R.id.spinnerCaptureTriggerMode);
167169

168170
// Setup language spinner
169171
setupLanguageSpinner();
170172

171173
// Setup processing mode spinner
172174
setupProcessingModeSpinner();
173175

176+
// Setup capture trigger mode spinner
177+
setupCaptureTriggerModeSpinner();
178+
174179
// Setup HTTPS endpoint validation
175180
setupHttpsEndpointValidation();
176181

@@ -368,6 +373,7 @@ private void loadPreferences()
368373
loadProcessingMode(sharedPreferences);
369374
loadHttpsPostSettings(sharedPreferences);
370375
loadFilteringSettings(sharedPreferences);
376+
loadCaptureTriggerMode(sharedPreferences);
371377

372378
etPrefix.setText(prefix);
373379
selectExtensionRadioButton(extension);
@@ -479,6 +485,19 @@ private void loadProcessingMode(SharedPreferences sharedPreferences) {
479485
}
480486
}
481487

488+
private void loadCaptureTriggerMode(SharedPreferences sharedPreferences) {
489+
String captureTriggerModeKey = sharedPreferences.getString(SHARED_PREFERENCES_CAPTURE_TRIGGER_MODE, SHARED_PREFERENCES_CAPTURE_TRIGGER_MODE_DEFAULT);
490+
ECaptureTriggerMode captureTriggerMode = ECaptureTriggerMode.fromKey(captureTriggerModeKey);
491+
492+
// Set the spinner selection based on the loaded capture trigger mode
493+
for (int i = 0; i < ECaptureTriggerMode.values().length; i++) {
494+
if (ECaptureTriggerMode.values()[i] == captureTriggerMode) {
495+
spinnerCaptureTriggerMode.setSelection(i);
496+
break;
497+
}
498+
}
499+
}
500+
482501
private void savePreferences()
483502
{
484503
// Get the SharedPreferences object
@@ -500,6 +519,7 @@ private void savePreferences()
500519
saveProcessingMode(editor);
501520
saveHttpsPostSettings(editor);
502521
saveFilteringSettings(editor);
522+
saveCaptureTriggerMode(editor);
503523

504524
editor.putString(SHARED_PREFERENCES_EXTENSION, getSelectedExtension());
505525

@@ -624,6 +644,31 @@ public void onNothingSelected(AdapterView<?> parent) {
624644
updateSectionVisibility(spinnerProcessingMode.getSelectedItemPosition());
625645
}
626646

647+
private void setupCaptureTriggerModeSpinner() {
648+
// Create array of capture trigger mode display names
649+
String[] captureTriggerModeDisplayNames = new String[ECaptureTriggerMode.values().length];
650+
for (int i = 0; i < ECaptureTriggerMode.values().length; i++) {
651+
captureTriggerModeDisplayNames[i] = ECaptureTriggerMode.values()[i].getDisplayName(this);
652+
}
653+
654+
// Create adapter and set to spinner
655+
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, captureTriggerModeDisplayNames);
656+
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
657+
spinnerCaptureTriggerMode.setAdapter(adapter);
658+
659+
// Set current selection based on saved preferences
660+
SharedPreferences sharedPreferences = getSharedPreferences(getPackageName(), Context.MODE_PRIVATE);
661+
String currentCaptureTriggerMode = sharedPreferences.getString(SHARED_PREFERENCES_CAPTURE_TRIGGER_MODE, SHARED_PREFERENCES_CAPTURE_TRIGGER_MODE_DEFAULT);
662+
663+
ECaptureTriggerMode currentMode = ECaptureTriggerMode.fromKey(currentCaptureTriggerMode);
664+
for (int i = 0; i < ECaptureTriggerMode.values().length; i++) {
665+
if (ECaptureTriggerMode.values()[i] == currentMode) {
666+
spinnerCaptureTriggerMode.setSelection(i);
667+
break;
668+
}
669+
}
670+
}
671+
627672
private void setupHttpsEndpointValidation() {
628673
// No automatic prefix enforcement - allow both HTTP and HTTPS
629674
}
@@ -772,6 +817,14 @@ private void saveProcessingMode(SharedPreferences.Editor editor) {
772817
}
773818
}
774819

820+
private void saveCaptureTriggerMode(SharedPreferences.Editor editor) {
821+
int selectedPosition = spinnerCaptureTriggerMode.getSelectedItemPosition();
822+
if (selectedPosition >= 0 && selectedPosition < ECaptureTriggerMode.values().length) {
823+
ECaptureTriggerMode selectedMode = ECaptureTriggerMode.values()[selectedPosition];
824+
editor.putString(SHARED_PREFERENCES_CAPTURE_TRIGGER_MODE, selectedMode.toString());
825+
}
826+
}
827+
775828
private void loadHttpsPostSettings(SharedPreferences sharedPreferences) {
776829
String endpoint = sharedPreferences.getString(SHARED_PREFERENCES_HTTPS_ENDPOINT, SHARED_PREFERENCES_HTTPS_ENDPOINT_DEFAULT);
777830

AI_MultiBarcodes_Capture/src/main/res/layout/activity_setup.xml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,45 @@
7373

7474
</LinearLayout>
7575

76+
<LinearLayout
77+
android:id="@+id/llCaptureTriggerMode"
78+
android:layout_width="match_parent"
79+
android:layout_height="wrap_content"
80+
android:layout_marginBottom="10dp"
81+
android:orientation="vertical">
82+
83+
<androidx.constraintlayout.widget.ConstraintLayout
84+
android:layout_width="match_parent"
85+
android:layout_height="48dp"
86+
android:background="@color/zebra"
87+
android:backgroundTint="@color/zebra">
88+
89+
<TextView
90+
android:id="@+id/tvCaptureTriggerModeTitle"
91+
android:layout_width="0dp"
92+
android:layout_height="wrap_content"
93+
android:gravity="center"
94+
android:text="@string/capture_trigger_mode"
95+
android:textColor="@color/white"
96+
app:layout_constraintStart_toStartOf="parent"
97+
app:layout_constraintEnd_toEndOf="parent"
98+
app:layout_constraintTop_toTopOf="parent"
99+
app:layout_constraintBottom_toBottomOf="parent" />
100+
</androidx.constraintlayout.widget.ConstraintLayout>
101+
102+
<Spinner
103+
android:id="@+id/spinnerCaptureTriggerMode"
104+
android:layout_width="match_parent"
105+
android:layout_height="wrap_content"
106+
android:layout_marginTop="8dp"
107+
android:layout_marginStart="8dp"
108+
android:layout_marginEnd="8dp"
109+
android:background="@drawable/spinner_background"
110+
android:minHeight="48dp"
111+
android:popupBackground="@color/white" />
112+
113+
</LinearLayout>
114+
76115
<LinearLayout
77116
android:id="@+id/llDataProcessing"
78117
android:layout_width="match_parent"

AI_MultiBarcodes_Capture/src/main/res/values/strings.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,19 @@
475475
<item>CPU</item>
476476
</string-array>
477477

478+
<!-- Capture Trigger Mode Arrays for Managed Configuration -->
479+
<string-array name="capture_trigger_mode_names">
480+
<item>On Scan Press</item>
481+
<item>On Scan Release</item>
482+
</string-array>
483+
484+
<string-array name="capture_trigger_mode_values">
485+
<item>press</item>
486+
<item>release</item>
487+
</string-array>
488+
478489
<!-- Capture Mode -->
490+
<string name="capture_trigger_mode">Capture Trigger Mode</string>
479491
<string name="capture_mode_press">On Scan Press</string>
480492
<string name="capture_mode_release">On Scan Release</string>
481493

AI_MultiBarcodes_Capture/src/main/res/xml/app_restrictions.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,16 @@
2929
android:entries="@array/language_names"
3030
android:entryValues="@array/language_codes" />
3131

32+
<!-- Capture Trigger Mode Configuration -->
33+
<restriction
34+
android:key="capture_trigger_mode"
35+
android:title="Capture Trigger Mode"
36+
description="Select when to capture barcodes: on scan button press or on scan button release"
37+
android:restrictionType="choice"
38+
android:defaultValue="press"
39+
android:entries="@array/capture_trigger_mode_names"
40+
android:entryValues="@array/capture_trigger_mode_values" />
41+
3242
<!-- Processing Mode Configuration -->
3343
<restriction
3444
android:key="processing_mode"

0 commit comments

Comments
 (0)