From 569c69e2687f932c2323544973879639095ae21f Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Wed, 6 Sep 2017 17:19:11 +0300 Subject: [PATCH 01/24] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=20=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=BE=20=D1=81=D0=B5=D1=81=D1=81=D0=B8=D0=B8=20(=D1=82=D0=BE?= =?UTF-8?q?=D0=BA=D0=B5=D0=BD,=20din,=20posid)=20=D0=B2=20=D0=B1=D0=B0?= =?UTF-8?q?=D0=B7=D1=83=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dinect/checker/MainActivity.java | 82 +------------------ ios/Runner/ScannerViewController.swift | 2 - lib/common.dart | 8 +- lib/db.dart | 82 +++++++++++++++++++ lib/finish_registration.dart | 26 +++--- lib/purchase.dart | 4 +- lib/registration.dart | 16 +++- lib/splash.dart | 67 +++++++++------ pubspec.yaml | 2 + 9 files changed, 162 insertions(+), 127 deletions(-) create mode 100644 lib/db.dart 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 3bccbf7..67bf35c 100644 --- a/android/app/src/main/java/com/dinect/checker/MainActivity.java +++ b/android/app/src/main/java/com/dinect/checker/MainActivity.java @@ -29,9 +29,6 @@ public class MainActivity extends FlutterActivity { static final String TAG = "Checker.MainActivity"; private static final int START_SCANNER_REQUEST_CODE = 2017; - private static final String PREF_POS_MERCHANT_ID = "pref_pos_merchant_id"; - private static final String PREF_DOC_ID = "pref_doc_id"; - private static final String PREF_POS_ID = "pref_pos_id"; 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"; @@ -52,34 +49,17 @@ public class MainActivity extends FlutterActivity { initLocale(this); mPreferences = getPreferences(Context.MODE_PRIVATE); - Log.d(TAG, "application prefs:"); - for(final Map.Entry kv: mPreferences.getAll().entrySet()){ - Log.d(TAG, " key = " + kv.getKey() + ", value = " + kv.getValue().toString()); - } - mChannel = new MethodChannel(getFlutterView(), "com.dinect.checker/instance_id"); mChannel.setMethodCallHandler( new MethodCallHandler() { @Override public void onMethodCall(MethodCall call, Result result) { switch (call.method) { - case "saveToken": - Map tokenArguments = call.arguments(); - mPreferences.edit().putString(PREF_POS_TOKEN, (String) tokenArguments.get("token")).apply(); - break; - case "getToken": - result.success(mPreferences.getString(PREF_POS_TOKEN, null)); - break; - case "saveMerchantID": - Map merchantIDArguments = call.arguments(); - mPreferences.edit().putString(PREF_POS_MERCHANT_ID, (String) merchantIDArguments.get("merchantID")).apply(); - break; + case "getLocale": result.success(BuildConfig.locale); break; - case "getMerchantID": - result.success(mPreferences.getString(PREF_POS_MERCHANT_ID, null)); - break; + case "startScanner": final Map arguments = call.arguments(); final int idx = mPreferences.getInt(SCANNER_BACKEND_KEY, 0); @@ -90,18 +70,7 @@ public class MainActivity extends FlutterActivity { cameraIntent.putExtra(PREF_POS_TOKEN, (String) arguments.get("token")); startActivityForResult(cameraIntent, START_SCANNER_REQUEST_CODE); break; - case "removeKeys": - mPreferences.edit().remove(PREF_POS_TOKEN).apply(); - mPreferences.edit().remove(PREF_POS_MERCHANT_ID).apply(); - mPreferences.edit().remove(PREF_DOC_ID).apply(); - mPreferences.edit().remove(PREF_POS_ID).apply(); - result.success(null); - break; - case "getDocID": - int docId = mPreferences.getInt(PREF_DOC_ID, 0) + 1; - mPreferences.edit().putInt(PREF_DOC_ID, docId).apply(); - result.success(String.valueOf(docId)); - break; + case "isOnline": boolean online = Utils.isOnline(MainActivity.this); if (!online) { @@ -109,14 +78,7 @@ public class MainActivity extends FlutterActivity { } result.success(online); break; - case "getPosID": - String posId = mPreferences.getString(PREF_POS_ID, null); - if (posId == null) { - posId = String.valueOf(System.currentTimeMillis()); - } - mPreferences.edit().putString(PREF_POS_ID, posId).apply(); - result.success(posId); - break; + default: result.notImplemented(); break; @@ -169,53 +131,17 @@ public class MainActivity extends FlutterActivity { res.updateConfiguration(configuration, res.getDisplayMetrics()); break; } - } public void getLocale() { } - public void handleItemClick() { - - } - - public void getDocID() { - - } - - public void removeKeys() { - - } public void startScanner() { } - public void getInstanceID() { - - } - - public void saveToken() { - - } - - public void getToken() { - - } - - public void getPosID() { - - } - - public void saveMerchantID() { - - } - - public void getMerchantID() { - - } - public void isOnline() { } diff --git a/ios/Runner/ScannerViewController.swift b/ios/Runner/ScannerViewController.swift index 0cae00b..91a18a1 100644 --- a/ios/Runner/ScannerViewController.swift +++ b/ios/Runner/ScannerViewController.swift @@ -17,8 +17,6 @@ extension ZBarSymbolSet: Sequence { } } -// TODO: Реализовать окно сканнера в этом контроллере, вместо вызова ZBarReaderViewController - @objc class ScannerViewController: UIViewController, ZBarReaderDelegate { override func viewDidLoad() { diff --git a/lib/common.dart b/lib/common.dart index 78c0075..a616ca2 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -25,7 +25,7 @@ faq(BuildContext context, bool returnToScanner) { // В методе отправляется запрос на удаление токена кассы, очищаются SharedPreferences приложения. logout(BuildContext context) async { - String token = await platform.invokeMethod('getToken'); + String token = await sqliteHelper.getToken(); VoidCallback positiveCalback = () { if (token != null) { deleteToken(token).then((response) { @@ -48,7 +48,7 @@ logout(BuildContext context) async { } forceLogout(BuildContext context) async { - String token = await platform.invokeMethod('getToken'); + String token = await sqliteHelper.getToken(); deleteToken(token).then((response) { print(response.body); platform.invokeMethod('removeKeys').then((result) { @@ -64,9 +64,9 @@ forceLogout(BuildContext context) async { /// Может производиться с нескольких экранов (splash, finish_registration). startScanner(BuildContext context) async { - String token = await platform.invokeMethod('getToken'); + String token = await sqliteHelper.getToken(); // Канал ловит вызовы методов из "нативной" части приложения. - // Могут быть вызваны либо logaut либо faq, либо purchase. + // Могут быть вызваны либо logout либо faq, либо purchase. if (token != null) { platform.setMethodCallHandler((MethodCall call) async { diff --git a/lib/db.dart b/lib/db.dart new file mode 100644 index 0000000..2443ccc --- /dev/null +++ b/lib/db.dart @@ -0,0 +1,82 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:path/path.dart'; +import 'package:sqflite/sqflite.dart'; +import 'package:path_provider/path_provider.dart'; + +const String tableSession = "session"; +const String columnMerchantID = "merchant_id"; // DIN code, который вводится при авторизации +const String columnToken = "token"; // Токен для pos. Приходит с бэкэнда. +const String columnPosID = "pos_id"; // идентификатор для создания токена на бэке. +const String columnDocID = "doc_id"; // идентификатор, для проведения покупки на бэкенде. + +//{ +// columnMerchantID: merchantID, +// columnToken: token, +// columnPosID: posID, +// columnDocID: docID +//} + +/// База данных, для хранения временных данных (din, token, locale, etc.) +class SqliteHelper { + + Database db; + + Future open() async { + Directory documentsDirectory = await getApplicationDocumentsDirectory(); + String path = join(documentsDirectory.path, "demo.db"); + db = await openDatabase(path, version: 1, + onCreate: (Database db, int version) async { + await db.execute('''create table session ( + $columnMerchantID text primary key, + $columnToken text, + $columnPosID text, + $columnDocID integer)'''); + }); + } + + Future insert(String merchantID, String posID, String token) async { + + Map session = { + columnMerchantID: merchantID, + columnPosID: posID, + columnToken: token + }; + + return db.insert(tableSession, session); + } + + Future getToken() async { + Map session = await _getSession(); + return session != null ? session[columnToken] : null; + } + + Future getMerchantID() async { + Map session = await _getSession(); + return session != null ? session[columnMerchantID] : null; + } + + Future getPosID() async { + Map session = await _getSession(); + return session != null ? session[columnPosID] : new DateTime.now().millisecondsSinceEpoch.toString(); + } + + Future _getSession() async { + + List maps = await db.query(tableSession, columns: null); + + if (maps.length > 0) { + return maps.first; + } + + return null; + } + + Future clear() async { + return await db.delete(tableSession, where: null); + } + + Future close() async => db.close(); + +} \ No newline at end of file diff --git a/lib/finish_registration.dart b/lib/finish_registration.dart index 30b2351..46959a7 100644 --- a/lib/finish_registration.dart +++ b/lib/finish_registration.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:checker/db.dart'; import 'dart:convert'; // Пакет для обработки json с ответом от сервера. import 'package:checker/common.dart'; @@ -14,12 +15,22 @@ class FinishRegistrationScreen extends StatefulWidget { class _RegistrationScreenState extends BaseState { + SqliteHelper helper; + bool _tokenActive = false; String _merchantID = ''; _RegistrationScreenState() { + helper = new SqliteHelper(); if (textFieldValue == "") { - getSavedMerchantID(); + helper.open().then((_){ + helper.getMerchantID().then((result) { + setState(() { + _merchantID = result; + print('merchanID: ${_merchantID}'); + }); + }); + }); } } @@ -47,10 +58,11 @@ class _RegistrationScreenState extends BaseState { // Если нет, то отправляется запрос на проверку статуса токена. handleTap() async { if (_tokenActive) { + helper.close(); startScanner(context); } else { if (await platform.invokeMethod('isOnline')) { - String token = await platform.invokeMethod('getToken'); + String token = await helper.getToken(); checkTokenStatus(token).then((response) { print(response.body); @@ -74,16 +86,6 @@ class _RegistrationScreenState extends BaseState { style: new TextStyle(color: Colors.black, fontSize: 16.0))]); } - /// Достаем сохраненный в SharedPreferences merchantID. - getSavedMerchantID() { - platform.invokeMethod('getMerchantID').then((result) { - setState(() { - _merchantID = result; - print('merchanID: ${_merchantID}'); - }); - }); - } - /// Метод возвращает контейнер с текстом сообщения и бэкграундом. getMessage() { return new Container(height: _tokenActive ? 72.0 : 108.0, decoration: _getDecorationForMessageField(), diff --git a/lib/purchase.dart b/lib/purchase.dart index 6922afc..4a44169 100644 --- a/lib/purchase.dart +++ b/lib/purchase.dart @@ -108,7 +108,7 @@ class PurchaseScreenState extends BaseState { if (await platform.invokeMethod('isOnline')) { - String token = await platform.invokeMethod('getToken'); + String token = await sqliteHelper.getToken(); var headers = { 'DM-Authorization': 'dmapptoken $appToken', @@ -198,7 +198,7 @@ class PurchaseScreenState extends BaseState { if (!purchaseInProgress) { purchaseInProgress = true; - String token = await platform.invokeMethod('getToken'); + String token = await sqliteHelper.getToken(); platform.invokeMethod('getDocID').then((result) { String url = user['purchases_url']; diff --git a/lib/registration.dart b/lib/registration.dart index 0213c8b..4ea45b5 100644 --- a/lib/registration.dart +++ b/lib/registration.dart @@ -1,3 +1,4 @@ +import 'package:checker/db.dart'; import 'package:checker/finish_registration.dart'; import 'package:flutter/material.dart'; import 'dart:convert'; // Пакет для обработки json с ответом от сервера. @@ -70,7 +71,12 @@ class _RegistrationScreenState extends BaseState { /// Получение от платформы id установки, формирование запроса на получение токена, сохранение токена. _register() async { if (await platform.invokeMethod('isOnline')) { - createToken(textFieldValue, await platform.invokeMethod('getPosID')).then((response) { + + SqliteHelper helper = new SqliteHelper(); + await helper.open(); + String posID = await helper.getPosID(); + + createToken(textFieldValue, posID).then((response) { setState(() { error = null; @@ -80,17 +86,19 @@ class _RegistrationScreenState extends BaseState { print(response.body); Map parsedMap = JSON.decode(response.body); + if (response.statusCode == 201) { - String token = parsedMap['token']; - platform.invokeMethod('saveToken', {'token' : token}); - platform.invokeMethod('saveMerchantID', {'merchantID' : textFieldValue}); + helper.insert(textFieldValue, posID, parsedMap['token']); + helper.close(); pushRoute(context, new FinishRegistrationScreen()); } else { + helper.close(); setState(() { error = parsedMap['errors'][0]; }); } }).catchError((error) { + helper.close(); print(error.toString()); }); } diff --git a/lib/splash.dart b/lib/splash.dart index 16cef33..84323b0 100644 --- a/lib/splash.dart +++ b/lib/splash.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:intl/intl.dart'; import 'dart:async'; @@ -9,7 +10,7 @@ import 'network.dart'; import 'consts.dart'; import 'registration.dart'; import 'finish_registration.dart'; -import 'strings.dart'; +import 'db.dart'; class SplashScreen extends StatelessWidget { @@ -18,7 +19,7 @@ class SplashScreen extends StatelessWidget { // Появляется splash screen, проверяется токен. new Future.delayed(const Duration(milliseconds: 500), () { - platform.invokeMethod("getLocale").then((locale) { + platform.invokeMethod('getLocale').then((locale) { Intl.defaultLocale = locale; print(Intl.defaultLocale); showNextScreen(context); @@ -49,19 +50,24 @@ class SplashScreen extends StatelessWidget { /// Запуск следующего экрана приложения. showNextScreen(BuildContext context) async { - String token = await platform.invokeMethod('getToken'); - + SqliteHelper helper = new SqliteHelper(); + await helper.open(); + String token = await helper.getToken(); + // В случае, если в приложении отсутствует токен, // необходимо запустить регистрацию кассы. if (token == null) { + await helper.close(); pushRoute(context, new RegistrationScreen()); } else { if (await platform.invokeMethod('isOnline')) { checkTokenStatus(token).then((statusResponse) { - handleStatusResponse(context, statusResponse); + handleStatusResponse(context, statusResponse, helper); }).catchError((error) { - print(error.toString()); - return false; + helper.close().then((_) { + print(error.toString()); + return false; + }); }); } } @@ -70,14 +76,15 @@ class SplashScreen extends StatelessWidget { /// Обработка ответа. /// В случае, если токен был удален может прийти active: false, либо 404. /// Если токен не активен, попробовать создать его еще раз. - handleStatusResponse(BuildContext context, var statusResponse) async { + handleStatusResponse(BuildContext context, var statusResponse, SqliteHelper helper) async { int code = statusResponse.statusCode; print('resp: ${code}'); if (code == 404) { - platform.invokeMethod('removeKeys').then((result) { - print('try to start registration'); - pushRoute(context, new RegistrationScreen()); + helper.clear().then((result) { + helper.close().then((_) { + pushRoute(context, new RegistrationScreen()); + }); }); } else { @@ -88,7 +95,7 @@ class SplashScreen extends StatelessWidget { startScanner(context); } else { if (await platform.invokeMethod('isOnline')) { - _createToken(context); + _createToken(context, helper); } } } @@ -101,24 +108,34 @@ class SplashScreen extends StatelessWidget { /// /// Если вернулся код 200, значит токен был ранее удален и только что снова создался. /// Нужно удалить его и направить пользователя на экран регистрации. - _createToken(BuildContext ctx) async { - String merchantID = await platform.invokeMethod('getMerchantID'); - String posID = await platform.invokeMethod('getPosID'); + _createToken(BuildContext ctx, SqliteHelper helper) async { + + String merchantID = await helper.getMerchantID(); + String posID = await helper.getPosID(); + createToken(merchantID, posID).then((response) { if (response.statusCode == 409) { + helper.close(); pushRoute(ctx, new FinishRegistrationScreen()); } else if (response.statusCode == 201) { - platform.invokeMethod('removeKeys').then((result) { - Map parsedMap = JSON.decode(result); - deleteToken(parsedMap['token']).then((response) { - print(response.body); - Navigator.of(ctx).pop(); // Убираем текущий route - pushRoute(ctx, new RegistrationScreen()); // Запускаем регистрацию - }).catchError((error) { - print(error.toString()); - }); - }); + clearToken(response, ctx, helper); } }).catchError((error) => print(error.toString())); } + + /// Очищаем бд, делаем запрос на удаление токена. + void clearToken(Response response, BuildContext ctx, SqliteHelper helper) { + + helper.clear().then((_) { + Map parsedMap = JSON.decode(response.body); + deleteToken(parsedMap['token']).then((_) { + helper.close(); + Navigator.of(ctx).pop(); // Убираем текущий route + pushRoute(ctx, new RegistrationScreen()); // Запускаем регистрацию + }).catchError((error) { + helper.close(); + print(error.toString()); + }); + }); + } } diff --git a/pubspec.yaml b/pubspec.yaml index eb6d9a4..eb63b7f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -6,6 +6,8 @@ dependencies: intl: '>=0.14.0 <0.16.0' intl_translation: '>=0.14.0 <0.16.0' sprintf: "^3.0.2" + path_provider: "^0.2.1+1" + sqflite: any flutter: sdk: flutter From 9429d6f98e9a9d75c464fb2d80041502836a0cf5 Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Wed, 6 Sep 2017 18:02:42 +0300 Subject: [PATCH 02/24] =?UTF-8?q?=D0=9E=D1=82=D0=BA=D1=80=D1=8B=D1=82?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=81=D0=BA=D0=B0=D0=BD=D0=BD=D0=B5=D1=80=D0=B0?= =?UTF-8?q?,=20=D0=BB=D0=BE=D0=B3=D0=B0=D1=83=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/common.dart | 18 ++++++++++++------ lib/splash.dart | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/common.dart b/lib/common.dart index a616ca2..0191204 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -1,3 +1,4 @@ +import 'db.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; @@ -25,7 +26,11 @@ faq(BuildContext context, bool returnToScanner) { // В методе отправляется запрос на удаление токена кассы, очищаются SharedPreferences приложения. logout(BuildContext context) async { - String token = await sqliteHelper.getToken(); + + SqliteHelper helper = new SqliteHelper(); + await helper.open(); + String token = await helper.getToken(); + VoidCallback positiveCalback = () { if (token != null) { deleteToken(token).then((response) { @@ -47,8 +52,8 @@ logout(BuildContext context) async { showYesNoDialog(context, StringsLocalization.confirmation(), StringsLocalization.askChangeStore(), positiveCalback); } -forceLogout(BuildContext context) async { - String token = await sqliteHelper.getToken(); +forceLogout(SqliteHelper helper, BuildContext context) async { + String token = await helper.getToken(); deleteToken(token).then((response) { print(response.body); platform.invokeMethod('removeKeys').then((result) { @@ -62,9 +67,9 @@ forceLogout(BuildContext context) async { /// Запуск спецефичной для каждой платформы части приложения - сканера. /// Может производиться с нескольких экранов (splash, finish_registration). -startScanner(BuildContext context) async { +startScanner(SqliteHelper helper, BuildContext context) async { - String token = await sqliteHelper.getToken(); + String token = await helper.getToken(); // Канал ловит вызовы методов из "нативной" части приложения. // Могут быть вызваны либо logout либо faq, либо purchase. if (token != null) { @@ -72,7 +77,7 @@ startScanner(BuildContext context) async { print('call.method: ${call.method}'); if (call.method == 'logout') { - forceLogout(context); + forceLogout(helper, context); } else if (call.method == 'faq') { faq(context, true); } else { @@ -84,6 +89,7 @@ startScanner(BuildContext context) async { Navigator.of(context).pushReplacement(route); } }); + await platform.invokeMethod('startScanner', { 'token' : token, 'url': url, diff --git a/lib/splash.dart b/lib/splash.dart index 84323b0..25611b3 100644 --- a/lib/splash.dart +++ b/lib/splash.dart @@ -92,7 +92,7 @@ class SplashScreen extends StatelessWidget { bool active = status['active'] == null ? false : status['active']; if (active) { - startScanner(context); + startScanner(helper, context); } else { if (await platform.invokeMethod('isOnline')) { _createToken(context, helper); From c652276066d378a0581790e33839b21c0ff165a8 Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Fri, 8 Sep 2017 11:01:42 +0300 Subject: [PATCH 03/24] =?UTF-8?q?=D0=92=D1=8B=D0=BF=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D1=8E=D1=89=D0=B5=D0=B5=20=D0=BC=D0=B5=D0=BD=D1=8E=20=D1=81=20?= =?UTF-8?q?=D1=82=D1=80=D0=B5=D0=BC=D1=8F=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ansion_icon.png => faq_expansion_icon.png} | Bin assets/help.png | Bin 0 -> 3632 bytes assets/logout.png | Bin 1300 -> 1213 bytes assets/settings.png | Bin 0 -> 2373 bytes checker.iml | 16 --------- lib/base_state.dart | 30 +++++++++++++---- lib/common.dart | 27 ++++++++------- lib/consts.dart | 8 ++++- lib/db.dart | 19 +++++++++-- lib/main.dart | 2 +- lib/{ => screens}/faq.dart | 8 ++--- lib/{ => screens}/finish_registration.dart | 23 ++++--------- lib/{ => screens}/purchase.dart | 31 ++++++++++-------- lib/{ => screens}/purchase_success.dart | 2 +- lib/{ => screens}/registration.dart | 15 ++++----- lib/{ => screens}/splash.dart | 20 +++++------ pubspec.yaml | 4 ++- 17 files changed, 111 insertions(+), 94 deletions(-) rename assets/{expansion_icon.png => faq_expansion_icon.png} (100%) create mode 100644 assets/help.png create mode 100644 assets/settings.png delete mode 100644 checker.iml rename lib/{ => screens}/faq.dart (97%) rename lib/{ => screens}/finish_registration.dart (89%) rename lib/{ => screens}/purchase.dart (89%) rename lib/{ => screens}/purchase_success.dart (99%) rename lib/{ => screens}/registration.dart (92%) rename lib/{ => screens}/splash.dart (93%) diff --git a/assets/expansion_icon.png b/assets/faq_expansion_icon.png similarity index 100% rename from assets/expansion_icon.png rename to assets/faq_expansion_icon.png diff --git a/assets/help.png b/assets/help.png new file mode 100644 index 0000000000000000000000000000000000000000..5d7029a5a6647403b1e30b0542b651e605d3d062 GIT binary patch literal 3632 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 bfU^9*Hie*$BIC5x00000NkvXXu0mjf9$`9c literal 1300 zcmV+v1?&2WP)<5DFwZf_=3f!fmZHB_1dH8a<^yeql$?m{6Va2A4CYv4 z=Cj&4=AeiOG~z>nR%q9;&&=Ce;gDPe$RN7O%+Q*ub`He>`BF8St}~9)rcQKTDgy+< zI6|*W#`gQnptvLR?E*Dqyv{vler8#`i0n8UlIphF!mbQZLTA*n<`P-;21Eq*?QLd~ zZDz(ksvEmo23itpzj1>Qk=3%}cDR!m_kfwR#(dd8uwFoc8soMJwXa09UTV?ZwfQbG z_8BwZN`2NTfDBNMiRfWqanO*JQXs>48C&p(nKA!Dn+nJP1;^rcU|nWo7}*^Bo?j7- z2;LSV@|lS4RT~HW0AK)jVRwKck-p6gmx#o`?=mxPmGdSdpNQzbem_kmXX}AYi9v~~ zwsjdI5<8+HD6#cer!A2`W#-lYP)6t&twT-uLqyk0K68UUN6fs@BNUCJ)?oh&L%{vm zfJfXN6f9Ll9uU!cBD$8?{ZAsotNU*QLdU*q&?OWH1}}CP=o^VmBVL0Gp*mdP&(STE zDZz9NWhyY;L$QEi=Cua)W%eNK%6W@z$_2r4Hl~TgnS!$5ZI*ro5rH8L8BEh03NURV zZz2K<9*TR+9GOxOL%&SC#{9m@fI;9I`>ATs6aXZ7;h>GMN8nS$z2*K%Pb=59?BF&L|sFf zs)(ptC{q>@bqQtaBBEZQOj<-#4aL>BJaxXzP`X*{r1ellR0Snc@KcqGQ4|r)vUnxF zk+z7a7D}wdq8LmfQr9HhpeZ7%g%S%$<3kpKNz}452{$?;o-87&g_1LfW-y7AOS6ze zu861>3gV;Kc(Z(O4|%96C@##dwTxL32dr8=@%1|V0hiDVe+@|UF{V`{S!%^o!+<$#$#y|n`>G<$@SbHJ?o zw8$@1HuPdsaCGpxz33#^7}j}-W_Oz6r8AJiu%t0U8UaTxmq`0aL@yG*-iTFJHA~3n ziioN`S`VtGC^-9m>7j_I36z$<&FP_ts2YkAi0Y?t&NH68h^PumCXzLrEHw}ZW%44T zS}3t1!XhA^eVVk0s1{1<2TLXm8DC|Y0z!)~q>-I_LexTuRaRC3@s80XMMSkwLII{G zu~ZMt(u;_ypm+<%jR6CR|Hr^mMX6Ekr56!ZLs9Ljkkq^0u!0000< KMNUMnLSTXkYETIP diff --git a/assets/settings.png b/assets/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..1e19365d61f0a0e948320f870109338749f2b274 GIT binary patch literal 2373 zcmV-L3A*-)P)49P41Iq{oJg8i?FcAXb}xWtNnZDvhMty$B^9PB3FzwT zTJ6-WJ^@I3Pho9*Y;9|6>zLH&NdT)#0`k56t;9}If`79ROj?ysUq1_4M%lx(#l4p7bOt+aEo1PGopCfeGwi_lZbUnb^;DDIu zx}1^h@QX8FJ~ROb4jibdU*Av!qh$_w1&sY5-aYcd^N(-cx^;3fLpzU@-lb{uBLMFS z>yTjkziFi1+L~_q>tga#zPe_p+m>kIkl5NWbo$zXkNxjzRw^$q9yQ^R$c$kT2FN8Xlz#tu z&)9+i9tP;melZEyl{NGm{k98Dz^Qbx^R(w;P%D;qy9$%m7IdXGa1Sh4_Fn*0-K%{} zTs~zQ`j#NN0})WPN>?-J(I5&}Y8wJylQmM0`Ss5?0S5;M&pmf+ya&LgewD3o`D3rF zuFG8B(C~^MKYbHW=q=w4<~#f-IcsEz?l9BI@A&c87XcmJX$z6%qO@9VpQ9L>#qgxiQ3vBKn-HD^n% zx%p`kzl4Ix%v!OxzZ2lB2N@PQ@5CN|8&S!01tHJL8Z1!nP z0CC!zO*dU9GKqboxjWnzOC7x%rtOb_XWFRhBQ6E~H6%7zFndUf63Cb%_SiR5PeDH$}y`^SqQ% zz<82tczZ6DdNHUyp$Kr5KE|9#_4VHc=3B$PjnZDzNJcrg%*Lo-l^+T@Av+-YeyO?X zwyTLML4)tM3r)c6ykObxte*^O3^Q%dWs+{H8~Ih}DQ^d{`+gAgDw~F`2W>pJolF9T z!@MUrlSqlCZeblS94V)uvAdfi=rv**y2wrtPkfmKj033k)VQ#KGxEYP0NZ7csd@5j2K6?P9eQAvmPfV%&6~Vp)vKTjd)Ge7F4N zXd2V-+NSvjIRyKJr`Ytti*pW3S%^Db+c<;1nlqC3c^WZKz*ic&oIl8PcX!uLB7M_lJt3E${hA>6qkO@#m-Dt1_ub;% zej_MBUf#Bpf@Qm>8$CA}Nicc=h+rGDFyY(`#w`&{xT0CKw9j>*v&U}JfM10zTUj{LeL)(&G7v>7s(xeTgVQKdQS~D?9|S~@imG23`iTFO zsQQ_w--t<;FZPr^z(hZj@jF{${!%uR`jcc6rNC9)T96d4mJx^|AZD@@0g8Z_BM`HC rH3Ad?F-IU~^=bqt0%DFp% - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/lib/base_state.dart b/lib/base_state.dart index 0ceb4be..4aa805c 100644 --- a/lib/base_state.dart +++ b/lib/base_state.dart @@ -1,5 +1,3 @@ -import 'dart:async'; - import 'package:checker/resources.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -7,10 +5,12 @@ import 'package:intl/intl.dart'; import 'common.dart'; import 'consts.dart'; -import 'strings.dart'; +import 'package:checker/db.dart'; abstract class BaseState extends State { + SqliteHelper helper; + /// Тип сборки. Определяет, какие брать ресурсы (цвета, картинки) String app; @@ -31,7 +31,10 @@ abstract class BaseState extends State { platform.invokeMethod('getFlavor').then((flavor) { setState(() { app = flavor; - onStart(); + helper = new SqliteHelper(); + helper.open().then((_){ + onStart(); + }); }); }); } @@ -57,7 +60,7 @@ abstract class BaseState extends State { } void onStart() { - + print("ON START!"); } /// Возвращает контейнер с всеми виджетами экрана. @@ -72,7 +75,22 @@ abstract class BaseState extends State { } List getMenuButtons() { - return [getFaqButton()]; + return [ + new PopupMenuButton( + itemBuilder: (BuildContext context) { + [ + new PopupMenuItem( + child: new Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + new Image.asset( + settings_png, width: 48.0, height: 48.0), + new Image.asset(help_png, width: 48.0, height: 48.0), + new Image.asset(logout_png, width: 48.0, height: 48.0), + ])) + ]; + } + )]; } Widget getFaqButton() { diff --git a/lib/common.dart b/lib/common.dart index ce2e840..5a078b8 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -1,13 +1,13 @@ -import 'db.dart'; -import 'package:flutter/services.dart'; +import 'package:checker/screens/faq.dart'; +import 'package:checker/screens/purchase.dart'; +import 'package:checker/screens/registration.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'consts.dart'; +import 'db.dart'; import 'network.dart'; import 'resources.dart'; -import 'package:checker/registration.dart'; -import 'package:checker/purchase.dart'; -import 'faq.dart'; import 'strings.dart'; // Канал для взаимодействия с кодом платформы. @@ -53,13 +53,18 @@ logout(BuildContext context) async { showYesNoDialog(context, StringsLocalization.confirmation(), StringsLocalization.askChangeStore(), positiveCalback); } -forceLogout(SqliteHelper helper, BuildContext context) async { - String token = await helper.getToken(); +forceLogout(String token , BuildContext context) async { + deleteToken(token).then((response) { print(response.body); - platform.invokeMethod('removeKeys').then((result) { - Navigator.of(context).pop(); - pushRoute(context, new RegistrationScreen()); // Запускаем регистрацию + SqliteHelper helper = new SqliteHelper(); + helper.open().then((_) { + helper.clear().then((_) { + helper.close().then((_) { + Navigator.of(context).pop(); + pushRoute(context, new RegistrationScreen()); // Запускаем регистрацию + }); + }); }); }).catchError((error) { print(error.toString()); @@ -79,7 +84,7 @@ startScanner(BuildContext context, String app, SqliteHelper helper) async { print('call.method: ${call.method}'); if (call.method == 'logout') { - forceLogout(helper, context); + forceLogout(token, context); } else if (call.method == 'faq') { faq(context, true); } else { diff --git a/lib/consts.dart b/lib/consts.dart index a098939..60d9b85 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -8,11 +8,17 @@ const String appToken = '9fec83cdca38c357e6b65dbb17514cdd36bf2a08'; // Assets const String logout_png = 'assets/logout.png'; +const String help_png = 'assets/help.png'; +const String settings_png = 'assets/settings.png'; + const String activate_token_bg_png = 'assets/activate_token_message_background.png'; const String active_token_bg_png = 'assets/active_token_message_background.png'; -const String expansion_icon_png = 'assets/expansion_icon.png'; + +const String expansion_icon_png = 'assets/faq_expansion_icon.png'; + const String powered_by_dinect_splash_png = 'assets/powered_by_dinect_splash.png'; const String powered_by_dinect_png = 'assets/powered_by_dinect.png'; + const String splash_text_png = 'assets/splash_text.png'; const Color greyTextColor = const Color(0xffa5a5a5); diff --git a/lib/db.dart b/lib/db.dart index 2443ccc..db078d3 100644 --- a/lib/db.dart +++ b/lib/db.dart @@ -41,7 +41,8 @@ class SqliteHelper { Map session = { columnMerchantID: merchantID, columnPosID: posID, - columnToken: token + columnToken: token, + columnDocID: 0 }; return db.insert(tableSession, session); @@ -49,12 +50,16 @@ class SqliteHelper { Future getToken() async { Map session = await _getSession(); - return session != null ? session[columnToken] : null; + String token = session != null ? session[columnToken] : null; + print('token: {$token}'); + return token; } Future getMerchantID() async { Map session = await _getSession(); - return session != null ? session[columnMerchantID] : null; + String merchantID = session != null ? session[columnMerchantID] : null; + print('token: {$merchantID}'); + return merchantID; } Future getPosID() async { @@ -62,6 +67,14 @@ class SqliteHelper { return session != null ? session[columnPosID] : new DateTime.now().millisecondsSinceEpoch.toString(); } + Future getDocID() async { + Map session = await _getSession(); + int docID = session != null ? session[columnDocID] : 0; + db.update(tableSession, {columnDocID: docID + 1}); + print('docid: {$docID}'); + return docID; + } + Future _getSession() async { List maps = await db.query(tableSession, columns: null); diff --git a/lib/main.dart b/lib/main.dart index d0d13ae..a9da1c9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'splash.dart'; +import 'package:checker/screens/splash.dart'; import 'consts.dart'; import 'strings.dart'; import 'common.dart'; diff --git a/lib/faq.dart b/lib/screens/faq.dart similarity index 97% rename from lib/faq.dart rename to lib/screens/faq.dart index c13f87a..481f02c 100644 --- a/lib/faq.dart +++ b/lib/screens/faq.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -import 'base_state.dart'; -import 'consts.dart'; -import 'common.dart'; +import 'package:checker/base_state.dart'; +import 'package:checker/consts.dart'; +import 'package:checker/common.dart'; /// Класс содержит заголовки и текст блоков FAQ. class Entry { @@ -68,7 +68,7 @@ class FAQScreenState extends BaseState { onWillPop() { if(returnToScanner) { - return startScanner(context, app); + return startScanner(context, app, helper); } else { return true; } diff --git a/lib/finish_registration.dart b/lib/screens/finish_registration.dart similarity index 89% rename from lib/finish_registration.dart rename to lib/screens/finish_registration.dart index 014e8e9..5956f37 100644 --- a/lib/finish_registration.dart +++ b/lib/screens/finish_registration.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:checker/db.dart'; import 'dart:convert'; // Пакет для обработки json с ответом от сервера. import 'package:checker/common.dart'; @@ -15,23 +14,15 @@ class FinishRegistrationScreen extends StatefulWidget { class _RegistrationScreenState extends BaseState { - SqliteHelper helper; - bool _tokenActive = false; - String _merchantID = ''; + String _merchantID; - _RegistrationScreenState() { - helper = new SqliteHelper(); - if (textFieldValue == "") { - helper.open().then((_){ - helper.getMerchantID().then((result) { - setState(() { - _merchantID = result; - print('merchanID: ${_merchantID}'); - }); - }); + @override void onStart() { + helper.getMerchantID().then((result) { + setState(() { + _merchantID = result; }); - } + }); } @override String getTitle() { @@ -39,7 +30,7 @@ class _RegistrationScreenState extends BaseState { } @override getHint() { - return StringsLocalization.idStore(); + return _merchantID; } @override Widget getScreenContent() { diff --git a/lib/purchase.dart b/lib/screens/purchase.dart similarity index 89% rename from lib/purchase.dart rename to lib/screens/purchase.dart index 53887df..88e60b2 100644 --- a/lib/purchase.dart +++ b/lib/screens/purchase.dart @@ -3,13 +3,13 @@ import 'package:flutter/services.dart'; import 'dart:convert'; import 'dart:core'; -import 'resources.dart'; -import 'strings.dart'; -import 'common.dart'; -import 'consts.dart'; -import 'network.dart'; -import 'base_state.dart'; -import 'purchase_success.dart'; +import 'package:checker/resources.dart'; +import 'package:checker/strings.dart'; +import 'package:checker/common.dart'; +import 'package:checker/consts.dart'; +import 'package:checker/network.dart'; +import 'package:checker/base_state.dart'; +import 'package:checker/screens/purchase_success.dart'; /// Экран проведения покупки. class PurchaseScreen extends StatefulWidget { @@ -32,6 +32,9 @@ class PurchaseScreenState extends BaseState { PurchaseScreenState(String userString, String card) { this.user = JSON.decode(userString); this.card = card; + } + + @override void onStart() { getLoyalty(user['loyalty_url']); } @@ -69,7 +72,7 @@ class PurchaseScreenState extends BaseState { child: new Text( title, style: new TextStyle(color: textColor)), - onPressed: () => startScanner(context, app)), + onPressed: () => startScanner(context, app, helper)), decoration: new BoxDecoration( border: new Border.all(color: Resources.getButtonColor(app), width: 1.0), borderRadius: new BorderRadius.all(new Radius.circular(4.0)))); @@ -109,7 +112,7 @@ class PurchaseScreenState extends BaseState { if (await platform.invokeMethod('isOnline')) { - String token = await sqliteHelper.getToken(); + String token = await helper.getToken(); var headers = { 'DM-Authorization': 'dmapptoken $appToken', @@ -199,8 +202,8 @@ class PurchaseScreenState extends BaseState { if (!purchaseInProgress) { purchaseInProgress = true; - String token = await sqliteHelper.getToken(); - platform.invokeMethod('getDocID').then((result) { + String token = await helper.getToken(); + helper.getMerchantID().then((result) { String url = user['purchases_url']; @@ -219,8 +222,10 @@ class PurchaseScreenState extends BaseState { httpClient.post(url, body: body, headers: headers).then((response) { print(response.body); - Navigator.of(context).pop(); - pushRoute(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name'])); + helper.close().then((_) { + Navigator.of(context).pop(); + pushRoute(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name'])); + }); }).catchError((error) { purchaseInProgress = false; diff --git a/lib/purchase_success.dart b/lib/screens/purchase_success.dart similarity index 99% rename from lib/purchase_success.dart rename to lib/screens/purchase_success.dart index dfebd2d..fc0134b 100644 --- a/lib/purchase_success.dart +++ b/lib/screens/purchase_success.dart @@ -50,7 +50,7 @@ class PurchaseSuccessScreenState extends BaseState { getScanButton() { String title = StringsLocalization.scan(); - return buildRaisedButton(title, () => startScanner(context, app)); + return buildRaisedButton(title, () => startScanner(context, app, helper)); } getSuccessMessage() { diff --git a/lib/registration.dart b/lib/screens/registration.dart similarity index 92% rename from lib/registration.dart rename to lib/screens/registration.dart index 4ea45b5..ff61741 100644 --- a/lib/registration.dart +++ b/lib/screens/registration.dart @@ -1,5 +1,5 @@ import 'package:checker/db.dart'; -import 'package:checker/finish_registration.dart'; +import 'package:checker/screens/finish_registration.dart'; import 'package:flutter/material.dart'; import 'dart:convert'; // Пакет для обработки json с ответом от сервера. @@ -72,8 +72,6 @@ class _RegistrationScreenState extends BaseState { _register() async { if (await platform.invokeMethod('isOnline')) { - SqliteHelper helper = new SqliteHelper(); - await helper.open(); String posID = await helper.getPosID(); createToken(textFieldValue, posID).then((response) { @@ -84,21 +82,20 @@ class _RegistrationScreenState extends BaseState { }); print(response.body); - + print(response.statusCode.toString()); Map parsedMap = JSON.decode(response.body); if (response.statusCode == 201) { - helper.insert(textFieldValue, posID, parsedMap['token']); - helper.close(); - pushRoute(context, new FinishRegistrationScreen()); + helper.insert(textFieldValue, posID, parsedMap['token']).then((_) { + helper.close(); + pushRoute(context, new FinishRegistrationScreen()); + }); } else { - helper.close(); setState(() { error = parsedMap['errors'][0]; }); } }).catchError((error) { - helper.close(); print(error.toString()); }); } diff --git a/lib/splash.dart b/lib/screens/splash.dart similarity index 93% rename from lib/splash.dart rename to lib/screens/splash.dart index cde2563..0585269 100644 --- a/lib/splash.dart +++ b/lib/screens/splash.dart @@ -1,16 +1,15 @@ import 'package:flutter/material.dart'; import 'package:http/http.dart'; -import 'package:intl/intl.dart'; import 'dart:convert'; import 'dart:async'; -import 'common.dart'; -import 'network.dart'; -import 'consts.dart'; -import 'registration.dart'; -import 'finish_registration.dart'; -import 'db.dart'; -import 'resources.dart'; -import 'base_state.dart'; +import 'package:checker/common.dart'; +import 'package:checker/network.dart'; +import 'package:checker/consts.dart'; +import 'package:checker/resources.dart'; +import 'package:checker/db.dart'; +import 'package:checker/base_state.dart'; +import 'package:checker/screens/registration.dart'; +import 'package:checker/screens/finish_registration.dart'; class SplashScreen extends StatefulWidget { @override State createState() => new _SplashScreenState(); @@ -37,7 +36,6 @@ class _SplashScreenState extends BaseState { width: 122.0)))]); } - @override Widget getMainWidget() { return getScreenContent(); } @@ -73,8 +71,6 @@ class _SplashScreenState extends BaseState { /// Запуск следующего экрана приложения. showNextScreen(BuildContext context) async { - SqliteHelper helper = new SqliteHelper(); - await helper.open(); String token = await helper.getToken(); // В случае, если в приложении отсутствует токен, diff --git a/pubspec.yaml b/pubspec.yaml index 9d607a0..dc47938 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -32,10 +32,12 @@ flutter: - assets/autobonus_splash.png - assets/pip_splash.png + - assets/settings.png + - assets/help.png - assets/logout.png - assets/activate_token_message_background.png - assets/active_token_message_background.png - - assets/expansion_icon.png + - assets/faq_expansion_icon.png - assets/powered_by_dinect_splash.png - assets/powered_by_dinect.png - assets/autobonus_logo.png From 0dc8ab5da029e1410b44e0342aaa98407defbf73 Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Fri, 8 Sep 2017 17:25:56 +0300 Subject: [PATCH 04/24] =?UTF-8?q?=D0=92=20=D0=B1=D0=B4=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=82=D0=B0=D0=B1?= =?UTF-8?q?=D0=BB=D0=B8=D1=86=D0=B0=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BA,=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA?= =?UTF-8?q?=20=D0=B1=D0=B5=D1=80=D1=83=D1=82=D1=81=D1=8F=20=D0=B8=D0=B7=20?= =?UTF-8?q?=D0=B1=D0=B0=D0=B7=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/build.gradle | 6 ++ .../java/com/dinect/checker/MainActivity.java | 9 +- assets/settings_arrow.png | Bin 0 -> 2043 bytes lib/base_state.dart | 81 +++++++++++------- lib/consts.dart | 5 +- lib/db.dart | 48 +++++++++-- lib/i18n/messages_en.dart | 7 +- lib/i18n/messages_ru.dart | 7 +- lib/screens/faq.dart | 4 - lib/screens/purchase.dart | 4 - lib/screens/purchase_success.dart | 4 - lib/screens/registration.dart | 9 +- lib/screens/settings.dart | 71 +++++++++++++++ lib/screens/splash.dart | 65 ++++++++------ lib/strings.dart | 5 ++ pubspec.yaml | 1 + 16 files changed, 239 insertions(+), 87 deletions(-) create mode 100644 assets/settings_arrow.png create mode 100644 lib/screens/settings.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 7bef710..6ddf713 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -46,36 +46,42 @@ android { applicationId 'com.dinect.autobonus' buildConfigField "String", "locale", "\"en\"" buildConfigField "String", "flavor", "\"autobonus\"" + buildConfigField "int", "currency", "643" } autobonus_ru { applicationId 'com.dinect.autobonus' buildConfigField "String", "locale", "\"ru\"" buildConfigField "String", "flavor", "\"autobonus\"" + buildConfigField "int", "currency", "643" } autobonus_ua { applicationId 'com.dinect.autobonus' buildConfigField "String", "locale", "\"ua\"" buildConfigField "String", "flavor", "\"autobonus\"" + buildConfigField "int", "currency", "643" } pip_en { applicationId 'com.dinect.pip' buildConfigField "String", "locale", "\"en\"" buildConfigField "String", "flavor", "\"pip\"" + buildConfigField "int", "currency", "980" } pip_ru { applicationId 'com.dinect.pip' buildConfigField "String", "locale", "\"ru\"" buildConfigField "String", "flavor", "\"pip\"" + buildConfigField "int", "currency", "980" } pip_ua { applicationId 'com.dinect.pip' buildConfigField "String", "locale", "\"ua\"" buildConfigField "String", "flavor", "\"pip\"" + buildConfigField "int", "currency", "980" } } 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 80a56c9..9640d79 100644 --- a/android/app/src/main/java/com/dinect/checker/MainActivity.java +++ b/android/app/src/main/java/com/dinect/checker/MainActivity.java @@ -66,6 +66,10 @@ public class MainActivity extends FlutterActivity { result.success(BuildConfig.flavor); break; + case "getCurrency": + result.success(BuildConfig.currency); + break; + case "startScanner": final Map arguments = call.arguments(); final int idx = mPreferences.getInt(SCANNER_BACKEND_KEY, 0); @@ -144,10 +148,13 @@ public class MainActivity extends FlutterActivity { } - public void getLocale() { + public void getCurrency() { } + public void getLocale() { + + } public void startScanner() { diff --git a/assets/settings_arrow.png b/assets/settings_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..7b3efe87e170346db67d807363d0bdcf5c2f640d GIT binary patch literal 2043 zcmcIl`#;nBAAf(gVa9A>=|~Ytrna4A8HQU3nq)ta zT-k^tQcm6MwaJykV^fjj_B%_SS2RiPvMugEet8Qen8<}}4uATBIHsP@S?CxUIwtqT$4KB~M{M{BFjV4z4j>)nU0m^i5I~F~ zVNT$AK;#dJC!FN4Al*o08B+*gfFqZFjfkTGMj4PU=EIPn1IO4Y^a2p?39O^(Pt^Zl z;)xSj{GLHCxY+Ni|1M+A@7zik=(%{F@ia+J8}@j+NIK&c6w!<)os}TKHE#4nY;!Ci z?bv&1ITz%=d+osffyp*PSuFvrh1p`Fe8pF2#FxAgGkyqr+}>2*9Pbf->VZ8x{E>mh z{+$m4Kqg^EyH}N(=5s$4mCm&c988fDSQy_`rfEY5!~Df}Fe_TTlbeZYAiM&Wf)J#x znk<_jJLUf(EdPG|npb=*e(ND{-F`=V@K@Tz{f$;xvJvDS{j_l62%MG8);t8N_5Kar zI10}Gc;R}_9r#C2!0RzpDmIoWo1@;<;_WbTO^}NJyeEYy1)gyB<7iCXg4XvLBnPb)%Ra`u4;y% zDaJQ6w6$u)LJh{F>$|I04cWIml9cgb!I_mnP;D;R;oR�$De9?1=C#WE2(`!^z;L zcf9|nHT+HmZjf25H!~#X<6Sn-Qy88pBl@4At!@@ zOqYwZo#PdCCQiVS6Q2Ul|8|byqj(qos6Xutvlg(B%PC9N*foEsPE*W++?4tZ*;ghm zy)g+zZ?9pyrf1#RY*EdwPnp?V%;B;VY>_(pP;m`Yd(df>%GNf}QmIbOkn2Eq#4f2X%{0deCFyxZsM5)lWe4wUD3-=o}u&UJx_R{wC zkOfIeea=mE>(ARBXNruz54;;0Dd}E(W#STN4;L_JI)aY{AxHHJ`X3LXY<|(3{`sCG z>y9NbZ%v8S+9E?RmRLOrrI*{Io%h73F~t}sTjPD8{x@0VTqLBA z-1{Yab5?|mZYoE z!Ggxuqe=JVfYE6r8w;aFy*t)h1sGS+6KHFIbd5IRZUrTec0Hpb|G#1H**If7zi7ly Ree extends State { @@ -21,24 +24,23 @@ abstract class BaseState extends State { String error; /// Введенное пользователем значение. - String textFieldValue = ''; + String dinCode = ''; @override Widget build(BuildContext ctx) { - platform.invokeMethod('getLocale').then((locale) { - Intl.defaultLocale = locale; - if (app == null) { - platform.invokeMethod('getFlavor').then((flavor) { - setState(() { + if (helper == null) { + helper = new SqliteHelper(); + helper.open().then((_) { + if (app == null) { + platform.invokeMethod('getFlavor').then((flavor) { app = flavor; - helper = new SqliteHelper(); - helper.open().then((_){ + setState(() { onStart(); }); }); - }); - } - }); + } + }); + } return getMainWidget(); } @@ -67,7 +69,9 @@ abstract class BaseState extends State { Widget getScreenContent(); /// Возвращает заголовок для AppBar - String getTitle(); + String getTitle() { + return null; + } AppBar getAppBar() { return new AppBar(title: new Text(getTitle(), style: new TextStyle(fontSize: 18.0)), @@ -76,29 +80,44 @@ abstract class BaseState extends State { List getMenuButtons() { return [ - new PopupMenuButton( + new PopupMenuButton( + onSelected: onOptionsItemClick, itemBuilder: (BuildContext context) { - [ - new PopupMenuItem( - child: new Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - new Image.asset( - settings_png, width: 48.0, height: 48.0), - new Image.asset(help_png, width: 48.0, height: 48.0), - new Image.asset(logout_png, width: 48.0, height: 48.0), - ])) + return [new PopupMenuItem( + value: 0, + child: getMenuItem(settings_png, StringsLocalization.settings())), + new PopupMenuItem( + value: 1, + child: getMenuItem(help_png, StringsLocalization.help())), + new PopupMenuItem( + value: 2, + child: getMenuItem(logout_png, StringsLocalization.logout())) ]; } )]; } - Widget getFaqButton() { - return new IconButton(icon: new Icon(Icons.help_outline), onPressed: () => faq(context, false)); + void onOptionsItemClick(int index) { + switch (index) { + case 0: { + pushRoute(context, new SettingsScreen()); + break; + } + case 1: { + pushRoute(context, new FAQScreen(false)); + break; + } + case 0: { + logout(context); + } + } } - Widget getLogoutButton() { - return new IconButton(icon: new Image.asset(logout_png, height: iconHeight, width: iconHeight), onPressed: () => logout(context)); + Widget getMenuItem(String image, String text) { + return new Row(children: [ + new Image.asset(image, width: 28.0, height: 28.0), + new Container(padding: new EdgeInsets.only(left: 8.0), child: new Text(text)) + ]); } /// Возврвщает контейнер, внутри которого Text с подсказкой. @@ -112,7 +131,7 @@ abstract class BaseState extends State { /// Возвращает подсказку, либо ошибку, если введенные в поле ввода данные неверны. String getHintString() { - if (textFieldValue.length == 0 && error == null) { + if (dinCode.length == 0 && error == null) { return ' '; } else if (error != null) { return error; @@ -130,7 +149,7 @@ abstract class BaseState extends State { /// Смена состояния экрана при изменении текста в поле ввода. void handleUserInput(String text) { setState(() { - textFieldValue = text; + dinCode = text; }); } diff --git a/lib/consts.dart b/lib/consts.dart index 675775e..313b78c 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -3,13 +3,14 @@ import 'package:flutter/material.dart'; // Serious constants const String appName = "AutoBonus"; -const String url = 'https://pos-api-autoclub.dinect.com/20130701/'; -const String appToken = 'bdea0f3ba9034b688019a7cac753d1209e2b227f'; +const String url = 'https://pos-api-int.dinect.com/20130701/'; +const String appToken = '9fec83cdca38c357e6b65dbb17514cdd36bf2a08'; // Assets const String logout_png = 'assets/logout.png'; const String help_png = 'assets/help.png'; const String settings_png = 'assets/settings.png'; +const String settings_arrow_png = 'assets/settings_arrow.png'; const String activate_token_bg_png = 'assets/activate_token_message_background.png'; const String active_token_bg_png = 'assets/active_token_message_background.png'; diff --git a/lib/db.dart b/lib/db.dart index db078d3..cb864d1 100644 --- a/lib/db.dart +++ b/lib/db.dart @@ -5,12 +5,20 @@ import 'package:path/path.dart'; import 'package:sqflite/sqflite.dart'; import 'package:path_provider/path_provider.dart'; +/// Данные о таблице сессии пользователя. const String tableSession = "session"; + const String columnMerchantID = "merchant_id"; // DIN code, который вводится при авторизации const String columnToken = "token"; // Токен для pos. Приходит с бэкэнда. const String columnPosID = "pos_id"; // идентификатор для создания токена на бэке. const String columnDocID = "doc_id"; // идентификатор, для проведения покупки на бэкенде. +/// Данные о таблице данных приложения. +const String tableSettings = "settings"; + +const String columnCurrency = "currency"; // валюта. +const String columnLocale = "locale"; // локаль. + //{ // columnMerchantID: merchantID, // columnToken: token, @@ -28,15 +36,22 @@ class SqliteHelper { String path = join(documentsDirectory.path, "demo.db"); db = await openDatabase(path, version: 1, onCreate: (Database db, int version) async { - await db.execute('''create table session ( + + await db.execute('''create table $tableSession ( $columnMerchantID text primary key, $columnToken text, $columnPosID text, $columnDocID integer)'''); + + await db.execute('''create table $tableSettings ( + $columnCurrency integer, + $columnLocale text)'''); }); } - Future insert(String merchantID, String posID, String token) async { + /// Создается запись в таблице, содержащая + /// необходимые для идентификации пользователя и проведения запросов. + Future createSession(String merchantID, String posID, String token) async { Map session = { columnMerchantID: merchantID, @@ -48,36 +63,53 @@ class SqliteHelper { return db.insert(tableSession, session); } + /// Создается запись в таблице, содержащая данные, которые не зависят от сессии. + Future createAppInfo(String locale, int currency) async { + List appInfo = await db.query(tableSettings); + if (appInfo.length > 0) { + return null; + } else { + return db.insert(tableSettings, { + columnLocale: locale, + columnCurrency: currency + }); + } + } + + Future getSettings() async { + return await selectAll(tableSettings); + } + Future getToken() async { - Map session = await _getSession(); + Map session = await selectAll(tableSession); String token = session != null ? session[columnToken] : null; print('token: {$token}'); return token; } Future getMerchantID() async { - Map session = await _getSession(); + Map session = await selectAll(tableSession); String merchantID = session != null ? session[columnMerchantID] : null; print('token: {$merchantID}'); return merchantID; } Future getPosID() async { - Map session = await _getSession(); + Map session = await selectAll(tableSession); return session != null ? session[columnPosID] : new DateTime.now().millisecondsSinceEpoch.toString(); } Future getDocID() async { - Map session = await _getSession(); + Map session = await selectAll(tableSession); int docID = session != null ? session[columnDocID] : 0; db.update(tableSession, {columnDocID: docID + 1}); print('docid: {$docID}'); return docID; } - Future _getSession() async { + Future selectAll(String table) async { - List maps = await db.query(tableSession, columns: null); + List maps = await db.query(table, columns: null); if (maps.length > 0) { return maps.first; diff --git a/lib/i18n/messages_en.dart b/lib/i18n/messages_en.dart index 846e453..c5a0503 100644 --- a/lib/i18n/messages_en.dart +++ b/lib/i18n/messages_en.dart @@ -38,6 +38,11 @@ class MessageLookup extends MessageLookupByLibrary { "sum" : MessageLookupByLibrary.simpleMessage("Sum"), "update_activ_status" : MessageLookupByLibrary.simpleMessage("Update activation status"), "user_name" : MessageLookupByLibrary.simpleMessage("User name"), - "yes" : MessageLookupByLibrary.simpleMessage("Yes") + "yes" : MessageLookupByLibrary.simpleMessage("Yes"), + "settings" : MessageLookupByLibrary.simpleMessage("Settings"), + "help " : MessageLookupByLibrary.simpleMessage("FAQ"), + "logout" : MessageLookupByLibrary.simpleMessage("Logout"), + "currency" : MessageLookupByLibrary.simpleMessage("Currency"), + "locale" : MessageLookupByLibrary.simpleMessage("Locale") }; } diff --git a/lib/i18n/messages_ru.dart b/lib/i18n/messages_ru.dart index bce5b66..0b2733a 100644 --- a/lib/i18n/messages_ru.dart +++ b/lib/i18n/messages_ru.dart @@ -38,6 +38,11 @@ class MessageLookup extends MessageLookupByLibrary { "sum" : MessageLookupByLibrary.simpleMessage("Сумма"), "update_activ_status" : MessageLookupByLibrary.simpleMessage("Обновить статус активации"), "user_name" : MessageLookupByLibrary.simpleMessage("ФИО"), - "yes" : MessageLookupByLibrary.simpleMessage("Да") + "yes" : MessageLookupByLibrary.simpleMessage("Да"), + "settings" : MessageLookupByLibrary.simpleMessage("Настройки"), + "help " : MessageLookupByLibrary.simpleMessage("Справка"), + "logout" : MessageLookupByLibrary.simpleMessage("Выход"), + "currency" : MessageLookupByLibrary.simpleMessage("Валюта"), + "locale" : MessageLookupByLibrary.simpleMessage("Язык") }; } diff --git a/lib/screens/faq.dart b/lib/screens/faq.dart index 481f02c..b6457b6 100644 --- a/lib/screens/faq.dart +++ b/lib/screens/faq.dart @@ -51,10 +51,6 @@ class FAQScreenState extends BaseState { return "FAQ"; } - @override getMenuButtons() { - return [getLogoutButton()]; - } - @override String getHint() { return null; } diff --git a/lib/screens/purchase.dart b/lib/screens/purchase.dart index 88e60b2..dd2d915 100644 --- a/lib/screens/purchase.dart +++ b/lib/screens/purchase.dart @@ -86,10 +86,6 @@ class PurchaseScreenState extends BaseState { return StringsLocalization.sum(); } - @override getMenuButtons() { - return [getFaqButton(), getLogoutButton()]; - } - @override getTextWidget() { return new TextField( keyboardType: TextInputType.number, diff --git a/lib/screens/purchase_success.dart b/lib/screens/purchase_success.dart index fc0134b..40ea706 100644 --- a/lib/screens/purchase_success.dart +++ b/lib/screens/purchase_success.dart @@ -22,10 +22,6 @@ class PurchaseSuccessScreenState extends BaseState { String sum; String username; - @override getMenuButtons() { - return [getFaqButton(), getLogoutButton()]; - } - @override String getTitle() { return StringsLocalization.carryingPurchase(); } diff --git a/lib/screens/registration.dart b/lib/screens/registration.dart index ff61741..3b56c09 100644 --- a/lib/screens/registration.dart +++ b/lib/screens/registration.dart @@ -1,4 +1,3 @@ -import 'package:checker/db.dart'; import 'package:checker/screens/finish_registration.dart'; import 'package:flutter/material.dart'; import 'dart:convert'; // Пакет для обработки json с ответом от сервера. @@ -56,8 +55,8 @@ class _RegistrationScreenState extends BaseState { /// Токен кассы - это DIN код. DIN код - это специальный код динекта, максимальная его длина - 25 символов. _isValidMerchantID() { - print("${textFieldValue.length}"); - return textFieldValue.length > 0 && textFieldValue.length < 25; + print("${dinCode.length}"); + return dinCode.length > 0 && dinCode.length < 25; } /// Показать progressBar, запросить токен. @@ -74,7 +73,7 @@ class _RegistrationScreenState extends BaseState { String posID = await helper.getPosID(); - createToken(textFieldValue, posID).then((response) { + createToken(dinCode, posID).then((response) { setState(() { error = null; @@ -86,7 +85,7 @@ class _RegistrationScreenState extends BaseState { Map parsedMap = JSON.decode(response.body); if (response.statusCode == 201) { - helper.insert(textFieldValue, posID, parsedMap['token']).then((_) { + helper.createSession(dinCode, posID, parsedMap['token']).then((_) { helper.close(); pushRoute(context, new FinishRegistrationScreen()); }); diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart new file mode 100644 index 0000000..a7f1a43 --- /dev/null +++ b/lib/screens/settings.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'dart:convert'; +import 'dart:async'; +import 'package:checker/common.dart'; +import 'package:checker/network.dart'; +import 'package:checker/consts.dart'; +import 'package:checker/db.dart'; +import 'package:checker/strings.dart'; +import 'package:checker/base_state.dart'; +import 'package:checker/screens/registration.dart'; +import 'package:checker/screens/finish_registration.dart'; + +class SettingsScreen extends StatefulWidget { + @override State createState() => new _SettingsState(); +} + +class MenuItem { + + MenuItem(); + + String title; + String selectedValue; +} + +class _SettingsState extends BaseState { + + List menuItems; + + @override onStart() { + if (menuItems == null) { + helper.getSettings().then((info) { + setState(() { + + print("load settings"); + + menuItems = [new MenuItem(), new MenuItem()]; + + menuItems[0].title = StringsLocalization.locale(); + menuItems[0].selectedValue = info["locale"]; + + menuItems[1].title = StringsLocalization.currency(); + menuItems[1].selectedValue = info["currency"].toString(); + }); + }); + } + } + + @override + Widget getScreenContent() { + return menuItems == null + ? getBackground() + : new ListView(children: getSettings()); + } + + List getSettings() { + List widgets = new List(); + for (MenuItem item in menuItems) { + widgets.add(new Row(children: [ + new Text(item.title, textAlign: TextAlign.left), + new Text(item.selectedValue,textAlign: TextAlign.right), + new Image.asset(settings_arrow_png, width: 28.0, height: 28.0, alignment: FractionalOffset.centerRight)])); + } + return widgets; + } + + @override + String getTitle() { + return StringsLocalization.settings(); + } +} \ No newline at end of file diff --git a/lib/screens/splash.dart b/lib/screens/splash.dart index 0585269..28eab62 100644 --- a/lib/screens/splash.dart +++ b/lib/screens/splash.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:intl/intl.dart'; import 'dart:convert'; import 'dart:async'; import 'package:checker/common.dart'; @@ -17,6 +18,33 @@ class SplashScreen extends StatefulWidget { class _SplashScreenState extends BaseState { + @override Widget getMainWidget() { + return getScreenContent(); + } + + @override void onStart() { + helper.getSettings().then((info) { + if (info == null) { + platform.invokeMethod('getLocale').then((locale) { + Intl.defaultLocale = locale; + platform.invokeMethod('getCurrency').then((currency) { + helper.createAppInfo(locale, currency).then((_) { + showNext(); + }); + }); + }); + } else { + showNext(); + } + }); + } + + void showNext() { + new Future.delayed(const Duration(milliseconds: 1000), () { + showNextScreen(); + }); + } + @override Widget getScreenContent() { return app == null @@ -36,21 +64,6 @@ class _SplashScreenState extends BaseState { width: 122.0)))]); } - @override Widget getMainWidget() { - return getScreenContent(); - } - - @override - String getTitle() { - return null; - } - - @override void onStart() { - new Future.delayed(const Duration(milliseconds: 1000), () { - showNextScreen(context); - }); - } - /// Возвращает столбец с логотипом приложения и текстом под ним. /// Столбец занимает не все доступное пространство, а необходимый минимум в центре экрана. getLogo() { @@ -69,10 +82,10 @@ class _SplashScreenState extends BaseState { } /// Запуск следующего экрана приложения. - showNextScreen(BuildContext context) async { + showNextScreen() async { String token = await helper.getToken(); - + // В случае, если в приложении отсутствует токен, // необходимо запустить регистрацию кассы. if (token == null) { @@ -81,7 +94,7 @@ class _SplashScreenState extends BaseState { } else { if (await platform.invokeMethod('isOnline')) { checkTokenStatus(token).then((statusResponse) { - handleStatusResponse(context, statusResponse, helper); + handleStatusResponse(statusResponse, helper); }).catchError((error) { helper.close().then((_) { print(error.toString()); @@ -95,7 +108,7 @@ class _SplashScreenState extends BaseState { /// Обработка ответа. /// В случае, если токен был удален может прийти active: false, либо 404. /// Если токен не активен, попробовать создать его еще раз. - handleStatusResponse(BuildContext context, var statusResponse, SqliteHelper helper) async { + handleStatusResponse(var statusResponse, SqliteHelper helper) async { int code = statusResponse.statusCode; print('resp: ${code}'); @@ -114,7 +127,7 @@ class _SplashScreenState extends BaseState { startScanner(context, app, helper); } else { if (await platform.invokeMethod('isOnline')) { - _createToken(context, helper); + _createToken(helper); } } } @@ -127,7 +140,7 @@ class _SplashScreenState extends BaseState { /// /// Если вернулся код 200, значит токен был ранее удален и только что снова создался. /// Нужно удалить его и направить пользователя на экран регистрации. - _createToken(BuildContext ctx, SqliteHelper helper) async { + _createToken(SqliteHelper helper) async { String merchantID = await helper.getMerchantID(); String posID = await helper.getPosID(); @@ -135,22 +148,22 @@ class _SplashScreenState extends BaseState { createToken(merchantID, posID).then((response) { if (response.statusCode == 409) { helper.close(); - pushRoute(ctx, new FinishRegistrationScreen()); + pushRoute(context, new FinishRegistrationScreen()); } else if (response.statusCode == 201) { - clearToken(response, ctx, helper); + clearToken(response, helper); } }).catchError((error) => print(error.toString())); } /// Очищаем бд, делаем запрос на удаление токена. - void clearToken(Response response, BuildContext ctx, SqliteHelper helper) { + void clearToken(Response response, SqliteHelper helper) { helper.clear().then((_) { Map parsedMap = JSON.decode(response.body); deleteToken(parsedMap['token']).then((_) { helper.close(); - Navigator.of(ctx).pop(); // Убираем текущий route - pushRoute(ctx, new RegistrationScreen()); // Запускаем регистрацию + Navigator.of(context).pop(); // Убираем текущий route + pushRoute(context, new RegistrationScreen()); // Запускаем регистрацию }).catchError((error) { helper.close(); print(error.toString()); diff --git a/lib/strings.dart b/lib/strings.dart index 8b030f7..0221352 100644 --- a/lib/strings.dart +++ b/lib/strings.dart @@ -39,4 +39,9 @@ class StringsLocalization { static String scan() => Intl.message('scan', name: 'scan', locale: Intl.defaultLocale); static String buyer() => Intl.message('buyer', name: 'buyer', locale: Intl.defaultLocale); static String idNotFound() => Intl.message('ID_not_found', name: 'ID_not_found', locale: Intl.defaultLocale); + static String settings() => Intl.message('settings', name: 'settings', locale: Intl.defaultLocale); + static String help () => Intl.message('help ', name: 'help ', locale: Intl.defaultLocale); + static String logout() => Intl.message('logout', name: 'logout', locale: Intl.defaultLocale); + static String currency() => Intl.message('currency', name: 'currency', locale: Intl.defaultLocale); + static String locale() => Intl.message('locale', name: 'locale', locale: Intl.defaultLocale); } \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index dc47938..6a5929c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -33,6 +33,7 @@ flutter: - assets/pip_splash.png - assets/settings.png + - assets/settings_arrow.png - assets/help.png - assets/logout.png - assets/activate_token_message_background.png From 0dde204dcdf3b14b450f2bf164ac9e877e96c88c Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Mon, 11 Sep 2017 11:41:20 +0300 Subject: [PATCH 05/24] =?UTF-8?q?=D0=9B=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D1=8D=D0=BA=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA,=20?= =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20=D0=BB=D0=B8=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D1=83=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/common.dart | 34 ++++++++++++++++++++------ lib/db.dart | 16 ++++++++++++- lib/i18n/messages_en.dart | 9 ++++++- lib/i18n/messages_es.dart | 11 ++++++++- lib/i18n/messages_ru.dart | 8 ++++++- lib/i18n/messages_ua.dart | 11 ++++++++- lib/main.dart | 21 +--------------- lib/screens/purchase.dart | 2 +- lib/screens/registration.dart | 2 +- lib/screens/settings.dart | 45 ++++++++++++++++++++++------------- lib/screens/splash.dart | 17 ++++++++----- lib/strings.dart | 12 +++++++++- 12 files changed, 131 insertions(+), 57 deletions(-) diff --git a/lib/common.dart b/lib/common.dart index 5a078b8..413099c 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -14,15 +14,19 @@ import 'strings.dart'; const platform = const MethodChannel('com.dinect.checker/instance_id'); // Метод обеспечивает замену текущего объекта route новым. -pushRoute(BuildContext context, Widget widget) { +pushRouteReplacement(BuildContext context, Widget widget) { var route = new MaterialPageRoute(builder: (BuildContext context) => widget); Navigator.of(context).pushReplacement(route); } +pushRoute(BuildContext context, Widget widget) { + var route = new MaterialPageRoute(builder: (BuildContext context) => widget); + Navigator.of(context).push(route); +} + // Добавление route, с возможностью вернуться к предыдущему экрану. faq(BuildContext context, bool returnToScanner) { - var route = new MaterialPageRoute(builder: (BuildContext context) => new FAQScreen(returnToScanner)); - Navigator.of(context).push(route); + pushRoute(context, new FAQScreen(returnToScanner)); } // В методе отправляется запрос на удаление токена кассы, очищаются SharedPreferences приложения. @@ -32,14 +36,14 @@ logout(BuildContext context) async { await helper.open(); String token = await helper.getToken(); - VoidCallback positiveCalback = () { + VoidCallback positiveCallback = () { if (token != null) { deleteToken(token).then((response) { print(response.body); platform.invokeMethod('removeKeys').then((result) { Navigator.of(context).pop(); Navigator.of(context).pop(); - pushRoute(context, new RegistrationScreen()); // Запускаем регистрацию + pushRouteReplacement(context, new RegistrationScreen()); // Запускаем регистрацию }); }).catchError((error) { print(error.toString()); @@ -50,7 +54,7 @@ logout(BuildContext context) async { } }; - showYesNoDialog(context, StringsLocalization.confirmation(), StringsLocalization.askChangeStore(), positiveCalback); + showYesNoDialog(context, StringsLocalization.confirmation(), StringsLocalization.askChangeStore(), positiveCallback); } forceLogout(String token , BuildContext context) async { @@ -62,7 +66,7 @@ forceLogout(String token , BuildContext context) async { helper.clear().then((_) { helper.close().then((_) { Navigator.of(context).pop(); - pushRoute(context, new RegistrationScreen()); // Запускаем регистрацию + pushRouteReplacement(context, new RegistrationScreen()); // Запускаем регистрацию }); }); }); @@ -122,3 +126,19 @@ showYesNoDialog(BuildContext context, String title, String content, VoidCallback child: new Text(StringsLocalization.yes()), onPressed: positiveCallback)])); } + +getCurrencyTitle(int code) { + switch(code) { + case 643: return StringsLocalization.ruble(); + case 840: return StringsLocalization.dollar(); + case 980: return StringsLocalization.hryvna(); + } +} + +getLocaleTitle(String code) { + switch(code) { + case 'ru': return StringsLocalization.russian(); + case 'en': return StringsLocalization.english(); + case 'ua': return StringsLocalization.ukrainian(); + } +} \ No newline at end of file diff --git a/lib/db.dart b/lib/db.dart index cb864d1..9dfe716 100644 --- a/lib/db.dart +++ b/lib/db.dart @@ -90,7 +90,7 @@ class SqliteHelper { Future getMerchantID() async { Map session = await selectAll(tableSession); String merchantID = session != null ? session[columnMerchantID] : null; - print('token: {$merchantID}'); + print('merchantID: {$merchantID}'); return merchantID; } @@ -107,6 +107,20 @@ class SqliteHelper { return docID; } + Future getLocale() async { + Map settings = await selectAll(tableSettings); + String locale = settings != null ? settings[columnLocale] : null; + print('locale: {$locale}'); + return locale; + } + + Future getCurrency() async { + Map settings = await selectAll(tableSettings); + String currency = settings != null ? settings[columnCurrency] : null; + print('currency: {$currency}'); + return currency; + } + Future selectAll(String table) async { List maps = await db.query(table, columns: null); diff --git a/lib/i18n/messages_en.dart b/lib/i18n/messages_en.dart index c5a0503..f198955 100644 --- a/lib/i18n/messages_en.dart +++ b/lib/i18n/messages_en.dart @@ -43,6 +43,13 @@ class MessageLookup extends MessageLookupByLibrary { "help " : MessageLookupByLibrary.simpleMessage("FAQ"), "logout" : MessageLookupByLibrary.simpleMessage("Logout"), "currency" : MessageLookupByLibrary.simpleMessage("Currency"), - "locale" : MessageLookupByLibrary.simpleMessage("Locale") + "locale" : MessageLookupByLibrary.simpleMessage("Locale"), + "russian" : MessageLookupByLibrary.simpleMessage("Russian"), + "english" : MessageLookupByLibrary.simpleMessage("English"), + "ukrainian" : MessageLookupByLibrary.simpleMessage("Ukrainian"), + "rubles" : MessageLookupByLibrary.simpleMessage("Ruble"), + "dollars" : MessageLookupByLibrary.simpleMessage("Dollar"), + "hryvna" : MessageLookupByLibrary.simpleMessage("Hryvna") + }; } diff --git a/lib/i18n/messages_es.dart b/lib/i18n/messages_es.dart index 0faa5d9..f6b8f47 100644 --- a/lib/i18n/messages_es.dart +++ b/lib/i18n/messages_es.dart @@ -38,6 +38,15 @@ class MessageLookup extends MessageLookupByLibrary { "sum" : MessageLookupByLibrary.simpleMessage("Suma"), "update_activ_status" : MessageLookupByLibrary.simpleMessage("Actualizar la condición de activación"), "user_name" : MessageLookupByLibrary.simpleMessage("Un nombre de usario"), - "yes" : MessageLookupByLibrary.simpleMessage("Si") + "yes" : MessageLookupByLibrary.simpleMessage("Si"), + "logout" : MessageLookupByLibrary.simpleMessage("Logout"), + "currency" : MessageLookupByLibrary.simpleMessage("Currency"), + "locale" : MessageLookupByLibrary.simpleMessage("Locale"), + "russian" : MessageLookupByLibrary.simpleMessage("Russian"), + "english" : MessageLookupByLibrary.simpleMessage("English"), + "ukrainian" : MessageLookupByLibrary.simpleMessage("Ukrainian"), + "rubles" : MessageLookupByLibrary.simpleMessage("Ruble"), + "dollars" : MessageLookupByLibrary.simpleMessage("Dollar"), + "hryvna" : MessageLookupByLibrary.simpleMessage("Hryvna") }; } diff --git a/lib/i18n/messages_ru.dart b/lib/i18n/messages_ru.dart index 0b2733a..10b0b0c 100644 --- a/lib/i18n/messages_ru.dart +++ b/lib/i18n/messages_ru.dart @@ -43,6 +43,12 @@ class MessageLookup extends MessageLookupByLibrary { "help " : MessageLookupByLibrary.simpleMessage("Справка"), "logout" : MessageLookupByLibrary.simpleMessage("Выход"), "currency" : MessageLookupByLibrary.simpleMessage("Валюта"), - "locale" : MessageLookupByLibrary.simpleMessage("Язык") + "locale" : MessageLookupByLibrary.simpleMessage("Язык"), + "russian" : MessageLookupByLibrary.simpleMessage("Русский"), + "english" : MessageLookupByLibrary.simpleMessage("Английский"), + "ukrainian" : MessageLookupByLibrary.simpleMessage("Украинский"), + "rubles" : MessageLookupByLibrary.simpleMessage("Рубль"), + "dollars" : MessageLookupByLibrary.simpleMessage("Доллар"), + "hryvna" : MessageLookupByLibrary.simpleMessage("Гривна") }; } diff --git a/lib/i18n/messages_ua.dart b/lib/i18n/messages_ua.dart index ac058c6..9baa6bf 100644 --- a/lib/i18n/messages_ua.dart +++ b/lib/i18n/messages_ua.dart @@ -38,6 +38,15 @@ class MessageLookup extends MessageLookupByLibrary { "sum" : MessageLookupByLibrary.simpleMessage("Сума"), "update_activ_status" : MessageLookupByLibrary.simpleMessage("Оновити статус активації"), "user_name" : MessageLookupByLibrary.simpleMessage("ПІБ"), - "yes" : MessageLookupByLibrary.simpleMessage("Так") + "yes" : MessageLookupByLibrary.simpleMessage("Так"), + "logout" : MessageLookupByLibrary.simpleMessage("Logout"), + "currency" : MessageLookupByLibrary.simpleMessage("Currency"), + "locale" : MessageLookupByLibrary.simpleMessage("Locale"), + "russian" : MessageLookupByLibrary.simpleMessage("Russian"), + "english" : MessageLookupByLibrary.simpleMessage("English"), + "ukrainian" : MessageLookupByLibrary.simpleMessage("Ukrainian"), + "rubles" : MessageLookupByLibrary.simpleMessage("Ruble"), + "dollars" : MessageLookupByLibrary.simpleMessage("Dollar"), + "hryvna" : MessageLookupByLibrary.simpleMessage("Hryvna") }; } diff --git a/lib/main.dart b/lib/main.dart index a9da1c9..8b6e94d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -5,20 +5,6 @@ import 'strings.dart'; import 'common.dart'; import 'dart:async'; -class StringsLocalizationDelegate extends LocalizationsDelegate { - - @override - Future load(Locale locale) async { - return StringsLocalization.load(await platform.invokeMethod("getLocale")); - } - - @override - bool shouldReload(LocalizationsDelegate old) { - return false; - } - -} - /// Точка входа в приложение. void main() { runApp(new Checker()); @@ -33,12 +19,7 @@ class CheckerState extends State { @override Widget build(BuildContext context) { return new MaterialApp( title: appName, - home: new SplashScreen(), - localizationsDelegates: getLocalizationsDelegate() - ); + home: new SplashScreen()); } - getLocalizationsDelegate() { - return [new StringsLocalizationDelegate()]; - } } diff --git a/lib/screens/purchase.dart b/lib/screens/purchase.dart index dd2d915..1022563 100644 --- a/lib/screens/purchase.dart +++ b/lib/screens/purchase.dart @@ -220,7 +220,7 @@ class PurchaseScreenState extends BaseState { print(response.body); helper.close().then((_) { Navigator.of(context).pop(); - pushRoute(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name'])); + pushRouteReplacement(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name'])); }); }).catchError((error) { diff --git a/lib/screens/registration.dart b/lib/screens/registration.dart index 3b56c09..0f19ff6 100644 --- a/lib/screens/registration.dart +++ b/lib/screens/registration.dart @@ -87,7 +87,7 @@ class _RegistrationScreenState extends BaseState { if (response.statusCode == 201) { helper.createSession(dinCode, posID, parsedMap['token']).then((_) { helper.close(); - pushRoute(context, new FinishRegistrationScreen()); + pushRouteReplacement(context, new FinishRegistrationScreen()); }); } else { setState(() { diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index a7f1a43..edc01f5 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -17,10 +17,10 @@ class SettingsScreen extends StatefulWidget { class MenuItem { - MenuItem(); + // Заголовок пункта меню и выбранное значение. + String title, selectedValue; - String title; - String selectedValue; + MenuItem(this.title, this.selectedValue); } class _SettingsState extends BaseState { @@ -31,16 +31,11 @@ class _SettingsState extends BaseState { if (menuItems == null) { helper.getSettings().then((info) { setState(() { - print("load settings"); - - menuItems = [new MenuItem(), new MenuItem()]; - - menuItems[0].title = StringsLocalization.locale(); - menuItems[0].selectedValue = info["locale"]; - - menuItems[1].title = StringsLocalization.currency(); - menuItems[1].selectedValue = info["currency"].toString(); + menuItems = [ + new MenuItem(StringsLocalization.locale(), getLocaleTitle(info["locale"])), + new MenuItem(StringsLocalization.currency(), getCurrencyTitle(info["currency"])) + ]; }); }); } @@ -53,17 +48,35 @@ class _SettingsState extends BaseState { : new ListView(children: getSettings()); } + @override + List getMenuButtons() { + return null; + } + List getSettings() { List widgets = new List(); for (MenuItem item in menuItems) { - widgets.add(new Row(children: [ - new Text(item.title, textAlign: TextAlign.left), - new Text(item.selectedValue,textAlign: TextAlign.right), - new Image.asset(settings_arrow_png, width: 28.0, height: 28.0, alignment: FractionalOffset.centerRight)])); + widgets.add(getSettingsItem(item)); } return widgets; } + Widget getSettingsItem(MenuItem item) { + return new Container( + margin: const EdgeInsets.all(16.0), + child: new Row(children: [ + new Expanded(child: new Text(item.title)), + new Text(item.selectedValue), + getArrow()]) + ); + } + + Widget getArrow() { + return new Image.asset(settings_arrow_png, + width: 28.0, + height: 28.0); + } + @override String getTitle() { return StringsLocalization.settings(); diff --git a/lib/screens/splash.dart b/lib/screens/splash.dart index 28eab62..2109f9a 100644 --- a/lib/screens/splash.dart +++ b/lib/screens/splash.dart @@ -1,3 +1,4 @@ +import 'package:checker/strings.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; import 'package:intl/intl.dart'; @@ -26,7 +27,6 @@ class _SplashScreenState extends BaseState { helper.getSettings().then((info) { if (info == null) { platform.invokeMethod('getLocale').then((locale) { - Intl.defaultLocale = locale; platform.invokeMethod('getCurrency').then((currency) { helper.createAppInfo(locale, currency).then((_) { showNext(); @@ -34,7 +34,12 @@ class _SplashScreenState extends BaseState { }); }); } else { - showNext(); + helper.getLocale().then((locale) { + Intl.defaultLocale = locale; + StringsLocalization.load(locale).then((l) { + showNext(); + }); + }); } }); } @@ -90,7 +95,7 @@ class _SplashScreenState extends BaseState { // необходимо запустить регистрацию кассы. if (token == null) { await helper.close(); - pushRoute(context, new RegistrationScreen()); + pushRouteReplacement(context, new RegistrationScreen()); } else { if (await platform.invokeMethod('isOnline')) { checkTokenStatus(token).then((statusResponse) { @@ -115,7 +120,7 @@ class _SplashScreenState extends BaseState { if (code == 404) { helper.clear().then((result) { helper.close().then((_) { - pushRoute(context, new RegistrationScreen()); + pushRouteReplacement(context, new RegistrationScreen()); }); }); } else { @@ -148,7 +153,7 @@ class _SplashScreenState extends BaseState { createToken(merchantID, posID).then((response) { if (response.statusCode == 409) { helper.close(); - pushRoute(context, new FinishRegistrationScreen()); + pushRouteReplacement(context, new FinishRegistrationScreen()); } else if (response.statusCode == 201) { clearToken(response, helper); } @@ -163,7 +168,7 @@ class _SplashScreenState extends BaseState { deleteToken(parsedMap['token']).then((_) { helper.close(); Navigator.of(context).pop(); // Убираем текущий route - pushRoute(context, new RegistrationScreen()); // Запускаем регистрацию + pushRouteReplacement(context, new RegistrationScreen()); // Запускаем регистрацию }).catchError((error) { helper.close(); print(error.toString()); diff --git a/lib/strings.dart b/lib/strings.dart index 0221352..c8fd75f 100644 --- a/lib/strings.dart +++ b/lib/strings.dart @@ -40,8 +40,18 @@ class StringsLocalization { static String buyer() => Intl.message('buyer', name: 'buyer', locale: Intl.defaultLocale); static String idNotFound() => Intl.message('ID_not_found', name: 'ID_not_found', locale: Intl.defaultLocale); static String settings() => Intl.message('settings', name: 'settings', locale: Intl.defaultLocale); - static String help () => Intl.message('help ', name: 'help ', locale: Intl.defaultLocale); + static String help() => Intl.message('help ', name: 'help ', locale: Intl.defaultLocale); static String logout() => Intl.message('logout', name: 'logout', locale: Intl.defaultLocale); static String currency() => Intl.message('currency', name: 'currency', locale: Intl.defaultLocale); static String locale() => Intl.message('locale', name: 'locale', locale: Intl.defaultLocale); + + // Языки + static String russian() => Intl.message('russian', name: 'russian', locale: Intl.defaultLocale); + static String english() => Intl.message('english', name: 'english', locale: Intl.defaultLocale); + static String ukrainian() => Intl.message('ukrainian', name: 'ukrainian', locale: Intl.defaultLocale); + + // Валюты + static String ruble() => Intl.message('rubles', name: 'rubles', locale: Intl.defaultLocale); + static String dollar() => Intl.message('dollars', name: 'dollars', locale: Intl.defaultLocale); + static String hryvna() => Intl.message('hryvna', name: 'hryvna', locale: Intl.defaultLocale); } \ No newline at end of file From 24fdfc15f64db9f78976aa26c188a6dc1f665c16 Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Mon, 11 Sep 2017 14:51:50 +0300 Subject: [PATCH 06/24] =?UTF-8?q?=D0=AD=D0=BA=D1=80=D0=B0=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/build.gradle | 43 ++----------------------- assets/check.png | Bin 0 -> 2376 bytes lib/{ => base}/base_state.dart | 0 lib/base/settings_base_state.dart | 46 +++++++++++++++++++++++++++ lib/common.dart | 6 ++-- lib/consts.dart | 12 ++++--- lib/i18n/messages_en.dart | 9 ++---- lib/i18n/messages_es.dart | 11 +++---- lib/i18n/messages_ru.dart | 5 +-- lib/i18n/messages_ua.dart | 11 +++---- lib/screens/currencies.dart | 27 ++++++++++++++++ lib/screens/faq.dart | 2 +- lib/screens/finish_registration.dart | 2 +- lib/screens/languages.dart | 21 ++++++++++++ lib/screens/purchase.dart | 2 +- lib/screens/purchase_success.dart | 2 +- lib/screens/registration.dart | 2 +- lib/screens/settings.dart | 34 ++++++++++---------- lib/screens/splash.dart | 3 +- lib/strings.dart | 7 +--- pubspec.yaml | 1 + 21 files changed, 148 insertions(+), 98 deletions(-) create mode 100644 assets/check.png rename lib/{ => base}/base_state.dart (100%) create mode 100644 lib/base/settings_base_state.dart create mode 100644 lib/screens/currencies.dart create mode 100644 lib/screens/languages.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 6ddf713..7e54f2f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -42,42 +42,14 @@ android { productFlavors { - autobonus_en { - applicationId 'com.dinect.autobonus' - buildConfigField "String", "locale", "\"en\"" - buildConfigField "String", "flavor", "\"autobonus\"" - buildConfigField "int", "currency", "643" - } - - autobonus_ru { + autobonus { applicationId 'com.dinect.autobonus' buildConfigField "String", "locale", "\"ru\"" buildConfigField "String", "flavor", "\"autobonus\"" buildConfigField "int", "currency", "643" } - autobonus_ua { - applicationId 'com.dinect.autobonus' - buildConfigField "String", "locale", "\"ua\"" - buildConfigField "String", "flavor", "\"autobonus\"" - buildConfigField "int", "currency", "643" - } - - pip_en { - applicationId 'com.dinect.pip' - buildConfigField "String", "locale", "\"en\"" - buildConfigField "String", "flavor", "\"pip\"" - buildConfigField "int", "currency", "980" - } - - pip_ru { - applicationId 'com.dinect.pip' - buildConfigField "String", "locale", "\"ru\"" - buildConfigField "String", "flavor", "\"pip\"" - buildConfigField "int", "currency", "980" - } - - pip_ua { + pip { applicationId 'com.dinect.pip' buildConfigField "String", "locale", "\"ua\"" buildConfigField "String", "flavor", "\"pip\"" @@ -90,20 +62,11 @@ android { main.jniLibs.srcDir 'jniLibs' - pip_ua { + pip { res.srcDirs = ['src/pip/res'] manifest.srcFile 'src/pip/AndroidManifest.xml' } - pip_ru { - res.srcDirs = ['src/pip/res'] - manifest.srcFile 'src/pip/AndroidManifest.xml' - } - - pip_en { - res.srcDirs = ['src/pip/res'] - manifest.srcFile 'src/pip/AndroidManifest.xml' - } } } diff --git a/assets/check.png b/assets/check.png new file mode 100644 index 0000000000000000000000000000000000000000..58ac0303a8ecc4224bb45210f8a8e7aff873e2a6 GIT binary patch literal 2376 zcmd5;S5%V;8vT<{k_e&q0AWRfC~Z(gN&sO%qzD4SNHKs)kQ&*c3js4C5dj&-&_VAY|}m!B3Otr__}~$roKxaEE5X1D8fYQhLu`Is=b9x#pt61U7%ab9gqh& z2q^g}>^=aEw`ops1w?I{A>A|K;C)zK+Tfy`4M=*45VKVbzzH$p#DPyD?f}sO1{u{ z0!>Pa3WLgu!0F%Sibp&~Sy7#z4>riUA4{NHplF>f^&uyqr6W!{33*^6kQlkcYu4?@ zd|TJSHBT@N>c5#;DzbavzW5sRkJPn@pObsA&FuoW8ldu$&ve&Izvwrln{XavQ>HLV zR9cl&%|#`l_LNUAV(g8&nL8!!ak4+wrYL4~hdw`L9T- zWpz6zM-7=t6?I>T<*|aBWZ&K#N53nNX&%<;s!ZM2d^R;GkX&JcS`h>_UV)f>TCBt< z(_G;sk~qzp_X7H$^sQ;G4}h8HqHo|wh|BBuRs|1i!$1lIWBIAZBvDQNU@Y>gSWMm7 z6-l~d_I$xhul8N0amox4Sqn3Q`$azDwUG6(vkaT(<1{(mF%5|L*xxg@M`=2AUy@W~ z-DD(8CnfFL9iOJUIHB5u&06Pcw{&duOiilmTN;#IIK)@z2DuW);#z?^bjT#F*8S{TW6ja{R5v(Rl#hT+OhME*MX>EP~tQ1HEzU5*<*sDm9b_3ZVwI3L}CzcV7p7 zb#f>M=MkN6yb|gYn467BbhW*&PJV(dK=f6i!0vN@$toW)kd>n%jw~pME&3+`?kd!&bnV~KPZf^XW zww9R!mj?#o3=a3tZG23}DG&~$Y7OR8#*UXi3X`afI@&R5#t)W#^#hUE{4(g*1*hcN!)T1kngn36a+@b^ z@~x0Oqd&3r?s`?A!(`g-QO-%7+J>=1|42<>Ni+>^r`n_32<*KChFH~JxN9qoQ6lE0oMx}r9=a)BA zoz&A_6`d?4v$jy-?;6T#KwvR0atib`?D3LWzQO*7`Qo*b$dp_f!X+16sK}ev7ZHjL zd$!z7R}Z<4^fJ|_9N=2PPSyM_apr#rgb5ni|Kfq@o&Ht9i2ri;P%O#{fHN;=jDa zyNi9rjaC^tT{|et_x__aeQzMRPGk8OsE-bA9ihtn&6GzmRA+vj7LU@ZuK#|o#wbx> z)usn*VMKFen_FvILmca+_g&K93wx@!*0(U4OQb7!r-$zZ5Gr7&gwsL|?!X`eDfx6n zZpO1AvkyE!J#%Xk`n}s`(v_c=pMV-Agypl(LX_EZ`6SI|5oNJ1DdlQWcXn)BD*bKl zEaEH1`dmELB714PJb0`r-d3xG+2_* z!6waGSkDypH>vO^?48&^iRFpUw@wR?jN|%Q_u`ohS`CvJ(D4D21C}BvG%mCp^0^dR zlq5C>a#;_PnSyW*1AjS1EVR!Wk(uT%m#cd%()xQE0D54=;>V{mj+9s_5Z_9A)xmjp zi`#sgvLMPjvauH$!E+Km7#1V=$}aey%TqTl$;ZiXz5DjuU-;cl>ndvivxO*ZK~svl)LUSF{FM#IZTqE5Y?3bLd@N|+dN%=5A-R)+hl5QwItuKqagt1a&Mt4pm+WL z7#E9ET50YX^ih4pYOU1&p)+5iP8Pt7v>O-xE?Ik6W{@D84F@_96|e3br=UHJ?WV`F zLG13{ extends BaseState { + + @override + Widget getScreenContent() { + + List widgets = new List(); + + for (String option in getOptions()) { + widgets.add(getItem(option)); + } + + return new ListView(children: widgets); + } + + List getOptions(); + + @override + List getMenuButtons() { + return null; + } + + Widget getItem(String option) { + return new Container( + height: 56.0, + child: (new FlatButton(onPressed: null, + child: new Row(children: [ + new Expanded(child: new Text(option)), + getCheckMark()])))); + } + + Widget getCheckMark() { + return new Image.asset(check_png, + width: 28.0, + height: 28.0); + } + + @override + String getTitle() { + return StringsLocalization.settings(); + } +} \ No newline at end of file diff --git a/lib/common.dart b/lib/common.dart index 413099c..d1d238b 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -137,8 +137,8 @@ getCurrencyTitle(int code) { getLocaleTitle(String code) { switch(code) { - case 'ru': return StringsLocalization.russian(); - case 'en': return StringsLocalization.english(); - case 'ua': return StringsLocalization.ukrainian(); + case 'ru': return languages[0]; + case 'en': return languages[1]; + case 'ua': return languages[2]; } } \ No newline at end of file diff --git a/lib/consts.dart b/lib/consts.dart index 313b78c..79f3f2e 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -11,15 +11,12 @@ const String logout_png = 'assets/logout.png'; const String help_png = 'assets/help.png'; const String settings_png = 'assets/settings.png'; const String settings_arrow_png = 'assets/settings_arrow.png'; - +const String check_png = 'assets/check.png'; const String activate_token_bg_png = 'assets/activate_token_message_background.png'; const String active_token_bg_png = 'assets/active_token_message_background.png'; - const String expansion_icon_png = 'assets/faq_expansion_icon.png'; - const String powered_by_dinect_splash_png = 'assets/powered_by_dinect_splash.png'; const String powered_by_dinect_png = 'assets/powered_by_dinect.png'; - const String splash_text_png = 'assets/splash_text.png'; const Color greyTextColor = const Color(0xffa5a5a5); @@ -35,3 +32,10 @@ const Color inputFieldBackground = const Color(0xffefefef); const double verticalMargin = 28.0; const double buttonHeight = 48.0; const double iconHeight = 20.0; + +List languages = const [ + 'Русский', + 'English', + 'Український', + 'Español' +]; \ No newline at end of file diff --git a/lib/i18n/messages_en.dart b/lib/i18n/messages_en.dart index f198955..e649e25 100644 --- a/lib/i18n/messages_en.dart +++ b/lib/i18n/messages_en.dart @@ -40,13 +40,10 @@ class MessageLookup extends MessageLookupByLibrary { "user_name" : MessageLookupByLibrary.simpleMessage("User name"), "yes" : MessageLookupByLibrary.simpleMessage("Yes"), "settings" : MessageLookupByLibrary.simpleMessage("Settings"), - "help " : MessageLookupByLibrary.simpleMessage("FAQ"), - "logout" : MessageLookupByLibrary.simpleMessage("Logout"), + "help" : MessageLookupByLibrary.simpleMessage("Help"), + "logout" : MessageLookupByLibrary.simpleMessage("Exit"), "currency" : MessageLookupByLibrary.simpleMessage("Currency"), - "locale" : MessageLookupByLibrary.simpleMessage("Locale"), - "russian" : MessageLookupByLibrary.simpleMessage("Russian"), - "english" : MessageLookupByLibrary.simpleMessage("English"), - "ukrainian" : MessageLookupByLibrary.simpleMessage("Ukrainian"), + "locale" : MessageLookupByLibrary.simpleMessage("Language"), "rubles" : MessageLookupByLibrary.simpleMessage("Ruble"), "dollars" : MessageLookupByLibrary.simpleMessage("Dollar"), "hryvna" : MessageLookupByLibrary.simpleMessage("Hryvna") diff --git a/lib/i18n/messages_es.dart b/lib/i18n/messages_es.dart index f6b8f47..2d2c411 100644 --- a/lib/i18n/messages_es.dart +++ b/lib/i18n/messages_es.dart @@ -39,12 +39,11 @@ class MessageLookup extends MessageLookupByLibrary { "update_activ_status" : MessageLookupByLibrary.simpleMessage("Actualizar la condición de activación"), "user_name" : MessageLookupByLibrary.simpleMessage("Un nombre de usario"), "yes" : MessageLookupByLibrary.simpleMessage("Si"), - "logout" : MessageLookupByLibrary.simpleMessage("Logout"), - "currency" : MessageLookupByLibrary.simpleMessage("Currency"), - "locale" : MessageLookupByLibrary.simpleMessage("Locale"), - "russian" : MessageLookupByLibrary.simpleMessage("Russian"), - "english" : MessageLookupByLibrary.simpleMessage("English"), - "ukrainian" : MessageLookupByLibrary.simpleMessage("Ukrainian"), + "settings" : MessageLookupByLibrary.simpleMessage("Las configuraciones"), + "help" : MessageLookupByLibrary.simpleMessage("La Ayuda"), + "logout" : MessageLookupByLibrary.simpleMessage("Salir"), + "currency" : MessageLookupByLibrary.simpleMessage("La Moneda"), + "locale" : MessageLookupByLibrary.simpleMessage("La lengua"), "rubles" : MessageLookupByLibrary.simpleMessage("Ruble"), "dollars" : MessageLookupByLibrary.simpleMessage("Dollar"), "hryvna" : MessageLookupByLibrary.simpleMessage("Hryvna") diff --git a/lib/i18n/messages_ru.dart b/lib/i18n/messages_ru.dart index 10b0b0c..0e6ab1f 100644 --- a/lib/i18n/messages_ru.dart +++ b/lib/i18n/messages_ru.dart @@ -40,13 +40,10 @@ class MessageLookup extends MessageLookupByLibrary { "user_name" : MessageLookupByLibrary.simpleMessage("ФИО"), "yes" : MessageLookupByLibrary.simpleMessage("Да"), "settings" : MessageLookupByLibrary.simpleMessage("Настройки"), - "help " : MessageLookupByLibrary.simpleMessage("Справка"), + "help" : MessageLookupByLibrary.simpleMessage("Справка"), "logout" : MessageLookupByLibrary.simpleMessage("Выход"), "currency" : MessageLookupByLibrary.simpleMessage("Валюта"), "locale" : MessageLookupByLibrary.simpleMessage("Язык"), - "russian" : MessageLookupByLibrary.simpleMessage("Русский"), - "english" : MessageLookupByLibrary.simpleMessage("Английский"), - "ukrainian" : MessageLookupByLibrary.simpleMessage("Украинский"), "rubles" : MessageLookupByLibrary.simpleMessage("Рубль"), "dollars" : MessageLookupByLibrary.simpleMessage("Доллар"), "hryvna" : MessageLookupByLibrary.simpleMessage("Гривна") diff --git a/lib/i18n/messages_ua.dart b/lib/i18n/messages_ua.dart index 9baa6bf..0c50c7f 100644 --- a/lib/i18n/messages_ua.dart +++ b/lib/i18n/messages_ua.dart @@ -39,12 +39,11 @@ class MessageLookup extends MessageLookupByLibrary { "update_activ_status" : MessageLookupByLibrary.simpleMessage("Оновити статус активації"), "user_name" : MessageLookupByLibrary.simpleMessage("ПІБ"), "yes" : MessageLookupByLibrary.simpleMessage("Так"), - "logout" : MessageLookupByLibrary.simpleMessage("Logout"), - "currency" : MessageLookupByLibrary.simpleMessage("Currency"), - "locale" : MessageLookupByLibrary.simpleMessage("Locale"), - "russian" : MessageLookupByLibrary.simpleMessage("Russian"), - "english" : MessageLookupByLibrary.simpleMessage("English"), - "ukrainian" : MessageLookupByLibrary.simpleMessage("Ukrainian"), + "help" : MessageLookupByLibrary.simpleMessage("Допомога"), + "settings" : MessageLookupByLibrary.simpleMessage("Налаштування"), + "logout" : MessageLookupByLibrary.simpleMessage("Вихід"), + "currency" : MessageLookupByLibrary.simpleMessage("Валюта"), + "locale" : MessageLookupByLibrary.simpleMessage("Мова"), "rubles" : MessageLookupByLibrary.simpleMessage("Ruble"), "dollars" : MessageLookupByLibrary.simpleMessage("Dollar"), "hryvna" : MessageLookupByLibrary.simpleMessage("Hryvna") diff --git a/lib/screens/currencies.dart b/lib/screens/currencies.dart new file mode 100644 index 0000000..9280650 --- /dev/null +++ b/lib/screens/currencies.dart @@ -0,0 +1,27 @@ +import 'package:checker/base/settings_base_state.dart'; +import 'package:flutter/material.dart'; +import 'package:checker/consts.dart'; +import 'package:checker/strings.dart'; +import 'package:checker/base/base_state.dart'; + +class CurrenciesScreen extends StatefulWidget { + @override State createState() => new _CurrenciesState(); +} + +class _CurrenciesState extends SettingsBaseState { + + @override + List getOptions() { + + String ruble = StringsLocalization.ruble(); + String dollar = StringsLocalization.dollar(); + String hryvna = StringsLocalization.hryvna(); + + return [ruble, dollar, hryvna]; + } + + @override + String getTitle() { + return StringsLocalization.settings(); + } +} \ No newline at end of file diff --git a/lib/screens/faq.dart b/lib/screens/faq.dart index b6457b6..9b3c78c 100644 --- a/lib/screens/faq.dart +++ b/lib/screens/faq.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:checker/base_state.dart'; +import 'package:checker/base/base_state.dart'; import 'package:checker/consts.dart'; import 'package:checker/common.dart'; diff --git a/lib/screens/finish_registration.dart b/lib/screens/finish_registration.dart index 5956f37..9a65dab 100644 --- a/lib/screens/finish_registration.dart +++ b/lib/screens/finish_registration.dart @@ -5,7 +5,7 @@ import 'dart:convert'; // Пакет для обработки json с отве import 'package:checker/common.dart'; import 'package:checker/consts.dart'; import 'package:checker/network.dart'; -import 'package:checker/base_state.dart'; +import 'package:checker/base/base_state.dart'; import 'package:checker/strings.dart'; class FinishRegistrationScreen extends StatefulWidget { diff --git a/lib/screens/languages.dart b/lib/screens/languages.dart new file mode 100644 index 0000000..1ec61b6 --- /dev/null +++ b/lib/screens/languages.dart @@ -0,0 +1,21 @@ +import 'package:checker/base/settings_base_state.dart'; +import 'package:flutter/material.dart'; +import 'package:checker/consts.dart'; +import 'package:checker/strings.dart'; + +class LanguagesScreen extends StatefulWidget { + @override State createState() => new _LanguagesState(); +} + +class _LanguagesState extends SettingsBaseState { + + @override + List getOptions() { + return languages; + } + + @override + String getTitle() { + return StringsLocalization.locale(); + } +} \ No newline at end of file diff --git a/lib/screens/purchase.dart b/lib/screens/purchase.dart index 1022563..d465493 100644 --- a/lib/screens/purchase.dart +++ b/lib/screens/purchase.dart @@ -8,7 +8,7 @@ import 'package:checker/strings.dart'; import 'package:checker/common.dart'; import 'package:checker/consts.dart'; import 'package:checker/network.dart'; -import 'package:checker/base_state.dart'; +import 'package:checker/base/base_state.dart'; import 'package:checker/screens/purchase_success.dart'; /// Экран проведения покупки. diff --git a/lib/screens/purchase_success.dart b/lib/screens/purchase_success.dart index 40ea706..0365e5b 100644 --- a/lib/screens/purchase_success.dart +++ b/lib/screens/purchase_success.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:checker/common.dart'; import 'package:checker/consts.dart'; import 'package:checker/strings.dart'; -import 'package:checker/base_state.dart'; +import 'package:checker/base/base_state.dart'; /// Экран проведения покупки. class PurchaseSuccessScreen extends StatefulWidget { diff --git a/lib/screens/registration.dart b/lib/screens/registration.dart index 0f19ff6..3d5bbd3 100644 --- a/lib/screens/registration.dart +++ b/lib/screens/registration.dart @@ -5,7 +5,7 @@ import 'dart:convert'; // Пакет для обработки json с отве import 'package:checker/common.dart'; import 'package:checker/consts.dart'; import 'package:checker/network.dart'; -import 'package:checker/base_state.dart'; +import 'package:checker/base/base_state.dart'; import 'package:checker/strings.dart'; /// Экран регистрации магазина и кассы. diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index edc01f5..36dc2d8 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -1,15 +1,10 @@ +import 'package:checker/screens/currencies.dart'; +import 'package:checker/screens/languages.dart'; import 'package:flutter/material.dart'; -import 'package:http/http.dart'; -import 'dart:convert'; -import 'dart:async'; import 'package:checker/common.dart'; -import 'package:checker/network.dart'; import 'package:checker/consts.dart'; -import 'package:checker/db.dart'; import 'package:checker/strings.dart'; -import 'package:checker/base_state.dart'; -import 'package:checker/screens/registration.dart'; -import 'package:checker/screens/finish_registration.dart'; +import 'package:checker/base/base_state.dart'; class SettingsScreen extends StatefulWidget { @override State createState() => new _SettingsState(); @@ -63,18 +58,23 @@ class _SettingsState extends BaseState { Widget getSettingsItem(MenuItem item) { return new Container( - margin: const EdgeInsets.all(16.0), - child: new Row(children: [ - new Expanded(child: new Text(item.title)), - new Text(item.selectedValue), - getArrow()]) - ); + height: 56.0, + child: (new FlatButton(onPressed: () => onPressed(menuItems.indexOf(item)), + child: new Row(children: [ + new Expanded(child: new Container(child: new Text(item.title))), + new Text(item.selectedValue), + getArrow()])))); + } + + void onPressed(int position) { + switch (position) { + case 0 : return pushRoute(context, new LanguagesScreen()); + case 1 : return pushRoute(context, new CurrenciesScreen()); + } } Widget getArrow() { - return new Image.asset(settings_arrow_png, - width: 28.0, - height: 28.0); + return new Image.asset(settings_arrow_png); } @override diff --git a/lib/screens/splash.dart b/lib/screens/splash.dart index 2109f9a..d116cdd 100644 --- a/lib/screens/splash.dart +++ b/lib/screens/splash.dart @@ -9,7 +9,7 @@ import 'package:checker/network.dart'; import 'package:checker/consts.dart'; import 'package:checker/resources.dart'; import 'package:checker/db.dart'; -import 'package:checker/base_state.dart'; +import 'package:checker/base/base_state.dart'; import 'package:checker/screens/registration.dart'; import 'package:checker/screens/finish_registration.dart'; @@ -27,6 +27,7 @@ class _SplashScreenState extends BaseState { helper.getSettings().then((info) { if (info == null) { platform.invokeMethod('getLocale').then((locale) { + Intl.defaultLocale = locale; platform.invokeMethod('getCurrency').then((currency) { helper.createAppInfo(locale, currency).then((_) { showNext(); diff --git a/lib/strings.dart b/lib/strings.dart index c8fd75f..f4a5dc5 100644 --- a/lib/strings.dart +++ b/lib/strings.dart @@ -40,16 +40,11 @@ class StringsLocalization { static String buyer() => Intl.message('buyer', name: 'buyer', locale: Intl.defaultLocale); static String idNotFound() => Intl.message('ID_not_found', name: 'ID_not_found', locale: Intl.defaultLocale); static String settings() => Intl.message('settings', name: 'settings', locale: Intl.defaultLocale); - static String help() => Intl.message('help ', name: 'help ', locale: Intl.defaultLocale); + static String help() => Intl.message('help', name: 'help', locale: Intl.defaultLocale); static String logout() => Intl.message('logout', name: 'logout', locale: Intl.defaultLocale); static String currency() => Intl.message('currency', name: 'currency', locale: Intl.defaultLocale); static String locale() => Intl.message('locale', name: 'locale', locale: Intl.defaultLocale); - // Языки - static String russian() => Intl.message('russian', name: 'russian', locale: Intl.defaultLocale); - static String english() => Intl.message('english', name: 'english', locale: Intl.defaultLocale); - static String ukrainian() => Intl.message('ukrainian', name: 'ukrainian', locale: Intl.defaultLocale); - // Валюты static String ruble() => Intl.message('rubles', name: 'rubles', locale: Intl.defaultLocale); static String dollar() => Intl.message('dollars', name: 'dollars', locale: Intl.defaultLocale); diff --git a/pubspec.yaml b/pubspec.yaml index 6a5929c..0411abd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -35,6 +35,7 @@ flutter: - assets/settings.png - assets/settings_arrow.png - assets/help.png + - assets/check.png - assets/logout.png - assets/activate_token_message_background.png - assets/active_token_message_background.png From e492a3a146014fdd372718f5836013f2cf56063c Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Mon, 11 Sep 2017 15:18:01 +0300 Subject: [PATCH 07/24] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=B2=D0=B5=D1=80=D1=81=D1=82=D0=BA=D1=83=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=B5=D0=BB=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/settings_arrow.png | Bin 2043 -> 1882 bytes lib/screens/settings.dart | 12 ++++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/assets/settings_arrow.png b/assets/settings_arrow.png index 7b3efe87e170346db67d807363d0bdcf5c2f640d..a68e66cd77e45d5a5ead2c4c2c25fa88ed9119d1 100644 GIT binary patch literal 1882 zcmc(g`#%%rt&oGVTz52kb({{wSWP^#E!IzfN3$~%Z1&J) zIcGl8WOa*>zwUp?w5<942Aw6g&bcked2w#j5eZ*)oNax9f&cU~vO zHKSA!QrtN=EA3eCTH_`C%zN?qCye$-1h!x5dJF;D_o09in9(3vUf7ERBt6KC{7=aL zvT(w}Po_=z<7utCtVPGlUQNScxSCO7-^UdsRLBCdmsX)(pRot^b}50C8yhd&3*^?I z1Zuk>zEkQQaXPY&6?>IJSk+_La>~pz+ZJHLjiYOnw_&J7uD{^u19Q#O@L$w$zYhia znQ=LoiH_}4(E%ADHF;R6RmWoT%R1#;F}cJtvkk33p}S<3R6nle{#@7p<0w@4N<*dz zUeF5O4S<+PNxoS@RererKF=6xQ!NZ={FG)m1{G>)7p+sWfktyg<*?2#PyRmG=>V{% z{g8Sn<9%TIE%xJ(O9{piL})j>!K!AN@;6BZi1PiGqyMT^X56HW;bVB)A@588<7{yI zW6r9w%}6A`>h$*ZX12GtulosAKPaw-3A1F|N{hk~~+x0-x%Jkshu~_gmd)y7=BA@jB%0AE+QTe*p zBS#&H1g)vZwPi36IGM#y?^mVTNoMC|7)WkZg}>lO_vel553lk0b`2*4*FRl3r+YJ@ z91J=-SNfW55J{fhu1)iMheggX9P04n4jry{>b8n|VGq3nT;h|*AsEDjEs{BIQ zFF*dU$|?YS%4TpLCLuw!Lk6}kzMK#_8dn=FRtr-DA;H(K$$PF=f71pfF&&7I7$ zk!uA$j=nb=-!woQaX^7im2r3cx(eu@vB-UOu@Dve#wv8M`osf3@)?Y%Q~~3OAYssI z?VV9}{{G9sKj_-6N;Lrx))T)!r#B87F@4v3L|GbRW=Wogi6Cmaw_5o#b=1_?-6;Ig z)w_9YiM33ANe%Z@oC`BRLxfK`Lr;gk-|D|nT*mE^Kt#>W2Z&WsL%%`YM4?>oXmxdU zr-ekhDl`L$Yq{_`ZcZD>vVy03Ws4{?z5sUG!y`yCPrbjhXx#^tdqoOdif9>NP<2cU z?V{P69y=>I=SKge*gthGN)JLvJCmL&LDvq56?4Hp={(OcANB?9ix7r@cH`_66S|bs zFBA%&sp%YDpGR=C8(DA+XVScN`q2Irz1VhyQSF0}Au^lWbqR@b6}z%ntcu3?%wT!= zmz#nW%07=T-_2DT>~VEObcwGS9|$K)TilvPMOotRbaWJ2Xv`;S6)H;GT&p%MQ(M&) z8l)@ysyLoG8Yswu>X@Q+45Yld?v2HnwTgQ+2ijix|D{!*I}57hEs7u;D%t7HtII8E z9ZxJ*lB1P|3M9?SNXnVSYF@}t=v6Md-9UKGk*+!8IAE-|#Q-9EW@E^&TF5TPd%L2Q>w!xJiYnFg**GELNuy-^0n(?=y$gU0zqkdo4%_ z(|pt23-(L}WwD|&spmJjmuZ27(7UYsoOU0Q%a@Q3_h+~p*^4LT&L@WlpA6Mk!)<% zc}Ly^F6oaS0r^IRv_#b6ad6(+OUI9XhmvlhJ}-fhW|fLh74$@d@>;KDrbSy$hU(bc zT}lu@xI38;RN!q#-b^J0nK^lFz!gNsuj79n_TWEg4MPCJGe=0_#yTzBakFR(2Aejh lzy)paN2o-)^Z$#9O>`y7i~p8ujND=-Ah>$sOaDVk{s)57P6_}3 literal 2043 zcmcIl`#;nBAAf(gVa9A>=|~Ytrna4A8HQU3nq)ta zT-k^tQcm6MwaJykV^fjj_B%_SS2RiPvMugEet8Qen8<}}4uATBIHsP@S?CxUIwtqT$4KB~M{M{BFjV4z4j>)nU0m^i5I~F~ zVNT$AK;#dJC!FN4Al*o08B+*gfFqZFjfkTGMj4PU=EIPn1IO4Y^a2p?39O^(Pt^Zl z;)xSj{GLHCxY+Ni|1M+A@7zik=(%{F@ia+J8}@j+NIK&c6w!<)os}TKHE#4nY;!Ci z?bv&1ITz%=d+osffyp*PSuFvrh1p`Fe8pF2#FxAgGkyqr+}>2*9Pbf->VZ8x{E>mh z{+$m4Kqg^EyH}N(=5s$4mCm&c988fDSQy_`rfEY5!~Df}Fe_TTlbeZYAiM&Wf)J#x znk<_jJLUf(EdPG|npb=*e(ND{-F`=V@K@Tz{f$;xvJvDS{j_l62%MG8);t8N_5Kar zI10}Gc;R}_9r#C2!0RzpDmIoWo1@;<;_WbTO^}NJyeEYy1)gyB<7iCXg4XvLBnPb)%Ra`u4;y% zDaJQ6w6$u)LJh{F>$|I04cWIml9cgb!I_mnP;D;R;oR�$De9?1=C#WE2(`!^z;L zcf9|nHT+HmZjf25H!~#X<6Sn-Qy88pBl@4At!@@ zOqYwZo#PdCCQiVS6Q2Ul|8|byqj(qos6Xutvlg(B%PC9N*foEsPE*W++?4tZ*;ghm zy)g+zZ?9pyrf1#RY*EdwPnp?V%;B;VY>_(pP;m`Yd(df>%GNf}QmIbOkn2Eq#4f2X%{0deCFyxZsM5)lWe4wUD3-=o}u&UJx_R{wC zkOfIeea=mE>(ARBXNruz54;;0Dd}E(W#STN4;L_JI)aY{AxHHJ`X3LXY<|(3{`sCG z>y9NbZ%v8S+9E?RmRLOrrI*{Io%h73F~t}sTjPD8{x@0VTqLBA z-1{Yab5?|mZYoE z!Ggxuqe=JVfYE6r8w;aFy*t)h1sGS+6KHFIbd5IRZUrTec0Hpb|G#1H**If7zi7ly Ree { Widget getScreenContent() { return menuItems == null ? getBackground() - : new ListView(children: getSettings()); + : new Container( + margin: new EdgeInsets.only(top: 16.0), + child: new ListView(children: getSettings())); } @override @@ -59,10 +61,11 @@ class _SettingsState extends BaseState { Widget getSettingsItem(MenuItem item) { return new Container( height: 56.0, + padding: new EdgeInsets.only(left: 8.0), child: (new FlatButton(onPressed: () => onPressed(menuItems.indexOf(item)), child: new Row(children: [ - new Expanded(child: new Container(child: new Text(item.title))), - new Text(item.selectedValue), + new Expanded(child: new Text(item.title, style: new TextStyle(fontWeight: FontWeight.w600, color: faqGrey, fontSize: 14.0))), + new Text(item.selectedValue, style: new TextStyle(fontWeight: FontWeight.w400, color: faqGrey, fontSize: 14.0)), getArrow()])))); } @@ -74,7 +77,8 @@ class _SettingsState extends BaseState { } Widget getArrow() { - return new Image.asset(settings_arrow_png); + return new Container(margin: new EdgeInsets.only(left: 8.0), + child: new Image.asset(settings_arrow_png, height: 42.0)); } @override From bc092ca8f9f05b1b416bf1e875eaec38159f25b8 Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Mon, 11 Sep 2017 16:43:13 +0300 Subject: [PATCH 08/24] =?UTF-8?q?=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2=D0=B0=D0=BB=D1=8E=D1=82,=20?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B0=D0=BB=D0=B8=D1=81=D1=8C=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF=D0=BE=20ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/base/base_state.dart | 1 - lib/base/settings_base_state.dart | 25 +++++++++++++++---- lib/db.dart | 10 ++++++-- lib/screens/currencies.dart | 19 +++++++++++++-- lib/screens/languages.dart | 16 +++++++++++++ lib/screens/purchase.dart | 40 ++++++++++++++++--------------- 6 files changed, 82 insertions(+), 29 deletions(-) diff --git a/lib/base/base_state.dart b/lib/base/base_state.dart index 13b854a..7e60689 100644 --- a/lib/base/base_state.dart +++ b/lib/base/base_state.dart @@ -41,7 +41,6 @@ abstract class BaseState extends State { } }); } - return getMainWidget(); } diff --git a/lib/base/settings_base_state.dart b/lib/base/settings_base_state.dart index c196fdb..bb857e2 100644 --- a/lib/base/settings_base_state.dart +++ b/lib/base/settings_base_state.dart @@ -5,9 +5,15 @@ import 'package:flutter/material.dart'; abstract class SettingsBaseState extends BaseState { + int selectedItem; + @override Widget getScreenContent() { + print('getScreenContent: $selectedItem'); + getSelectedValue(); + + List widgets = new List(); for (String option in getOptions()) { @@ -19,6 +25,10 @@ abstract class SettingsBaseState extends BaseState List getOptions(); + void saveOption(); + + void getSelectedValue(); + @override List getMenuButtons() { return null; @@ -27,16 +37,21 @@ abstract class SettingsBaseState extends BaseState Widget getItem(String option) { return new Container( height: 56.0, - child: (new FlatButton(onPressed: null, + child: (new FlatButton(onPressed: () { + saveOption(); + setState(() { + selectedItem = getOptions().indexOf(option); + }); + }, child: new Row(children: [ new Expanded(child: new Text(option)), - getCheckMark()])))); + getCheckMark(getOptions().indexOf(option))])))); } - Widget getCheckMark() { - return new Image.asset(check_png, + Widget getCheckMark(int index) { + return index == selectedItem ? new Image.asset(check_png, width: 28.0, - height: 28.0); + height: 28.0) : new Image.asset(check_png, color: new Color(0xffffff)); } @override diff --git a/lib/db.dart b/lib/db.dart index 9dfe716..244ce35 100644 --- a/lib/db.dart +++ b/lib/db.dart @@ -114,9 +114,15 @@ class SqliteHelper { return locale; } - Future getCurrency() async { + Future getCurrency() async { Map settings = await selectAll(tableSettings); - String currency = settings != null ? settings[columnCurrency] : null; + int currency = settings != null ? settings[columnCurrency] : null; + print('currency: {$currency}'); + return currency; + } + + Future saveCurrency(int currency) async { + db.update(tableSettings, {columnCurrency: currency}); print('currency: {$currency}'); return currency; } diff --git a/lib/screens/currencies.dart b/lib/screens/currencies.dart index 9280650..737a54f 100644 --- a/lib/screens/currencies.dart +++ b/lib/screens/currencies.dart @@ -1,8 +1,7 @@ import 'package:checker/base/settings_base_state.dart'; import 'package:flutter/material.dart'; -import 'package:checker/consts.dart'; import 'package:checker/strings.dart'; -import 'package:checker/base/base_state.dart'; +import 'package:checker/common.dart'; class CurrenciesScreen extends StatefulWidget { @override State createState() => new _CurrenciesState(); @@ -10,6 +9,8 @@ class CurrenciesScreen extends StatefulWidget { class _CurrenciesState extends SettingsBaseState { + List currencies = const [643, 840, 980]; + @override List getOptions() { @@ -20,8 +21,22 @@ class _CurrenciesState extends SettingsBaseState { return [ruble, dollar, hryvna]; } + @override + void getSelectedValue() { + helper.getCurrency().then((currency) { + setState(() { + selectedItem = currencies.indexOf(currency); + }); + }); + } + @override String getTitle() { return StringsLocalization.settings(); } + + @override + saveOption() async { + await helper.saveCurrency(currencies[selectedItem]); + } } \ No newline at end of file diff --git a/lib/screens/languages.dart b/lib/screens/languages.dart index 1ec61b6..94eb3b4 100644 --- a/lib/screens/languages.dart +++ b/lib/screens/languages.dart @@ -2,6 +2,7 @@ import 'package:checker/base/settings_base_state.dart'; import 'package:flutter/material.dart'; import 'package:checker/consts.dart'; import 'package:checker/strings.dart'; +import 'package:checker/common.dart'; class LanguagesScreen extends StatefulWidget { @override State createState() => new _LanguagesState(); @@ -18,4 +19,19 @@ class _LanguagesState extends SettingsBaseState { String getTitle() { return StringsLocalization.locale(); } + + @override + void saveOption() { +// helper.sa(languages[selectedItem]); + } + + @override + void getSelectedValue() { + helper.getLocale().then((locale) { + setState(() { + print(selectedItem); + selectedItem = getOptions().indexOf(getLocaleTitle(locale)); + }); + }); + } } \ No newline at end of file diff --git a/lib/screens/purchase.dart b/lib/screens/purchase.dart index d465493..e49a70d 100644 --- a/lib/screens/purchase.dart +++ b/lib/screens/purchase.dart @@ -203,29 +203,31 @@ class PurchaseScreenState extends BaseState { String url = user['purchases_url']; - var body = { - 'doc_id': result, - 'curr_iso_code': '643', - 'commit': 'true', - 'sum_total': sumTotal - }; + helper.getCurrency().then((currency) { + var body = { + 'doc_id': result, + 'curr_iso_code': currency.toString(), + 'commit': 'true', + 'sum_total': sumTotal + }; - var headers = { - 'DM-Authorization': 'dmapptoken $appToken', - 'Authorization': 'dmtoken ${token}' - }; + var headers = { + 'DM-Authorization': 'dmapptoken $appToken', + 'Authorization': 'dmtoken ${token}' + }; - httpClient.post(url, body: body, headers: headers).then((response) { + httpClient.post(url, body: body, headers: headers).then((response) { - print(response.body); - helper.close().then((_) { - Navigator.of(context).pop(); - pushRouteReplacement(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name'])); + print(response.body); + helper.close().then((_) { + Navigator.of(context).pop(); + pushRouteReplacement(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name'])); + }); + + }).catchError((error) { + purchaseInProgress = false; + print(error.toString()); }); - - }).catchError((error) { - purchaseInProgress = false; - print(error.toString()); }); }); } From 9e4cbe200df2250be8375d198f9e820018f75e94 Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Mon, 11 Sep 2017 19:15:08 +0300 Subject: [PATCH 09/24] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=B0=D0=BB=D1=8E?= =?UTF-8?q?=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/src/main/AndroidManifest.xml | 2 +- lib/base/base_state.dart | 2 +- lib/base/settings_base_state.dart | 6 +++++ lib/screens/currencies.dart | 12 ++++++++- lib/screens/languages.dart | 13 ++++++++-- lib/screens/settings.dart | 31 ++++++++++++++++-------- lib/screens/splash.dart | 8 +++--- 7 files changed, 56 insertions(+), 18 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index cda80be..c3da8b2 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="1.0.2"> extends State { void onOptionsItemClick(int index) { switch (index) { case 0: { - pushRoute(context, new SettingsScreen()); + pushRoute(context, new SettingsScreen(helper, app)); break; } case 1: { diff --git a/lib/base/settings_base_state.dart b/lib/base/settings_base_state.dart index bb857e2..b4c87c7 100644 --- a/lib/base/settings_base_state.dart +++ b/lib/base/settings_base_state.dart @@ -1,10 +1,16 @@ import 'package:checker/base/base_state.dart'; import 'package:checker/consts.dart'; +import 'package:checker/db.dart'; import 'package:checker/strings.dart'; import 'package:flutter/material.dart'; abstract class SettingsBaseState extends BaseState { + SettingsBaseState(SqliteHelper helper, String app) { + this.helper = helper; + this.app = app; + } + int selectedItem; @override diff --git a/lib/screens/currencies.dart b/lib/screens/currencies.dart index 737a54f..18dcbe7 100644 --- a/lib/screens/currencies.dart +++ b/lib/screens/currencies.dart @@ -1,16 +1,26 @@ import 'package:checker/base/settings_base_state.dart'; +import 'package:checker/db.dart'; import 'package:flutter/material.dart'; import 'package:checker/strings.dart'; import 'package:checker/common.dart'; class CurrenciesScreen extends StatefulWidget { - @override State createState() => new _CurrenciesState(); + + final SqliteHelper helper; + final String app; + + CurrenciesScreen(this.helper, this.app); + + @override State createState() => new _CurrenciesState(helper, app); } class _CurrenciesState extends SettingsBaseState { List currencies = const [643, 840, 980]; + _CurrenciesState(SqliteHelper helper, String app) : super(helper, app); + + @override List getOptions() { diff --git a/lib/screens/languages.dart b/lib/screens/languages.dart index 94eb3b4..ea0dadc 100644 --- a/lib/screens/languages.dart +++ b/lib/screens/languages.dart @@ -1,14 +1,23 @@ import 'package:checker/base/settings_base_state.dart'; +import 'package:checker/db.dart'; import 'package:flutter/material.dart'; import 'package:checker/consts.dart'; import 'package:checker/strings.dart'; import 'package:checker/common.dart'; class LanguagesScreen extends StatefulWidget { - @override State createState() => new _LanguagesState(); + + final SqliteHelper helper; + final String app; + + LanguagesScreen(this.helper, this.app); + @override State createState() => new LanguagesState(helper, app); } -class _LanguagesState extends SettingsBaseState { +class LanguagesState extends SettingsBaseState { + + LanguagesState(SqliteHelper helper, String app) : super(helper, app); + @override List getOptions() { diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index 7b39ebb..2aef273 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -1,3 +1,4 @@ +import 'package:checker/db.dart'; import 'package:checker/screens/currencies.dart'; import 'package:checker/screens/languages.dart'; import 'package:flutter/material.dart'; @@ -7,7 +8,13 @@ import 'package:checker/strings.dart'; import 'package:checker/base/base_state.dart'; class SettingsScreen extends StatefulWidget { - @override State createState() => new _SettingsState(); + + final SqliteHelper helper; + final String app; + + SettingsScreen(this.helper, this.app); + + @override State createState() => new SettingsState(helper, app); } class MenuItem { @@ -18,22 +25,26 @@ class MenuItem { MenuItem(this.title, this.selectedValue); } -class _SettingsState extends BaseState { +class SettingsState extends BaseState { List menuItems; - @override onStart() { - if (menuItems == null) { + SettingsState(SqliteHelper helper, String app) { + this.helper = helper; + this.app = app; + } + + @override Widget build(BuildContext ctx) { helper.getSettings().then((info) { setState(() { print("load settings"); menuItems = [ - new MenuItem(StringsLocalization.locale(), getLocaleTitle(info["locale"])), +// new MenuItem(StringsLocalization.locale(), getLocaleTitle(info["locale"])), new MenuItem(StringsLocalization.currency(), getCurrencyTitle(info["currency"])) ]; }); }); - } + return getMainWidget(); } @override @@ -41,8 +52,8 @@ class _SettingsState extends BaseState { return menuItems == null ? getBackground() : new Container( - margin: new EdgeInsets.only(top: 16.0), - child: new ListView(children: getSettings())); + margin: new EdgeInsets.only(top: 16.0), + child: new ListView(children: getSettings())); } @override @@ -71,8 +82,8 @@ class _SettingsState extends BaseState { void onPressed(int position) { switch (position) { - case 0 : return pushRoute(context, new LanguagesScreen()); - case 1 : return pushRoute(context, new CurrenciesScreen()); +// case 0 : return pushRoute(context, new LanguagesScreen()); + case 0 : return pushRoute(context, new CurrenciesScreen(helper, app)); } } diff --git a/lib/screens/splash.dart b/lib/screens/splash.dart index d116cdd..704eb6a 100644 --- a/lib/screens/splash.dart +++ b/lib/screens/splash.dart @@ -28,9 +28,11 @@ class _SplashScreenState extends BaseState { if (info == null) { platform.invokeMethod('getLocale').then((locale) { Intl.defaultLocale = locale; - platform.invokeMethod('getCurrency').then((currency) { - helper.createAppInfo(locale, currency).then((_) { - showNext(); + StringsLocalization.load(locale).then((l) { + platform.invokeMethod('getCurrency').then((currency) { + helper.createAppInfo(locale, currency).then((_) { + showNext(); + }); }); }); }); From e8788f72a312c46bf81db612caf00e1d3c3bb441 Mon Sep 17 00:00:00 2001 From: kifio Date: Tue, 12 Sep 2017 00:08:13 +0300 Subject: [PATCH 10/24] =?UTF-8?q?=D0=AD=D0=BA=D1=80=D0=B0=D0=BD=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B2=D0=B0=D0=BB=D1=8E=D1=82=D1=8B=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D1=80=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D1=81?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B2=D0=BE=D0=B3=D0=BE=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D0=B0,=20=D1=81=D0=BE=D0=B5=D0=B4=D0=B8=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81=20=D0=B1=D0=B0=D0=B7=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BD=D0=B5=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D1=80=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=82=D0=B5=D1=85=20=D1=8D=D0=BA=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B0=D1=85,=20=D0=BD=D0=B0=20=D0=BA=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D1=8B=D1=85=20=D1=8D=D1=82=D0=BE=20=D0=BD=D0=B5=20=D1=82?= =?UTF-8?q?=D1=80=D0=B5=D0=B1=D1=83=D0=B5=D1=82=D1=81=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/base/base_screen.dart | 13 ++++++++ lib/common.dart | 5 +-- lib/main.dart | 17 +++------- lib/screens/currencies.dart | 11 +++---- lib/screens/purchase.dart | 15 ++++++--- lib/screens/registration.dart | 6 +++- lib/screens/settings.dart | 52 +++++++++++++++--------------- lib/screens/splash.dart | 60 +++++++++++++++++------------------ 8 files changed, 98 insertions(+), 81 deletions(-) create mode 100644 lib/base/base_screen.dart diff --git a/lib/base/base_screen.dart b/lib/base/base_screen.dart new file mode 100644 index 0000000..4ff6667 --- /dev/null +++ b/lib/base/base_screen.dart @@ -0,0 +1,13 @@ +import 'package:checker/db.dart'; +import 'package:flutter/material.dart'; + +abstract class BaseScreen extends StatefulWidget { + + final SqliteHelper helper; + final String app; + + BaseScreen(this.helper, this.app); + + @override + State createState(); +} \ No newline at end of file diff --git a/lib/common.dart b/lib/common.dart index d1d238b..5c4d8dd 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -1,6 +1,7 @@ import 'package:checker/screens/faq.dart'; import 'package:checker/screens/purchase.dart'; import 'package:checker/screens/registration.dart'; +import 'package:checker/screens/splash.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -43,7 +44,7 @@ logout(BuildContext context) async { platform.invokeMethod('removeKeys').then((result) { Navigator.of(context).pop(); Navigator.of(context).pop(); - pushRouteReplacement(context, new RegistrationScreen()); // Запускаем регистрацию + pushRouteReplacement(context, new SplashScreen()); // Запускаем регистрацию }); }).catchError((error) { print(error.toString()); @@ -66,7 +67,7 @@ forceLogout(String token , BuildContext context) async { helper.clear().then((_) { helper.close().then((_) { Navigator.of(context).pop(); - pushRouteReplacement(context, new RegistrationScreen()); // Запускаем регистрацию + pushRouteReplacement(context, new SplashScreen()); }); }); }); diff --git a/lib/main.dart b/lib/main.dart index 8b6e94d..8c81152 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,25 +1,16 @@ import 'package:flutter/material.dart'; import 'package:checker/screens/splash.dart'; import 'consts.dart'; -import 'strings.dart'; -import 'common.dart'; -import 'dart:async'; /// Точка входа в приложение. void main() { runApp(new Checker()); } -class Checker extends StatefulWidget { - @override CheckerState createState() => new CheckerState(); -} - -class CheckerState extends State { - +class Checker extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( - title: appName, - home: new SplashScreen()); + title: appName, + home: new SplashScreen()); } - -} +} \ No newline at end of file diff --git a/lib/screens/currencies.dart b/lib/screens/currencies.dart index 18dcbe7..bbd5499 100644 --- a/lib/screens/currencies.dart +++ b/lib/screens/currencies.dart @@ -1,15 +1,14 @@ +import 'dart:async'; + +import 'package:checker/base/base_screen.dart'; import 'package:checker/base/settings_base_state.dart'; import 'package:checker/db.dart'; import 'package:flutter/material.dart'; import 'package:checker/strings.dart'; -import 'package:checker/common.dart'; -class CurrenciesScreen extends StatefulWidget { +class CurrenciesScreen extends BaseScreen { - final SqliteHelper helper; - final String app; - - CurrenciesScreen(this.helper, this.app); + CurrenciesScreen(helper, app) : super(helper, app); @override State createState() => new _CurrenciesState(helper, app); } diff --git a/lib/screens/purchase.dart b/lib/screens/purchase.dart index e49a70d..82f61bf 100644 --- a/lib/screens/purchase.dart +++ b/lib/screens/purchase.dart @@ -219,10 +219,17 @@ class PurchaseScreenState extends BaseState { httpClient.post(url, body: body, headers: headers).then((response) { print(response.body); - helper.close().then((_) { - Navigator.of(context).pop(); - pushRouteReplacement(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name'])); - }); + Map parsedMap = JSON.decode(response.body); + + if (parsedMap.containsKey('errors')) { + List errors = parsedMap['errors']; + // TODO: ПОказывать сообщение с ошибкой! + } else { + helper.close().then((_) { + Navigator.of(context).pop(); + pushRouteReplacement(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name'])); + }); + } }).catchError((error) { purchaseInProgress = false; diff --git a/lib/screens/registration.dart b/lib/screens/registration.dart index 3d5bbd3..ea42ffa 100644 --- a/lib/screens/registration.dart +++ b/lib/screens/registration.dart @@ -1,3 +1,4 @@ +import 'package:checker/base/base_screen.dart'; import 'package:checker/screens/finish_registration.dart'; import 'package:flutter/material.dart'; import 'dart:convert'; // Пакет для обработки json с ответом от сервера. @@ -9,7 +10,10 @@ import 'package:checker/base/base_state.dart'; import 'package:checker/strings.dart'; /// Экран регистрации магазина и кассы. -class RegistrationScreen extends StatefulWidget { +class RegistrationScreen extends BaseScreen { + + RegistrationScreen(helper, app) : super(helper, app); + @override State createState() => new _RegistrationScreenState(); } diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index 2aef273..8d6211f 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -1,18 +1,15 @@ -import 'package:checker/db.dart'; -import 'package:checker/screens/currencies.dart'; -import 'package:checker/screens/languages.dart'; -import 'package:flutter/material.dart'; +import 'package:checker/base/base_screen.dart'; +import 'package:checker/base/base_state.dart'; import 'package:checker/common.dart'; import 'package:checker/consts.dart'; +import 'package:checker/db.dart'; +import 'package:checker/screens/currencies.dart'; import 'package:checker/strings.dart'; -import 'package:checker/base/base_state.dart'; +import 'package:flutter/material.dart'; -class SettingsScreen extends StatefulWidget { +class SettingsScreen extends BaseScreen { - final SqliteHelper helper; - final String app; - - SettingsScreen(this.helper, this.app); + SettingsScreen(helper, app) : super(helper, app); @override State createState() => new SettingsState(helper, app); } @@ -27,7 +24,7 @@ class MenuItem { class SettingsState extends BaseState { - List menuItems; + List menuItems = [new MenuItem(StringsLocalization.currency(), '')]; SettingsState(SqliteHelper helper, String app) { this.helper = helper; @@ -35,15 +32,15 @@ class SettingsState extends BaseState { } @override Widget build(BuildContext ctx) { - helper.getSettings().then((info) { - setState(() { - print("load settings"); - menuItems = [ -// new MenuItem(StringsLocalization.locale(), getLocaleTitle(info["locale"])), - new MenuItem(StringsLocalization.currency(), getCurrencyTitle(info["currency"])) - ]; - }); - }); + helper.getSettings().then((info) { + if (menuItems != null) { + if (menuItems[0].selectedValue != info['currency'].toString()) { + setState(() { + menuItems[0].selectedValue = info['currency'].toString(); + }); + } + } + }); return getMainWidget(); } @@ -73,16 +70,21 @@ class SettingsState extends BaseState { return new Container( height: 56.0, padding: new EdgeInsets.only(left: 8.0), - child: (new FlatButton(onPressed: () => onPressed(menuItems.indexOf(item)), + child: (new FlatButton( + onPressed: () => onPressed(menuItems.indexOf(item)), child: new Row(children: [ - new Expanded(child: new Text(item.title, style: new TextStyle(fontWeight: FontWeight.w600, color: faqGrey, fontSize: 14.0))), - new Text(item.selectedValue, style: new TextStyle(fontWeight: FontWeight.w400, color: faqGrey, fontSize: 14.0)), - getArrow()])))); + new Expanded(child: new Text(item.title, style: new TextStyle( + fontWeight: FontWeight.w600, + color: faqGrey, + fontSize: 14.0))), + new Text(getCurrencyTitle(int.parse(item.selectedValue)), style: new TextStyle( + fontWeight: FontWeight.w400, color: faqGrey, fontSize: 14.0)), + getArrow() + ])))); } void onPressed(int position) { switch (position) { -// case 0 : return pushRoute(context, new LanguagesScreen()); case 0 : return pushRoute(context, new CurrenciesScreen(helper, app)); } } diff --git a/lib/screens/splash.dart b/lib/screens/splash.dart index 704eb6a..1f3dd3b 100644 --- a/lib/screens/splash.dart +++ b/lib/screens/splash.dart @@ -1,17 +1,18 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:checker/base/base_state.dart'; +import 'package:checker/common.dart'; +import 'package:checker/consts.dart'; +import 'package:checker/db.dart'; +import 'package:checker/network.dart'; +import 'package:checker/resources.dart'; +import 'package:checker/screens/finish_registration.dart'; +import 'package:checker/screens/registration.dart'; import 'package:checker/strings.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; import 'package:intl/intl.dart'; -import 'dart:convert'; -import 'dart:async'; -import 'package:checker/common.dart'; -import 'package:checker/network.dart'; -import 'package:checker/consts.dart'; -import 'package:checker/resources.dart'; -import 'package:checker/db.dart'; -import 'package:checker/base/base_state.dart'; -import 'package:checker/screens/registration.dart'; -import 'package:checker/screens/finish_registration.dart'; class SplashScreen extends StatefulWidget { @override State createState() => new _SplashScreenState(); @@ -26,10 +27,9 @@ class _SplashScreenState extends BaseState { @override void onStart() { helper.getSettings().then((info) { if (info == null) { - platform.invokeMethod('getLocale').then((locale) { - Intl.defaultLocale = locale; - StringsLocalization.load(locale).then((l) { - platform.invokeMethod('getCurrency').then((currency) { + platform.invokeMethod('getCurrency').then((currency) { + platform.invokeMethod('getLocale').then((locale) { + initLocale(locale, () { helper.createAppInfo(locale, currency).then((_) { showNext(); }); @@ -38,8 +38,7 @@ class _SplashScreenState extends BaseState { }); } else { helper.getLocale().then((locale) { - Intl.defaultLocale = locale; - StringsLocalization.load(locale).then((l) { + initLocale(locale, () { showNext(); }); }); @@ -47,6 +46,13 @@ class _SplashScreenState extends BaseState { }); } + void initLocale(String locale, Future onValue()) { + Intl.defaultLocale = locale; + StringsLocalization.load(locale).then((_) { + onValue(); + }); + } + void showNext() { new Future.delayed(const Duration(milliseconds: 1000), () { showNextScreen(); @@ -69,7 +75,8 @@ class _SplashScreenState extends BaseState { bottom: 5.0), child: new Image.asset(powered_by_dinect_splash_png, height: 16.0, - width: 122.0)))]); + width: 122.0))) + ]); } /// Возвращает столбец с логотипом приложения и текстом под ним. @@ -86,19 +93,18 @@ class _SplashScreenState extends BaseState { new Image.asset( splash_text_png, height: 40.0, - width: 240.0)])); + width: 240.0) + ])); } /// Запуск следующего экрана приложения. showNextScreen() async { - String token = await helper.getToken(); // В случае, если в приложении отсутствует токен, // необходимо запустить регистрацию кассы. if (token == null) { - await helper.close(); - pushRouteReplacement(context, new RegistrationScreen()); + pushRouteReplacement(context, new RegistrationScreen(helper, app)); } else { if (await platform.invokeMethod('isOnline')) { checkTokenStatus(token).then((statusResponse) { @@ -122,12 +128,9 @@ class _SplashScreenState extends BaseState { if (code == 404) { helper.clear().then((result) { - helper.close().then((_) { - pushRouteReplacement(context, new RegistrationScreen()); - }); + pushRouteReplacement(context, new RegistrationScreen(helper, app)); }); } else { - Map status = JSON.decode(statusResponse.body); bool active = status['active'] == null ? false : status['active']; @@ -149,7 +152,6 @@ class _SplashScreenState extends BaseState { /// Если вернулся код 200, значит токен был ранее удален и только что снова создался. /// Нужно удалить его и направить пользователя на экран регистрации. _createToken(SqliteHelper helper) async { - String merchantID = await helper.getMerchantID(); String posID = await helper.getPosID(); @@ -165,13 +167,11 @@ class _SplashScreenState extends BaseState { /// Очищаем бд, делаем запрос на удаление токена. void clearToken(Response response, SqliteHelper helper) { - helper.clear().then((_) { Map parsedMap = JSON.decode(response.body); deleteToken(parsedMap['token']).then((_) { - helper.close(); - Navigator.of(context).pop(); // Убираем текущий route - pushRouteReplacement(context, new RegistrationScreen()); // Запускаем регистрацию + Navigator.of(context).pop(); + pushRouteReplacement(context, new RegistrationScreen(helper, app)); }).catchError((error) { helper.close(); print(error.toString()); From d23ca1c9916dd12ff62afa91692f69b9a8aa87b4 Mon Sep 17 00:00:00 2001 From: kifio Date: Tue, 12 Sep 2017 09:38:17 +0300 Subject: [PATCH 11/24] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BE=D1=82=D0=B7=D1=8B=D0=B2=D1=87=D0=B8=D0=B2?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BE=D0=BA?= =?UTF-8?q?=20=D0=B2=D0=B0=D0=BB=D1=8E=D1=82=20=D0=BD=D0=B0=20=D1=8D=D0=BA?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B5=20=D0=B2=D0=B0=D0=BB=D1=8E=D1=82=D1=8B?= =?UTF-8?q?,=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D0=B9=20=D0=B2=D0=B0?= =?UTF-8?q?=D0=BB=D1=8E=D1=82=D1=8B=20=D0=BD=D0=B0=20=D1=8D=D0=BA=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=B0=D1=85=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D0=B4?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=BA=D1=83=D0=BF=D0=BA?= =?UTF-8?q?=D0=B8=20(=D1=80=D1=83=D0=B1=D0=BB=D1=8C,=20=D1=80=D1=83=D0=B1?= =?UTF-8?q?=D0=BB=D1=8F,=20=D1=80=D1=83=D0=B1=D0=BB=D0=B5=D0=B9)=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=80=D1=83=D1=81=D1=81=D0=BA=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/base/base_state.dart | 18 ------- lib/base/settings_base_state.dart | 4 ++ lib/common.dart | 6 +-- lib/i18n/messages_en.dart | 4 +- lib/i18n/messages_es.dart | 4 +- lib/i18n/messages_ru.dart | 16 ++++-- lib/i18n/messages_ua.dart | 4 +- lib/screens/currencies.dart | 6 +-- lib/screens/faq.dart | 4 ++ lib/screens/finish_registration.dart | 65 +++++++++++++++--------- lib/screens/purchase.dart | 68 +++++++++++++++---------- lib/screens/purchase_success.dart | 55 +++++++++++++++----- lib/screens/registration.dart | 48 +++++++++++------- lib/screens/settings.dart | 14 ++++-- lib/screens/splash.dart | 38 ++++++++++---- lib/strings.dart | 75 +++++++++++++++++++++++++--- 16 files changed, 292 insertions(+), 137 deletions(-) diff --git a/lib/base/base_state.dart b/lib/base/base_state.dart index 45e1a91..f668c8f 100644 --- a/lib/base/base_state.dart +++ b/lib/base/base_state.dart @@ -26,24 +26,6 @@ abstract class BaseState extends State { /// Введенное пользователем значение. String dinCode = ''; - @override Widget build(BuildContext ctx) { - - if (helper == null) { - helper = new SqliteHelper(); - helper.open().then((_) { - if (app == null) { - platform.invokeMethod('getFlavor').then((flavor) { - app = flavor; - setState(() { - onStart(); - }); - }); - } - }); - } - return getMainWidget(); - } - Widget getMainWidget() { return app == null ? getBackground() : new Scaffold(appBar: getAppBar(), body: new Stack(children: [ diff --git a/lib/base/settings_base_state.dart b/lib/base/settings_base_state.dart index b4c87c7..b7906ae 100644 --- a/lib/base/settings_base_state.dart +++ b/lib/base/settings_base_state.dart @@ -13,6 +13,10 @@ abstract class SettingsBaseState extends BaseState int selectedItem; + @override Widget build(BuildContext context) { + return getMainWidget(); + } + @override Widget getScreenContent() { diff --git a/lib/common.dart b/lib/common.dart index 5c4d8dd..379c1cc 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -130,9 +130,9 @@ showYesNoDialog(BuildContext context, String title, String content, VoidCallback getCurrencyTitle(int code) { switch(code) { - case 643: return StringsLocalization.ruble(); - case 840: return StringsLocalization.dollar(); - case 980: return StringsLocalization.hryvna(); + case 643: return StringsLocalization.nominativeRuble(); + case 840: return StringsLocalization.nominativeDollar(); + case 980: return StringsLocalization.nominativeHryvna(); } } diff --git a/lib/i18n/messages_en.dart b/lib/i18n/messages_en.dart index e649e25..b0f0bac 100644 --- a/lib/i18n/messages_en.dart +++ b/lib/i18n/messages_en.dart @@ -44,8 +44,8 @@ class MessageLookup extends MessageLookupByLibrary { "logout" : MessageLookupByLibrary.simpleMessage("Exit"), "currency" : MessageLookupByLibrary.simpleMessage("Currency"), "locale" : MessageLookupByLibrary.simpleMessage("Language"), - "rubles" : MessageLookupByLibrary.simpleMessage("Ruble"), - "dollars" : MessageLookupByLibrary.simpleMessage("Dollar"), + "ruble" : MessageLookupByLibrary.simpleMessage("Ruble"), + "dollar" : MessageLookupByLibrary.simpleMessage("Dollar"), "hryvna" : MessageLookupByLibrary.simpleMessage("Hryvna") }; diff --git a/lib/i18n/messages_es.dart b/lib/i18n/messages_es.dart index 2d2c411..6de7bf2 100644 --- a/lib/i18n/messages_es.dart +++ b/lib/i18n/messages_es.dart @@ -44,8 +44,8 @@ class MessageLookup extends MessageLookupByLibrary { "logout" : MessageLookupByLibrary.simpleMessage("Salir"), "currency" : MessageLookupByLibrary.simpleMessage("La Moneda"), "locale" : MessageLookupByLibrary.simpleMessage("La lengua"), - "rubles" : MessageLookupByLibrary.simpleMessage("Ruble"), - "dollars" : MessageLookupByLibrary.simpleMessage("Dollar"), + "ruble" : MessageLookupByLibrary.simpleMessage("Ruble"), + "dollar" : MessageLookupByLibrary.simpleMessage("Dollar"), "hryvna" : MessageLookupByLibrary.simpleMessage("Hryvna") }; } diff --git a/lib/i18n/messages_ru.dart b/lib/i18n/messages_ru.dart index 0e6ab1f..bac406e 100644 --- a/lib/i18n/messages_ru.dart +++ b/lib/i18n/messages_ru.dart @@ -25,10 +25,10 @@ class MessageLookup extends MessageLookupByLibrary { "carry_purchase" : MessageLookupByLibrary.simpleMessage("Проведение покупки"), "complite_activ" : MessageLookupByLibrary.simpleMessage("Завершить регистрацию"), "complite_purchase" : MessageLookupByLibrary.simpleMessage("Завершить покупку"), - "confirm_purchase" : MessageLookupByLibrary.simpleMessage("Вы подтверждаете покупку на %s рублей"), + "confirm_purchase" : MessageLookupByLibrary.simpleMessage("Вы подтверждаете покупку на %s %s"), "confirmation" : MessageLookupByLibrary.simpleMessage("Подтверждение"), "no" : MessageLookupByLibrary.simpleMessage("Нет"), - "purchase_complite" : MessageLookupByLibrary.simpleMessage("Покупка на сумму %s рублей проведена"), + "purchase_complite" : MessageLookupByLibrary.simpleMessage("Покупка на сумму %s %s проведена"), "registration" : MessageLookupByLibrary.simpleMessage("Регистрация"), "request_sent_wait_activ" : MessageLookupByLibrary.simpleMessage("Запрос на активацию приложения отправлен, дождитесь подтверждения активации администратором"), "reward" : MessageLookupByLibrary.simpleMessage("Вознаграждение"), @@ -44,8 +44,14 @@ class MessageLookup extends MessageLookupByLibrary { "logout" : MessageLookupByLibrary.simpleMessage("Выход"), "currency" : MessageLookupByLibrary.simpleMessage("Валюта"), "locale" : MessageLookupByLibrary.simpleMessage("Язык"), - "rubles" : MessageLookupByLibrary.simpleMessage("Рубль"), - "dollars" : MessageLookupByLibrary.simpleMessage("Доллар"), - "hryvna" : MessageLookupByLibrary.simpleMessage("Гривна") + "nominative_ruble": MessageLookupByLibrary.simpleMessage("Рубль"), + "singular_ruble": MessageLookupByLibrary.simpleMessage("Рубля"), + "plural_ruble": MessageLookupByLibrary.simpleMessage("Рублей"), + "nominative_dollar": MessageLookupByLibrary.simpleMessage("Доллар"), + "singular_dollar": MessageLookupByLibrary.simpleMessage("Доллара"), + "plural_dollar": MessageLookupByLibrary.simpleMessage("Долларов"), + "nominative_hryvna": MessageLookupByLibrary.simpleMessage("Гривна"), + "singular_hryvna": MessageLookupByLibrary.simpleMessage("Гривны"), + "plural_hryvna": MessageLookupByLibrary.simpleMessage("Гривен") }; } diff --git a/lib/i18n/messages_ua.dart b/lib/i18n/messages_ua.dart index 0c50c7f..ad367c1 100644 --- a/lib/i18n/messages_ua.dart +++ b/lib/i18n/messages_ua.dart @@ -44,8 +44,8 @@ class MessageLookup extends MessageLookupByLibrary { "logout" : MessageLookupByLibrary.simpleMessage("Вихід"), "currency" : MessageLookupByLibrary.simpleMessage("Валюта"), "locale" : MessageLookupByLibrary.simpleMessage("Мова"), - "rubles" : MessageLookupByLibrary.simpleMessage("Ruble"), - "dollars" : MessageLookupByLibrary.simpleMessage("Dollar"), + "ruble" : MessageLookupByLibrary.simpleMessage("Ruble"), + "dollar" : MessageLookupByLibrary.simpleMessage("Dollar"), "hryvna" : MessageLookupByLibrary.simpleMessage("Hryvna") }; } diff --git a/lib/screens/currencies.dart b/lib/screens/currencies.dart index bbd5499..e16a5fc 100644 --- a/lib/screens/currencies.dart +++ b/lib/screens/currencies.dart @@ -23,9 +23,9 @@ class _CurrenciesState extends SettingsBaseState { @override List getOptions() { - String ruble = StringsLocalization.ruble(); - String dollar = StringsLocalization.dollar(); - String hryvna = StringsLocalization.hryvna(); + String ruble = StringsLocalization.nominativeRuble(); + String dollar = StringsLocalization.nominativeDollar(); + String hryvna = StringsLocalization.nominativeHryvna(); return [ruble, dollar, hryvna]; } diff --git a/lib/screens/faq.dart b/lib/screens/faq.dart index 9b3c78c..24d1475 100644 --- a/lib/screens/faq.dart +++ b/lib/screens/faq.dart @@ -55,6 +55,10 @@ class FAQScreenState extends BaseState { return null; } + @override Widget build(BuildContext context) { + return getScreenContent(); + } + /// Метод возвращает ListView с блоками faq. @override Widget getScreenContent() { return new WillPopScope(onWillPop: onWillPop, child: new ListView.builder( diff --git a/lib/screens/finish_registration.dart b/lib/screens/finish_registration.dart index 9a65dab..8021d56 100644 --- a/lib/screens/finish_registration.dart +++ b/lib/screens/finish_registration.dart @@ -1,28 +1,41 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'dart:convert'; // Пакет для обработки json с ответом от сервера. +import 'dart:convert'; +import 'package:checker/base/base_screen.dart'; +import 'package:checker/base/base_state.dart'; import 'package:checker/common.dart'; import 'package:checker/consts.dart'; +import 'package:checker/db.dart'; import 'package:checker/network.dart'; -import 'package:checker/base/base_state.dart'; import 'package:checker/strings.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; -class FinishRegistrationScreen extends StatefulWidget { - @override State createState() => new _RegistrationScreenState(); +class FinishRegistrationScreen extends BaseScreen { + + FinishRegistrationScreen(helper, app) : super(helper, app); + + @override State createState() => new RegistrationScreenState(helper, app); } -class _RegistrationScreenState extends BaseState { +class RegistrationScreenState extends BaseState { + + RegistrationScreenState(SqliteHelper helper, String app) { + this.helper = helper; + this.app = app; + } bool _tokenActive = false; - String _merchantID; + String _merchantID = ''; - @override void onStart() { - helper.getMerchantID().then((result) { - setState(() { - _merchantID = result; + @override Widget build(BuildContext context) { + if (_merchantID == '') { + helper.getMerchantID().then((result) { + setState(() { + _merchantID = result; + }); }); - }); + } + return getMainWidget(); } @override String getTitle() { @@ -54,7 +67,6 @@ class _RegistrationScreenState extends BaseState { if (await platform.invokeMethod('isOnline')) { String token = await helper.getToken(); checkTokenStatus(token).then((response) { - print(response.body); Map parsedMap = JSON.decode(response.body); @@ -72,23 +84,29 @@ class _RegistrationScreenState extends BaseState { } @override getTextWidget() { - return new Row(children: [new Text(_merchantID != null ? _merchantID : '', - style: new TextStyle(color: Colors.black, fontSize: 16.0))]); + return new Row( + children: [new Text(_merchantID != null ? _merchantID : '', + style: new TextStyle(color: Colors.black, fontSize: 16.0)) + ]); } /// Метод возвращает контейнер с текстом сообщения и бэкграундом. getMessage() { - return new Container(height: _tokenActive ? 72.0 : 108.0, decoration: _getDecorationForMessageField(), - margin: new EdgeInsets.only(top: 20.0, left: 12.0, right: 12.0), - padding: new EdgeInsets.only(bottom: 22.0, left: 14.0, right: 14.0), - child: new Center(child: getMessageTextWidget())); + return new Container(height: _tokenActive ? 72.0 : 108.0, + decoration: _getDecorationForMessageField(), + margin: new EdgeInsets.only(top: 20.0, left: 12.0, right: 12.0), + padding: new EdgeInsets.only(bottom: 22.0, left: 14.0, right: 14.0), + child: new Center(child: getMessageTextWidget())); } /// Метод возвращает виджет с текстом сообщения, всеми его привязками и стилями. getMessageTextWidget() { return new Text(getMessageString(), textAlign: TextAlign.center, - style: new TextStyle(height: 1.5, fontWeight: FontWeight.bold, fontSize: 14.0, - color: _tokenActive ? tokenActiveTextColor : tokenActivateTextColor)); + style: new TextStyle( + height: 1.5, fontWeight: FontWeight.bold, fontSize: 14.0, + color: _tokenActive + ? tokenActiveTextColor + : tokenActivateTextColor)); } /// Получаем текст сообщения, в зависимости от статуса активации. @@ -101,7 +119,8 @@ class _RegistrationScreenState extends BaseState { /// Фоновое изображение для сообщения. Decoration _getDecorationForMessageField() { return new BoxDecoration(image: new DecorationImage( - image: new ExactAssetImage(_tokenActive ? active_token_bg_png : activate_token_bg_png), + image: new ExactAssetImage( + _tokenActive ? active_token_bg_png : activate_token_bg_png), fit: _tokenActive ? BoxFit.fitWidth : BoxFit.fill)); } } \ No newline at end of file diff --git a/lib/screens/purchase.dart b/lib/screens/purchase.dart index 82f61bf..8003b2c 100644 --- a/lib/screens/purchase.dart +++ b/lib/screens/purchase.dart @@ -1,3 +1,4 @@ +import 'package:checker/db.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'dart:convert'; @@ -34,8 +35,21 @@ class PurchaseScreenState extends BaseState { this.card = card; } - @override void onStart() { - getLoyalty(user['loyalty_url']); + @override Widget build(BuildContext ctx) { + if (helper == null) { + helper = new SqliteHelper(); + helper.open().then((_) { + if (app == null) { + platform.invokeMethod('getFlavor').then((flavor) { + app = flavor; + setState(() { + getLoyalty(user['loyalty_url']); + }); + }); + } + }); + } + return getMainWidget(); } bool purchaseInProgress = false; @@ -126,8 +140,8 @@ class PurchaseScreenState extends BaseState { this.loyalty = '${user['discount']}%'; } else { List amountToBonus = bonuses['amount_to_bonus']; - double loyalityVal = (double.parse(amountToBonus[1]) / amountToBonus[0]) * 100; - this.loyalty = '${loyalityVal.toStringAsFixed(0)}%'; + double loyaltyVal = (double.parse(amountToBonus[1]) / amountToBonus[0]) * 100; + this.loyalty = '${loyaltyVal.toStringAsFixed(0)}%'; } }); }).catchError((error) { @@ -136,6 +150,7 @@ class PurchaseScreenState extends BaseState { } } + // TODO: Переделать? чтобы работало хорошо String _cleanupNumber(String text){ String tmp = text .replaceAll(' ', '') @@ -174,23 +189,25 @@ class PurchaseScreenState extends BaseState { onPurchaseClick() { String val = _parseSum(controller.text); - showDialog(context: context, child: new AlertDialog( - title: new Text(StringsLocalization.confirmation()), - content: new Text(StringsLocalization.confirmPurchase(val)), - actions: [ - new FlatButton( - child: new Text(StringsLocalization.no()), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - new FlatButton( - child: new Text(StringsLocalization.yes()), - onPressed: () { - purchase(val); - }, - ) - ])); + helper.getCurrency().then((currency) { + showDialog(context: context, child: new AlertDialog( + title: new Text(StringsLocalization.confirmation()), + content: new Text(StringsLocalization.confirmPurchase(val, currency)), + actions: [ + new FlatButton( + child: new Text(StringsLocalization.no()), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + new FlatButton( + child: new Text(StringsLocalization.yes()), + onPressed: () { + purchase(val); + }, + ) + ])); + }); } purchase(String sumTotal) async { @@ -221,14 +238,13 @@ class PurchaseScreenState extends BaseState { print(response.body); Map parsedMap = JSON.decode(response.body); + Navigator.of(context).pop(); + if (parsedMap.containsKey('errors')) { List errors = parsedMap['errors']; - // TODO: ПОказывать сообщение с ошибкой! + Scaffold.of(context).showSnackBar(new SnackBar(content: new Text(errors[0]))); } else { - helper.close().then((_) { - Navigator.of(context).pop(); - pushRouteReplacement(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name'])); - }); + pushRouteReplacement(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name'], helper, app)); } }).catchError((error) { diff --git a/lib/screens/purchase_success.dart b/lib/screens/purchase_success.dart index 0365e5b..41238fc 100644 --- a/lib/screens/purchase_success.dart +++ b/lib/screens/purchase_success.dart @@ -1,26 +1,36 @@ -import 'package:flutter/material.dart'; - +import 'package:checker/base/base_state.dart'; import 'package:checker/common.dart'; import 'package:checker/consts.dart'; +import 'package:checker/db.dart'; import 'package:checker/strings.dart'; -import 'package:checker/base/base_state.dart'; +import 'package:flutter/material.dart'; /// Экран проведения покупки. class PurchaseSuccessScreen extends StatefulWidget { - PurchaseSuccessScreen(this.val, this.name); + PurchaseSuccessScreen(this.val, this.name, this.helper, this.app); + final String val; final String name; + final String app; + final SqliteHelper helper; - @override State createState() => new PurchaseSuccessScreenState(val, name); + @override State createState() => + new PurchaseSuccessScreenState(val, name, helper, app); } class PurchaseSuccessScreenState extends BaseState { - PurchaseSuccessScreenState(this.sum, this.username); + PurchaseSuccessScreenState(String sum, String username, SqliteHelper helper, + String app) { + this.sum = sum; + this.username = username; + this.helper = helper; + this.app = app; + } - String sum; - String username; + String sum, username; + int currency; @override String getTitle() { return StringsLocalization.carryingPurchase(); @@ -30,6 +40,17 @@ class PurchaseSuccessScreenState extends BaseState { return null; } + @override Widget build(BuildContext context) { + if (currency == null) { + helper.getCurrency().then((currency) { + setState(() { + this.currency = currency; + }); + }); + } + return getMainWidget(); + } + @override Widget getScreenContent() { return new Column(children: [ getValueWithDescription(StringsLocalization.buyer(), username), @@ -50,14 +71,22 @@ class PurchaseSuccessScreenState extends BaseState { } getSuccessMessage() { - return new Row(children: [new Expanded(child: new Container(margin: new EdgeInsets.only(top: 20.0), height: 64.0, - decoration: new BoxDecoration(color: greenBackground), - child: new Center(child: new Text(getMessageTitle(), textAlign: TextAlign.center, - style: new TextStyle(fontWeight: FontWeight.bold, color: tokenActiveTextColor)))))]); + return new Row(children: [new Expanded(child: new Container( + margin: new EdgeInsets.only(top: 20.0), height: 64.0, + decoration: new BoxDecoration(color: greenBackground), + child: new Center( + child: new Text(getMessageTitle(), textAlign: TextAlign.center, + style: new TextStyle(fontWeight: FontWeight.bold, + color: tokenActiveTextColor))))) + ]); } getMessageTitle() { - return StringsLocalization.purchaseCompleted(sum); + if (currency != null) { + return StringsLocalization.purchaseCompleted(sum, currency); + } else { + return ''; + } } } \ No newline at end of file diff --git a/lib/screens/registration.dart b/lib/screens/registration.dart index ea42ffa..acebce4 100644 --- a/lib/screens/registration.dart +++ b/lib/screens/registration.dart @@ -1,23 +1,35 @@ -import 'package:checker/base/base_screen.dart'; -import 'package:checker/screens/finish_registration.dart'; -import 'package:flutter/material.dart'; -import 'dart:convert'; // Пакет для обработки json с ответом от сервера. +import 'dart:convert'; +import 'package:checker/base/base_screen.dart'; +import 'package:checker/base/base_state.dart'; import 'package:checker/common.dart'; import 'package:checker/consts.dart'; +import 'package:checker/db.dart'; import 'package:checker/network.dart'; -import 'package:checker/base/base_state.dart'; +import 'package:checker/screens/finish_registration.dart'; import 'package:checker/strings.dart'; +import 'package:flutter/material.dart'; +// Пакет для обработки json с ответом от сервера. + /// Экран регистрации магазина и кассы. class RegistrationScreen extends BaseScreen { RegistrationScreen(helper, app) : super(helper, app); - @override State createState() => new _RegistrationScreenState(); + @override State createState() => new RegistrationScreenState(helper, app); } -class _RegistrationScreenState extends BaseState { +class RegistrationScreenState extends BaseState { + + RegistrationScreenState(SqliteHelper helper, String app) { + this.helper = helper; + this.app = app; + } + + @override Widget build(BuildContext ctx) { + return getMainWidget(); + } @override String getTitle() { return StringsLocalization.registration(); @@ -30,13 +42,14 @@ class _RegistrationScreenState extends BaseState { /// Список виджетов, автоматически прокручиваемый вверх при открытии клавиатуры. @override Widget getScreenContent() { return new Container( - child: new ListView(children: [ - new Column(children: [ - getLogo(), - getHintLabel(), - getInputField(), - getButton()]) - ])); + child: new ListView(children: [ + new Column(children: [ + getLogo(), + getHintLabel(), + getInputField(), + getButton() + ]) + ])); } @override getTextWidget() { @@ -49,7 +62,7 @@ class _RegistrationScreenState extends BaseState { /// Возвращает кнопку регистрации. getButton() { return new Container(margin: new EdgeInsets.only(top: 36.0), child: - buildRaisedButton(StringsLocalization.signUp(), getOnPressed())); + buildRaisedButton(StringsLocalization.signUp(), getOnPressed())); } // Возвращает обработчик нажатий на кнопку регистрации. @@ -74,11 +87,9 @@ class _RegistrationScreenState extends BaseState { /// Получение от платформы id установки, формирование запроса на получение токена, сохранение токена. _register() async { if (await platform.invokeMethod('isOnline')) { - String posID = await helper.getPosID(); createToken(dinCode, posID).then((response) { - setState(() { error = null; loading = false; @@ -90,8 +101,7 @@ class _RegistrationScreenState extends BaseState { if (response.statusCode == 201) { helper.createSession(dinCode, posID, parsedMap['token']).then((_) { - helper.close(); - pushRouteReplacement(context, new FinishRegistrationScreen()); + pushRouteReplacement(context, new FinishRegistrationScreen(helper, app)); }); } else { setState(() { diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index 8d6211f..c78d38c 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -61,7 +61,9 @@ class SettingsState extends BaseState { List getSettings() { List widgets = new List(); for (MenuItem item in menuItems) { - widgets.add(getSettingsItem(item)); + if (item.selectedValue != '') { + widgets.add(getSettingsItem(item)); + } } return widgets; } @@ -77,15 +79,19 @@ class SettingsState extends BaseState { fontWeight: FontWeight.w600, color: faqGrey, fontSize: 14.0))), - new Text(getCurrencyTitle(int.parse(item.selectedValue)), style: new TextStyle( - fontWeight: FontWeight.w400, color: faqGrey, fontSize: 14.0)), + new Text(getCurrencyTitle(int.parse(item.selectedValue)), + style: new TextStyle( + fontWeight: FontWeight.w400, + color: faqGrey, + fontSize: 14.0)), getArrow() ])))); } void onPressed(int position) { switch (position) { - case 0 : return pushRoute(context, new CurrenciesScreen(helper, app)); + case 0 : + return pushRoute(context, new CurrenciesScreen(helper, app)); } } diff --git a/lib/screens/splash.dart b/lib/screens/splash.dart index 1f3dd3b..0fda3b1 100644 --- a/lib/screens/splash.dart +++ b/lib/screens/splash.dart @@ -20,7 +20,20 @@ class SplashScreen extends StatefulWidget { class _SplashScreenState extends BaseState { - @override Widget getMainWidget() { + @override Widget build(BuildContext ctx) { + if (helper == null) { + helper = new SqliteHelper(); + helper.open().then((_) { + if (app == null) { + platform.invokeMethod('getFlavor').then((flavor) { + app = flavor; + setState(() { + onStart(); + }); + }); + } + }); + } return getScreenContent(); } @@ -110,10 +123,7 @@ class _SplashScreenState extends BaseState { checkTokenStatus(token).then((statusResponse) { handleStatusResponse(statusResponse, helper); }).catchError((error) { - helper.close().then((_) { - print(error.toString()); - return false; - }); + handleError(error.toString()); }); } } @@ -157,12 +167,13 @@ class _SplashScreenState extends BaseState { createToken(merchantID, posID).then((response) { if (response.statusCode == 409) { - helper.close(); - pushRouteReplacement(context, new FinishRegistrationScreen()); + pushRouteReplacement(context, new FinishRegistrationScreen(helper, app)); } else if (response.statusCode == 201) { clearToken(response, helper); } - }).catchError((error) => print(error.toString())); + }).catchError((error) { + handleError(error.toString()); + }); } /// Очищаем бд, делаем запрос на удаление токена. @@ -173,9 +184,16 @@ class _SplashScreenState extends BaseState { Navigator.of(context).pop(); pushRouteReplacement(context, new RegistrationScreen(helper, app)); }).catchError((error) { - helper.close(); - print(error.toString()); + handleError(error.toString()); }); }); } + + /// Закрываем соединение, логируем ошибку. + void handleError(String error) { + helper.close().then((_) { + print(error.toString()); + return false; + }); + } } diff --git a/lib/strings.dart b/lib/strings.dart index f4a5dc5..690ec6e 100644 --- a/lib/strings.dart +++ b/lib/strings.dart @@ -9,12 +9,64 @@ class StringsLocalization { return initializeMessages(locale); } - static String confirmPurchase(String val) { - return sprintf(Intl.message('confirm_purchase', name: 'confirm_purchase', locale: Intl.defaultLocale), [val]); + static String declineCurrency(int num, int code) { + + int residual = num % 100; + if (residual >= 20) { + residual %= 10; + } + + List strings = currencies(code); + + switch (residual) { + case 1: + return strings[0]; + case 2: + case 3: + case 4: + return strings[1]; + default: // case 0, 5-19 + return strings[2]; + } } - static String purchaseCompleted(String val) { - return sprintf(Intl.message('purchase_complite', name: 'purchase_complite', locale: Intl.defaultLocale), [val]); + static List currencies(int code) { + + String nominative, singular, plural; + + switch (code) { + case 643: + nominative = nominativeRuble(); + singular = singularRuble(); + plural = pluralRuble(); + break; + case 840: + nominative = nominativeDollar(); + singular = singularDollar(); + plural = pluralDollar(); + break; + case 980: + nominative = nominativeHryvna(); + singular = singularHryvna(); + plural = pluralHryvna(); + break; + } + + + return [nominative, singular, plural]; + } + + + static String confirmPurchase(String val, int code) { + String trimmedVal =val.substring(0, val.length - 3); + print(trimmedVal); + return sprintf(Intl.message('confirm_purchase', name: 'confirm_purchase', locale: Intl.defaultLocale), [trimmedVal, declineCurrency(int.parse(trimmedVal), code)]); + } + + static String purchaseCompleted(String val, int code) { + String trimmedVal =val.substring(0, val.length - 3); + print(trimmedVal); + return sprintf(Intl.message('purchase_complite', name: 'purchase_complite', locale: Intl.defaultLocale), [val, declineCurrency(int.parse(trimmedVal), code)]); } static String registration() => Intl.message('registration', name: 'registration', locale: Intl.defaultLocale); @@ -46,7 +98,16 @@ class StringsLocalization { static String locale() => Intl.message('locale', name: 'locale', locale: Intl.defaultLocale); // Валюты - static String ruble() => Intl.message('rubles', name: 'rubles', locale: Intl.defaultLocale); - static String dollar() => Intl.message('dollars', name: 'dollars', locale: Intl.defaultLocale); - static String hryvna() => Intl.message('hryvna', name: 'hryvna', locale: Intl.defaultLocale); + static String nominativeRuble() => Intl.message('nominative_ruble', name: 'nominative_ruble', locale: Intl.defaultLocale); + static String singularRuble() => Intl.message('singular_ruble', name: 'singular_ruble', locale: Intl.defaultLocale); + static String pluralRuble() => Intl.message('plural_ruble', name: 'plural_ruble', locale: Intl.defaultLocale); + + static String nominativeDollar() => Intl.message('nominative_dollar', name: 'nominative_dollar', locale: Intl.defaultLocale); + static String singularDollar() => Intl.message('singular_dollar', name: 'singular_dollar', locale: Intl.defaultLocale); + static String pluralDollar() => Intl.message('plural_dollar', name: 'plural_dollar', locale: Intl.defaultLocale); + + static String nominativeHryvna() => Intl.message('nominative_hryvna', name: 'nominative_hryvna', locale: Intl.defaultLocale); + static String singularHryvna() => Intl.message('singular_hryvna', name: 'singular_hryvna', locale: Intl.defaultLocale); + static String pluralHryvna() => Intl.message('plural_hryvna', name: 'plural_hryvna', locale: Intl.defaultLocale); + } \ No newline at end of file From 8fb84947e51baa544045ecc033f64da13fea9452 Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Tue, 12 Sep 2017 12:38:10 +0300 Subject: [PATCH 12/24] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/base/base_state.dart | 8 ++------ lib/base/settings_base_state.dart | 1 - lib/common.dart | 20 +++++++++----------- lib/db.dart | 6 ------ lib/i18n/messages_ru.dart | 8 +++++++- lib/network.dart | 12 ++++++------ lib/screens/currencies.dart | 6 ++++-- lib/screens/faq.dart | 17 +++++++++++++++-- lib/screens/finish_registration.dart | 4 ++-- lib/screens/languages.dart | 1 - lib/screens/purchase.dart | 10 +++++++--- lib/screens/registration.dart | 4 ++-- lib/screens/splash.dart | 14 ++++++++------ lib/strings.dart | 22 +++++++++++++++++++--- 14 files changed, 81 insertions(+), 52 deletions(-) diff --git a/lib/base/base_state.dart b/lib/base/base_state.dart index f668c8f..38f18bd 100644 --- a/lib/base/base_state.dart +++ b/lib/base/base_state.dart @@ -42,10 +42,6 @@ abstract class BaseState extends State { fit: BoxFit.cover))); } - void onStart() { - print("ON START!"); - } - /// Возвращает контейнер с всеми виджетами экрана. Widget getScreenContent(); @@ -88,8 +84,8 @@ abstract class BaseState extends State { pushRoute(context, new FAQScreen(false)); break; } - case 0: { - logout(context); + case 2: { + logout(context, helper); } } } diff --git a/lib/base/settings_base_state.dart b/lib/base/settings_base_state.dart index b7906ae..5fc1a62 100644 --- a/lib/base/settings_base_state.dart +++ b/lib/base/settings_base_state.dart @@ -20,7 +20,6 @@ abstract class SettingsBaseState extends BaseState @override Widget getScreenContent() { - print('getScreenContent: $selectedItem'); getSelectedValue(); diff --git a/lib/common.dart b/lib/common.dart index 379c1cc..8379716 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -31,20 +31,20 @@ faq(BuildContext context, bool returnToScanner) { } // В методе отправляется запрос на удаление токена кассы, очищаются SharedPreferences приложения. -logout(BuildContext context) async { +logout(BuildContext context, SqliteHelper helper) async { - SqliteHelper helper = new SqliteHelper(); - await helper.open(); String token = await helper.getToken(); + String locale = await helper.getLocale(); VoidCallback positiveCallback = () { if (token != null) { - deleteToken(token).then((response) { - print(response.body); - platform.invokeMethod('removeKeys').then((result) { + deleteToken(token, locale).then((response) { + helper.clear().then((result) { + helper.close().then((_) { Navigator.of(context).pop(); Navigator.of(context).pop(); pushRouteReplacement(context, new SplashScreen()); // Запускаем регистрацию + }); }); }).catchError((error) { print(error.toString()); @@ -60,8 +60,7 @@ logout(BuildContext context) async { forceLogout(String token , BuildContext context) async { - deleteToken(token).then((response) { - print(response.body); + deleteToken(token, 'ru').then((response) { SqliteHelper helper = new SqliteHelper(); helper.open().then((_) { helper.clear().then((_) { @@ -87,16 +86,13 @@ startScanner(BuildContext context, String app, SqliteHelper helper) async { if (token != null) { platform.setMethodCallHandler((MethodCall call) async { - print('call.method: ${call.method}'); if (call.method == 'logout') { forceLogout(token, context); } else if (call.method == 'faq') { faq(context, true); } else { String userString = call.arguments[0]; - print('user: ${userString}'); String card = call.arguments[1]; - print('card: ${card}'); var route = new MaterialPageRoute(builder: (BuildContext context) => new PurchaseScreen(userString, card)); Navigator.of(context).pushReplacement(route); } @@ -133,6 +129,8 @@ getCurrencyTitle(int code) { case 643: return StringsLocalization.nominativeRuble(); case 840: return StringsLocalization.nominativeDollar(); case 980: return StringsLocalization.nominativeHryvna(); + case 978: return StringsLocalization.nominativeEuro(); + case 398: return StringsLocalization.nominativeEuro(); } } diff --git a/lib/db.dart b/lib/db.dart index 244ce35..6996c57 100644 --- a/lib/db.dart +++ b/lib/db.dart @@ -83,14 +83,12 @@ class SqliteHelper { Future getToken() async { Map session = await selectAll(tableSession); String token = session != null ? session[columnToken] : null; - print('token: {$token}'); return token; } Future getMerchantID() async { Map session = await selectAll(tableSession); String merchantID = session != null ? session[columnMerchantID] : null; - print('merchantID: {$merchantID}'); return merchantID; } @@ -103,27 +101,23 @@ class SqliteHelper { Map session = await selectAll(tableSession); int docID = session != null ? session[columnDocID] : 0; db.update(tableSession, {columnDocID: docID + 1}); - print('docid: {$docID}'); return docID; } Future getLocale() async { Map settings = await selectAll(tableSettings); String locale = settings != null ? settings[columnLocale] : null; - print('locale: {$locale}'); return locale; } Future getCurrency() async { Map settings = await selectAll(tableSettings); int currency = settings != null ? settings[columnCurrency] : null; - print('currency: {$currency}'); return currency; } Future saveCurrency(int currency) async { db.update(tableSettings, {columnCurrency: currency}); - print('currency: {$currency}'); return currency; } diff --git a/lib/i18n/messages_ru.dart b/lib/i18n/messages_ru.dart index bac406e..e3bb563 100644 --- a/lib/i18n/messages_ru.dart +++ b/lib/i18n/messages_ru.dart @@ -52,6 +52,12 @@ class MessageLookup extends MessageLookupByLibrary { "plural_dollar": MessageLookupByLibrary.simpleMessage("Долларов"), "nominative_hryvna": MessageLookupByLibrary.simpleMessage("Гривна"), "singular_hryvna": MessageLookupByLibrary.simpleMessage("Гривны"), - "plural_hryvna": MessageLookupByLibrary.simpleMessage("Гривен") + "plural_hryvna": MessageLookupByLibrary.simpleMessage("Гривен"), + "nominative_tenge": MessageLookupByLibrary.simpleMessage("Тенге"), + "singular_tenge": MessageLookupByLibrary.simpleMessage("Тенге"), + "plural_tenge": MessageLookupByLibrary.simpleMessage("Тенге"), + "nominative_euro": MessageLookupByLibrary.simpleMessage("Евро"), + "singular_euro": MessageLookupByLibrary.simpleMessage("Евро"), + "plural_euro": MessageLookupByLibrary.simpleMessage("Евро") }; } diff --git a/lib/network.dart b/lib/network.dart index c5f16fa..fc74466 100644 --- a/lib/network.dart +++ b/lib/network.dart @@ -8,7 +8,7 @@ final httpClient = createHttpClient(); // Попытка создать токен для кассы. // В случае если токен для кассы уже существует, вернется ошибка 409. // На сервере есть ограничение в 40 токенов. -createToken(String merchantId, String posID) async { +createToken(String merchantId, String posID, String locale) async { // Поле description - необязательное. var body = { @@ -16,15 +16,15 @@ createToken(String merchantId, String posID) async { 'pos': posID, }; - return httpClient.post(url + 'tokens/?_dmapptoken=' + appToken, body: body); + return httpClient.post(url + 'tokens/?_dmapptoken=' + appToken, body: body, headers: {'Accept-Language': locale}); } // Проверка статуса токена. В ответе приходит параметр active, который может быть либо true, либо false,. -checkTokenStatus(String token) async { - return httpClient.get(url + 'tokens/' + token + '?_dmapptoken=' + appToken); +checkTokenStatus(String token, String locale) async { + return httpClient.get(url + 'tokens/' + token + '?_dmapptoken=' + appToken, headers: {'Accept-Language': locale}); } // Удаление токена на сервере. -deleteToken(String token) async { - return httpClient.delete(url + 'tokens/' + token + '?_dmapptoken=' + appToken); +deleteToken(String token, String locale) async { + return httpClient.delete(url + 'tokens/' + token + '?_dmapptoken=' + appToken, headers: {'Accept-Language': locale}); } \ No newline at end of file diff --git a/lib/screens/currencies.dart b/lib/screens/currencies.dart index e16a5fc..83b5b9a 100644 --- a/lib/screens/currencies.dart +++ b/lib/screens/currencies.dart @@ -15,7 +15,7 @@ class CurrenciesScreen extends BaseScreen { class _CurrenciesState extends SettingsBaseState { - List currencies = const [643, 840, 980]; + List currencies = const [643, 840, 980, 978, 398]; _CurrenciesState(SqliteHelper helper, String app) : super(helper, app); @@ -26,8 +26,10 @@ class _CurrenciesState extends SettingsBaseState { String ruble = StringsLocalization.nominativeRuble(); String dollar = StringsLocalization.nominativeDollar(); String hryvna = StringsLocalization.nominativeHryvna(); + String euro = StringsLocalization.nominativeEuro(); + String tenge = StringsLocalization.nominativeTenge(); - return [ruble, dollar, hryvna]; + return [ruble, dollar, hryvna, euro, tenge]; } @override diff --git a/lib/screens/faq.dart b/lib/screens/faq.dart index 24d1475..9e703be 100644 --- a/lib/screens/faq.dart +++ b/lib/screens/faq.dart @@ -1,3 +1,4 @@ +import 'package:checker/strings.dart'; import 'package:flutter/material.dart'; import 'package:checker/base/base_state.dart'; @@ -46,9 +47,10 @@ class FAQScreenState extends BaseState { FAQScreenState(this.returnToScanner); final bool returnToScanner; + String app; @override String getTitle() { - return "FAQ"; + return StringsLocalization.help(); } @override String getHint() { @@ -56,7 +58,18 @@ class FAQScreenState extends BaseState { } @override Widget build(BuildContext context) { - return getScreenContent(); + if (app == null) { + platform.invokeMethod('getFlavor').then((flavor) { + setState(() { + app = flavor; + }); + }); + } + return new Scaffold(appBar: getAppBar(),body: getScreenContent()); + } + + @override List getMenuButtons() { + return null; } /// Метод возвращает ListView с блоками faq. diff --git a/lib/screens/finish_registration.dart b/lib/screens/finish_registration.dart index 8021d56..03660c6 100644 --- a/lib/screens/finish_registration.dart +++ b/lib/screens/finish_registration.dart @@ -66,8 +66,8 @@ class RegistrationScreenState extends BaseState { } else { if (await platform.invokeMethod('isOnline')) { String token = await helper.getToken(); - checkTokenStatus(token).then((response) { - print(response.body); + String locale = await helper.getLocale(); + checkTokenStatus(token, locale).then((response) { Map parsedMap = JSON.decode(response.body); // Обновить экран, заменить сообщение о необходимости активации токена, на сообщние о том, что токен активен. diff --git a/lib/screens/languages.dart b/lib/screens/languages.dart index ea0dadc..3978a68 100644 --- a/lib/screens/languages.dart +++ b/lib/screens/languages.dart @@ -38,7 +38,6 @@ class LanguagesState extends SettingsBaseState { void getSelectedValue() { helper.getLocale().then((locale) { setState(() { - print(selectedItem); selectedItem = getOptions().indexOf(getLocaleTitle(locale)); }); }); diff --git a/lib/screens/purchase.dart b/lib/screens/purchase.dart index 8003b2c..df7d04d 100644 --- a/lib/screens/purchase.dart +++ b/lib/screens/purchase.dart @@ -60,7 +60,7 @@ class PurchaseScreenState extends BaseState { @override Widget getScreenContent() { return new Column( children: [new Expanded(child: new ListView(children: [ - getValueWithDescription(StringsLocalization.userName(), user['first_name'] == null ? '' : user['first_name']), + getValueWithDescription(StringsLocalization.buyer(), user['first_name'] == null ? '' : user['first_name']), getValueWithDescription(StringsLocalization.card(), card), getValueWithDescription(StringsLocalization.reward(), loyalty), getHintLabel(), @@ -123,10 +123,12 @@ class PurchaseScreenState extends BaseState { if (await platform.invokeMethod('isOnline')) { String token = await helper.getToken(); + String locale = await helper.getLocale(); var headers = { 'DM-Authorization': 'dmapptoken $appToken', - 'Authorization': 'dmtoken ${token}' + 'Authorization': 'dmtoken ${token}', + 'Accept-Language': locale }; httpClient.get(url, headers: headers).then((response) { @@ -216,6 +218,7 @@ class PurchaseScreenState extends BaseState { purchaseInProgress = true; String token = await helper.getToken(); + String locale = await helper.getLocale(); helper.getMerchantID().then((result) { String url = user['purchases_url']; @@ -230,7 +233,8 @@ class PurchaseScreenState extends BaseState { var headers = { 'DM-Authorization': 'dmapptoken $appToken', - 'Authorization': 'dmtoken ${token}' + 'Authorization': 'dmtoken ${token}', + 'Accept-Language': locale }; httpClient.post(url, body: body, headers: headers).then((response) { diff --git a/lib/screens/registration.dart b/lib/screens/registration.dart index acebce4..9b62eb5 100644 --- a/lib/screens/registration.dart +++ b/lib/screens/registration.dart @@ -88,8 +88,8 @@ class RegistrationScreenState extends BaseState { _register() async { if (await platform.invokeMethod('isOnline')) { String posID = await helper.getPosID(); - - createToken(dinCode, posID).then((response) { + String locale = await helper.getLocale(); + createToken(dinCode, posID, locale).then((response) { setState(() { error = null; loading = false; diff --git a/lib/screens/splash.dart b/lib/screens/splash.dart index 0fda3b1..280e85d 100644 --- a/lib/screens/splash.dart +++ b/lib/screens/splash.dart @@ -37,7 +37,7 @@ class _SplashScreenState extends BaseState { return getScreenContent(); } - @override void onStart() { + void onStart() { helper.getSettings().then((info) { if (info == null) { platform.invokeMethod('getCurrency').then((currency) { @@ -113,6 +113,7 @@ class _SplashScreenState extends BaseState { /// Запуск следующего экрана приложения. showNextScreen() async { String token = await helper.getToken(); + String locale = await helper.getLocale(); // В случае, если в приложении отсутствует токен, // необходимо запустить регистрацию кассы. @@ -120,7 +121,7 @@ class _SplashScreenState extends BaseState { pushRouteReplacement(context, new RegistrationScreen(helper, app)); } else { if (await platform.invokeMethod('isOnline')) { - checkTokenStatus(token).then((statusResponse) { + checkTokenStatus(token, locale).then((statusResponse) { handleStatusResponse(statusResponse, helper); }).catchError((error) { handleError(error.toString()); @@ -134,7 +135,6 @@ class _SplashScreenState extends BaseState { /// Если токен не активен, попробовать создать его еще раз. handleStatusResponse(var statusResponse, SqliteHelper helper) async { int code = statusResponse.statusCode; - print('resp: ${code}'); if (code == 404) { helper.clear().then((result) { @@ -164,8 +164,9 @@ class _SplashScreenState extends BaseState { _createToken(SqliteHelper helper) async { String merchantID = await helper.getMerchantID(); String posID = await helper.getPosID(); + String locale = await helper.getLocale(); - createToken(merchantID, posID).then((response) { + createToken(merchantID, posID, locale).then((response) { if (response.statusCode == 409) { pushRouteReplacement(context, new FinishRegistrationScreen(helper, app)); } else if (response.statusCode == 201) { @@ -177,10 +178,11 @@ class _SplashScreenState extends BaseState { } /// Очищаем бд, делаем запрос на удаление токена. - void clearToken(Response response, SqliteHelper helper) { + Future clearToken(Response response, SqliteHelper helper) async { + String locale = await helper.getLocale(); helper.clear().then((_) { Map parsedMap = JSON.decode(response.body); - deleteToken(parsedMap['token']).then((_) { + deleteToken(parsedMap['token'], locale).then((_) { Navigator.of(context).pop(); pushRouteReplacement(context, new RegistrationScreen(helper, app)); }).catchError((error) { diff --git a/lib/strings.dart b/lib/strings.dart index 690ec6e..464968e 100644 --- a/lib/strings.dart +++ b/lib/strings.dart @@ -50,6 +50,16 @@ class StringsLocalization { singular = singularHryvna(); plural = pluralHryvna(); break; + case 978: + nominative = nominativeHryvna(); + singular = singularHryvna(); + plural = pluralHryvna(); + break; + case 398: + nominative = nominativeTenge(); + singular = singularTenge(); + plural = pluralTenge(); + break; } @@ -59,13 +69,11 @@ class StringsLocalization { static String confirmPurchase(String val, int code) { String trimmedVal =val.substring(0, val.length - 3); - print(trimmedVal); return sprintf(Intl.message('confirm_purchase', name: 'confirm_purchase', locale: Intl.defaultLocale), [trimmedVal, declineCurrency(int.parse(trimmedVal), code)]); } static String purchaseCompleted(String val, int code) { String trimmedVal =val.substring(0, val.length - 3); - print(trimmedVal); return sprintf(Intl.message('purchase_complite', name: 'purchase_complite', locale: Intl.defaultLocale), [val, declineCurrency(int.parse(trimmedVal), code)]); } @@ -82,7 +90,6 @@ class StringsLocalization { static String appActivated() => Intl.message('app_activ', name: 'app_activ', locale: Intl.defaultLocale); static String completeRegistration() => Intl.message('complite_activ', name: 'complite_activ', locale: Intl.defaultLocale); static String cardScanner() => Intl.message('card_scaner', name: 'card_scaner', locale: Intl.defaultLocale); - static String userName() => Intl.message('user_name', name: 'user_name', locale: Intl.defaultLocale); static String card() => Intl.message('card', name: 'card', locale: Intl.defaultLocale); static String reward() => Intl.message('reward', name: 'reward', locale: Intl.defaultLocale); static String sum() => Intl.message('sum', name: 'sum', locale: Intl.defaultLocale); @@ -102,6 +109,11 @@ class StringsLocalization { static String singularRuble() => Intl.message('singular_ruble', name: 'singular_ruble', locale: Intl.defaultLocale); static String pluralRuble() => Intl.message('plural_ruble', name: 'plural_ruble', locale: Intl.defaultLocale); + static String nominativeEuro() => Intl.message('nominative_euro', name: 'nominative_euro', locale: Intl.defaultLocale); + static String singularEuro() => Intl.message('singular_euro', name: 'singular_euro', locale: Intl.defaultLocale); + static String pluralEuro() => Intl.message('plural_euro', name: 'plural_euro', locale: Intl.defaultLocale); + + static String nominativeDollar() => Intl.message('nominative_dollar', name: 'nominative_dollar', locale: Intl.defaultLocale); static String singularDollar() => Intl.message('singular_dollar', name: 'singular_dollar', locale: Intl.defaultLocale); static String pluralDollar() => Intl.message('plural_dollar', name: 'plural_dollar', locale: Intl.defaultLocale); @@ -110,4 +122,8 @@ class StringsLocalization { static String singularHryvna() => Intl.message('singular_hryvna', name: 'singular_hryvna', locale: Intl.defaultLocale); static String pluralHryvna() => Intl.message('plural_hryvna', name: 'plural_hryvna', locale: Intl.defaultLocale); + static String nominativeTenge() => Intl.message('nominative_tenge', name: 'nominative_tenge', locale: Intl.defaultLocale); + static String singularTenge() => Intl.message('singular_tenge', name: 'singular_tenge', locale: Intl.defaultLocale); + static String pluralTenge() => Intl.message('plural_tenge', name: 'plural_tenge', locale: Intl.defaultLocale); + } \ No newline at end of file From ef7d903144226bbc48e52bf3f08010f370a8a6ad Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Tue, 12 Sep 2017 14:07:10 +0300 Subject: [PATCH 13/24] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D0=BC=D0=B5=D0=BD=D1=8E,=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8,=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=95=D0=B2=D1=80=D0=BE?= =?UTF-8?q?=20=D0=B8=20=D0=A2=D0=B5=D0=BD=D0=B3=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/src/main/AndroidManifest.xml | 2 +- .../checker/AbstractScannerActivity.java | 20 +++- .../src/main/res/drawable-xxxhdpi/help.png | Bin 0 -> 3632 bytes .../res/drawable-xxxhdpi/help_outline.png | Bin 1766 -> 0 bytes .../res/drawable-xxxhdpi/ic_more_vert.png | Bin 0 -> 1661 bytes .../src/main/res/drawable-xxxhdpi/logout.png | Bin 1300 -> 1213 bytes .../main/res/drawable-xxxhdpi/settings.png | Bin 0 -> 2373 bytes android/app/src/main/res/menu/menu.xml | 31 ++++-- .../app/src/main/res/values-ru/strings.xml | 3 +- .../app/src/main/res/values-ua/strings.xml | 3 +- android/app/src/main/res/values/strings.xml | 3 +- android/app/src/main/res/values/styles.xml | 4 +- android/build.gradle | 2 +- lib/base/base_state.dart | 2 +- lib/common.dart | 100 +++++++++++------- lib/screens/settings.dart | 23 +++- 16 files changed, 130 insertions(+), 63 deletions(-) create mode 100644 android/app/src/main/res/drawable-xxxhdpi/help.png delete mode 100644 android/app/src/main/res/drawable-xxxhdpi/help_outline.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/ic_more_vert.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/settings.png diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index c3da8b2..590fc55 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -31,7 +31,7 @@ android:hardwareAccelerated="true" android:launchMode="singleTop" android:screenOrientation="portrait" - android:theme="@android:style/Theme.Black.NoTitleBar" + android:theme="@android:style/Theme.Light.NoTitleBar" android:windowSoftInputMode="adjustResize"> 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 6e2a1ff..9356c71 100644 --- a/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java +++ b/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java @@ -27,7 +27,6 @@ import android.os.Handler; import android.support.annotation.NonNull; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; import android.util.Log; import android.util.Pair; import android.view.LayoutInflater; @@ -38,6 +37,7 @@ import android.view.Window; import android.widget.FrameLayout; import android.widget.Toast; import android.widget.TextView; +import android.support.v7.widget.Toolbar; import com.dinect.checker.net.ApiClient; @@ -45,6 +45,8 @@ import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; +import static android.app.Activity.RESULT_OK; + /** * Created by anonymous @@ -297,9 +299,23 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { return true; } + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + menu.findItem(R.id.settings).setIcon(getResources().getDrawable(R.drawable.settings)); + menu.findItem(R.id.faq).setIcon(getResources().getDrawable(R.drawable.help)); + menu.findItem(R.id.logout).setIcon(getResources().getDrawable(R.drawable.logout)); + return super.onPrepareOptionsMenu(menu); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == R.id.logout) { + if (item.getItemId() == R.id.settings) { + final Intent intent = new Intent(); + intent.putExtra("item", "settings"); + setResult(RESULT_OK, intent); + finish(); + return true; + } else if (item.getItemId() == R.id.logout) { logoutDialog = LogoutDialogFragment.newInstance(mColor); logoutDialog.show(getFragmentManager(), "logout"); return true; diff --git a/android/app/src/main/res/drawable-xxxhdpi/help.png b/android/app/src/main/res/drawable-xxxhdpi/help.png new file mode 100644 index 0000000000000000000000000000000000000000..5d7029a5a6647403b1e30b0542b651e605d3d062 GIT binary patch literal 3632 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 Q>a75V_eQU(wd{<)0hjLmi~s-t literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxxhdpi/logout.png b/android/app/src/main/res/drawable-xxxhdpi/logout.png index 83b23bb6bb28288ea7e97d39d07fb80ee2b8d074..2f7918159c05fb5d3383ba390255d40cd78d78e3 100644 GIT binary patch literal 1213 zcmV;u1Va0XP)hA1R=*_Hb)}5Yyd%EkLoqp#0c0FCsuionFsp={N z{!|?>s_GO60Vp>D0w4fo2bATR0R*7zfU-O@fB=*oP?l!~5P-4+%JR&B%?@CCwsD|Y zu%`>w9=9-~0EU(8l&QP{-dZ34aJ_)$?~}g2(2HQ=45(BpTXyc<_mj0a3!vD`O>EX{ z+c3T>``*t<>yQY*WowJxpN-4L;$%|cLAuTY7Z3X07fI@r2tai%_z@Q0CJ`LqYraX6 z31R@X`d{NMv>pT4I>2U%tG3b|+2TZbV)U8hVljYfJ@^&CR}zsN#r{(Ey>pWK$^py< zGcfp6B9f!nCuQF|AgQkyz@vKb#sVdYNRDFPlzs0bNqxlts`a1+be>6DUN-wt!fVM* zY?|1&*ikIn=Mnd7%f45T)F%l58zr#3)r=e(8yiRf4;qaf#U=YHs{Uo)6L~5M4uz}r zfB+&05P&5Ag|W;4p33he*jD=I-Bkk|(}d6$0Ad-C zK~Sw$+uj=9eht9USjA`19pxH8X!^{|%*Ttx;Tr&sXh6t4fY9`N^YfpSTILUHao9Bk z0%$wlHsU6L&s{5>#{luxdv8A3)$|svGy5F1D-ThuRTOEf)adJ~Y#gV;7XR zqr&nCKxkOn;RKMjqr&nCKxkOn;RKMjqr&p~1pv3L>*6SXoorov!2)L_l=Bj649-uDdtXcHE6xCJU%#=v&bF@)<#~X^h7jBw;1Ejl z2$TNi7p*#TvFW&i;wJD@Dj3?Kky2bATR0R*7z bfU^9*Hie*$BIC5x00000NkvXXu0mjf9$`9c literal 1300 zcmV+v1?&2WP)<5DFwZf_=3f!fmZHB_1dH8a<^yeql$?m{6Va2A4CYv4 z=Cj&4=AeiOG~z>nR%q9;&&=Ce;gDPe$RN7O%+Q*ub`He>`BF8St}~9)rcQKTDgy+< zI6|*W#`gQnptvLR?E*Dqyv{vler8#`i0n8UlIphF!mbQZLTA*n<`P-;21Eq*?QLd~ zZDz(ksvEmo23itpzj1>Qk=3%}cDR!m_kfwR#(dd8uwFoc8soMJwXa09UTV?ZwfQbG z_8BwZN`2NTfDBNMiRfWqanO*JQXs>48C&p(nKA!Dn+nJP1;^rcU|nWo7}*^Bo?j7- z2;LSV@|lS4RT~HW0AK)jVRwKck-p6gmx#o`?=mxPmGdSdpNQzbem_kmXX}AYi9v~~ zwsjdI5<8+HD6#cer!A2`W#-lYP)6t&twT-uLqyk0K68UUN6fs@BNUCJ)?oh&L%{vm zfJfXN6f9Ll9uU!cBD$8?{ZAsotNU*QLdU*q&?OWH1}}CP=o^VmBVL0Gp*mdP&(STE zDZz9NWhyY;L$QEi=Cua)W%eNK%6W@z$_2r4Hl~TgnS!$5ZI*ro5rH8L8BEh03NURV zZz2K<9*TR+9GOxOL%&SC#{9m@fI;9I`>ATs6aXZ7;h>GMN8nS$z2*K%Pb=59?BF&L|sFf zs)(ptC{q>@bqQtaBBEZQOj<-#4aL>BJaxXzP`X*{r1ellR0Snc@KcqGQ4|r)vUnxF zk+z7a7D}wdq8LmfQr9HhpeZ7%g%S%$<3kpKNz}452{$?;o-87&g_1LfW-y7AOS6ze zu861>3gV;Kc(Z(O4|%96C@##dwTxL32dr8=@%1|V0hiDVe+@|UF{V`{S!%^o!+<$#$#y|n`>G<$@SbHJ?o zw8$@1HuPdsaCGpxz33#^7}j}-W_Oz6r8AJiu%t0U8UaTxmq`0aL@yG*-iTFJHA~3n ziioN`S`VtGC^-9m>7j_I36z$<&FP_ts2YkAi0Y?t&NH68h^PumCXzLrEHw}ZW%44T zS}3t1!XhA^eVVk0s1{1<2TLXm8DC|Y0z!)~q>-I_LexTuRaRC3@s80XMMSkwLII{G zu~ZMt(u;_ypm+<%jR6CR|Hr^mMX6Ekr56!ZLs9Ljkkq^0u!0000< KMNUMnLSTXkYETIP diff --git a/android/app/src/main/res/drawable-xxxhdpi/settings.png b/android/app/src/main/res/drawable-xxxhdpi/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..1e19365d61f0a0e948320f870109338749f2b274 GIT binary patch literal 2373 zcmV-L3A*-)P)49P41Iq{oJg8i?FcAXb}xWtNnZDvhMty$B^9PB3FzwT zTJ6-WJ^@I3Pho9*Y;9|6>zLH&NdT)#0`k56t;9}If`79ROj?ysUq1_4M%lx(#l4p7bOt+aEo1PGopCfeGwi_lZbUnb^;DDIu zx}1^h@QX8FJ~ROb4jibdU*Av!qh$_w1&sY5-aYcd^N(-cx^;3fLpzU@-lb{uBLMFS z>yTjkziFi1+L~_q>tga#zPe_p+m>kIkl5NWbo$zXkNxjzRw^$q9yQ^R$c$kT2FN8Xlz#tu z&)9+i9tP;melZEyl{NGm{k98Dz^Qbx^R(w;P%D;qy9$%m7IdXGa1Sh4_Fn*0-K%{} zTs~zQ`j#NN0})WPN>?-J(I5&}Y8wJylQmM0`Ss5?0S5;M&pmf+ya&LgewD3o`D3rF zuFG8B(C~^MKYbHW=q=w4<~#f-IcsEz?l9BI@A&c87XcmJX$z6%qO@9VpQ9L>#qgxiQ3vBKn-HD^n% zx%p`kzl4Ix%v!OxzZ2lB2N@PQ@5CN|8&S!01tHJL8Z1!nP z0CC!zO*dU9GKqboxjWnzOC7x%rtOb_XWFRhBQ6E~H6%7zFndUf63Cb%_SiR5PeDH$}y`^SqQ% zz<82tczZ6DdNHUyp$Kr5KE|9#_4VHc=3B$PjnZDzNJcrg%*Lo-l^+T@Av+-YeyO?X zwyTLML4)tM3r)c6ykObxte*^O3^Q%dWs+{H8~Ih}DQ^d{`+gAgDw~F`2W>pJolF9T z!@MUrlSqlCZeblS94V)uvAdfi=rv**y2wrtPkfmKj033k)VQ#KGxEYP0NZ7csd@5j2K6?P9eQAvmPfV%&6~Vp)vKTjd)Ge7F4N zXd2V-+NSvjIRyKJr`Ytti*pW3S%^Db+c<;1nlqC3c^WZKz*ic&oIl8PcX!uLB7M_lJt3E${hA>6qkO@#m-Dt1_ub;% zej_MBUf#Bpf@Qm>8$CA}Nicc=h+rGDFyY(`#w`&{xT0CKw9j>*v&U}JfM10zTUj{LeL)(&G7v>7s(xeTgVQKdQS~D?9|S~@imG23`iTFO zsQQ_w--t<;FZPr^z(hZj@jF{${!%uR`jcc6rNC9)T96d4mJx^|AZD@@0g8Z_BM`HC rH3Ad?F-IU~^=bqt0%DFp% - + - + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/values-ru/strings.xml b/android/app/src/main/res/values-ru/strings.xml index d203e90..dae7ebe 100644 --- a/android/app/src/main/res/values-ru/strings.xml +++ b/android/app/src/main/res/values-ru/strings.xml @@ -2,8 +2,9 @@ AutoBonus Сканер карты Сканировать - FAQ + Справка Выход + Настройки Подтверждение Вы действительно хотите выйти и ввести другой номер магазина? Да diff --git a/android/app/src/main/res/values-ua/strings.xml b/android/app/src/main/res/values-ua/strings.xml index bd673a5..abd3168 100644 --- a/android/app/src/main/res/values-ua/strings.xml +++ b/android/app/src/main/res/values-ua/strings.xml @@ -2,8 +2,9 @@ AutoBonus Сканер карти Сканувати - FAQ + Допомога Вихід + Налаштування Підтвердження Ви дійсно хочете вийти і ввести інший номер магазину? Так diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index bc190eb..99d4eca 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -2,8 +2,9 @@ AutoBonus Card Scanner Scan - FAQ + Help Logout + Settings Сonfirmation Do you really want to log out and enter a different store number? Yes diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index e36e3aa..e491f12 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -1,6 +1,8 @@ - diff --git a/android/build.gradle b/android/build.gradle index f5004b9..ebe4957 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -4,7 +4,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:2.2.3' + classpath 'com.android.tools.build:gradle:2.3.3' } } diff --git a/lib/base/base_state.dart b/lib/base/base_state.dart index 38f18bd..7e793de 100644 --- a/lib/base/base_state.dart +++ b/lib/base/base_state.dart @@ -77,7 +77,7 @@ abstract class BaseState extends State { void onOptionsItemClick(int index) { switch (index) { case 0: { - pushRoute(context, new SettingsScreen(helper, app)); + pushRoute(context, new SettingsScreen(helper, app, false)); break; } case 1: { diff --git a/lib/common.dart b/lib/common.dart index 8379716..e199db1 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -1,6 +1,6 @@ import 'package:checker/screens/faq.dart'; import 'package:checker/screens/purchase.dart'; -import 'package:checker/screens/registration.dart'; +import 'package:checker/screens/settings.dart'; import 'package:checker/screens/splash.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -65,7 +65,9 @@ forceLogout(String token , BuildContext context) async { helper.open().then((_) { helper.clear().then((_) { helper.close().then((_) { - Navigator.of(context).pop(); + while (Navigator.of(context).canPop()) { + Navigator.of(context).pop(); + } pushRouteReplacement(context, new SplashScreen()); }); }); @@ -78,50 +80,68 @@ forceLogout(String token , BuildContext context) async { /// Запуск спецефичной для каждой платформы части приложения - сканера. /// Может производиться с нескольких экранов (splash, finish_registration). startScanner(BuildContext context, String app, SqliteHelper helper) async { - - String token = await helper.getToken(); - helper.close(); - // Канал ловит вызовы методов из "нативной" части приложения. - // Могут быть вызваны либо logout либо faq, либо purchase. - if (token != null) { - platform.setMethodCallHandler((MethodCall call) async { - - if (call.method == 'logout') { - forceLogout(token, context); - } else if (call.method == 'faq') { - faq(context, true); - } else { - String userString = call.arguments[0]; - String card = call.arguments[1]; - var route = new MaterialPageRoute(builder: (BuildContext context) => new PurchaseScreen(userString, card)); - Navigator.of(context).pushReplacement(route); - } + if (helper == null) { + helper = new SqliteHelper(); + helper.open().then((_) { + startScanner(context, app, helper); }); + } else { + String token = await helper.getToken(); + helper.close(); + // Канал ловит вызовы методов из "нативной" части приложения. + // Могут быть вызваны либо logout либо faq, либо purchase. + if (token != null) { + platform.setMethodCallHandler((MethodCall call) async { + if (call.method == 'logout') { + forceLogout(token, context); + } else if (call.method == 'faq') { + faq(context, true); + } else if(call.method == 'settings') { + helper = new SqliteHelper(); + helper.open().then((_) { + pushRoute(context, new SettingsScreen(helper, app, true)); + }); + } else { + String userString = call.arguments[0]; + String card = call.arguments[1]; + var route = new MaterialPageRoute( + builder: (BuildContext context) => + new PurchaseScreen( + userString, card)); + while (Navigator.of(context).canPop()) { + Navigator.of(context).pop(); + } + Navigator.of(context).pushReplacement(route); + } + }); - await platform.invokeMethod('startScanner', { - 'token' : token, - 'url': url, - 'appToken': appToken, - 'color': Resources.getPrimaryColor(app).value - }); + await platform.invokeMethod('startScanner', { + 'token': token, + 'url': url, + 'appToken': appToken, + 'color': Resources + .getPrimaryColor(app) + .value + }); + } } } // Запуск диалога с двумя кнопками showYesNoDialog(BuildContext context, String title, String content, VoidCallback positiveCallback) { - showDialog(context: context, child: new AlertDialog( - title: new Text(title), - content: new Text(content), - actions: [ - new FlatButton( - child: new Text(StringsLocalization.no()), - onPressed: () { - Navigator.of(context).pop(); - } - ), - new FlatButton( - child: new Text(StringsLocalization.yes()), - onPressed: positiveCallback)])); + showDialog(context: context, child: new AlertDialog( + title: new Text(title), + content: new Text(content), + actions: [ + new FlatButton( + child: new Text(StringsLocalization.no()), + onPressed: () { + Navigator.of(context).pop(); + } + ), + new FlatButton( + child: new Text(StringsLocalization.yes()), + onPressed: positiveCallback)])); } getCurrencyTitle(int code) { @@ -130,7 +150,7 @@ getCurrencyTitle(int code) { case 840: return StringsLocalization.nominativeDollar(); case 980: return StringsLocalization.nominativeHryvna(); case 978: return StringsLocalization.nominativeEuro(); - case 398: return StringsLocalization.nominativeEuro(); + case 398: return StringsLocalization.nominativeTenge(); } } diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index c78d38c..2e49bc0 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:checker/base/base_screen.dart'; import 'package:checker/base/base_state.dart'; import 'package:checker/common.dart'; @@ -9,9 +11,11 @@ import 'package:flutter/material.dart'; class SettingsScreen extends BaseScreen { - SettingsScreen(helper, app) : super(helper, app); + final bool returnToScanner; - @override State createState() => new SettingsState(helper, app); + SettingsScreen(helper, app, this.returnToScanner) : super(helper, app); + + @override State createState() => new SettingsState(helper, app, returnToScanner); } class MenuItem { @@ -26,9 +30,12 @@ class SettingsState extends BaseState { List menuItems = [new MenuItem(StringsLocalization.currency(), '')]; - SettingsState(SqliteHelper helper, String app) { + bool returnToScanner; + + SettingsState(SqliteHelper helper, String app, bool returnToScanner) { this.helper = helper; this.app = app; + this.returnToScanner = returnToScanner; } @override Widget build(BuildContext ctx) { @@ -41,7 +48,7 @@ class SettingsState extends BaseState { } } }); - return getMainWidget(); + return new WillPopScope(onWillPop: onWillPop, child: getMainWidget()); } @override @@ -104,4 +111,12 @@ class SettingsState extends BaseState { String getTitle() { return StringsLocalization.settings(); } + + onWillPop() { + if(returnToScanner) { + return startScanner(context, app, helper); + } else { + return true; + } + } } \ No newline at end of file From 87b88cb99c15daf7aeb58255a1f62d49c90c0eeb Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Tue, 12 Sep 2017 14:18:38 +0300 Subject: [PATCH 14/24] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/src/main/AndroidManifest.xml | 2 +- lib/base/base_state.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 590fc55..069c9d3 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="1.0.4"> extends State { return new Container(margin: new EdgeInsets.only(top: horizontalMargin, bottom: horizontalMargin, left: verticalMargin, right: verticalMargin), child: new Row(crossAxisAlignment: CrossAxisAlignment.start, children: [new Text(getHintString(), textAlign: TextAlign.left, - style: new TextStyle(fontWeight: FontWeight.w300, color: error == null ? greyTextColor : Resources.getLogo(app), fontSize: 14.0))])); + style: new TextStyle(fontWeight: FontWeight.w300, color: error == null ? greyTextColor : Resources.getPrimaryColor(app), fontSize: 14.0))])); } /// Возвращает подсказку, либо ошибку, если введенные в поле ввода данные неверны. From 6f76ea7b2a92656054cd07b604cca4f44ed65307 Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Fri, 15 Sep 2017 11:29:34 +0300 Subject: [PATCH 15/24] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=B2=D0=B0=D0=BB=D1=8E=D1=82=20=D0=B4=D0=BB=D1=8F=20=D0=A3?= =?UTF-8?q?=D0=BA=D1=80=D0=B0=D0=B8=D0=BD=D1=8B=20=D0=B8=20=D0=B1=D0=B0?= =?UTF-8?q?=D0=B3=20=D1=81=20=D1=82=D0=B5=D0=BC,=20=D1=87=D1=82=D0=BE=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D0=B2=D1=8B=D0=B1=D1=80=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D0=BE=D0=BC=20=D0=B5=D0=B2=D1=80=D0=BE=20=D0=B2=D0=B5=D0=B7?= =?UTF-8?q?=D0=B4=D0=B5=20=D0=BF=D0=B8=D1=81=D0=B0=D0=BB=D0=BE=D1=81=D1=8C?= =?UTF-8?q?=20'=D0=B3=D1=80=D0=B8=D0=B2=D0=BD=D0=B0'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/src/pip/AndroidManifest.xml | 51 ------------------------ android/app/src/pip/ic_launcher-web.png | Bin 17718 -> 0 bytes lib/consts.dart | 2 +- lib/i18n/messages_ru.dart | 6 +-- lib/i18n/messages_ua.dart | 22 +++++++--- lib/main.dart | 1 + lib/screens/currencies.dart | 1 + lib/screens/purchase.dart | 1 + lib/strings.dart | 6 +-- 9 files changed, 27 insertions(+), 63 deletions(-) delete mode 100644 android/app/src/pip/AndroidManifest.xml delete mode 100644 android/app/src/pip/ic_launcher-web.png diff --git a/android/app/src/pip/AndroidManifest.xml b/android/app/src/pip/AndroidManifest.xml deleted file mode 100644 index cda80be..0000000 --- a/android/app/src/pip/AndroidManifest.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/android/app/src/pip/ic_launcher-web.png b/android/app/src/pip/ic_launcher-web.png deleted file mode 100644 index fd2adebe3dd59c1ea61f5fcfca4cc578177f7308..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17718 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 { @override saveOption() async { + print(currencies[selectedItem]); await helper.saveCurrency(currencies[selectedItem]); } } \ No newline at end of file diff --git a/lib/screens/purchase.dart b/lib/screens/purchase.dart index df7d04d..5f00967 100644 --- a/lib/screens/purchase.dart +++ b/lib/screens/purchase.dart @@ -192,6 +192,7 @@ class PurchaseScreenState extends BaseState { onPurchaseClick() { String val = _parseSum(controller.text); helper.getCurrency().then((currency) { + print(currency.toString()); showDialog(context: context, child: new AlertDialog( title: new Text(StringsLocalization.confirmation()), content: new Text(StringsLocalization.confirmPurchase(val, currency)), diff --git a/lib/strings.dart b/lib/strings.dart index 464968e..23df707 100644 --- a/lib/strings.dart +++ b/lib/strings.dart @@ -51,9 +51,9 @@ class StringsLocalization { plural = pluralHryvna(); break; case 978: - nominative = nominativeHryvna(); - singular = singularHryvna(); - plural = pluralHryvna(); + nominative = nominativeEuro(); + singular = singularEuro(); + plural = pluralEuro(); break; case 398: nominative = nominativeTenge(); From 4890bb40650bfba0bdb2d3a4cea9c2ab24bc4cef Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Tue, 19 Sep 2017 18:55:34 +0300 Subject: [PATCH 16/24] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8E=20FAQ.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BD=D0=BE=D0=BC=D0=B5=D1=80=D0=B0=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D1=84=D0=BE=D0=BD=D0=BE=D0=B2=20=D0=B8=20url=20?= =?UTF-8?q?=D1=81=D0=B0=D0=B9=D1=82=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/base/base_state.dart | 16 +-- lib/consts.dart | 4 +- lib/i18n/messages_en.dart | 41 +++++++- lib/i18n/messages_es.dart | 5 +- lib/i18n/messages_ru.dart | 43 +++++++- lib/i18n/messages_ua.dart | 45 +++++++- lib/screens/faq.dart | 148 ++++++++++++++------------- lib/screens/finish_registration.dart | 2 +- lib/screens/purchase.dart | 4 +- lib/screens/purchase_success.dart | 2 +- lib/screens/registration.dart | 4 +- lib/strings.dart | 10 ++ 12 files changed, 233 insertions(+), 91 deletions(-) diff --git a/lib/base/base_state.dart b/lib/base/base_state.dart index de584a9..a4a3d10 100644 --- a/lib/base/base_state.dart +++ b/lib/base/base_state.dart @@ -12,6 +12,7 @@ import 'package:checker/db.dart'; abstract class BaseState extends State { + /// Класс для работы с бд. SqliteHelper helper; /// Тип сборки. Определяет, какие брать ресурсы (цвета, картинки) @@ -71,7 +72,8 @@ abstract class BaseState extends State { child: getMenuItem(logout_png, StringsLocalization.logout())) ]; } - )]; + ) + ]; } void onOptionsItemClick(int index) { @@ -90,6 +92,7 @@ abstract class BaseState extends State { } } + /// Возвращает пункт меню (Картинка с текстом) Widget getMenuItem(String image, String text) { return new Row(children: [ new Image.asset(image, width: 28.0, height: 28.0), @@ -102,24 +105,24 @@ abstract class BaseState extends State { double horizontalMargin = 8.0; return new Container(margin: new EdgeInsets.only(top: horizontalMargin, bottom: horizontalMargin, left: verticalMargin, right: verticalMargin), child: new Row(crossAxisAlignment: CrossAxisAlignment.start, - children: [new Text(getHintString(), textAlign: TextAlign.left, + children: [new Text(getHintOrError(), textAlign: TextAlign.left, style: new TextStyle(fontWeight: FontWeight.w300, color: error == null ? greyTextColor : Resources.getPrimaryColor(app), fontSize: 14.0))])); } /// Возвращает подсказку, либо ошибку, если введенные в поле ввода данные неверны. - String getHintString() { + String getHintOrError() { if (dinCode.length == 0 && error == null) { return ' '; } else if (error != null) { return error; } else { - return getHint(); + return getHintString(); } } /// Возвращает текст подсказки для поля ввода. /// Должен быть переопределен на экранах, на которых есть поле ввода. - String getHint() { + String getHintString() { return null; } @@ -199,5 +202,4 @@ abstract class BaseState extends State { Widget wrapButton(EdgeInsets margin, Widget widget) { return new Container(margin: margin, height: buttonHeight, child: new Row(children: [new Expanded(child: widget)])); } - -} +} \ No newline at end of file diff --git a/lib/consts.dart b/lib/consts.dart index 7f3203e..abfe32f 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -3,8 +3,8 @@ import 'package:flutter/material.dart'; // Serious constants const String appName = "PIP"; -const String url = 'https://pos-api-int.dinect.com/20130701/'; -const String appToken = '9fec83cdca38c357e6b65dbb17514cdd36bf2a08'; +const String url = 'https://pos-api.discount.kiev.ua/20130701/'; +const String appToken = 'bdea0f3ba9034b688019a7cac753d1209e2b227f'; // Assets const String logout_png = 'assets/logout.png'; diff --git a/lib/i18n/messages_en.dart b/lib/i18n/messages_en.dart index b0f0bac..a837d23 100644 --- a/lib/i18n/messages_en.dart +++ b/lib/i18n/messages_en.dart @@ -30,6 +30,9 @@ class MessageLookup extends MessageLookupByLibrary { "no" : MessageLookupByLibrary.simpleMessage("No"), "purchase_complite" : MessageLookupByLibrary.simpleMessage("A purchase of %s USD was complite"), "registration" : MessageLookupByLibrary.simpleMessage("Registration"), + "usage" : MessageLookupByLibrary.simpleMessage("Usage"), + "support" : MessageLookupByLibrary.simpleMessage("Support contacts"), + "common" : MessageLookupByLibrary.simpleMessage("General information"), "request_sent_wait_activ" : MessageLookupByLibrary.simpleMessage("The activation request for the application has been sent, wait for confirm activation"), "reward" : MessageLookupByLibrary.simpleMessage("Reward"), "scan" : MessageLookupByLibrary.simpleMessage("Scan"), @@ -46,7 +49,43 @@ class MessageLookup extends MessageLookupByLibrary { "locale" : MessageLookupByLibrary.simpleMessage("Language"), "ruble" : MessageLookupByLibrary.simpleMessage("Ruble"), "dollar" : MessageLookupByLibrary.simpleMessage("Dollar"), - "hryvna" : MessageLookupByLibrary.simpleMessage("Hryvna") + "hryvna" : MessageLookupByLibrary.simpleMessage("Hryvna"), + "registration_guide": MessageLookupByLibrary.simpleMessage(''' +Store log in screen is the first thing you will see after starting the application. +Enter the store number (DIN). You can look it up in the loyalty program control panel. If you do not have access to the control panel, ask the administrator. + +Click the ""Login"" button. + +Please wait while the administrator activates your request. You can refresh your store activation status by pressing the ""Update activation status"" button. + +After the administrator activates your request, click the ""Complete activation"" button. The application is ready to use. + +If you want to log in as another store, click the Menu button (upper right corner of the screen) and select "Exit". +'''), + "usage_guide": MessageLookupByLibrary.simpleMessage(''' +Step 1: + +Launch this application and scan your customer's loyalty card using the built in scanner. + +If the scan is successful, the customer's information will appear on the screen. + +Step 2: + +Enter the purchase amount and click the ""Create a purchase"" button. + +In a pop-up window press ""YES"" to confirm the amount and allot the points to a customer. + +If you want to correct the amount, press ""NO"" and you will return back to the purchase screen where you can adjust the amount. +'''), + "support_guide": MessageLookupByLibrary.simpleMessage(''' +Always recommend your customers to install your loyalty card app, so they can participate in your loyalty program. + +If you have any problems with the application, feel free to contact the support. + +Phone: %s +Our website: %s'''), + "common_guide": MessageLookupByLibrary.simpleMessage(''' +To improve barcode scanning quality, adjust the distance between the camera and the barcode so that the border around the barcode (if any) is not visible. Otherwise the vertical lines of the border could be wrongly considered as part of the code.''') }; } diff --git a/lib/i18n/messages_es.dart b/lib/i18n/messages_es.dart index 6de7bf2..7a51443 100644 --- a/lib/i18n/messages_es.dart +++ b/lib/i18n/messages_es.dart @@ -46,6 +46,9 @@ class MessageLookup extends MessageLookupByLibrary { "locale" : MessageLookupByLibrary.simpleMessage("La lengua"), "ruble" : MessageLookupByLibrary.simpleMessage("Ruble"), "dollar" : MessageLookupByLibrary.simpleMessage("Dollar"), - "hryvna" : MessageLookupByLibrary.simpleMessage("Hryvna") + "hryvna" : MessageLookupByLibrary.simpleMessage("Hryvna"), + "registration_guide": MessageLookupByLibrary.simpleMessage(''' +Después del inicio de una aplicación móvil usted será movido a la página del registro del negocio. Ponga DIN del negocio (DIN está generada por el sistema en el paso del registro del negocio). +''') }; } diff --git a/lib/i18n/messages_ru.dart b/lib/i18n/messages_ru.dart index 30bde3e..c5d16b1 100644 --- a/lib/i18n/messages_ru.dart +++ b/lib/i18n/messages_ru.dart @@ -30,6 +30,9 @@ class MessageLookup extends MessageLookupByLibrary { "no" : MessageLookupByLibrary.simpleMessage("Нет"), "purchase_complite" : MessageLookupByLibrary.simpleMessage("Покупка на сумму %s %s проведена"), "registration" : MessageLookupByLibrary.simpleMessage("Регистрация"), + "usage" : MessageLookupByLibrary.simpleMessage("Использование"), + "support" : MessageLookupByLibrary.simpleMessage("Контакты поддержки"), + "common" : MessageLookupByLibrary.simpleMessage("Общая информация"), "request_sent_wait_activ" : MessageLookupByLibrary.simpleMessage("Запрос на активацию приложения отправлен, дождитесь подтверждения активации администратором"), "reward" : MessageLookupByLibrary.simpleMessage("Вознаграждение"), "scan" : MessageLookupByLibrary.simpleMessage("Сканировать"), @@ -58,6 +61,44 @@ class MessageLookup extends MessageLookupByLibrary { "plural_tenge": MessageLookupByLibrary.simpleMessage("Тенге"), "nominative_euro": MessageLookupByLibrary.simpleMessage("Евро"), "singular_euro": MessageLookupByLibrary.simpleMessage("Евро"), - "plural_euro": MessageLookupByLibrary.simpleMessage("Евро") + "plural_euro": MessageLookupByLibrary.simpleMessage("Евро"), + "registration_guide": MessageLookupByLibrary.simpleMessage(''' +После запуска приложения вы окажетесь на странице регистрации магазина. + +Введите DIN код магазина (выдается партнером/менеджером International Auto Club, дублируется на почту) + +Кликните по кнопке: «Зарегистрировать» +Дождитесь подтверждение активации программы, кликом по кнопке «Обновите статус активации» обновите статус. + +После подтверждения запроса на активацию программы Партнером/менеджером кликните по кнопке «Завершить регистрацию», приложение готово к использованию. + +При желании изменить номер кассы, необходимо кликнуть на «значок» верхнем правом углу и вернуться на шаг регистрации. +'''), + "usage_guide": MessageLookupByLibrary.simpleMessage(''' +Шаг 1: + +Запустите прилодение для сканирования карты участника системы лояльности. + +При успешном сканировании на вашем экране появятся данные покупателя. + +Шаг 2: + +Введите сумму покупки данного покупателя и нажмите на кнопку «Проведение покупки». + +Во всплывающем окне нажмите ""ДА"", для подтверждения суммы покупки + +Если вы хотите поправить сумму, нажмите «НЕТ» и Вы вернетесь на экран покупки и сможете её скорректировать. +'''), + "support_guide": MessageLookupByLibrary.simpleMessage(''' +Рекомендуйте покупателям установить мобильное приложение дисконтной системы и получайте новых лояльных покупателей. + +При некорректной работе приложения просьба сразу обратиться по телефону нашей технической поддержки. + +Телефон: %s +Наш сайт: %s +'''), + "common_guide": MessageLookupByLibrary.simpleMessage(''' + Для эффективного считывания штрих-кода карты участника системы лояльности необходимо камеру сканера поднести так, чтобы в неё не попадали вертикальные полосы рамки (если она есть). Они расцениваются сканером как часть штрих-кода. +''') }; } diff --git a/lib/i18n/messages_ua.dart b/lib/i18n/messages_ua.dart index 53ccfa3..7b71490 100644 --- a/lib/i18n/messages_ua.dart +++ b/lib/i18n/messages_ua.dart @@ -30,6 +30,9 @@ class MessageLookup extends MessageLookupByLibrary { "no" : MessageLookupByLibrary.simpleMessage("Ні"), "purchase_complite" : MessageLookupByLibrary.simpleMessage("Купівля на суму %s %s проведена"), "registration" : MessageLookupByLibrary.simpleMessage("Реєстрація"), + "usage" : MessageLookupByLibrary.simpleMessage("Використання"), + "support" : MessageLookupByLibrary.simpleMessage("Контакти підтримки"), + "common" : MessageLookupByLibrary.simpleMessage("Загальна інформація"), "request_sent_wait_activ" : MessageLookupByLibrary.simpleMessage("Запит на активацію додатку відправлений, дочекайтеся підтвердження активації адміністратором"), "reward" : MessageLookupByLibrary.simpleMessage("Винагорода"), "scan" : MessageLookupByLibrary.simpleMessage("Сканувати"), @@ -58,6 +61,46 @@ class MessageLookup extends MessageLookupByLibrary { "plural_tenge": MessageLookupByLibrary.simpleMessage("Тенге"), "nominative_euro": MessageLookupByLibrary.simpleMessage("Євро"), "singular_euro": MessageLookupByLibrary.simpleMessage("Євро"), - "plural_euro": MessageLookupByLibrary.simpleMessage("Євро") + "plural_euro": MessageLookupByLibrary.simpleMessage("Євро"), + "registration_guide": MessageLookupByLibrary.simpleMessage(''' +Після запуску програми ви опинитеся на сторінці реєстрації магазина. + +Введіть DIN код магазину (видається при підключенні до системи лояльності) + +Натисніть на кнопку «Зареєструвати» +Дочекайтеся підтвердження активації програми, натисканням на кнопку «Оновлення статус активації» поновіть статус. +     +Після підтвердження запиту на активацію програми Партнером / менеджером клікніть по кнопці «Завершити реєстрацію», додаток готове до використання. + +При бажанні змінити номер каси, необхідно натиснути на кнопку Меню (верхній правий кут екрану) і вибрати "Вихід". +'''), + "usage_guide": MessageLookupByLibrary.simpleMessage(''' +Крок 1: +     +При пред'явленні покупцем картки учасника системи лояльності, запустіть цю програму. + +На екрані з'явиться сканер штрих кодів. Відскануте штрих-код карти сканером. + +При успішному скануванні на вашому екрані з'являться дані покупця. +     +Крок 2: +     +Необхідно ввести суму покупки даного покупця і клікнути на кнопку «Проведення покупки». + +Спливе вікно підтвердження правильності введення суми. У разі правильного введення суми, натисніть «ТАК», сума буде проведена і винагороду буде нараховано учаснику системи лояльності. + +Якщо сума введена з помилкою, натисніть «НІ» і Ви повернетеся на крок введення суми і зможете її скорегувати. +'''), + "support_guide": MessageLookupByLibrary.simpleMessage(''' +Рекомендуйте покупцям встановити мобільний додаток дисконтної системи і отримуйте нових лояльних покупців. + +При некоректній роботі програми прохання відразу звернутися за телефоном нашої технічної підтримки. + +Телефон: %s +Наш сайт: %s" +'''), + "common_guide": MessageLookupByLibrary.simpleMessage(''' +Для ефективного зчитування штрих-коду карти учасника системи лояльності необхідно камеру сканера піднести так, щоб в неї не потрапляли вертикальні смуги рамки. Вони розцінюються сканером як частина штрих-коду. +''') }; } diff --git a/lib/screens/faq.dart b/lib/screens/faq.dart index 9e703be..41e7af4 100644 --- a/lib/screens/faq.dart +++ b/lib/screens/faq.dart @@ -1,9 +1,11 @@ +import 'package:checker/resources.dart'; import 'package:checker/strings.dart'; import 'package:flutter/material.dart'; import 'package:checker/base/base_state.dart'; import 'package:checker/consts.dart'; import 'package:checker/common.dart'; +import 'package:checker/db.dart'; /// Класс содержит заголовки и текст блоков FAQ. class Entry { @@ -13,20 +15,44 @@ class Entry { } class EntryItem extends StatelessWidget { - + const EntryItem(this.entry); final Entry entry; Widget _buildTiles(BuildContext context, Entry root) { EdgeInsets margin = new EdgeInsets.only(left: 20.0, right: 20.0); - TextStyle titleStyle = Theme.of(context).textTheme.button.copyWith(fontWeight: FontWeight.bold, color: faqTitlesColor); - return new Container(margin: margin, child: new Card(child: new ExpansionTile( - key: new PageStorageKey(root), - title:new Text(root.title, style: titleStyle), - children: [new Container(margin: margin, padding: new EdgeInsets.only(top: 12.0, bottom: 20.0), - child: new Text(root.text, style: new TextStyle(fontWeight: FontWeight.w300, color: faqGrey, fontSize: 14.0)), - decoration: new BoxDecoration(border: new Border(top: new BorderSide(color: greyTextColor, width: 0.5))))] - ))); + TextStyle titleStyle = Theme.of(context).textTheme.button.copyWith( + fontWeight: FontWeight.bold, + color: faqTitlesColor); + return new Container(margin: margin, child: new Card( + child: new ExpansionTile( + key: new PageStorageKey(root), + title:new Text( + root.title, + style: titleStyle), + children: [ + new Container( + margin: margin, + padding: new EdgeInsets.only(top: 12.0, bottom: 20.0), + child: new Text( + root.text, + style: new TextStyle( + fontWeight: FontWeight.w300, + color: faqGrey, + fontSize: 14.0) + ), + decoration: new BoxDecoration( + border: new Border( + top: new BorderSide( + color: greyTextColor, + width: 0.5) + ) + ) + ) + ] + ) + ) + ); } @override @@ -46,14 +72,16 @@ class FAQScreen extends StatefulWidget { class FAQScreenState extends BaseState { FAQScreenState(this.returnToScanner); - final bool returnToScanner; - String app; + + bool returnToScanner; + + List data; @override String getTitle() { return StringsLocalization.help(); } - @override String getHint() { + @override String getHintString() { return null; } @@ -62,10 +90,32 @@ class FAQScreenState extends BaseState { platform.invokeMethod('getFlavor').then((flavor) { setState(() { app = flavor; + initPhoneAndUrl(); }); }); } - return new Scaffold(appBar: getAppBar(),body: getScreenContent()); + return new Scaffold(appBar: getAppBar(), body: getScreenContent()); + } + + void initPhoneAndUrl() { + String phone, url; + if (app == 'pip') { + phone = 'Tel: +38 080 030 9997\nTel: +38 044 390 1697'; + url = 'http://discount.kiev.ua/'; + } else if (app == 'autobonus') { + phone = '8-800-234-6064'; + url = 'https://www.auto-club.biz'; + } + initHelp(phone, url); + } + + void initHelp(String phone, String url) { + data = [ + new Entry(StringsLocalization.registration(), StringsLocalization.registrationGuide()), + new Entry(StringsLocalization.usage(), StringsLocalization.usageGuide()), + new Entry(StringsLocalization.support(), StringsLocalization.supportGuide(phone, url)), + new Entry(StringsLocalization.common(), StringsLocalization.commonGuide()) + ]; } @override List getMenuButtons() { @@ -74,71 +124,25 @@ class FAQScreenState extends BaseState { /// Метод возвращает ListView с блоками faq. @override Widget getScreenContent() { - return new WillPopScope(onWillPop: onWillPop, child: new ListView.builder( - itemBuilder: (BuildContext context, int index) => new EntryItem(data[index]), - itemCount: data.length)); + if (data == null) { + return new Container( + decoration: new BoxDecoration( + image: new DecorationImage( + image: new ExactAssetImage(Resources.getSplash(app)), + fit: BoxFit.cover))); + } else { + return new WillPopScope(onWillPop: onWillPop, child: new ListView.builder( + itemBuilder: (BuildContext context, int index) => + new EntryItem(data[index]), + itemCount: data.length)); + } } - onWillPop() { + onWillPop() { if(returnToScanner) { return startScanner(context, app, helper); } else { return true; } } - - /// Список с контентом - final List data = [ - new Entry('РЕГИСТРАЦИЯ', registrationGuide), - new Entry('ИСПОЛЬЗОВАНИЕ', usageGuide), - new Entry('КОНТАКТЫ ПОДДЕРЖКИ', supportGuide), - new Entry('ОБЩАЯ ИНФОРМАЦИЯ', commonGuide) - ]; - - static const String registrationGuide = ''' -После запуска приложения вы окажетесь на странице регистрации магазина. - -Введите DIN код магазина (выдается партнером/менеджером International Auto Club, дублируется на почту) - -Кликните по кнопке: «Зарегистрировать» -Дождитесь подтверждение активации программы, кликом по кнопке «Обновите статус активации» обновите статус. - -После подтверждения запроса на активацию программы Партнером/менеджером кликните по кнопке «Завершить регистрацию», приложение готово к использованию. - -При желании изменить номер кассы, необходимо кликнуть на «значок» верхнем правом углу и вернуться на шаг регистрации. - '''; - - static const String usageGuide = ''' -Действие 1: - -При предъявлении покупателем штрих-кода участника системы лояльности, запустите данное приложение. - -На экране появится сканер штрих кодов. Отсканируйте предъявленный штрих-код сканером. - -При успешном сканировании на вашем экране появятся данные партнера. - -Действие 2: - -Необходимо ввести сумму покупки данного покупателя и кликнуть по кнопке «Зафиксировать». - -Всплывет окно подтверждения правильности ввода суммы». В случае правильного ввода суммы, кликните «ДА», сумма будет проведена и вознаграждение будет начислено участнику системы лояльности. - -Если сумма введена с ошибкой, кликните «НЕТ» и Вы вернетесь на шаг ввода суммы и сможете её скорректировать. - '''; - - static const String supportGuide = ''' -При некорректной работе приложения AUTO BONUS просьба сразу обратиться по телефону нашей технической поддержки: 8-800-234-6064 (звонок бесплатный) и Вас свяжут с менеджером. - -При звонке приготовьтесь назвать ИНН и наименование вашей организации. - -Рекомендуйте покупателям установить мобильное приложение дисконтной системы International Auto Club AUTO CLUB и получайте новых лояльных покупателей. - -Наш сайт https://www.auto-club.biz - '''; - - static const String commonGuide = ''' -Для эффективного считывания штрих-кода участника системы лояльности необходимо камеру сканера поднести так, чтобы в неё не попадали вертикальные полосы рамки. - -Увеличение времени сканирования может произойти из-за черной рамки, в которую помещен штрих-код, так как вертикальные полосы этой рамки расцениваются сканером как часть штрих-кода. - '''; } diff --git a/lib/screens/finish_registration.dart b/lib/screens/finish_registration.dart index 03660c6..7e35bd2 100644 --- a/lib/screens/finish_registration.dart +++ b/lib/screens/finish_registration.dart @@ -42,7 +42,7 @@ class RegistrationScreenState extends BaseState { return StringsLocalization.registration(); } - @override getHint() { + @override getHintString() { return _merchantID; } diff --git a/lib/screens/purchase.dart b/lib/screens/purchase.dart index 5f00967..01952c6 100644 --- a/lib/screens/purchase.dart +++ b/lib/screens/purchase.dart @@ -96,7 +96,7 @@ class PurchaseScreenState extends BaseState { return StringsLocalization.carryingPurchase(); } - @override getHint() { + @override getHintString() { return StringsLocalization.sum(); } @@ -104,7 +104,7 @@ class PurchaseScreenState extends BaseState { return new TextField( keyboardType: TextInputType.number, decoration: new InputDecoration.collapsed( - hintText: getHint(), + hintText: getHintString(), hintStyle: new TextStyle(color: greyTextColor, fontSize: 16.0) ), controller: controller, diff --git a/lib/screens/purchase_success.dart b/lib/screens/purchase_success.dart index 41238fc..043bedc 100644 --- a/lib/screens/purchase_success.dart +++ b/lib/screens/purchase_success.dart @@ -36,7 +36,7 @@ class PurchaseSuccessScreenState extends BaseState { return StringsLocalization.carryingPurchase(); } - @override String getHint() { + @override String getHintString() { return null; } diff --git a/lib/screens/registration.dart b/lib/screens/registration.dart index 9b62eb5..12996c9 100644 --- a/lib/screens/registration.dart +++ b/lib/screens/registration.dart @@ -35,7 +35,7 @@ class RegistrationScreenState extends BaseState { return StringsLocalization.registration(); } - @override getHint() { + @override getHintString() { return StringsLocalization.idStore(); } @@ -54,7 +54,7 @@ class RegistrationScreenState extends BaseState { @override getTextWidget() { return new TextField(keyboardType: TextInputType.number, - decoration: new InputDecoration.collapsed(hintText: getHint(), + decoration: new InputDecoration.collapsed(hintText: getHintString(), hintStyle: new TextStyle(color: greyTextColor, fontSize: 16.0)), onChanged: (text) => handleUserInput(text)); } diff --git a/lib/strings.dart b/lib/strings.dart index 23df707..eb27faf 100644 --- a/lib/strings.dart +++ b/lib/strings.dart @@ -78,6 +78,9 @@ class StringsLocalization { } static String registration() => Intl.message('registration', name: 'registration', locale: Intl.defaultLocale); + static String usage() => Intl.message('usage', name: 'usage', locale: Intl.defaultLocale); + static String support() => Intl.message('support', name: 'support', locale: Intl.defaultLocale); + static String common() => Intl.message('common', name: 'common', locale: Intl.defaultLocale); static String idStore() => Intl.message('ID_Store', name: 'ID_Store', locale: Intl.defaultLocale); static String signUp() => Intl.message('sign_up', name: 'sign_up', locale: Intl.defaultLocale); static String specifyDinStore() => Intl.message('specify_din_store', name: 'specify_din_store', locale: Intl.defaultLocale); @@ -126,4 +129,11 @@ class StringsLocalization { static String singularTenge() => Intl.message('singular_tenge', name: 'singular_tenge', locale: Intl.defaultLocale); static String pluralTenge() => Intl.message('plural_tenge', name: 'plural_tenge', locale: Intl.defaultLocale); + static String registrationGuide() => Intl.message('registration_guide', name: 'registration_guide', locale: Intl.defaultLocale); + static String usageGuide() => Intl.message('usage_guide', name: 'usage_guide', locale: Intl.defaultLocale); + static String commonGuide() => Intl.message('common_guide', name: 'common_guide', locale: Intl.defaultLocale); + + static String supportGuide(String phone, String url) { + return sprintf(Intl.message('support_guide', name: 'support_guide', locale: Intl.defaultLocale), [phone, url]); + } } \ No newline at end of file From 8936fd1c011e49bf42cad0cf5eaac0c591c2f589 Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Wed, 20 Sep 2017 11:04:45 +0300 Subject: [PATCH 17/24] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8E=20faq?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/src/main/AndroidManifest.xml | 2 +- lib/consts.dart | 7 +++++-- lib/i18n/messages_en.dart | 4 ++-- lib/i18n/messages_ru.dart | 4 ++-- lib/i18n/messages_ua.dart | 4 ++-- lib/screens/faq.dart | 2 +- 6 files changed, 13 insertions(+), 10 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 069c9d3..f28fddb 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="1.0.5"> extends BaseState { void initPhoneAndUrl() { String phone, url; if (app == 'pip') { - phone = 'Tel: +38 080 030 9997\nTel: +38 044 390 1697'; + phone = '+38 080 030 9997\n+38 044 390 1697'; url = 'http://discount.kiev.ua/'; } else if (app == 'autobonus') { phone = '8-800-234-6064'; From e89b7f4005815082f3899dd6f99d70647c3ce4b4 Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Wed, 20 Sep 2017 15:35:58 +0300 Subject: [PATCH 18/24] =?UTF-8?q?RG-3445=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D1=80=D1=83=D1=87=D0=BD=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=B2=D0=B2=D0=BE=D0=B4=20=D0=BA=D0=BE=D0=B4=D0=B0=20=D1=81=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=80=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../checker/AbstractScannerActivity.java | 209 ++++-------------- .../java/com/dinect/checker/MainActivity.java | 146 ++++++------ .../main/java/com/dinect/checker/Utils.java | 7 +- .../com/dinect/checker/net/ApiClient.java | 2 +- .../net/DinectAuthorizationInterceptor.java | 4 +- .../dinect/checker/zbar/CameraActivity.java | 9 +- .../dinect/checker/zxing/ScannerActivity.java | 8 +- .../{activity_zbar_scanner.xml => a_zbar.xml} | 6 +- ...activity_zxing_scanner.xml => a_zxing.xml} | 6 +- .../src/main/res/layout/v_custom_toolbar.xml | 21 ++ .../app/src/main/res/values-ru/strings.xml | 3 +- lib/consts.dart | 8 +- 12 files changed, 165 insertions(+), 264 deletions(-) rename android/app/src/main/res/layout/{activity_zbar_scanner.xml => a_zbar.xml} (88%) rename android/app/src/main/res/layout/{activity_zxing_scanner.xml => a_zxing.xml} (72%) create mode 100644 android/app/src/main/res/layout/v_custom_toolbar.xml 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 9356c71..c66ee95 100644 --- a/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java +++ b/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java @@ -23,21 +23,22 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Bundle; -import android.os.Handler; import android.support.annotation.NonNull; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; import android.util.Log; import android.util.Pair; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.Window; +import android.widget.EditText; import android.widget.FrameLayout; -import android.widget.Toast; import android.widget.TextView; -import android.support.v7.widget.Toolbar; +import android.widget.Toast; import com.dinect.checker.net.ApiClient; @@ -45,8 +46,6 @@ import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; -import static android.app.Activity.RESULT_OK; - /** * Created by anonymous @@ -56,26 +55,14 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { private final static String TAG = "Checker.ScannerActivity"; - private static final String[] CLICK_MESSAGES = { - "Там ничего нет.", - "Зачем ты это делаешь?", - "Перестань!", - "Ну и зачем?..", - }; - - private final AtomicInteger counter = new AtomicInteger(0); - private int mColor; + private int counter; public static final String SCAN_MODES = "SCAN_MODES"; public static final String ERROR_INFO = "ERROR_INFO"; - - protected AppCompatActivity ctx; protected ApiClient apiClient; protected NetworkThread networkThread; - protected DecrementCounterThread counterThread; protected LogoutDialogFragment logoutDialog; - protected NotificationThread notificationThread; boolean isCameraAvailable() { Log.d(TAG, "isCameraAvailable"); @@ -88,7 +75,6 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { final Intent response = new Intent(); response.putExtra(ERROR_INFO, message); setResult(RESULT_CANCELED, response); - notificationThread = null; } /** @@ -105,9 +91,6 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { cancelRequest("Camera unavailable"); return false; } - ctx = this; - notificationThread = new NotificationThread(this); - notificationThread.start(); // Hide the window title. requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(layoutID); @@ -117,120 +100,65 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { /** * Configure toolbar of app */ - protected final void initToolbar(final int toolbarId, final @NonNull String title) { - Log.d(TAG, "initToolbar"); - final Toolbar toolbar = (Toolbar) findViewById(toolbarId); - mColor = (int) getIntent().getLongExtra(MainActivity.PREF_APP_BAR_COLOR, 0xffffff); - toolbar.setBackgroundColor(mColor); + protected final void initToolbar(Intent intent) { + + final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + toolbar.setBackgroundColor((int) intent.getLongExtra(MainActivity.PREF_APP_BAR_COLOR, 0xffffff)); setSupportActionBar(toolbar); final ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { - actionBar.setTitle(title); + actionBar.setTitle(null); actionBar.setDisplayHomeAsUpEnabled(false); } + + initManualInput(); setupSecretClickHandler(toolbar); } - private void setupSecretClickHandler(final @NonNull Toolbar toolbar) { + private void initManualInput() { + EditText manualInput = (EditText) findViewById(R.id.manual_input); + + + manualInput.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + handleBarcode(v.getText().toString()); + return false; + } + }); + + } + + private void setupSecretClickHandler(final @NonNull View toolbar) { // Configure increment handler - counterThread = new DecrementCounterThread(counter, 700L); toolbar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - String toastMessage = null; - switch (counter.incrementAndGet()) { - case 1: - if (false == counterThread.isRunning()) { - counterThread.start(); - } - break; - case 5: - toastMessage = CLICK_MESSAGES[0]; - break; - case 11: - toastMessage = CLICK_MESSAGES[1]; - break; - case 17: - toastMessage = CLICK_MESSAGES[2]; - break; - case 23: - toastMessage = null; - counterThread.pause(); - Toast.makeText(ctx, CLICK_MESSAGES[3], Toast.LENGTH_SHORT).show(); - switchScanner(); - break; - } - Log.d(TAG, "toolbar clicked " + counter.get() + " times"); - - if (null != toastMessage) { - notificationThread.addMessage(toastMessage); + if (counter == 15) { + switchScanner(); + } else { + counter++; } + Log.d(TAG, "toolbar clicked " + counter + " times"); } }); } - - private class DecrementCounterThread extends Thread { - final long delay; - final AtomicInteger counter; - private boolean running = false; - private int previous = 0; - - public DecrementCounterThread(final AtomicInteger counter, final long delay) { - // Configure decrement handler - Log.d(TAG, "setupSecretClickHandler: DecrementCounterThread()"); - this.counter = counter; - this.delay = delay; - } - - @Override - public void run() { - running = true; - while (running) { - try { - Thread.sleep(delay); - if (counter.get() > 0) { - if (previous > counter.get()) { - previous = counter.decrementAndGet(); - Log.d(TAG, "decrement counter, now " + counter.get()); - } else { - previous = counter.get(); - } - } - } catch (final IllegalArgumentException | InterruptedException e) { - Log.d(TAG, "disable counter decrease Thread", e); - } - } - } - - public boolean isRunning() { - return running; - } - - public void pause() { - Log.d(TAG, "pause decrementer"); - running = false; - } - } - private void switchScanner() { - final SharedPreferences prefs = getSharedPreferences("MainActivity", Context.MODE_PRIVATE); - int idx = prefs.getInt(MainActivity.SCANNER_BACKEND_KEY, 0); - Log.d(TAG, "current scanner backend " + idx + ", " + MainActivity.SCANNER_BACKEND[idx].toString()); - if (idx >= MainActivity.SCANNER_BACKEND.length - 1) { - idx = 0; - } else { - idx++; - } + final SharedPreferences prefs = getSharedPreferences("scanner", Context.MODE_PRIVATE); + + int idx = (prefs.getInt(MainActivity.SCANNER_BACKEND_KEY, 0) == MainActivity.ZXING) + ? MainActivity.ZBAR + : MainActivity.ZXING; + Log.d(TAG, "switch to scanner backend " + idx + ", " + MainActivity.SCANNER_BACKEND[idx].toString()); prefs.edit().putInt(MainActivity.SCANNER_BACKEND_KEY, idx).apply(); - final Intent response = new Intent(); - response.putExtra("item", "restartScanner"); cancelRequest("Scanner backend changed"); + setResult(RESULT_OK); finish(); } @@ -270,7 +198,6 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { */ public void handleBarcode(final @NonNull String card) { Log.d(TAG, "handleBarcode"); - notificationThread.addMessage(card); networkThread = new NetworkThread(this, apiClient); networkThread.card(card).start(); } @@ -284,12 +211,7 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { intent.putExtra("card", result.first); setResult(RESULT_OK, intent); networkThread.cancel(); - notificationThread.cancel(); finish(); - } else { - if (null != result.second) { - notificationThread.addMessage(result.second); - } } } @@ -316,7 +238,8 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { finish(); return true; } else if (item.getItemId() == R.id.logout) { - logoutDialog = LogoutDialogFragment.newInstance(mColor); + int color = (int) getIntent().getLongExtra(MainActivity.PREF_APP_BAR_COLOR, 0xffffff); + logoutDialog = LogoutDialogFragment.newInstance(color); logoutDialog.show(getFragmentManager(), "logout"); return true; } else if (item.getItemId() == R.id.faq) { @@ -382,54 +305,4 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { return builder.create(); } } - - private class NotificationThread extends Thread { - - private final static int MAX_NOTIFICATION_MESSAGES = 2; - - private boolean run = true; - private final Queue queue; - private final AbstractScannerActivity ctx; - - public NotificationThread(final @NonNull AbstractScannerActivity ctx) { - this.queue = new ArrayBlockingQueue<>(MAX_NOTIFICATION_MESSAGES); - this.ctx = ctx; - } - - @Override - public void run() { - while (run) { - if (null != queue.peek()) { - Log.d(TAG, "null != queue.peek()"); - final String message = queue.poll(); - Log.d(TAG, "message: " + message); - if (null != message) { - runOnUiThread(new Runnable() { - @Override - public void run() { - Toast.makeText(ctx, message, Toast.LENGTH_SHORT).show(); - } - }); - } - } - try { - Thread.sleep(300); - } catch (final InterruptedException ie) { - run = false; - } - } - } - - public void addMessage(final @NonNull String message) { - if (queue.size() == MAX_NOTIFICATION_MESSAGES) { - Log.d(TAG, "Discard message: " + queue.poll()); - } - queue.add(message); - Log.d(TAG, "Add message: " + message); - } - - public void cancel() { - run = false; - } - } } 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 9640d79..a4b5977 100644 --- a/android/app/src/main/java/com/dinect/checker/MainActivity.java +++ b/android/app/src/main/java/com/dinect/checker/MainActivity.java @@ -1,28 +1,28 @@ package com.dinect.checker; -import android.os.Bundle; -import android.content.Intent; -import android.util.Log; -import android.widget.Toast; import android.content.Context; -import android.content.SharedPreferences; +import android.content.Intent; import android.content.res.Configuration; import android.content.res.Resources; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.Bundle; +import android.util.Log; +import android.widget.Toast; + import com.dinect.checker.zbar.CameraActivity; import com.dinect.checker.zxing.ScannerActivity; + +import java.util.ArrayList; import java.util.Locale; +import java.util.Map; import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; - -import java.util.Map; -import java.util.ArrayList; -import java.lang.System; -import java.util.Set; +import io.flutter.plugins.GeneratedPluginRegistrant; public class MainActivity extends FlutterActivity { @@ -35,88 +35,98 @@ public class MainActivity extends FlutterActivity { 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; + public static final int ZBAR = 1; + static final Class[] SCANNER_BACKEND = { ScannerActivity.class, CameraActivity.class, }; + static final String SCANNER_BACKEND_KEY = "scanner_backend_idx"; private MethodChannel mChannel; - private SharedPreferences mPreferences; + private Map mScannerArgs; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GeneratedPluginRegistrant.registerWith(this); initLocale(this); - mPreferences = getPreferences(Context.MODE_PRIVATE); - mChannel = new MethodChannel(getFlutterView(), "com.dinect.checker/instance_id"); mChannel.setMethodCallHandler( new MethodCallHandler() { @Override public void onMethodCall(MethodCall call, Result result) { - switch (call.method) { - - case "getLocale": - result.success(BuildConfig.locale); - break; - - case "getFlavor": - result.success(BuildConfig.flavor); - break; - - case "getCurrency": - result.success(BuildConfig.currency); - break; - - case "startScanner": - final Map arguments = call.arguments(); - final int idx = mPreferences.getInt(SCANNER_BACKEND_KEY, 0); - Log.d(TAG, "use " + SCANNER_BACKEND[idx].toString() + " backend, with idx = " + idx); - Intent cameraIntent = new Intent(MainActivity.this, SCANNER_BACKEND[idx]); - cameraIntent.putExtra(PREF_API_URL, (String) arguments.get("url")); - cameraIntent.putExtra(PREF_APP_TOKEN, (String) arguments.get("appToken")); - cameraIntent.putExtra(PREF_POS_TOKEN, (String) arguments.get("token")); - cameraIntent.putExtra(PREF_APP_BAR_COLOR, (Long) arguments.get("color")); - startActivityForResult(cameraIntent, START_SCANNER_REQUEST_CODE); - break; - - case "isOnline": - boolean online = Utils.isOnline(MainActivity.this); - if (!online) { - Toast.makeText(MainActivity.this, "Проверьте интернет соединение", Toast.LENGTH_SHORT).show(); - } - result.success(online); - break; - - default: - result.notImplemented(); - break; - } + callMethod(call, result); } }); } + private void callMethod(MethodCall call, Result result) { + switch (call.method) { + case "getLocale": + result.success(BuildConfig.locale); + break; + case "getFlavor": + result.success(BuildConfig.flavor); + break; + case "getCurrency": + result.success(BuildConfig.currency); + break; + case "startScanner": + mScannerArgs = call.arguments(); + startScannerActivity(); + break; + case "isOnline": + checkInternetConnection(result); + break; + default: + result.notImplemented(); + break; + } + } + + private void checkInternetConnection(Result result) { + boolean connected = Utils.isOnline(this); + if (!connected) + Toast.makeText(this, "Проверьте интернет соединение", Toast.LENGTH_SHORT).show(); + result.success(connected); + } + + private void startScannerActivity() { + final int idx = getSharedPreferences("scanner", Context.MODE_PRIVATE).getInt(SCANNER_BACKEND_KEY, 0); + Intent cameraIntent = new Intent(MainActivity.this, SCANNER_BACKEND[idx]); + cameraIntent.putExtra(PREF_API_URL, (String) mScannerArgs.get("url")); + cameraIntent.putExtra(PREF_APP_TOKEN, (String) mScannerArgs.get("appToken")); + cameraIntent.putExtra(PREF_POS_TOKEN, (String) mScannerArgs.get("token")); + cameraIntent.putExtra(PREF_APP_BAR_COLOR, (Long) mScannerArgs.get("color")); + startActivityForResult(cameraIntent, START_SCANNER_REQUEST_CODE); + } + @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == START_SCANNER_REQUEST_CODE && resultCode == RESULT_CANCELED) { - finish(); - } else if (requestCode == START_SCANNER_REQUEST_CODE && resultCode == RESULT_OK) { - if (data != null) { - String user = data.getExtras().getString("user", null); - if (user != null) { - String card = data.getExtras().getString("card", null); - ArrayList args = new ArrayList<>(2); - args.add(user); - args.add(card); - mChannel.invokeMethod("purchase", args); - } else { - String menuItem = data.getExtras().getString("item", null); - Log.d(TAG, menuItem); - if (menuItem != null) { - mChannel.invokeMethod(menuItem, null); + if (requestCode == START_SCANNER_REQUEST_CODE) { + if (resultCode == RESULT_CANCELED) { + finish(); + } else if (resultCode == RESULT_OK) { + if (data != null) { + String user = data.getExtras().getString("user", null); + if (user != null) { + String card = data.getExtras().getString("card", null); + ArrayList args = new ArrayList<>(2); + args.add(user); + args.add(card); + mChannel.invokeMethod("purchase", args); + } else { + String menuItem = data.getExtras().getString("item", null); + Log.d(TAG, menuItem); + if (menuItem != null) { + mChannel.invokeMethod(menuItem, null); + } } + } else { + startScannerActivity(); } } } diff --git a/android/app/src/main/java/com/dinect/checker/Utils.java b/android/app/src/main/java/com/dinect/checker/Utils.java index b4987f2..5175eeb 100644 --- a/android/app/src/main/java/com/dinect/checker/Utils.java +++ b/android/app/src/main/java/com/dinect/checker/Utils.java @@ -11,8 +11,11 @@ public class Utils { } public static boolean isOnline(Context context) { - ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo netInfo = cm.getActiveNetworkInfo(); + NetworkInfo netInfo = getConnectivityManager(context).getActiveNetworkInfo(); return netInfo != null && netInfo.isConnected(); } + + private static ConnectivityManager getConnectivityManager(Context context) { + return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + } } \ No newline at end of file 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 3ea5cbb..4768d82 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 @@ -93,7 +93,7 @@ public final class ApiClient { 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)); + 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); diff --git a/android/app/src/main/java/com/dinect/checker/net/DinectAuthorizationInterceptor.java b/android/app/src/main/java/com/dinect/checker/net/DinectAuthorizationInterceptor.java index 9d39896..edc4588 100644 --- a/android/app/src/main/java/com/dinect/checker/net/DinectAuthorizationInterceptor.java +++ b/android/app/src/main/java/com/dinect/checker/net/DinectAuthorizationInterceptor.java @@ -79,8 +79,6 @@ public final class DinectAuthorizationInterceptor implements Interceptor { } final Request request = requestBuilder.url(url).headers(headers).build(); - final Response response = chain.proceed(request); - - return response; + return chain.proceed(request); } } \ No newline at end of file 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 93860b8..5c85711 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 @@ -1,12 +1,12 @@ package com.dinect.checker.zbar; import android.content.Intent; -import android.content.pm.PackageManager; import android.hardware.Camera; import android.os.Bundle; import android.os.Handler; import android.text.TextUtils; import android.view.View; +import android.widget.EditText; import android.widget.Toast; import com.dinect.checker.AbstractScannerActivity; @@ -19,7 +19,8 @@ import net.sourceforge.zbar.ImageScanner; import net.sourceforge.zbar.Symbol; import net.sourceforge.zbar.SymbolSet; -public class CameraActivity extends AbstractScannerActivity implements Camera.PreviewCallback { +public class CameraActivity extends AbstractScannerActivity implements + Camera.PreviewCallback { public static final String ERROR_INFO = "ERROR_INFO"; @@ -39,12 +40,12 @@ public class CameraActivity extends AbstractScannerActivity implements Camera.Pr public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (!init(R.layout.activity_zbar_scanner)) { + if (!init(R.layout.a_zbar)) { return; } initNetwork(getIntent()); - initToolbar(R.id.toolbar, getString(R.string.scanner_title)); + 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 16d2680..6562aee 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,8 +17,8 @@ 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; import com.dinect.checker.AbstractScannerActivity; import com.dinect.checker.R; @@ -42,11 +42,13 @@ public class ScannerActivity extends AbstractScannerActivity @Override public void onCreate(Bundle state) { super.onCreate(state); - if (!init(R.layout.activity_zxing_scanner)) { + + if (!init(R.layout.a_zxing)) { return; } + initNetwork(getIntent()); - initToolbar(R.id.zxingToolbar, getString(R.string.scanner_title)); + initToolbar(getIntent()); scannerView = (ZXingScannerView) initScanner(); ArrayList formats = new ArrayList<>(); diff --git a/android/app/src/main/res/layout/activity_zbar_scanner.xml b/android/app/src/main/res/layout/a_zbar.xml similarity index 88% rename from android/app/src/main/res/layout/activity_zbar_scanner.xml rename to android/app/src/main/res/layout/a_zbar.xml index f23117d..0fb2abb 100644 --- a/android/app/src/main/res/layout/activity_zbar_scanner.xml +++ b/android/app/src/main/res/layout/a_zbar.xml @@ -41,11 +41,7 @@ android:layout_marginTop="56dp" android:background="#00ff00" /> - + - + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/values-ru/strings.xml b/android/app/src/main/res/values-ru/strings.xml index dae7ebe..2939cf1 100644 --- a/android/app/src/main/res/values-ru/strings.xml +++ b/android/app/src/main/res/values-ru/strings.xml @@ -1,4 +1,4 @@ - + AutoBonus Сканер карты Сканировать @@ -10,4 +10,5 @@ Да Нет "Идентификатор %s не найден" + Введите штрихкод вручную diff --git a/lib/consts.dart b/lib/consts.dart index f3ee797..7fc89b3 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -3,11 +3,11 @@ import 'package:flutter/material.dart'; // Serious constants const String appName = "Autobonus"; -const String url = 'https://pos-api-autoclub.dinect.com/20130701/'; -const String appToken = 'bdea0f3ba9034b688019a7cac753d1209e2b227f'; +//const String url = 'https://pos-api-autoclub.dinect.com/20130701/'; +//const String appToken = 'bdea0f3ba9034b688019a7cac753d1209e2b227f'; -//const String url = 'https://pos-api-int.dinect.com/20130701/'; -//const String appToken = '9fec83cdca38c357e6b65dbb17514cdd36bf2a08'; +const String url = 'https://pos-api-int.dinect.com/20130701/'; +const String appToken = '9fec83cdca38c357e6b65dbb17514cdd36bf2a08'; // Assets const String logout_png = 'assets/logout.png'; From a56839dca47c0944d09999e39441ad52373163b9 Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Wed, 20 Sep 2017 18:21:18 +0300 Subject: [PATCH 19/24] 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 From 912aa2248fb198f1aac53e23fe819914619d1bd1 Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Wed, 20 Sep 2017 18:54:39 +0300 Subject: [PATCH 20/24] =?UTF-8?q?RG-3443=20=D0=AD=D0=BA=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA=20=D0=BB?= =?UTF-8?q?=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/common.dart | 7 ++++--- lib/consts.dart | 9 +-------- lib/db.dart | 8 ++++++-- lib/screens/currencies.dart | 1 - lib/screens/languages.dart | 28 +++++++++++++++++++++------- lib/screens/settings.dart | 25 +++++++++++++++++-------- 6 files changed, 49 insertions(+), 29 deletions(-) diff --git a/lib/common.dart b/lib/common.dart index e199db1..a63745a 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -156,8 +156,9 @@ getCurrencyTitle(int code) { getLocaleTitle(String code) { switch(code) { - case 'ru': return languages[0]; - case 'en': return languages[1]; - case 'ua': return languages[2]; + case 'ru': return 'Русский'; + case 'en': return 'English'; + case 'ua': return 'Український'; + case 'es': return 'Español'; } } \ No newline at end of file diff --git a/lib/consts.dart b/lib/consts.dart index 7fc89b3..375476d 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -34,11 +34,4 @@ const Color inputFieldBackground = const Color(0xffefefef); // Dimens const double verticalMargin = 28.0; const double buttonHeight = 48.0; -const double iconHeight = 20.0; - -List languages = const [ - 'Русский', - 'English', - 'Український', - 'Español' -]; \ No newline at end of file +const double iconHeight = 20.0; \ No newline at end of file diff --git a/lib/db.dart b/lib/db.dart index 6996c57..39ceb20 100644 --- a/lib/db.dart +++ b/lib/db.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:io'; +import 'dart:ui'; import 'package:path/path.dart'; import 'package:sqflite/sqflite.dart'; @@ -110,15 +111,18 @@ class SqliteHelper { return locale; } + Future saveLocale(String locale) async { + db.update(tableSettings, {columnLocale: locale}); + } + Future getCurrency() async { Map settings = await selectAll(tableSettings); int currency = settings != null ? settings[columnCurrency] : null; return currency; } - Future saveCurrency(int currency) async { + Future saveCurrency(int currency) async { db.update(tableSettings, {columnCurrency: currency}); - return currency; } Future selectAll(String table) async { diff --git a/lib/screens/currencies.dart b/lib/screens/currencies.dart index 16c4986..83b5b9a 100644 --- a/lib/screens/currencies.dart +++ b/lib/screens/currencies.dart @@ -48,7 +48,6 @@ class _CurrenciesState extends SettingsBaseState { @override saveOption() async { - print(currencies[selectedItem]); await helper.saveCurrency(currencies[selectedItem]); } } \ No newline at end of file diff --git a/lib/screens/languages.dart b/lib/screens/languages.dart index 3978a68..16578ca 100644 --- a/lib/screens/languages.dart +++ b/lib/screens/languages.dart @@ -1,16 +1,16 @@ +import 'package:checker/base/base_screen.dart'; import 'package:checker/base/settings_base_state.dart'; import 'package:checker/db.dart'; import 'package:flutter/material.dart'; import 'package:checker/consts.dart'; import 'package:checker/strings.dart'; import 'package:checker/common.dart'; +import 'package:intl/intl.dart'; -class LanguagesScreen extends StatefulWidget { +class LanguagesScreen extends BaseScreen { - final SqliteHelper helper; - final String app; + LanguagesScreen(helper, app) : super(helper, app); - LanguagesScreen(this.helper, this.app); @override State createState() => new LanguagesState(helper, app); } @@ -18,10 +18,18 @@ class LanguagesState extends SettingsBaseState { LanguagesState(SqliteHelper helper, String app) : super(helper, app); + List languages = const ['ru', 'en', 'ua', 'es']; @override List getOptions() { - return languages; + + List list = new List(); + + for (String code in languages) { + list.add(getLocaleTitle(code)); + } + + return list; } @override @@ -30,8 +38,14 @@ class LanguagesState extends SettingsBaseState { } @override - void saveOption() { -// helper.sa(languages[selectedItem]); + saveOption() async { + await helper.saveLocale(languages[selectedItem]); + Intl.defaultLocale = languages[selectedItem]; + StringsLocalization.load(languages[selectedItem]).then((_) { + setState(() { + + }); + }); } @override diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index 2e49bc0..9a528a2 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -6,6 +6,7 @@ import 'package:checker/common.dart'; import 'package:checker/consts.dart'; import 'package:checker/db.dart'; import 'package:checker/screens/currencies.dart'; +import 'package:checker/screens/languages.dart'; import 'package:checker/strings.dart'; import 'package:flutter/material.dart'; @@ -28,7 +29,10 @@ class MenuItem { class SettingsState extends BaseState { - List menuItems = [new MenuItem(StringsLocalization.currency(), '')]; + List menuItems = [ + new MenuItem(StringsLocalization.currency(), ''), + new MenuItem(StringsLocalization.locale(), '') + ]; bool returnToScanner; @@ -44,6 +48,7 @@ class SettingsState extends BaseState { if (menuItems[0].selectedValue != info['currency'].toString()) { setState(() { menuItems[0].selectedValue = info['currency'].toString(); + menuItems[1].selectedValue = info['locale'].toString(); }); } } @@ -67,26 +72,28 @@ class SettingsState extends BaseState { List getSettings() { List widgets = new List(); - for (MenuItem item in menuItems) { - if (item.selectedValue != '') { - widgets.add(getSettingsItem(item)); + for (int i = 0; i < menuItems.length; i++) { + if (menuItems[i].selectedValue != '') { + widgets.add(getSettingsItem(() => onPressed(menuItems.indexOf(menuItems[i])), + menuItems[i].title, + i == 0 ? getCurrencyTitle(int.parse(menuItems[i].selectedValue)) : getLocaleTitle(menuItems[i].selectedValue))); } } return widgets; } - Widget getSettingsItem(MenuItem item) { + Widget getSettingsItem(VoidCallback onPressed, String title, String value) { return new Container( height: 56.0, padding: new EdgeInsets.only(left: 8.0), child: (new FlatButton( - onPressed: () => onPressed(menuItems.indexOf(item)), + onPressed: onPressed, child: new Row(children: [ - new Expanded(child: new Text(item.title, style: new TextStyle( + new Expanded(child: new Text(title, style: new TextStyle( fontWeight: FontWeight.w600, color: faqGrey, fontSize: 14.0))), - new Text(getCurrencyTitle(int.parse(item.selectedValue)), + new Text(value, style: new TextStyle( fontWeight: FontWeight.w400, color: faqGrey, @@ -99,6 +106,8 @@ class SettingsState extends BaseState { switch (position) { case 0 : return pushRoute(context, new CurrenciesScreen(helper, app)); + case 1 : + return pushRoute(context, new LanguagesScreen(helper, app)); } } From 78fe8f01bda66c0646f250e131f35908cacb75f0 Mon Sep 17 00:00:00 2001 From: kifio Date: Thu, 21 Sep 2017 09:11:48 +0300 Subject: [PATCH 21/24] RG-3444 --- android/app/build.gradle | 6 +- .../checker/AbstractScannerActivity.java | 2 +- .../java/com/dinect/checker/MainActivity.java | 39 +++++------- .../app/src/main/res/values-ua/strings.xml | 2 +- android/app/src/main/res/values/strings.xml | 2 +- ios/Podfile.lock | 33 ++++++++++ ios/Runner.xcodeproj/project.pbxproj | 60 +++++++++++++++++++ .../contents.xcworkspacedata | 3 + lib/base/base_state.dart | 5 +- lib/db.dart | 1 - lib/i18n/messages_en.dart | 15 +++++ lib/i18n/messages_es.dart | 53 +++++++++++++++- lib/screens/currencies.dart | 2 - lib/screens/faq.dart | 23 +++---- lib/screens/languages.dart | 1 - lib/screens/settings.dart | 2 - 16 files changed, 196 insertions(+), 53 deletions(-) create mode 100644 ios/Podfile.lock diff --git a/android/app/build.gradle b/android/app/build.gradle index 973bed0..b1031b6 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -47,7 +47,8 @@ android { buildConfigField "String", "locale", "\"ru\"" buildConfigField "String", "flavor", "\"autobonus\"" buildConfigField "int", "currency", "643" - buildConfigField "String", "support", "\"8-800-234-6064\"" + buildConfigField "String", "supportPhone", "\"8-800-234-6064\"" + buildConfigField "String", "supportUrl", "\"https://www.auto-club.biz\"" } pip { @@ -55,7 +56,8 @@ 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\"" + buildConfigField "String", "supportPhone", "\"+38 080 030 9997\\n+38 044 390 1697\"" + buildConfigField "String", "supportUrl", "\"http://discount.kiev.ua/\"" } } 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 63d323b..3456af7 100644 --- a/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java +++ b/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java @@ -238,7 +238,7 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { 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); + + String.format(getString(R.string.error_contact_support), BuildConfig.supportPhone); Toast.makeText(AbstractScannerActivity.this, message, Toast.LENGTH_SHORT).show(); } }); 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 56c3b53..4a79f26 100644 --- a/android/app/src/main/java/com/dinect/checker/MainActivity.java +++ b/android/app/src/main/java/com/dinect/checker/MainActivity.java @@ -53,7 +53,6 @@ public class MainActivity extends FlutterActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GeneratedPluginRegistrant.registerWith(this); - initLocale(this); mChannel = new MethodChannel(getFlutterView(), "com.dinect.checker/instance_id"); mChannel.setMethodCallHandler( new MethodCallHandler() { @@ -67,7 +66,7 @@ public class MainActivity extends FlutterActivity { private void callMethod(MethodCall call, Result result) { switch (call.method) { case "getLocale": - result.success(BuildConfig.locale); + result.success(Locale.getDefault().getLanguage()); break; case "getFlavor": result.success(BuildConfig.flavor); @@ -82,6 +81,12 @@ public class MainActivity extends FlutterActivity { case "isOnline": checkInternetConnection(result); break; + case "getSupportPhone": + result.success(BuildConfig.supportPhone); + break; + case "getSupportUrl": + result.success(BuildConfig.supportUrl); + break; default: result.notImplemented(); break; @@ -133,28 +138,6 @@ public class MainActivity extends FlutterActivity { } } - public static void initLocale(Context context) { - Resources res = context.getResources(); - Configuration configuration = new Configuration(res.getConfiguration()); - switch (BuildConfig.locale) { - case "en": - configuration.locale = new Locale("en"); - Locale.setDefault(configuration.locale); - res.updateConfiguration(configuration, res.getDisplayMetrics()); - break; - case "ru": - configuration.locale = new Locale("ru"); - Locale.setDefault(configuration.locale); - res.updateConfiguration(configuration, res.getDisplayMetrics()); - break; - case "ua": - configuration.locale = new Locale("ua"); - Locale.setDefault(configuration.locale); - res.updateConfiguration(configuration, res.getDisplayMetrics()); - break; - } - } - public void getFlavor() { } @@ -175,4 +158,12 @@ public class MainActivity extends FlutterActivity { } + public void getSupportPhone() { + + } + + public void getSupportUrl() { + + } + } diff --git a/android/app/src/main/res/values-ua/strings.xml b/android/app/src/main/res/values-ua/strings.xml index 456e511..9a2af0d 100644 --- a/android/app/src/main/res/values-ua/strings.xml +++ b/android/app/src/main/res/values-ua/strings.xml @@ -11,5 +11,5 @@ Ні "Ідентифікатор %s не знайден" Введіть штрихкод вручну - Можете воспользоваться ручным вводом или позвонить на номер:\n%s + Можете скористатися ручним введенням або зателефонувати на номер:\n%s diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 1fdceed..85f4376 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -11,5 +11,5 @@ No "Identifier %s is not found" Enter the barcode manually - Можете воспользоваться ручным вводом или позвонить на номер:\n%s + You can use manual input or call the number:\n%s diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 0000000..24d2c05 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,33 @@ +PODS: + - Flutter (1.0.0) + - FMDB (2.7.2): + - FMDB/standard (= 2.7.2) + - FMDB/standard (2.7.2) + - path_provider (0.0.1): + - Flutter + - sqflite (0.0.1): + - Flutter + - FMDB + +DEPENDENCIES: + - Flutter (from `/Users/kifio/flutter/bin/cache/artifacts/engine/ios`) + - path_provider (from `/Users/kifio/.pub-cache/hosted/pub.dartlang.org/path_provider-0.2.1+1/ios`) + - sqflite (from `/Users/kifio/.pub-cache/hosted/pub.dartlang.org/sqflite-0.2.2/ios`) + +EXTERNAL SOURCES: + Flutter: + :path: /Users/kifio/flutter/bin/cache/artifacts/engine/ios + path_provider: + :path: /Users/kifio/.pub-cache/hosted/pub.dartlang.org/path_provider-0.2.1+1/ios + sqflite: + :path: /Users/kifio/.pub-cache/hosted/pub.dartlang.org/sqflite-0.2.2/ios + +SPEC CHECKSUMS: + Flutter: d674e78c937094a75ac71dd77e921e840bea3dbf + FMDB: 6198a90e7b6900cfc046e6bc0ef6ebb7be9236aa + path_provider: f96fff6166a8867510d2c25fdcc346327cc4b259 + sqflite: 8e2d9fe1e7cdc95d4d537fc7eb2d23c8dc428e3c + +PODFILE CHECKSUM: 351e02e34b831289961ec3558a535cbd2c4965d2 + +COCOAPODS: 1.2.0 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 2490465..7129cd8 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 755861CA44FB15BD2EFD12F7 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 28B464359F9DDCC3EF756D7D /* libPods-Runner.a */; }; 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; @@ -54,6 +55,7 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 28B464359F9DDCC3EF756D7D /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; @@ -120,12 +122,20 @@ 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, BBA9BB5B1F179C320053B6EA /* libzbar.a in Frameworks */, + 755861CA44FB15BD2EFD12F7 /* libPods-Runner.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 578B8FA7D56ACA2E56C02128 /* Pods */ = { + isa = PBXGroup; + children = ( + ); + name = Pods; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -148,6 +158,7 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, BBA9BB001F1786510053B6EA /* Frameworks */, + 578B8FA7D56ACA2E56C02128 /* Pods */, ); sourceTree = ""; }; @@ -195,6 +206,7 @@ BBA9BB351F1792690053B6EA /* CoreMedia.framework */, BBA9BB331F17925F0053B6EA /* CoreGraphics.framework */, BBA9BB311F1792570053B6EA /* AVFoundation.framework */, + 28B464359F9DDCC3EF756D7D /* libPods-Runner.a */, ); name = Frameworks; sourceTree = ""; @@ -270,12 +282,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 586CFDEBE2C82C2A9F7DA22E /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 889CEA9B47E2F8AFF76F6433 /* [CP] Embed Pods Frameworks */, + 1F7C9AAD1A9D38F5484B84D1 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -342,6 +357,21 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 1F7C9AAD1A9D38F5484B84D1 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -356,6 +386,36 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; }; + 586CFDEBE2C82C2A9F7DA22E /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + 889CEA9B47E2F8AFF76F6433 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..21a3cc1 100644 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/lib/base/base_state.dart b/lib/base/base_state.dart index a4a3d10..43356ad 100644 --- a/lib/base/base_state.dart +++ b/lib/base/base_state.dart @@ -1,7 +1,6 @@ import 'package:checker/resources.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:intl/intl.dart'; import 'package:checker/common.dart'; import 'package:checker/consts.dart'; @@ -52,7 +51,9 @@ abstract class BaseState extends State { } AppBar getAppBar() { - return new AppBar(title: new Text(getTitle(), style: new TextStyle(fontSize: 18.0)), + return new AppBar(title: new Container( + margin: new EdgeInsets.only(left: 16.0), + child: new Text(getTitle(), style: new TextStyle(fontSize: 18.0))), backgroundColor: Resources.getPrimaryColor(app), actions: getMenuButtons()); } diff --git a/lib/db.dart b/lib/db.dart index 39ceb20..ffba953 100644 --- a/lib/db.dart +++ b/lib/db.dart @@ -1,6 +1,5 @@ import 'dart:async'; import 'dart:io'; -import 'dart:ui'; import 'package:path/path.dart'; import 'package:sqflite/sqflite.dart'; diff --git a/lib/i18n/messages_en.dart b/lib/i18n/messages_en.dart index 681173e..25512a5 100644 --- a/lib/i18n/messages_en.dart +++ b/lib/i18n/messages_en.dart @@ -50,6 +50,21 @@ class MessageLookup extends MessageLookupByLibrary { "ruble" : MessageLookupByLibrary.simpleMessage("Ruble"), "dollar" : MessageLookupByLibrary.simpleMessage("Dollar"), "hryvna" : MessageLookupByLibrary.simpleMessage("Hryvna"), + "nominative_ruble": MessageLookupByLibrary.simpleMessage("Ruble"), + "singular_ruble": MessageLookupByLibrary.simpleMessage("Ruble"), + "plural_ruble": MessageLookupByLibrary.simpleMessage("Rubles"), + "nominative_dollar": MessageLookupByLibrary.simpleMessage("US Dollar"), + "singular_dollar": MessageLookupByLibrary.simpleMessage("US Dollar"), + "plural_dollar": MessageLookupByLibrary.simpleMessage("US Dollars"), + "nominative_hryvna": MessageLookupByLibrary.simpleMessage("Hryvnia"), + "singular_hryvna": MessageLookupByLibrary.simpleMessage("Hryvnia"), + "plural_hryvna": MessageLookupByLibrary.simpleMessage("Hryvnia"), + "nominative_tenge": MessageLookupByLibrary.simpleMessage("Tenge"), + "singular_tenge": MessageLookupByLibrary.simpleMessage("Tenge"), + "plural_tenge": MessageLookupByLibrary.simpleMessage("Tenge"), + "nominative_euro": MessageLookupByLibrary.simpleMessage("Euro"), + "singular_euro": MessageLookupByLibrary.simpleMessage("Euro"), + "plural_euro": MessageLookupByLibrary.simpleMessage("Euro"), "registration_guide": MessageLookupByLibrary.simpleMessage(''' Store log in screen is the first thing you will see after starting the application. diff --git a/lib/i18n/messages_es.dart b/lib/i18n/messages_es.dart index 7a51443..936def0 100644 --- a/lib/i18n/messages_es.dart +++ b/lib/i18n/messages_es.dart @@ -47,8 +47,57 @@ class MessageLookup extends MessageLookupByLibrary { "ruble" : MessageLookupByLibrary.simpleMessage("Ruble"), "dollar" : MessageLookupByLibrary.simpleMessage("Dollar"), "hryvna" : MessageLookupByLibrary.simpleMessage("Hryvna"), + "nominative_ruble": MessageLookupByLibrary.simpleMessage("Rublo"), + "singular_ruble": MessageLookupByLibrary.simpleMessage("Rublo"), + "plural_ruble": MessageLookupByLibrary.simpleMessage("Rublos"), + "nominative_dollar": MessageLookupByLibrary.simpleMessage("Dólar Dolares"), + "singular_dollar": MessageLookupByLibrary.simpleMessage("Dólar Dolares"), + "plural_dollar": MessageLookupByLibrary.simpleMessage("Dólar Dolares"), + "nominative_hryvna": MessageLookupByLibrary.simpleMessage("Hryvnia"), + "singular_hryvna": MessageLookupByLibrary.simpleMessage("Hryvnia"), + "plural_hryvna": MessageLookupByLibrary.simpleMessage("Hryvnia"), + "nominative_tenge": MessageLookupByLibrary.simpleMessage("Tenge"), + "singular_tenge": MessageLookupByLibrary.simpleMessage("Tenge"), + "plural_tenge": MessageLookupByLibrary.simpleMessage("Tenge"), + "nominative_euro": MessageLookupByLibrary.simpleMessage("Euro"), + "singular_euro": MessageLookupByLibrary.simpleMessage("Euro"), + "plural_euro": MessageLookupByLibrary.simpleMessage("Euro"), "registration_guide": MessageLookupByLibrary.simpleMessage(''' -Después del inicio de una aplicación móvil usted será movido a la página del registro del negocio. Ponga DIN del negocio (DIN está generada por el sistema en el paso del registro del negocio). -''') +Store log in screen is the first thing you will see after starting the application. + +Enter the store number (DIN). You can look it up in the loyalty program control panel. If you do not have access to the control panel, ask the administrator. + +Click the ""Login"" button. + +Please wait while the administrator activates your request. You can refresh your store activation status by pressing the ""Update activation status"" button. + +After the administrator activates your request, click the ""Complete activation"" button. The application is ready to use. + +If you want to log in as another store, click the Menu button (upper right corner of the screen) and select "Exit". +'''), + "usage_guide": MessageLookupByLibrary.simpleMessage(''' +Step 1: + +Launch this application and scan your customer's loyalty card using the built in scanner. + +If the scan is successful, the customer's information will appear on the screen. + +Step 2: + +Enter the purchase amount and click the ""Create a purchase"" button. + +In a pop-up window press ""YES"" to confirm the amount and allot the points to a customer. + +If you want to correct the amount, press ""NO"" and you will return back to the purchase screen where you can adjust the amount. +'''), + "support_guide": MessageLookupByLibrary.simpleMessage(''' +Always recommend your customers to install your loyalty card app, so they can participate in your loyalty program. + +If you have any problems with the application, feel free to contact the support. + +Phone:\n%s\n +Our website:\n%s'''), + "common_guide": MessageLookupByLibrary.simpleMessage(''' +To improve barcode scanning quality, adjust the distance between the camera and the barcode so that the border around the barcode (if any) is not visible. Otherwise the vertical lines of the border could be wrongly considered as part of the code.''') }; } diff --git a/lib/screens/currencies.dart b/lib/screens/currencies.dart index 83b5b9a..d450702 100644 --- a/lib/screens/currencies.dart +++ b/lib/screens/currencies.dart @@ -1,5 +1,3 @@ -import 'dart:async'; - import 'package:checker/base/base_screen.dart'; import 'package:checker/base/settings_base_state.dart'; import 'package:checker/db.dart'; diff --git a/lib/screens/faq.dart b/lib/screens/faq.dart index bc41fdc..a7c2d41 100644 --- a/lib/screens/faq.dart +++ b/lib/screens/faq.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:checker/resources.dart'; import 'package:checker/strings.dart'; import 'package:flutter/material.dart'; @@ -5,7 +7,6 @@ import 'package:flutter/material.dart'; import 'package:checker/base/base_state.dart'; import 'package:checker/consts.dart'; import 'package:checker/common.dart'; -import 'package:checker/db.dart'; /// Класс содержит заголовки и текст блоков FAQ. class Entry { @@ -88,25 +89,19 @@ class FAQScreenState extends BaseState { @override Widget build(BuildContext context) { if (app == null) { platform.invokeMethod('getFlavor').then((flavor) { - setState(() { - app = flavor; - initPhoneAndUrl(); + initPhoneAndUrl().then((_) { + setState(() { + app = flavor; + }); }); }); } return new Scaffold(appBar: getAppBar(), body: getScreenContent()); } - void initPhoneAndUrl() { - String phone, url; - if (app == 'pip') { - phone = '+38 080 030 9997\n+38 044 390 1697'; - url = 'http://discount.kiev.ua/'; - } else if (app == 'autobonus') { - phone = '8-800-234-6064'; - url = 'https://www.auto-club.biz'; - } - initHelp(phone, url); + Future initPhoneAndUrl() async { + initHelp(await platform.invokeMethod('getSupportPhone'), + await platform.invokeMethod('getSupportUrl')); } void initHelp(String phone, String url) { diff --git a/lib/screens/languages.dart b/lib/screens/languages.dart index 16578ca..6401a03 100644 --- a/lib/screens/languages.dart +++ b/lib/screens/languages.dart @@ -2,7 +2,6 @@ import 'package:checker/base/base_screen.dart'; import 'package:checker/base/settings_base_state.dart'; import 'package:checker/db.dart'; import 'package:flutter/material.dart'; -import 'package:checker/consts.dart'; import 'package:checker/strings.dart'; import 'package:checker/common.dart'; import 'package:intl/intl.dart'; diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index 9a528a2..fa624cf 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -1,5 +1,3 @@ -import 'dart:async'; - import 'package:checker/base/base_screen.dart'; import 'package:checker/base/base_state.dart'; import 'package:checker/common.dart'; From eba8c9e642f0d5091b7a1e19dae9ab6e2da2a439 Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Thu, 21 Sep 2017 11:02:33 +0300 Subject: [PATCH 22/24] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=B2=D1=81=D0=B5=20=D0=BF=D1=83=D0=BD=D0=BA=D1=82?= =?UTF-8?q?=D1=8B=20=D0=B8=D0=B7=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/dinect/checker/MainActivity.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) 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 4a79f26..b6f042d 100644 --- a/android/app/src/main/java/com/dinect/checker/MainActivity.java +++ b/android/app/src/main/java/com/dinect/checker/MainActivity.java @@ -15,6 +15,8 @@ import com.dinect.checker.zbar.CameraActivity; import com.dinect.checker.zxing.ScannerActivity; import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Locale; import java.util.Map; @@ -66,7 +68,7 @@ public class MainActivity extends FlutterActivity { private void callMethod(MethodCall call, Result result) { switch (call.method) { case "getLocale": - result.success(Locale.getDefault().getLanguage()); + result.success(getLanguage()); break; case "getFlavor": result.success(BuildConfig.flavor); @@ -93,6 +95,15 @@ public class MainActivity extends FlutterActivity { } } + private String getLanguage() { + List availableLanguages = Arrays.asList("ru", "en"); + if (availableLanguages.contains(Locale.getDefault().getLanguage())) { + return Locale.getDefault().getLanguage(); + } else { + return BuildConfig.locale; + } + } + private void checkInternetConnection(Result result) { boolean connected = Utils.isOnline(this); if (!connected) From afc9cde20d53de4108539bf0f132799694321016 Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Thu, 21 Sep 2017 13:09:38 +0300 Subject: [PATCH 23/24] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=BE=D0=BA=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=20=D0=BD=D0=B0=20=D1=8D=D0=BA=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=20=D1=81=D0=BA=D0=B0=D0=BD=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/src/main/AndroidManifest.xml | 2 +- .../checker/AbstractScannerActivity.java | 2 + .../java/com/dinect/checker/MainActivity.java | 13 +++++ .../dinect/checker/zxing/ScannerActivity.java | 3 -- lib/base/settings_base_state.dart | 6 +-- lib/common.dart | 2 + lib/consts.dart | 8 ++-- lib/db.dart | 1 - lib/i18n/messages_ru.dart | 2 +- lib/screens/languages.dart | 20 ++++---- lib/screens/settings.dart | 28 ++++++----- lib/screens/splash.dart | 47 +++++++++++++------ 12 files changed, 85 insertions(+), 49 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index f28fddb..fd3a3fc 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="1.1.0"> formats = new ArrayList<>(); - formats.add(BarcodeFormat.UPC_EAN_EXTENSION); - scannerView.setFormats(formats); addScanner(scannerView, R.id.zxingRoot); } diff --git a/lib/base/settings_base_state.dart b/lib/base/settings_base_state.dart index 5fc1a62..1ca0aae 100644 --- a/lib/base/settings_base_state.dart +++ b/lib/base/settings_base_state.dart @@ -14,15 +14,13 @@ abstract class SettingsBaseState extends BaseState int selectedItem; @override Widget build(BuildContext context) { - return getMainWidget(); + return new Scaffold(appBar: getAppBar(), + body: getScreenContent()); } @override Widget getScreenContent() { - getSelectedValue(); - - List widgets = new List(); for (String option in getOptions()) { diff --git a/lib/common.dart b/lib/common.dart index a63745a..3a64b8d 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -87,6 +87,7 @@ startScanner(BuildContext context, String app, SqliteHelper helper) async { }); } else { String token = await helper.getToken(); + String locale = await helper.getLocale(); helper.close(); // Канал ловит вызовы методов из "нативной" части приложения. // Могут быть вызваны либо logout либо faq, либо purchase. @@ -119,6 +120,7 @@ startScanner(BuildContext context, String app, SqliteHelper helper) async { 'token': token, 'url': url, 'appToken': appToken, + 'locale': locale, 'color': Resources .getPrimaryColor(app) .value diff --git a/lib/consts.dart b/lib/consts.dart index 375476d..9156fca 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -3,11 +3,11 @@ import 'package:flutter/material.dart'; // Serious constants const String appName = "Autobonus"; -//const String url = 'https://pos-api-autoclub.dinect.com/20130701/'; -//const String appToken = 'bdea0f3ba9034b688019a7cac753d1209e2b227f'; +const String url = 'https://pos-api-autoclub.dinect.com/20130701/'; +const String appToken = 'bdea0f3ba9034b688019a7cac753d1209e2b227f'; -const String url = 'https://pos-api-int.dinect.com/20130701/'; -const String appToken = '9fec83cdca38c357e6b65dbb17514cdd36bf2a08'; +//const String url = 'https://pos-api-int.dinect.com/20130701/'; +//const String appToken = '9fec83cdca38c357e6b65dbb17514cdd36bf2a08'; // Assets const String logout_png = 'assets/logout.png'; diff --git a/lib/db.dart b/lib/db.dart index ffba953..925f774 100644 --- a/lib/db.dart +++ b/lib/db.dart @@ -70,7 +70,6 @@ class SqliteHelper { return null; } else { return db.insert(tableSettings, { - columnLocale: locale, columnCurrency: currency }); } diff --git a/lib/i18n/messages_ru.dart b/lib/i18n/messages_ru.dart index bf7d64f..1981499 100644 --- a/lib/i18n/messages_ru.dart +++ b/lib/i18n/messages_ru.dart @@ -77,7 +77,7 @@ class MessageLookup extends MessageLookupByLibrary { "usage_guide": MessageLookupByLibrary.simpleMessage(''' Шаг 1: -Запустите прилодение для сканирования карты участника системы лояльности. +Запустите приложение для сканирования карты участника системы лояльности. При успешном сканировании на вашем экране появятся данные покупателя. diff --git a/lib/screens/languages.dart b/lib/screens/languages.dart index 6401a03..e58a5a9 100644 --- a/lib/screens/languages.dart +++ b/lib/screens/languages.dart @@ -40,19 +40,23 @@ class LanguagesState extends SettingsBaseState { saveOption() async { await helper.saveLocale(languages[selectedItem]); Intl.defaultLocale = languages[selectedItem]; - StringsLocalization.load(languages[selectedItem]).then((_) { - setState(() { - - }); - }); + await StringsLocalization.load(languages[selectedItem]); } @override void getSelectedValue() { helper.getLocale().then((locale) { - setState(() { - selectedItem = getOptions().indexOf(getLocaleTitle(locale)); - }); + if (locale == null) { + platform.invokeMethod('getLocale').then((locale) { + setState(() { + selectedItem == locale; + }); + }); + } else { + setState(() { + selectedItem = getOptions().indexOf(getLocaleTitle(locale)); + }); + } }); } } \ No newline at end of file diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index fa624cf..58f1ee7 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -7,6 +7,7 @@ import 'package:checker/screens/currencies.dart'; import 'package:checker/screens/languages.dart'; import 'package:checker/strings.dart'; import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; class SettingsScreen extends BaseScreen { @@ -28,8 +29,8 @@ class MenuItem { class SettingsState extends BaseState { List menuItems = [ - new MenuItem(StringsLocalization.currency(), ''), - new MenuItem(StringsLocalization.locale(), '') + new MenuItem('', ''), + new MenuItem('', '') ]; bool returnToScanner; @@ -42,23 +43,24 @@ class SettingsState extends BaseState { @override Widget build(BuildContext ctx) { helper.getSettings().then((info) { - if (menuItems != null) { - if (menuItems[0].selectedValue != info['currency'].toString()) { - setState(() { - menuItems[0].selectedValue = info['currency'].toString(); - menuItems[1].selectedValue = info['locale'].toString(); - }); - } - } + setState(() { + menuItems[0].title = StringsLocalization.currency(); + menuItems[1].title = StringsLocalization.locale(); + menuItems[0].selectedValue = info['currency'].toString(); + menuItems[1].selectedValue = info['locale'] == null ? Intl.defaultLocale : info['locale'].toString(); + }); }); return new WillPopScope(onWillPop: onWillPop, child: getMainWidget()); } + Widget getMainWidget() { + return new Scaffold(appBar: getAppBar(), + body: getScreenContent()); + } + @override Widget getScreenContent() { - return menuItems == null - ? getBackground() - : new Container( + return new Container( margin: new EdgeInsets.only(top: 16.0), child: new ListView(children: getSettings())); } diff --git a/lib/screens/splash.dart b/lib/screens/splash.dart index 280e85d..aa29824 100644 --- a/lib/screens/splash.dart +++ b/lib/screens/splash.dart @@ -38,24 +38,43 @@ class _SplashScreenState extends BaseState { } void onStart() { - helper.getSettings().then((info) { - if (info == null) { - platform.invokeMethod('getCurrency').then((currency) { - platform.invokeMethod('getLocale').then((locale) { - initLocale(locale, () { - helper.createAppInfo(locale, currency).then((_) { - showNext(); - }); - }); - }); - }); + helper.getLocale().then((locale) { + if (locale == null) { + initWithSystemValue(); } else { - helper.getLocale().then((locale) { + initWithSavedValue(); + } + }); + } + + void initWithSystemValue() { + platform.invokeMethod('getLocale').then((locale) { + helper.getSettings().then((settings) { + if (settings == null) { + createSettingsTable(locale); + } else { initLocale(locale, () { showNext(); }); - }); - } + } + }); + }); + } + + void initWithSavedValue() { + helper.getLocale().then((locale) { + initLocale(locale, () { + showNext(); + }); + }); + } + + void createSettingsTable(String locale) { + platform.invokeMethod('getCurrency').then((currency) { + helper.createAppInfo(locale, currency); + initLocale(locale, () { + showNext(); + }); }); } From 65d9f755f618d20d49e7d9a8286da987cb164921 Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Thu, 21 Sep 2017 15:11:57 +0300 Subject: [PATCH 24/24] =?UTF-8?q?=D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B4=D0=B5=D0=B9=D1=81=D1=82=D0=B2=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B1=D1=80=D0=B5=D0=BD=D0=B4=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F,=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d2edd42..284ed3f 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,66 @@ -Приложение Checker. +#Приложение Checker. Для запуска необходимо установить [Dart](https://www.dartlang.org/install) - язык программирования и [flutter](https://flutter.io/setup/) - фреймворк для создания кроссплатформенных мобильных приложений на этом языке. -# Перед тем, как собирать приложение, необходимо в файле lib/consts.dart установить правильное значение appName. Для автоклуба - это AutoBonus. Для сборки и запуска приложения используются команды flutter run (собирает debug apk, устанавливает его на устройство) и -flutter build (собирает release apk, не устанавливает на устрйоство). +flutter build (собирает release apk, не устанавливает на устройство). Команды run и build необходимо выполнять с опцией --flavor, чтобы apk файл собирался с необходимыми ресурсами и настройками. -Название конкретной flavor передается в аргументе. Все flavors перечислены в файле android/app/build.gradle. \ No newline at end of file +Название конкретной flavor передается в аргументе. Все flavors перечислены в файле android/app/build.gradle. + +#Добавление брендированного приложения + +Для добавления брендированного приложения с названием %name% необходимо: + +1) В каталог assets/ положить изображения %name%_logo.png и %name%_splash.png + В качестве splash очень желательно использовать квадрат белого цвета 100x100. + +2) В файл pubscpec.yaml в раздел assets/ добавить пути этих изображений. + +3) В файл lib/resources.dart в методы ```getPrimaryColor``` и ```getButtonsColor``` + добавить цвета необходимые цвета.* + +4) В файле consts.dart изменить значения переменных appName, url, appToken на правильные для сборки значения.* + +5) В файл android/app/build.gradle в раздел productFlavors добавить блок следующего вида: +``` +%name% { + applicationId 'com.dinect.autobonus' + buildConfigField "String", "locale", "\"ru\"" + buildConfigField "String", "flavor", "\"%name%\"" + buildConfigField "int", "currency", "643" + buildConfigField "String", "supportPhone", "\"8-800-234-6064\"" + buildConfigField "String", "supportUrl", "\"https://www.auto-club.biz\"" +} +``` + +где все параметры необходимо заменить на соответствующие приложению значения. + +6) В каталог android/app/src/ добавить каталоги %name%/res в которых воссоздать структуру ресурсов аналогичную представленной в каталоге android/app/src/pip/res/: +Каталоги mipmap должны содержать иконки, каталоги values должны содержать .xml файлы с названием приложения в следующем формате: +``` + + %name% + +``` + + +Иконки проще всего нарезать тут: +https://romannurik.github.io/AndroidAssetStudio/icons-launcher.html + +В качестве Foreground выбрать иконку приложения размером 512x512, выставить необходимые параметры и скачать архив с нарещанными иконками. + +После выполнения всех этих пунктов появится возможность собирать приложение +как описано выше(flutter run --flavor %name% либо flutter build apk --flavor %name%). + +\* - параметры из этих пунктов будут при первой же возможности перенесены в пункт 5, чтобы менять их из одного места. + +#Добавление локализации приложения + +1) В каталог lib/i18n добавить файл messages_%locale%.dart. +Файл делать по аналогии с messages_en.dart. Либо с messages_ru.dart. + +2) В каталог android/app/src/main/res добавить каталог values-%locale% с единственным файлом strings.xml. +Файл должен иметь структуру полностью аналогичную файлу android/app/src/main/res/values/strings.xml, измениться должны только значения для строк. \ No newline at end of file