diff --git a/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java b/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java index e3a97fe..581e212 100644 --- a/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java +++ b/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java @@ -23,6 +23,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Bundle; +import android.os.Handler; import android.support.annotation.NonNull; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; @@ -39,6 +40,8 @@ import android.widget.Toast; import com.dinect.net.ApiClient; +import java.util.Queue; +import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; @@ -62,11 +65,12 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { public static final String ERROR_INFO = "ERROR_INFO"; + protected AppCompatActivity ctx; protected ApiClient apiClient; protected NetworkThread networkThread; - private DecrementCounterThread counterThread; - - LogoutDialogFragment logoutDialog; + protected DecrementCounterThread counterThread; + protected LogoutDialogFragment logoutDialog; + protected NotificationThread notificationThread; boolean isCameraAvailable() { Log.d(TAG, "isCameraAvailable"); @@ -79,6 +83,7 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { final Intent response = new Intent(); response.putExtra(ERROR_INFO, message); setResult(RESULT_CANCELED, response); + notificationThread = null; } /** @@ -95,10 +100,12 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { cancelRequest("Camera unavailable"); return false; } + ctx = this; + notificationThread = new NotificationThread(this); + notificationThread.start(); // Hide the window title. requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(layoutID); - return true; } @@ -142,21 +149,22 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { toastMessage = CLICK_MESSAGES[2]; break; case 23: - toastMessage = CLICK_MESSAGES[3]; + toastMessage = null; counterThread.pause(); - counter.set(0); + Toast.makeText(ctx, CLICK_MESSAGES[3], Toast.LENGTH_SHORT).show(); switchScanner(); break; } Log.d(TAG, "toolbar clicked " + counter.get() + " times"); if (null != toastMessage) { - Toast.makeText(getApplicationContext(), toastMessage, Toast.LENGTH_SHORT).show(); + notificationThread.addMessage(toastMessage); } } }); } + private class DecrementCounterThread extends Thread { final long delay; final AtomicInteger counter; @@ -255,7 +263,7 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { */ public void handleBarcode(final @NonNull String card) { Log.d(TAG, "handleBarcode"); - Toast.makeText(this, card, Toast.LENGTH_SHORT).show(); + notificationThread.addMessage(card); networkThread = new NetworkThread(this, apiClient); networkThread.card(card).start(); } @@ -268,11 +276,12 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { intent.putExtra("user", result.second); intent.putExtra("card", result.first); setResult(RESULT_OK, intent); - networkThread.close(); + networkThread.cancel(); + notificationThread.cancel(); finish(); } else { if (null != result.second) { - Toast.makeText(this, result.second, Toast.LENGTH_SHORT).show(); + notificationThread.addMessage(result.second); } } } @@ -341,4 +350,54 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { return builder.create(); } } + + private class NotificationThread extends Thread { + + private final static int MAX_NOTIFICATION_MESSAGES = 2; + + private boolean run = true; + private final Queue queue; + private final AbstractScannerActivity ctx; + + public NotificationThread(final @NonNull AbstractScannerActivity ctx) { + this.queue = new ArrayBlockingQueue<>(MAX_NOTIFICATION_MESSAGES); + this.ctx = ctx; + } + + @Override + public void run() { + while (run) { + if (null != queue.peek()) { + Log.d(TAG, "null != queue.peek()"); + final String message = queue.poll(); + Log.d(TAG, "message: " + message); + if (null != message) { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(ctx, message, Toast.LENGTH_SHORT).show(); + } + }); + } + } + try { + Thread.sleep(300); + } catch (final InterruptedException ie) { + run = false; + } + } + } + + public void addMessage(final @NonNull String message) { + if (queue.size() == MAX_NOTIFICATION_MESSAGES) { + Log.d(TAG, "Discard message: " + queue.poll()); + } + queue.add(message); + Log.d(TAG, "Add message: " + message); + } + + public void cancel() { + run = false; + } + } } diff --git a/android/app/src/main/java/com/dinect/checker/NetworkThread.java b/android/app/src/main/java/com/dinect/checker/NetworkThread.java index 6bc7c1e..40f70a0 100644 --- a/android/app/src/main/java/com/dinect/checker/NetworkThread.java +++ b/android/app/src/main/java/com/dinect/checker/NetworkThread.java @@ -66,7 +66,7 @@ public final class NetworkThread extends Thread { return this; } - void close() { + void cancel() { activity = null; } } diff --git a/android/app/src/main/java/com/dinect/checker/zxing/ScannerActivity.java b/android/app/src/main/java/com/dinect/checker/zxing/ScannerActivity.java index 7c98384..180a388 100644 --- a/android/app/src/main/java/com/dinect/checker/zxing/ScannerActivity.java +++ b/android/app/src/main/java/com/dinect/checker/zxing/ScannerActivity.java @@ -15,10 +15,8 @@ */ package com.dinect.checker.zxing; -import android.content.Intent; import android.os.Bundle; import android.os.Handler; -import android.support.annotation.NonNull; import android.view.View; import com.dinect.checker.AbstractScannerActivity; @@ -33,6 +31,8 @@ import me.dm7.barcodescanner.zxing.ZXingScannerView; public class ScannerActivity extends AbstractScannerActivity implements ZXingScannerView.ResultHandler { + private static final int SCAN_INTERVAL_PERIOD = 2000; + private ZXingScannerView scannerView; @Override @@ -84,6 +84,6 @@ public class ScannerActivity extends AbstractScannerActivity public void run() { scannerView.resumeCameraPreview(ScannerActivity.this); } - }, 500); + }, SCAN_INTERVAL_PERIOD); } }