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 9356c71..c66ee95 100644 --- a/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java +++ b/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java @@ -23,21 +23,22 @@ 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; +import android.support.v7.widget.Toolbar; import android.util.Log; import android.util.Pair; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.Window; +import android.widget.EditText; import android.widget.FrameLayout; -import android.widget.Toast; import android.widget.TextView; -import android.support.v7.widget.Toolbar; +import android.widget.Toast; import com.dinect.checker.net.ApiClient; @@ -45,8 +46,6 @@ import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; -import static android.app.Activity.RESULT_OK; - /** * Created by anonymous @@ -56,26 +55,14 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { private final static String TAG = "Checker.ScannerActivity"; - private static final String[] CLICK_MESSAGES = { - "Там ничего нет.", - "Зачем ты это делаешь?", - "Перестань!", - "Ну и зачем?..", - }; - - private final AtomicInteger counter = new AtomicInteger(0); - private int mColor; + private int counter; public static final String SCAN_MODES = "SCAN_MODES"; public static final String ERROR_INFO = "ERROR_INFO"; - - protected AppCompatActivity ctx; protected ApiClient apiClient; protected NetworkThread networkThread; - protected DecrementCounterThread counterThread; protected LogoutDialogFragment logoutDialog; - protected NotificationThread notificationThread; boolean isCameraAvailable() { Log.d(TAG, "isCameraAvailable"); @@ -88,7 +75,6 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { final Intent response = new Intent(); response.putExtra(ERROR_INFO, message); setResult(RESULT_CANCELED, response); - notificationThread = null; } /** @@ -105,9 +91,6 @@ 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); @@ -117,120 +100,65 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { /** * Configure toolbar of app */ - protected final void initToolbar(final int toolbarId, final @NonNull String title) { - Log.d(TAG, "initToolbar"); - final Toolbar toolbar = (Toolbar) findViewById(toolbarId); - mColor = (int) getIntent().getLongExtra(MainActivity.PREF_APP_BAR_COLOR, 0xffffff); - toolbar.setBackgroundColor(mColor); + protected final void initToolbar(Intent intent) { + + final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + toolbar.setBackgroundColor((int) intent.getLongExtra(MainActivity.PREF_APP_BAR_COLOR, 0xffffff)); setSupportActionBar(toolbar); final ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { - actionBar.setTitle(title); + actionBar.setTitle(null); actionBar.setDisplayHomeAsUpEnabled(false); } + + initManualInput(); setupSecretClickHandler(toolbar); } - private void setupSecretClickHandler(final @NonNull Toolbar toolbar) { + private void initManualInput() { + EditText manualInput = (EditText) findViewById(R.id.manual_input); + + + manualInput.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + handleBarcode(v.getText().toString()); + return false; + } + }); + + } + + private void setupSecretClickHandler(final @NonNull View toolbar) { // Configure increment handler - counterThread = new DecrementCounterThread(counter, 700L); toolbar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - String toastMessage = null; - switch (counter.incrementAndGet()) { - case 1: - if (false == counterThread.isRunning()) { - counterThread.start(); - } - break; - case 5: - toastMessage = CLICK_MESSAGES[0]; - break; - case 11: - toastMessage = CLICK_MESSAGES[1]; - break; - case 17: - toastMessage = CLICK_MESSAGES[2]; - break; - case 23: - toastMessage = null; - counterThread.pause(); - Toast.makeText(ctx, CLICK_MESSAGES[3], Toast.LENGTH_SHORT).show(); - switchScanner(); - break; - } - Log.d(TAG, "toolbar clicked " + counter.get() + " times"); - - if (null != toastMessage) { - notificationThread.addMessage(toastMessage); + if (counter == 15) { + switchScanner(); + } else { + counter++; } + Log.d(TAG, "toolbar clicked " + counter + " times"); } }); } - - private class DecrementCounterThread extends Thread { - final long delay; - final AtomicInteger counter; - private boolean running = false; - private int previous = 0; - - public DecrementCounterThread(final AtomicInteger counter, final long delay) { - // Configure decrement handler - Log.d(TAG, "setupSecretClickHandler: DecrementCounterThread()"); - this.counter = counter; - this.delay = delay; - } - - @Override - public void run() { - running = true; - while (running) { - try { - Thread.sleep(delay); - if (counter.get() > 0) { - if (previous > counter.get()) { - previous = counter.decrementAndGet(); - Log.d(TAG, "decrement counter, now " + counter.get()); - } else { - previous = counter.get(); - } - } - } catch (final IllegalArgumentException | InterruptedException e) { - Log.d(TAG, "disable counter decrease Thread", e); - } - } - } - - public boolean isRunning() { - return running; - } - - public void pause() { - Log.d(TAG, "pause decrementer"); - running = false; - } - } - private void switchScanner() { - final SharedPreferences prefs = getSharedPreferences("MainActivity", Context.MODE_PRIVATE); - int idx = prefs.getInt(MainActivity.SCANNER_BACKEND_KEY, 0); - Log.d(TAG, "current scanner backend " + idx + ", " + MainActivity.SCANNER_BACKEND[idx].toString()); - if (idx >= MainActivity.SCANNER_BACKEND.length - 1) { - idx = 0; - } else { - idx++; - } + final SharedPreferences prefs = getSharedPreferences("scanner", Context.MODE_PRIVATE); + + int idx = (prefs.getInt(MainActivity.SCANNER_BACKEND_KEY, 0) == MainActivity.ZXING) + ? MainActivity.ZBAR + : MainActivity.ZXING; + Log.d(TAG, "switch to scanner backend " + idx + ", " + MainActivity.SCANNER_BACKEND[idx].toString()); prefs.edit().putInt(MainActivity.SCANNER_BACKEND_KEY, idx).apply(); - final Intent response = new Intent(); - response.putExtra("item", "restartScanner"); cancelRequest("Scanner backend changed"); + setResult(RESULT_OK); finish(); } @@ -270,7 +198,6 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { */ public void handleBarcode(final @NonNull String card) { Log.d(TAG, "handleBarcode"); - notificationThread.addMessage(card); networkThread = new NetworkThread(this, apiClient); networkThread.card(card).start(); } @@ -284,12 +211,7 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { intent.putExtra("card", result.first); setResult(RESULT_OK, intent); networkThread.cancel(); - notificationThread.cancel(); finish(); - } else { - if (null != result.second) { - notificationThread.addMessage(result.second); - } } } @@ -316,7 +238,8 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { finish(); return true; } else if (item.getItemId() == R.id.logout) { - logoutDialog = LogoutDialogFragment.newInstance(mColor); + int color = (int) getIntent().getLongExtra(MainActivity.PREF_APP_BAR_COLOR, 0xffffff); + logoutDialog = LogoutDialogFragment.newInstance(color); logoutDialog.show(getFragmentManager(), "logout"); return true; } else if (item.getItemId() == R.id.faq) { @@ -382,54 +305,4 @@ 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/MainActivity.java b/android/app/src/main/java/com/dinect/checker/MainActivity.java index 9640d79..a4b5977 100644 --- a/android/app/src/main/java/com/dinect/checker/MainActivity.java +++ b/android/app/src/main/java/com/dinect/checker/MainActivity.java @@ -1,28 +1,28 @@ package com.dinect.checker; -import android.os.Bundle; -import android.content.Intent; -import android.util.Log; -import android.widget.Toast; import android.content.Context; -import android.content.SharedPreferences; +import android.content.Intent; import android.content.res.Configuration; import android.content.res.Resources; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.Bundle; +import android.util.Log; +import android.widget.Toast; + import com.dinect.checker.zbar.CameraActivity; import com.dinect.checker.zxing.ScannerActivity; + +import java.util.ArrayList; import java.util.Locale; +import java.util.Map; import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; - -import java.util.Map; -import java.util.ArrayList; -import java.lang.System; -import java.util.Set; +import io.flutter.plugins.GeneratedPluginRegistrant; public class MainActivity extends FlutterActivity { @@ -35,88 +35,98 @@ public class MainActivity extends FlutterActivity { static final String PREF_POS_TOKEN = "pref_pos_token"; static final String PREF_APP_BAR_COLOR = "pref_app_bar_color"; + public static final int ZXING = 0; + public static final int ZBAR = 1; + static final Class[] SCANNER_BACKEND = { ScannerActivity.class, CameraActivity.class, }; + static final String SCANNER_BACKEND_KEY = "scanner_backend_idx"; private MethodChannel mChannel; - private SharedPreferences mPreferences; + private Map mScannerArgs; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GeneratedPluginRegistrant.registerWith(this); initLocale(this); - mPreferences = getPreferences(Context.MODE_PRIVATE); - mChannel = new MethodChannel(getFlutterView(), "com.dinect.checker/instance_id"); mChannel.setMethodCallHandler( new MethodCallHandler() { @Override public void onMethodCall(MethodCall call, Result result) { - switch (call.method) { - - case "getLocale": - result.success(BuildConfig.locale); - break; - - case "getFlavor": - result.success(BuildConfig.flavor); - break; - - case "getCurrency": - result.success(BuildConfig.currency); - break; - - case "startScanner": - final Map arguments = call.arguments(); - final int idx = mPreferences.getInt(SCANNER_BACKEND_KEY, 0); - Log.d(TAG, "use " + SCANNER_BACKEND[idx].toString() + " backend, with idx = " + idx); - Intent cameraIntent = new Intent(MainActivity.this, SCANNER_BACKEND[idx]); - cameraIntent.putExtra(PREF_API_URL, (String) arguments.get("url")); - cameraIntent.putExtra(PREF_APP_TOKEN, (String) arguments.get("appToken")); - cameraIntent.putExtra(PREF_POS_TOKEN, (String) arguments.get("token")); - cameraIntent.putExtra(PREF_APP_BAR_COLOR, (Long) arguments.get("color")); - startActivityForResult(cameraIntent, START_SCANNER_REQUEST_CODE); - break; - - case "isOnline": - boolean online = Utils.isOnline(MainActivity.this); - if (!online) { - Toast.makeText(MainActivity.this, "Проверьте интернет соединение", Toast.LENGTH_SHORT).show(); - } - result.success(online); - break; - - default: - result.notImplemented(); - break; - } + callMethod(call, result); } }); } + private void callMethod(MethodCall call, Result result) { + switch (call.method) { + case "getLocale": + result.success(BuildConfig.locale); + break; + case "getFlavor": + result.success(BuildConfig.flavor); + break; + case "getCurrency": + result.success(BuildConfig.currency); + break; + case "startScanner": + mScannerArgs = call.arguments(); + startScannerActivity(); + break; + case "isOnline": + checkInternetConnection(result); + break; + default: + result.notImplemented(); + break; + } + } + + private void checkInternetConnection(Result result) { + boolean connected = Utils.isOnline(this); + if (!connected) + Toast.makeText(this, "Проверьте интернет соединение", Toast.LENGTH_SHORT).show(); + result.success(connected); + } + + private void startScannerActivity() { + final int idx = getSharedPreferences("scanner", Context.MODE_PRIVATE).getInt(SCANNER_BACKEND_KEY, 0); + Intent cameraIntent = new Intent(MainActivity.this, SCANNER_BACKEND[idx]); + cameraIntent.putExtra(PREF_API_URL, (String) mScannerArgs.get("url")); + cameraIntent.putExtra(PREF_APP_TOKEN, (String) mScannerArgs.get("appToken")); + cameraIntent.putExtra(PREF_POS_TOKEN, (String) mScannerArgs.get("token")); + cameraIntent.putExtra(PREF_APP_BAR_COLOR, (Long) mScannerArgs.get("color")); + startActivityForResult(cameraIntent, START_SCANNER_REQUEST_CODE); + } + @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == START_SCANNER_REQUEST_CODE && resultCode == RESULT_CANCELED) { - finish(); - } else if (requestCode == START_SCANNER_REQUEST_CODE && resultCode == RESULT_OK) { - if (data != null) { - String user = data.getExtras().getString("user", null); - if (user != null) { - String card = data.getExtras().getString("card", null); - ArrayList args = new ArrayList<>(2); - args.add(user); - args.add(card); - mChannel.invokeMethod("purchase", args); - } else { - String menuItem = data.getExtras().getString("item", null); - Log.d(TAG, menuItem); - if (menuItem != null) { - mChannel.invokeMethod(menuItem, null); + if (requestCode == START_SCANNER_REQUEST_CODE) { + if (resultCode == RESULT_CANCELED) { + finish(); + } else if (resultCode == RESULT_OK) { + if (data != null) { + String user = data.getExtras().getString("user", null); + if (user != null) { + String card = data.getExtras().getString("card", null); + ArrayList args = new ArrayList<>(2); + args.add(user); + args.add(card); + mChannel.invokeMethod("purchase", args); + } else { + String menuItem = data.getExtras().getString("item", null); + Log.d(TAG, menuItem); + if (menuItem != null) { + mChannel.invokeMethod(menuItem, null); + } } + } else { + startScannerActivity(); } } } diff --git a/android/app/src/main/java/com/dinect/checker/Utils.java b/android/app/src/main/java/com/dinect/checker/Utils.java index b4987f2..5175eeb 100644 --- a/android/app/src/main/java/com/dinect/checker/Utils.java +++ b/android/app/src/main/java/com/dinect/checker/Utils.java @@ -11,8 +11,11 @@ public class Utils { } public static boolean isOnline(Context context) { - ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo netInfo = cm.getActiveNetworkInfo(); + NetworkInfo netInfo = getConnectivityManager(context).getActiveNetworkInfo(); return netInfo != null && netInfo.isConnected(); } + + private static ConnectivityManager getConnectivityManager(Context context) { + return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + } } \ No newline at end of file diff --git a/android/app/src/main/java/com/dinect/checker/net/ApiClient.java b/android/app/src/main/java/com/dinect/checker/net/ApiClient.java index 3ea5cbb..4768d82 100644 --- a/android/app/src/main/java/com/dinect/checker/net/ApiClient.java +++ b/android/app/src/main/java/com/dinect/checker/net/ApiClient.java @@ -93,7 +93,7 @@ public final class ApiClient { try { final Response response = http.newCall(request).execute(); final String body = response.body().string(); - final String NOT_FOUND_MESSAGE = String.format(ctx.getString(R.string.identifier_not_found, card)); + final String NOT_FOUND_MESSAGE = String.format(ctx.getString(R.string.identifier_not_found), card); switch (response.code()) { case 200: final JSONArray users = new JSONArray(body); diff --git a/android/app/src/main/java/com/dinect/checker/net/DinectAuthorizationInterceptor.java b/android/app/src/main/java/com/dinect/checker/net/DinectAuthorizationInterceptor.java index 9d39896..edc4588 100644 --- a/android/app/src/main/java/com/dinect/checker/net/DinectAuthorizationInterceptor.java +++ b/android/app/src/main/java/com/dinect/checker/net/DinectAuthorizationInterceptor.java @@ -79,8 +79,6 @@ public final class DinectAuthorizationInterceptor implements Interceptor { } final Request request = requestBuilder.url(url).headers(headers).build(); - final Response response = chain.proceed(request); - - return response; + return chain.proceed(request); } } \ No newline at end of file diff --git a/android/app/src/main/java/com/dinect/checker/zbar/CameraActivity.java b/android/app/src/main/java/com/dinect/checker/zbar/CameraActivity.java index 93860b8..5c85711 100644 --- a/android/app/src/main/java/com/dinect/checker/zbar/CameraActivity.java +++ b/android/app/src/main/java/com/dinect/checker/zbar/CameraActivity.java @@ -1,12 +1,12 @@ package com.dinect.checker.zbar; import android.content.Intent; -import android.content.pm.PackageManager; import android.hardware.Camera; import android.os.Bundle; import android.os.Handler; import android.text.TextUtils; import android.view.View; +import android.widget.EditText; import android.widget.Toast; import com.dinect.checker.AbstractScannerActivity; @@ -19,7 +19,8 @@ import net.sourceforge.zbar.ImageScanner; import net.sourceforge.zbar.Symbol; import net.sourceforge.zbar.SymbolSet; -public class CameraActivity extends AbstractScannerActivity implements Camera.PreviewCallback { +public class CameraActivity extends AbstractScannerActivity implements + Camera.PreviewCallback { public static final String ERROR_INFO = "ERROR_INFO"; @@ -39,12 +40,12 @@ public class CameraActivity extends AbstractScannerActivity implements Camera.Pr public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (!init(R.layout.activity_zbar_scanner)) { + if (!init(R.layout.a_zbar)) { return; } initNetwork(getIntent()); - initToolbar(R.id.toolbar, getString(R.string.scanner_title)); + initToolbar(getIntent()); mPreview = (CameraPreview) initScanner(); 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 16d2680..6562aee 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 @@ -17,8 +17,8 @@ package com.dinect.checker.zxing; import android.os.Bundle; import android.os.Handler; -import android.util.Log; import android.view.View; +import android.widget.EditText; import com.dinect.checker.AbstractScannerActivity; import com.dinect.checker.R; @@ -42,11 +42,13 @@ public class ScannerActivity extends AbstractScannerActivity @Override public void onCreate(Bundle state) { super.onCreate(state); - if (!init(R.layout.activity_zxing_scanner)) { + + if (!init(R.layout.a_zxing)) { return; } + initNetwork(getIntent()); - initToolbar(R.id.zxingToolbar, getString(R.string.scanner_title)); + initToolbar(getIntent()); scannerView = (ZXingScannerView) initScanner(); ArrayList formats = new ArrayList<>(); diff --git a/android/app/src/main/res/layout/activity_zbar_scanner.xml b/android/app/src/main/res/layout/a_zbar.xml similarity index 88% rename from android/app/src/main/res/layout/activity_zbar_scanner.xml rename to android/app/src/main/res/layout/a_zbar.xml index f23117d..0fb2abb 100644 --- a/android/app/src/main/res/layout/activity_zbar_scanner.xml +++ b/android/app/src/main/res/layout/a_zbar.xml @@ -41,11 +41,7 @@ android:layout_marginTop="56dp" android:background="#00ff00" /> - + - + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/values-ru/strings.xml b/android/app/src/main/res/values-ru/strings.xml index dae7ebe..2939cf1 100644 --- a/android/app/src/main/res/values-ru/strings.xml +++ b/android/app/src/main/res/values-ru/strings.xml @@ -1,4 +1,4 @@ - + AutoBonus Сканер карты Сканировать @@ -10,4 +10,5 @@ Да Нет "Идентификатор %s не найден" + Введите штрихкод вручную diff --git a/lib/consts.dart b/lib/consts.dart index f3ee797..7fc89b3 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -3,11 +3,11 @@ import 'package:flutter/material.dart'; // Serious constants const String appName = "Autobonus"; -const String url = 'https://pos-api-autoclub.dinect.com/20130701/'; -const String appToken = 'bdea0f3ba9034b688019a7cac753d1209e2b227f'; +//const String url = 'https://pos-api-autoclub.dinect.com/20130701/'; +//const String appToken = 'bdea0f3ba9034b688019a7cac753d1209e2b227f'; -//const String url = 'https://pos-api-int.dinect.com/20130701/'; -//const String appToken = '9fec83cdca38c357e6b65dbb17514cdd36bf2a08'; +const String url = 'https://pos-api-int.dinect.com/20130701/'; +const String appToken = '9fec83cdca38c357e6b65dbb17514cdd36bf2a08'; // Assets const String logout_png = 'assets/logout.png';