This commit is contained in:
Ivan Murashov
2017-09-20 18:21:18 +03:00
parent e89b7f4005
commit a56839dca4
10 changed files with 101 additions and 198 deletions

View File

@@ -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\""
}
}

View File

@@ -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

View File

@@ -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;

View File

@@ -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;
}
}

View File

@@ -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);
}
}
}

View File

@@ -44,7 +44,6 @@ public class CameraActivity extends AbstractScannerActivity implements
return;
}
initNetwork(getIntent());
initToolbar(getIntent());
mPreview = (CameraPreview) initScanner();

View File

@@ -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);

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>