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 0000000..5d7029a Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/help.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/help_outline.png b/android/app/src/main/res/drawable-xxxhdpi/help_outline.png deleted file mode 100644 index 3b4a2fc..0000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/help_outline.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_more_vert.png b/android/app/src/main/res/drawable-xxxhdpi/ic_more_vert.png new file mode 100644 index 0000000..0f2a7e8 Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/ic_more_vert.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/logout.png b/android/app/src/main/res/drawable-xxxhdpi/logout.png index 83b23bb..2f79181 100644 Binary files a/android/app/src/main/res/drawable-xxxhdpi/logout.png and b/android/app/src/main/res/drawable-xxxhdpi/logout.png differ 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 0000000..1e19365 Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/settings.png differ diff --git a/android/app/src/main/res/menu/menu.xml b/android/app/src/main/res/menu/menu.xml index 564d0c3..a89d3df 100644 --- a/android/app/src/main/res/menu/menu.xml +++ b/android/app/src/main/res/menu/menu.xml @@ -2,16 +2,27 @@ - + - + + + + + + + + + + + \ 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