From 11640c0a160a86251160f401fe736274c6268b79 Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Mon, 12 Mar 2018 21:41:41 +0300 Subject: [PATCH] Android all done. --- .../checker/AbstractScannerActivity.java | 4 +- .../java/com/dinect/checker/MainActivity.java | 22 ++++- .../kifio/checker/checker/MainActivity.java | 14 --- .../xcschemes/Debug-Dinect-INT.xcscheme | 93 ------------------- .../xcschemes/Debug-Dinect-INT.xcscheme | 93 ------------------- lib/base/base_state.dart | 9 +- lib/common.dart | 14 +-- lib/screens/faq.dart | 27 ++---- lib/screens/purchase.dart | 10 +- lib/screens/purchase_success.dart | 23 +++-- lib/screens/registration.dart | 8 +- lib/screens/settings.dart | 8 +- lib/screens/splash.dart | 31 +++++-- pubspec.lock | 7 ++ pubspec.yaml | 1 + 15 files changed, 111 insertions(+), 253 deletions(-) delete mode 100644 android/app/src/main/java/com/kifio/checker/checker/MainActivity.java delete mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Debug-Dinect-INT.xcscheme delete mode 100644 ios/Runner.xcodeproj/xcuserdata/kifio.xcuserdatad/xcschemes/Debug-Dinect-INT.xcscheme 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 4abd2cf..f8b5cc8 100644 --- a/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java +++ b/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java @@ -165,8 +165,8 @@ public abstract class AbstractScannerActivity extends AppCompatActivity impleme // для удобства, чтоб не вводить постоянно руками при разработке - // manualInput.setText("9990010009012057060904229"); - manualInput.setText("4620011139016337050236302"); +// manualInput.setText("9990010009012057060904229"); +// manualInput.setText("4620011139016337050236302"); manualInput.setHint(getIntent().getStringExtra("enter_manual")); manualInput.setOnEditorActionListener(new TextView.OnEditorActionListener() { 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 9081d14..ca879f2 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,10 @@ import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugins.GeneratedPluginRegistrant; import android.support.v4.app.Fragment; +import android.Manifest; +import android.content.pm.PackageManager; +import android.support.v4.content.ContextCompat; +import android.support.v4.app.ActivityCompat; import java.util.*; @@ -127,7 +131,11 @@ public class MainActivity extends FlutterActivity { } private void startScannerActivity() { - final int idx = getSharedPreferences("scanner", Context.MODE_PRIVATE).getInt(SCANNER_BACKEND_KEY, 0); + if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.CAMERA}, 101); + } else { + final int idx = getSharedPreferences("scanner", Context.MODE_PRIVATE).getInt( + SCANNER_BACKEND_KEY, 0); Intent cameraIntent = new Intent(MainActivity.this, SCANNER_BACKEND[idx]); for (Object key : mScannerArgs.keySet()) { @@ -140,6 +148,18 @@ public class MainActivity extends FlutterActivity { setLocale((String) mScannerArgs.get("localeCode")); startActivityForResult(cameraIntent, START_SCANNER_REQUEST_CODE); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, + String permissions[], int[] grantResults) { + if (requestCode == 101) { + if (grantResults.length > 0 + && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + startScannerActivity(); + } + } } @Override diff --git a/android/app/src/main/java/com/kifio/checker/checker/MainActivity.java b/android/app/src/main/java/com/kifio/checker/checker/MainActivity.java deleted file mode 100644 index d9e165b..0000000 --- a/android/app/src/main/java/com/kifio/checker/checker/MainActivity.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.kifio.checker.checker; - -import android.os.Bundle; - -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Debug-Dinect-INT.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Debug-Dinect-INT.xcscheme deleted file mode 100644 index e49ac52..0000000 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Debug-Dinect-INT.xcscheme +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/Runner.xcodeproj/xcuserdata/kifio.xcuserdatad/xcschemes/Debug-Dinect-INT.xcscheme b/ios/Runner.xcodeproj/xcuserdata/kifio.xcuserdatad/xcschemes/Debug-Dinect-INT.xcscheme deleted file mode 100644 index a0b818f..0000000 --- a/ios/Runner.xcodeproj/xcuserdata/kifio.xcuserdatad/xcschemes/Debug-Dinect-INT.xcscheme +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/lib/base/base_state.dart b/lib/base/base_state.dart index afcd50c..eb3cab9 100644 --- a/lib/base/base_state.dart +++ b/lib/base/base_state.dart @@ -101,13 +101,18 @@ abstract class BaseState extends State { new Future.delayed(const Duration(milliseconds: 200), () { var route = new MaterialPageRoute(builder: (BuildContext context) => new SettingsScreen(helper, app, false), fullscreenDialog: true); Navigator.of(context).push(route).then((token) { - Navigator.of(context).pop(token); + if (token != null) { + Navigator.of(context).pop(token); + } }); }); break; } case 1: { - pushRoute(context, new FAQScreen(helper, app, false)); + new Future.delayed(const Duration(milliseconds: 200), () { + var route = new MaterialPageRoute(builder: (BuildContext context) => new FAQScreen(helper, app), fullscreenDialog: true); + Navigator.of(context).push(route); + }); break; } case 2: { diff --git a/lib/common.dart b/lib/common.dart index 1be79a3..d6d71a2 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:checker/screens/faq.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:image_picker/image_picker.dart'; import 'db.dart'; import 'strings.dart'; @@ -10,6 +11,8 @@ import 'strings.dart'; // Канал для взаимодействия с кодом платформы. const platform = const MethodChannel('com.dinect.checker/instance_id'); + +// TODO: Избавиться от следующих двух методов pushRoute(BuildContext context, Widget widget) { var route = new MaterialPageRoute(builder: (BuildContext context) => widget, fullscreenDialog: true); @@ -19,12 +22,6 @@ pushRoute(BuildContext context, Widget widget) { }); } -// Добавление route, с возможностью вернуться к предыдущему экрану. -faq(SqliteHelper helper, String app, BuildContext context, - bool returnToScanner) { - pushRoute(context, new FAQScreen(helper, app, returnToScanner)); -} - getCurrencyTitle(int code) { switch (code) { case 643: @@ -52,3 +49,8 @@ getLocaleTitle(String code) { return 'Español'; } } + +// Добавил вызов, что-бы AOT компилер не выкинул либу. +getImage() async { + return await ImagePicker.pickImage(); +} diff --git a/lib/screens/faq.dart b/lib/screens/faq.dart index 4f74b73..ff821aa 100644 --- a/lib/screens/faq.dart +++ b/lib/screens/faq.dart @@ -68,19 +68,14 @@ class EntryItem extends StatelessWidget { class FAQScreen extends BaseScreen { - FAQScreen(SqliteHelper helper, String app, - this.returnToScanner) : super(helper, app); + FAQScreen(SqliteHelper helper, String app) : super(helper, app); - final bool returnToScanner; - - @override State createState() => new FAQScreenState(returnToScanner, helper, app); + @override State createState() => new FAQScreenState(helper, app); } class FAQScreenState extends BaseState { - FAQScreenState(this.returnToScanner, SqliteHelper helper, String app) : super(helper, app); - - bool returnToScanner; + FAQScreenState(SqliteHelper helper, String app) : super(helper, app); List data; @@ -92,16 +87,14 @@ class FAQScreenState extends BaseState { return null; } + @override + void initState() { + initPhoneAndUrl().then((_) { + super.initState(); + }); + } + @override Widget build(BuildContext context) { - if (data == null) { - platform.invokeMethod('getFlavor').then((flavor) { - initPhoneAndUrl().then((_) { - setState(() { - app = flavor; - }); - }); - }); - } return new Scaffold(appBar: getAppBar(), body: getScreenContent()); } diff --git a/lib/screens/purchase.dart b/lib/screens/purchase.dart index 52f969a..6c86a85 100644 --- a/lib/screens/purchase.dart +++ b/lib/screens/purchase.dart @@ -73,7 +73,7 @@ class PurchaseScreenState extends BaseState { )); widgetList.add(getValueWithDescription(StringsLocalization.card(), card)); - if (app != 'crypto') { // FIXME Заменить на crypto + if (app != 'crypto') { widgetList.add(getValueWithDescription(StringsLocalization.reward(), loyalty)); } @@ -186,7 +186,7 @@ class PurchaseScreenState extends BaseState { height: buttonHeight, child: new FlatButton( child: new Text(title, style: new TextStyle(color: textColor)), - onPressed: () => Navigator.of(context).pop()), + onPressed: () => restartScanner()), decoration: new BoxDecoration( border: new Border.all( color: Resources.getButtonColor(app), width: 1.0), @@ -437,4 +437,10 @@ class PurchaseScreenState extends BaseState { print('kifio ' + this.loyalty); print('bonus ' + this.bonus); } + + restartScanner() { + helper.getToken().then((token) { + Navigator.of(context).pop(token); + }); + } } diff --git a/lib/screens/purchase_success.dart b/lib/screens/purchase_success.dart index 9bd5cfd..96e0701 100644 --- a/lib/screens/purchase_success.dart +++ b/lib/screens/purchase_success.dart @@ -39,6 +39,7 @@ class PurchaseSuccessScreenState extends BaseState { int bonusPlus = 0; int bonusMinus = 0; int currency; + String token; bool showBonus; bool isAutomaticallyImplyLeading() => false; @@ -51,15 +52,18 @@ class PurchaseSuccessScreenState extends BaseState { return null; } - @override Widget build(BuildContext context) { - - if (currency == null) { - helper.getCurrency().then((currency) { - setState(() { - this.currency = currency; - }); + @override + void initState() { + helper.getCurrency().then((currency) { + helper.getToken().then((token) { + this.currency = currency; + this.token = token; }); - } + }); + super.initState(); + } + + @override Widget build(BuildContext context) { if (this.details['sum_bonus'] is String) { String regexString = r'(\d+) начислено, (\d+).*'; @@ -122,9 +126,8 @@ class PurchaseSuccessScreenState extends BaseState { return new EdgeInsets.only(bottom: bottom, left: side, right: side); } - getScanButton() async { + getScanButton() { String title = StringsLocalization.scan(); - String token = await helper.getToken(); return buildRaisedButton(title, () => Navigator.of(context).pop(token)); } diff --git a/lib/screens/registration.dart b/lib/screens/registration.dart index e030d79..f7a3705 100644 --- a/lib/screens/registration.dart +++ b/lib/screens/registration.dart @@ -29,7 +29,7 @@ class RegistrationScreenState extends BaseState { @override Widget build(BuildContext ctx) { - return getMainWidget(); + return new WillPopScope(onWillPop: () => onWillPop(), child: getMainWidget()); } @override @@ -130,4 +130,10 @@ class RegistrationScreenState extends BaseState { }); } } + + onWillPop() { + if (Theme.of(context).platform != TargetPlatform.iOS) { + platform.invokeMethod('finish'); + } + } } diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index a6f2ea6..3bb12a3 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -48,11 +48,11 @@ class SettingsState extends BaseState { @override void initState() { - print('init state!'); super.initState(); } @override Widget build(BuildContext ctx) { + // TODO: Перенести в initStater helper.getSettings(true).then((info) { setState(() { menuItems[0].title = StringsLocalization.currency(); @@ -93,7 +93,6 @@ class SettingsState extends BaseState { List widgets = new List(); for (int i = 0; i < menuItems.length; i++) { if (menuItems[i].selectedValue.toString() != '') { - print('title : ${menuItems[i].title}'); widgets.add( getSettingsItem(() => onPressed(menuItems.indexOf(menuItems[i])), menuItems[i].title, @@ -108,7 +107,6 @@ class SettingsState extends BaseState { case 0 : return getCurrencyTitle(int.parse(menuItems[position].selectedValue)); case 1 : - print('val : ${menuItems[position].selectedValue}'); return getLocaleTitle(menuItems[position].selectedValue); default : return null; @@ -188,11 +186,11 @@ class SettingsState extends BaseState { helper.getToken().then((token) { getDeleteTokenRequest(token).then((response) { helper.clear().then((result) { - Navigator.of(context).pop(null); + Navigator.of(context).pop(''); }); }).catchError((error) { print(error.toString()); - Navigator.of(context).pop(null); + Navigator.of(context).pop(''); }); }); } diff --git a/lib/screens/splash.dart b/lib/screens/splash.dart index ffbe636..a099884 100644 --- a/lib/screens/splash.dart +++ b/lib/screens/splash.dart @@ -8,6 +8,7 @@ import 'package:checker/consts.dart'; import 'package:checker/db.dart'; import 'package:checker/network.dart'; import 'package:checker/resources.dart'; +import 'package:checker/screens/faq.dart'; import 'package:checker/screens/finish_registration.dart'; import 'package:checker/screens/purchase.dart'; import 'package:checker/screens/registration.dart'; @@ -17,6 +18,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:http/http.dart'; +// FIXME: Сделать запуск всех экранов из одной точки через метод showNextScreen() class SplashScreen extends BaseScreen { SplashScreen(SqliteHelper helper, String app) : super(helper, app); @@ -40,7 +42,7 @@ class _SplashScreenState extends BaseState { @override Widget build(BuildContext ctx) { - return a ? new Container( + return !a ? new Container( decoration: new BoxDecoration( image: new DecorationImage( image: new ExactAssetImage(Resources.getSplash(null)), @@ -76,10 +78,15 @@ class _SplashScreenState extends BaseState { var route = new MaterialPageRoute( builder: (BuildContext context) => screen, fullscreenDialog: true); Navigator.of(context).push(route).then((token) { - if (token != null) { + if (token == '') { + showNextScreen(new RegistrationScreen(helper, app)); + } else if (token != null) { _initAndStartScanner(context, app, token, helper); } else { - showNextScreen(new RegistrationScreen(helper, app)); + print('Произошла непредусмотренная ошибка в логике приложения'); + helper.getToken().then((token) { + _initAndStartScanner(context, app, token, helper); + }); } }); }); @@ -209,13 +216,23 @@ class _SplashScreenState extends BaseState { } } else if (call.method == 'faq') { - faq(helper, app, context, true); - } else if (call.method == 'settings') { new Future.delayed(const Duration(milliseconds: 200), () { var route = new MaterialPageRoute( + builder: (BuildContext context) => new FAQScreen(helper, app), fullscreenDialog: true); + Navigator.of(context).push(route).then((_) { + _initAndStartScanner(context, app, token, helper); + }); + }); + } else if (call.method == 'settings') { + new Future.delayed(const Duration(milliseconds: 200), () { + var route = new MaterialPageRoute( builder: (BuildContext context) => new SettingsScreen(helper, app, true), fullscreenDialog: true); - Navigator.of(context).push(route).then((_) { - _initAndStartScanner(context, app, token, helper); + Navigator.of(context).push(route).then((result) { + if (result != null) { + showNextScreen(new RegistrationScreen(helper, app)); + } else { + _initAndStartScanner(context, app, token, helper); + } }); }); } else { diff --git a/pubspec.lock b/pubspec.lock index f5def50..c8590db 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -41,6 +41,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.1.1" + image_picker: + dependency: "direct main" + description: + name: image_picker + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.5" matcher: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index f51ca1a..133ff60 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -6,6 +6,7 @@ dependencies: sprintf: "^3.0.2" path_provider: "^0.2.1+1" sqflite: any + image_picker: '^0.1.3' # use for ask permissions @ iOS xml: "^2.6.0" flutter: sdk: flutter