RG-3446
This commit is contained in:
@@ -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<String, String> 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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<String, String> 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;
|
||||
}
|
||||
}
|
||||
@@ -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<String, String> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,7 +44,6 @@ public class CameraActivity extends AbstractScannerActivity implements
|
||||
return;
|
||||
}
|
||||
|
||||
initNetwork(getIntent());
|
||||
initToolbar(getIntent());
|
||||
|
||||
mPreview = (CameraPreview) initScanner();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -11,4 +11,5 @@
|
||||
<string name="logout_no">Нет</string>
|
||||
<string name="identifier_not_found">"Идентификатор %s не найден"</string>
|
||||
<string name="enter_manual">Введите штрихкод вручную</string>
|
||||
<string name="error_contact_support">Можете воспользоваться ручным вводом или позвонить на номер:%s</string>
|
||||
</resources>
|
||||
|
||||
@@ -10,4 +10,6 @@
|
||||
<string name="logout_yes">Так</string>
|
||||
<string name="logout_no">Ні</string>
|
||||
<string name="identifier_not_found">"Ідентифікатор %s не знайден"</string>
|
||||
<string name="enter_manual">Введіть штрихкод вручну</string>
|
||||
<string name="error_contact_support">Можете воспользоваться ручным вводом или позвонить на номер:\n%s</string>
|
||||
</resources>
|
||||
|
||||
@@ -10,4 +10,6 @@
|
||||
<string name="logout_yes">Yes</string>
|
||||
<string name="logout_no">No</string>
|
||||
<string name="identifier_not_found">"Identifier %s is not found"</string>
|
||||
<string name="enter_manual">Enter the barcode manually</string>
|
||||
<string name="error_contact_support">Можете воспользоваться ручным вводом или позвонить на номер:\n%s</string>
|
||||
</resources>
|
||||
|
||||
Reference in New Issue
Block a user