From a56839dca47c0944d09999e39441ad52373163b9 Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Wed, 20 Sep 2017 18:21:18 +0300 Subject: [PATCH] RG-3446 --- android/app/build.gradle | 2 + .../checker/AbstractScannerActivity.java | 111 +++++++++++------- .../java/com/dinect/checker/MainActivity.java | 7 +- .../com/dinect/checker/NetworkThread.java | 72 ------------ .../com/dinect/checker/net/ApiClient.java | 89 +++----------- .../dinect/checker/zbar/CameraActivity.java | 1 - .../dinect/checker/zxing/ScannerActivity.java | 12 +- .../app/src/main/res/values-ru/strings.xml | 1 + .../app/src/main/res/values-ua/strings.xml | 2 + android/app/src/main/res/values/strings.xml | 2 + 10 files changed, 101 insertions(+), 198 deletions(-) delete mode 100644 android/app/src/main/java/com/dinect/checker/NetworkThread.java diff --git a/android/app/build.gradle b/android/app/build.gradle index 7e54f2f..973bed0 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -47,6 +47,7 @@ android { buildConfigField "String", "locale", "\"ru\"" buildConfigField "String", "flavor", "\"autobonus\"" buildConfigField "int", "currency", "643" + buildConfigField "String", "support", "\"8-800-234-6064\"" } pip { @@ -54,6 +55,7 @@ android { buildConfigField "String", "locale", "\"ua\"" buildConfigField "String", "flavor", "\"pip\"" buildConfigField "int", "currency", "980" + buildConfigField "String", "support", "\"+38 080 030 9997\\n+38 044 390 1697\"" } } 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 c66ee95..63d323b 100644 --- a/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java +++ b/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java @@ -24,6 +24,7 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; @@ -42,9 +43,16 @@ import android.widget.Toast; import com.dinect.checker.net.ApiClient; -import java.util.Queue; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.atomic.AtomicInteger; +import org.json.JSONArray; +import org.json.JSONException; + +import java.io.IOException; +import java.util.Locale; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Response; +import okhttp3.ResponseBody; /** @@ -60,9 +68,8 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { public static final String SCAN_MODES = "SCAN_MODES"; public static final String ERROR_INFO = "ERROR_INFO"; - protected ApiClient apiClient; - protected NetworkThread networkThread; protected LogoutDialogFragment logoutDialog; + private ApiClient mClient; boolean isCameraAvailable() { Log.d(TAG, "isCameraAvailable"); @@ -77,6 +84,15 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { setResult(RESULT_CANCELED, response); } + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + final String appToken = getIntent().getStringExtra(MainActivity.PREF_APP_TOKEN); + final String token = getIntent().getStringExtra(MainActivity.PREF_POS_TOKEN); + final String url = getIntent().getStringExtra(MainActivity.PREF_API_URL) + "/users/"; + mClient = new ApiClient(url, appToken, token); + } + /** * initialize activity * - removes windows title @@ -174,45 +190,58 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { protected abstract View initScanner(); - /** - * Initialize network client - */ - protected final void initNetwork(final Intent intent) { - Log.d(TAG, "initNetwork"); - final String url = intent.getStringExtra(MainActivity.PREF_API_URL); - final String appToken = intent.getStringExtra(MainActivity.PREF_APP_TOKEN); - final String token = intent.getStringExtra(MainActivity.PREF_POS_TOKEN); - - Log.d(TAG, "initializing addScanner activity with url " - + url + ", appToken " + appToken + ", token " + token); - - apiClient = new ApiClient(url, appToken, token); - } - - /** - * Handles barcode. - * Makes network call in separate thread and call - * networkResponseCallback - * - * @param card scanned card number - */ public void handleBarcode(final @NonNull String card) { - Log.d(TAG, "handleBarcode"); - networkThread = new NetworkThread(this, apiClient); - networkThread.card(card).start(); + mClient.findUser(card, new Callback() { + @Override + public void onFailure(Call call, IOException e) { + handleFail(card); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + try { + ResponseBody body = response.body(); + if (body != null) { + switch (response.code()) { + case 200: + final JSONArray users = new JSONArray(body.string()); + if (users.length() > 0) { + handleSuccess(card, users.get(0).toString()); + } else { + handleFail(card); + } + case 204: + handleFail(card); + } + } + } catch (final IOException | JSONException e) { + Log.e(TAG, e.getMessage(), e); + handleFail(card); + } + } + }); } - protected final void networkResponseCallback(final @NonNull Pair result) { - Log.d(TAG, "networkResponseCallback"); - if (null != result.first) { - Log.d(TAG, "user found, finish activity with result"); - final Intent intent = new Intent(); - intent.putExtra("user", result.second); - intent.putExtra("card", result.first); - setResult(RESULT_OK, intent); - networkThread.cancel(); - finish(); - } + protected final void handleSuccess(final String card, final String user) { + runOnUiThread(new Runnable() { + @Override + public void run() { + setResult(RESULT_OK, new Intent().putExtra("user", user).putExtra("card", card)); + finish(); + } + }); + } + + protected final void handleFail(final String card) { + runOnUiThread(new Runnable() { + @Override + public void run() { + String message = String.format(getString(R.string.identifier_not_found), card) + + ".\n" + + String.format(getString(R.string.error_contact_support), BuildConfig.support); + Toast.makeText(AbstractScannerActivity.this, message, Toast.LENGTH_SHORT).show(); + } + }); } @Override 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 a4b5977..56c3b53 100644 --- a/android/app/src/main/java/com/dinect/checker/MainActivity.java +++ b/android/app/src/main/java/com/dinect/checker/MainActivity.java @@ -10,6 +10,7 @@ import android.os.Bundle; import android.util.Log; import android.widget.Toast; +import com.dinect.checker.net.ApiClient; import com.dinect.checker.zbar.CameraActivity; import com.dinect.checker.zxing.ScannerActivity; @@ -30,9 +31,9 @@ public class MainActivity extends FlutterActivity { private static final int START_SCANNER_REQUEST_CODE = 2017; - static final String PREF_API_URL = "prefs_api_token"; - static final String PREF_APP_TOKEN = "pres_app_token"; - static final String PREF_POS_TOKEN = "pref_pos_token"; + public static final String PREF_API_URL = "prefs_api_token"; + public static final String PREF_APP_TOKEN = "pres_app_token"; + public 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; diff --git a/android/app/src/main/java/com/dinect/checker/NetworkThread.java b/android/app/src/main/java/com/dinect/checker/NetworkThread.java deleted file mode 100644 index e1288fd..0000000 --- a/android/app/src/main/java/com/dinect/checker/NetworkThread.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2017 . - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dinect.checker; - -import android.support.annotation.NonNull; -import android.util.Log; -import android.util.Pair; - -import com.dinect.checker.net.ApiClient; - -/** - * Created by anonymous on 03.08.17. - */ - -public final class NetworkThread extends Thread { - - private static final String TAG = "Checker.NetworkThread"; - - private AbstractScannerActivity activity; - private final ApiClient client; - private String card; - - /** - * @param activity caller activity (with networkResponseCallback()) - * @param client ApiClient instance - */ - public NetworkThread(final @NonNull AbstractScannerActivity activity, final @NonNull ApiClient client) { - this.activity = activity; - this.client = client; - } - - @Override - public void run() { - if (null != activity) { - final Pair response = client.findUser(activity, card); - Log.d(TAG, "network request done with result: " + response.first); - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - activity.networkResponseCallback(response); - } - }); - } - } - - /** - * Set card for network call - * - * @parm card number to search - */ - public NetworkThread card(final @NonNull String card) { - this.card = card; - return this; - } - - void cancel() { - activity = null; - } -} 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 4768d82..95de9e6 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 @@ -15,101 +15,44 @@ */ package com.dinect.checker.net; -import android.content.Context; import android.support.annotation.NonNull; -import android.util.Log; -import android.util.Pair; -import org.json.JSONArray; -import org.json.JSONException; - -import java.lang.String; -import java.io.IOException; import java.util.concurrent.TimeUnit; +import okhttp3.Callback; import okhttp3.HttpUrl; import okhttp3.OkHttpClient; import okhttp3.Request; -import okhttp3.Response; - -import com.dinect.checker.R; /** * Created by anonymous */ - public final class ApiClient { private static final String TAG = "Checker.ApiClient"; - private static final int TIMEOUT_CONNECTION = 3; - private static final int TIMEOUT_READ = 3; - private static final int TIMEOUT_WRITE = 3; + private static final int TIMEOUT = 3; - public final String endpoint; - public final String appToken; - public final String token; + private OkHttpClient mHttp; + private String mEndpoint; - - final OkHttpClient http; - - /** - * @param endpoint POS API endpoint - * @param appToken Application Token - * @param token POS token - */ - public ApiClient(final @NonNull String endpoint, final @NonNull String appToken, final @NonNull String token) { - this.endpoint = endpoint; - this.appToken = appToken; - this.token = token; - - http = new OkHttpClient(). + public ApiClient(final String url, final @NonNull String appToken, final @NonNull String token) { + mEndpoint = url; + mHttp = new OkHttpClient(). newBuilder() - .connectTimeout(TIMEOUT_CONNECTION, TimeUnit.SECONDS) - .readTimeout(TIMEOUT_READ, TimeUnit.SECONDS) - .writeTimeout(TIMEOUT_WRITE, TimeUnit.SECONDS) + .connectTimeout(TIMEOUT, TimeUnit.SECONDS) + .readTimeout(TIMEOUT, TimeUnit.SECONDS) + .writeTimeout(TIMEOUT, TimeUnit.SECONDS) .addInterceptor(new DinectAuthorizationInterceptor(appToken, token, "checker/0.1", true)) .build(); } - - /*** - * - * @param card card/foreigncarf number - * @return (null, error) on fail or (card, user) info on success - */ - public Pair findUser(Context ctx, final @NonNull String card) { - - final Request.Builder builder = new Request.Builder(); - final Request request; - - final HttpUrl.Builder httpBuilder = HttpUrl.parse(endpoint + "/users/").newBuilder(); - - httpBuilder.addQueryParameter("auto", card); - request = builder - .url(httpBuilder.build()) - .build(); - - 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); - switch (response.code()) { - case 200: - final JSONArray users = new JSONArray(body); - if (users.length() > 0) { - return new Pair<>(card, users.get(0).toString()); - } else { - return new Pair<>(null, NOT_FOUND_MESSAGE); - } - case 204: - return new Pair<>(null, NOT_FOUND_MESSAGE); - default: - return new Pair<>(null, "Что-то пошло не так"); - } - } catch (final IOException | JSONException e) { - Log.e(TAG, e.getMessage(), e); - return new Pair<>(null, "Упс..."); + public void findUser(String card, Callback callback) { + final Request.Builder requestBuilder = new Request.Builder(); + final HttpUrl url = HttpUrl.parse(mEndpoint); + if (url != null) { + HttpUrl.Builder httpBuilder = url.newBuilder().addQueryParameter("auto", card); + mHttp.newCall(requestBuilder.url(httpBuilder.build()).build()).enqueue(callback); } } } 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 5c85711..08903ef 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 @@ -44,7 +44,6 @@ public class CameraActivity extends AbstractScannerActivity implements return; } - initNetwork(getIntent()); 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 6562aee..f79eef7 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,6 +17,7 @@ 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; @@ -35,7 +36,7 @@ import me.dm7.barcodescanner.zxing.ZXingScannerView; public class ScannerActivity extends AbstractScannerActivity implements ZXingScannerView.ResultHandler { - private static final int SCAN_INTERVAL_PERIOD = 2000; + private static final int SCAN_INTERVAL_PERIOD = 500; private ZXingScannerView scannerView; @@ -47,7 +48,6 @@ public class ScannerActivity extends AbstractScannerActivity return; } - initNetwork(getIntent()); initToolbar(getIntent()); scannerView = (ZXingScannerView) initScanner(); @@ -83,12 +83,8 @@ public class ScannerActivity extends AbstractScannerActivity @Override public void handleResult(Result raw) { - final String card = raw.getText(); - - handleBarcode(card); - - final Handler handler = new Handler(); - handler.postDelayed(new Runnable() { + handleBarcode(raw.getText()); + scannerView.postDelayed(new Runnable() { @Override public void run() { scannerView.resumeCameraPreview(ScannerActivity.this); diff --git a/android/app/src/main/res/values-ru/strings.xml b/android/app/src/main/res/values-ru/strings.xml index 2939cf1..9313589 100644 --- a/android/app/src/main/res/values-ru/strings.xml +++ b/android/app/src/main/res/values-ru/strings.xml @@ -11,4 +11,5 @@ Нет "Идентификатор %s не найден" Введите штрихкод вручную + Можете воспользоваться ручным вводом или позвонить на номер:%s diff --git a/android/app/src/main/res/values-ua/strings.xml b/android/app/src/main/res/values-ua/strings.xml index abd3168..456e511 100644 --- a/android/app/src/main/res/values-ua/strings.xml +++ b/android/app/src/main/res/values-ua/strings.xml @@ -10,4 +10,6 @@ Так Ні "Ідентифікатор %s не знайден" + Введіть штрихкод вручну + Можете воспользоваться ручным вводом или позвонить на номер:\n%s diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 99d4eca..1fdceed 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -10,4 +10,6 @@ Yes No "Identifier %s is not found" + Enter the barcode manually + Можете воспользоваться ручным вводом или позвонить на номер:\n%s