RG-3446
This commit is contained in:
@@ -47,6 +47,7 @@ android {
|
|||||||
buildConfigField "String", "locale", "\"ru\""
|
buildConfigField "String", "locale", "\"ru\""
|
||||||
buildConfigField "String", "flavor", "\"autobonus\""
|
buildConfigField "String", "flavor", "\"autobonus\""
|
||||||
buildConfigField "int", "currency", "643"
|
buildConfigField "int", "currency", "643"
|
||||||
|
buildConfigField "String", "support", "\"8-800-234-6064\""
|
||||||
}
|
}
|
||||||
|
|
||||||
pip {
|
pip {
|
||||||
@@ -54,6 +55,7 @@ android {
|
|||||||
buildConfigField "String", "locale", "\"ua\""
|
buildConfigField "String", "locale", "\"ua\""
|
||||||
buildConfigField "String", "flavor", "\"pip\""
|
buildConfigField "String", "flavor", "\"pip\""
|
||||||
buildConfigField "int", "currency", "980"
|
buildConfigField "int", "currency", "980"
|
||||||
|
buildConfigField "String", "support", "\"+38 080 030 9997\\n+38 044 390 1697\""
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import android.content.SharedPreferences;
|
|||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
import android.support.v7.app.ActionBar;
|
import android.support.v7.app.ActionBar;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
import android.support.v7.widget.Toolbar;
|
import android.support.v7.widget.Toolbar;
|
||||||
@@ -42,9 +43,16 @@ import android.widget.Toast;
|
|||||||
|
|
||||||
import com.dinect.checker.net.ApiClient;
|
import com.dinect.checker.net.ApiClient;
|
||||||
|
|
||||||
import java.util.Queue;
|
import org.json.JSONArray;
|
||||||
import java.util.concurrent.ArrayBlockingQueue;
|
import org.json.JSONException;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
|
||||||
|
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 SCAN_MODES = "SCAN_MODES";
|
||||||
public static final String ERROR_INFO = "ERROR_INFO";
|
public static final String ERROR_INFO = "ERROR_INFO";
|
||||||
|
|
||||||
protected ApiClient apiClient;
|
|
||||||
protected NetworkThread networkThread;
|
|
||||||
protected LogoutDialogFragment logoutDialog;
|
protected LogoutDialogFragment logoutDialog;
|
||||||
|
private ApiClient mClient;
|
||||||
|
|
||||||
boolean isCameraAvailable() {
|
boolean isCameraAvailable() {
|
||||||
Log.d(TAG, "isCameraAvailable");
|
Log.d(TAG, "isCameraAvailable");
|
||||||
@@ -77,6 +84,15 @@ public abstract class AbstractScannerActivity extends AppCompatActivity {
|
|||||||
setResult(RESULT_CANCELED, response);
|
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
|
* initialize activity
|
||||||
* - removes windows title
|
* - removes windows title
|
||||||
@@ -174,45 +190,58 @@ public abstract class AbstractScannerActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
protected abstract View initScanner();
|
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) {
|
public void handleBarcode(final @NonNull String card) {
|
||||||
Log.d(TAG, "handleBarcode");
|
mClient.findUser(card, new Callback() {
|
||||||
networkThread = new NetworkThread(this, apiClient);
|
@Override
|
||||||
networkThread.card(card).start();
|
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) {
|
protected final void handleSuccess(final String card, final String user) {
|
||||||
Log.d(TAG, "networkResponseCallback");
|
runOnUiThread(new Runnable() {
|
||||||
if (null != result.first) {
|
@Override
|
||||||
Log.d(TAG, "user found, finish activity with result");
|
public void run() {
|
||||||
final Intent intent = new Intent();
|
setResult(RESULT_OK, new Intent().putExtra("user", user).putExtra("card", card));
|
||||||
intent.putExtra("user", result.second);
|
finish();
|
||||||
intent.putExtra("card", result.first);
|
}
|
||||||
setResult(RESULT_OK, intent);
|
});
|
||||||
networkThread.cancel();
|
}
|
||||||
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
|
@Override
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import android.os.Bundle;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import com.dinect.checker.net.ApiClient;
|
||||||
import com.dinect.checker.zbar.CameraActivity;
|
import com.dinect.checker.zbar.CameraActivity;
|
||||||
import com.dinect.checker.zxing.ScannerActivity;
|
import com.dinect.checker.zxing.ScannerActivity;
|
||||||
|
|
||||||
@@ -30,9 +31,9 @@ public class MainActivity extends FlutterActivity {
|
|||||||
|
|
||||||
private static final int START_SCANNER_REQUEST_CODE = 2017;
|
private static final int START_SCANNER_REQUEST_CODE = 2017;
|
||||||
|
|
||||||
static final String PREF_API_URL = "prefs_api_token";
|
public static final String PREF_API_URL = "prefs_api_token";
|
||||||
static final String PREF_APP_TOKEN = "pres_app_token";
|
public static final String PREF_APP_TOKEN = "pres_app_token";
|
||||||
static final String PREF_POS_TOKEN = "pref_pos_token";
|
public static final String PREF_POS_TOKEN = "pref_pos_token";
|
||||||
static final String PREF_APP_BAR_COLOR = "pref_app_bar_color";
|
static final String PREF_APP_BAR_COLOR = "pref_app_bar_color";
|
||||||
|
|
||||||
public static final int ZXING = 0;
|
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;
|
package com.dinect.checker.net;
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.support.annotation.NonNull;
|
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 java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import okhttp3.Callback;
|
||||||
import okhttp3.HttpUrl;
|
import okhttp3.HttpUrl;
|
||||||
import okhttp3.OkHttpClient;
|
import okhttp3.OkHttpClient;
|
||||||
import okhttp3.Request;
|
import okhttp3.Request;
|
||||||
import okhttp3.Response;
|
|
||||||
|
|
||||||
import com.dinect.checker.R;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by anonymous
|
* Created by anonymous
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public final class ApiClient {
|
public final class ApiClient {
|
||||||
|
|
||||||
private static final String TAG = "Checker.ApiClient";
|
private static final String TAG = "Checker.ApiClient";
|
||||||
|
|
||||||
private static final int TIMEOUT_CONNECTION = 3;
|
private static final int TIMEOUT = 3;
|
||||||
private static final int TIMEOUT_READ = 3;
|
|
||||||
private static final int TIMEOUT_WRITE = 3;
|
|
||||||
|
|
||||||
public final String endpoint;
|
private OkHttpClient mHttp;
|
||||||
public final String appToken;
|
private String mEndpoint;
|
||||||
public final String token;
|
|
||||||
|
|
||||||
|
public ApiClient(final String url, final @NonNull String appToken, final @NonNull String token) {
|
||||||
final OkHttpClient http;
|
mEndpoint = url;
|
||||||
|
mHttp = new OkHttpClient().
|
||||||
/**
|
|
||||||
* @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().
|
|
||||||
newBuilder()
|
newBuilder()
|
||||||
.connectTimeout(TIMEOUT_CONNECTION, TimeUnit.SECONDS)
|
.connectTimeout(TIMEOUT, TimeUnit.SECONDS)
|
||||||
.readTimeout(TIMEOUT_READ, TimeUnit.SECONDS)
|
.readTimeout(TIMEOUT, TimeUnit.SECONDS)
|
||||||
.writeTimeout(TIMEOUT_WRITE, TimeUnit.SECONDS)
|
.writeTimeout(TIMEOUT, TimeUnit.SECONDS)
|
||||||
.addInterceptor(new DinectAuthorizationInterceptor(appToken, token, "checker/0.1", true))
|
.addInterceptor(new DinectAuthorizationInterceptor(appToken, token, "checker/0.1", true))
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void findUser(String card, Callback callback) {
|
||||||
/***
|
final Request.Builder requestBuilder = new Request.Builder();
|
||||||
*
|
final HttpUrl url = HttpUrl.parse(mEndpoint);
|
||||||
* @param card card/foreigncarf number
|
if (url != null) {
|
||||||
* @return (null, error) on fail or (card, user) info on success
|
HttpUrl.Builder httpBuilder = url.newBuilder().addQueryParameter("auto", card);
|
||||||
*/
|
mHttp.newCall(requestBuilder.url(httpBuilder.build()).build()).enqueue(callback);
|
||||||
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, "Упс...");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ public class CameraActivity extends AbstractScannerActivity implements
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
initNetwork(getIntent());
|
|
||||||
initToolbar(getIntent());
|
initToolbar(getIntent());
|
||||||
|
|
||||||
mPreview = (CameraPreview) initScanner();
|
mPreview = (CameraPreview) initScanner();
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ package com.dinect.checker.zxing;
|
|||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
|
|
||||||
@@ -35,7 +36,7 @@ import me.dm7.barcodescanner.zxing.ZXingScannerView;
|
|||||||
public class ScannerActivity extends AbstractScannerActivity
|
public class ScannerActivity extends AbstractScannerActivity
|
||||||
implements ZXingScannerView.ResultHandler {
|
implements ZXingScannerView.ResultHandler {
|
||||||
|
|
||||||
private static final int SCAN_INTERVAL_PERIOD = 2000;
|
private static final int SCAN_INTERVAL_PERIOD = 500;
|
||||||
|
|
||||||
private ZXingScannerView scannerView;
|
private ZXingScannerView scannerView;
|
||||||
|
|
||||||
@@ -47,7 +48,6 @@ public class ScannerActivity extends AbstractScannerActivity
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
initNetwork(getIntent());
|
|
||||||
initToolbar(getIntent());
|
initToolbar(getIntent());
|
||||||
|
|
||||||
scannerView = (ZXingScannerView) initScanner();
|
scannerView = (ZXingScannerView) initScanner();
|
||||||
@@ -83,12 +83,8 @@ public class ScannerActivity extends AbstractScannerActivity
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleResult(Result raw) {
|
public void handleResult(Result raw) {
|
||||||
final String card = raw.getText();
|
handleBarcode(raw.getText());
|
||||||
|
scannerView.postDelayed(new Runnable() {
|
||||||
handleBarcode(card);
|
|
||||||
|
|
||||||
final Handler handler = new Handler();
|
|
||||||
handler.postDelayed(new Runnable() {
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
scannerView.resumeCameraPreview(ScannerActivity.this);
|
scannerView.resumeCameraPreview(ScannerActivity.this);
|
||||||
|
|||||||
@@ -11,4 +11,5 @@
|
|||||||
<string name="logout_no">Нет</string>
|
<string name="logout_no">Нет</string>
|
||||||
<string name="identifier_not_found">"Идентификатор %s не найден"</string>
|
<string name="identifier_not_found">"Идентификатор %s не найден"</string>
|
||||||
<string name="enter_manual">Введите штрихкод вручную</string>
|
<string name="enter_manual">Введите штрихкод вручную</string>
|
||||||
|
<string name="error_contact_support">Можете воспользоваться ручным вводом или позвонить на номер:%s</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -10,4 +10,6 @@
|
|||||||
<string name="logout_yes">Так</string>
|
<string name="logout_yes">Так</string>
|
||||||
<string name="logout_no">Ні</string>
|
<string name="logout_no">Ні</string>
|
||||||
<string name="identifier_not_found">"Ідентифікатор %s не знайден"</string>
|
<string name="identifier_not_found">"Ідентифікатор %s не знайден"</string>
|
||||||
|
<string name="enter_manual">Введіть штрихкод вручну</string>
|
||||||
|
<string name="error_contact_support">Можете воспользоваться ручным вводом или позвонить на номер:\n%s</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -10,4 +10,6 @@
|
|||||||
<string name="logout_yes">Yes</string>
|
<string name="logout_yes">Yes</string>
|
||||||
<string name="logout_no">No</string>
|
<string name="logout_no">No</string>
|
||||||
<string name="identifier_not_found">"Identifier %s is not found"</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>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user