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

View File

@@ -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);
} }
protected final void networkResponseCallback(final @NonNull Pair<String, String> result) { @Override
Log.d(TAG, "networkResponseCallback"); public void onResponse(Call call, Response response) throws IOException {
if (null != result.first) { try {
Log.d(TAG, "user found, finish activity with result"); ResponseBody body = response.body();
final Intent intent = new Intent(); if (body != null) {
intent.putExtra("user", result.second); switch (response.code()) {
intent.putExtra("card", result.first); case 200:
setResult(RESULT_OK, intent); final JSONArray users = new JSONArray(body.string());
networkThread.cancel(); 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 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(); 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

View File

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

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; 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, "Упс...");
} }
} }
} }

View File

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

View File

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

View File

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

View File

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

View File

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