diff --git a/README.md b/README.md index 64afd92..d2edd42 100644 --- a/README.md +++ b/README.md @@ -1 +1,12 @@ -Кроссплатформенное приложение AUTOBONUS для Dinect. \ No newline at end of file +Приложение 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, не устанавливает на устрйоство). + +Команды run и build необходимо выполнять с опцией --flavor, чтобы apk файл собирался с необходимыми ресурсами и настройками. +Название конкретной flavor передается в аргументе. Все flavors перечислены в файле android/app/build.gradle. \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index d9f013c..c55d4e9 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -38,24 +38,66 @@ android { } } + // Не смог разобраться, как коомбинировать flavors в flutter при запуске + productFlavors { - en { + autobonus_en { + applicationId 'com.dinect.autobonus' buildConfigField "String", "locale", "\"en\"" + buildConfigField "String", "flavor", "\"autobonus\"" } - ru { + autobonus_ru { + applicationId 'com.dinect.autobonus' buildConfigField "String", "locale", "\"ru\"" + buildConfigField "String", "flavor", "\"autobonus\"" } - ua { + autobonus_ua { + applicationId 'com.dinect.autobonus' buildConfigField "String", "locale", "\"ua\"" + buildConfigField "String", "flavor", "\"autobonus\"" + } + + pip_en { + applicationId 'com.dinect.pip' + buildConfigField "String", "locale", "\"en\"" + buildConfigField "String", "flavor", "\"pip\"" + } + + pip_ru { + applicationId 'com.dinect.pip' + buildConfigField "String", "locale", "\"ru\"" + buildConfigField "String", "flavor", "\"pip\"" + } + + pip_ua { + applicationId 'com.dinect.pip' + buildConfigField "String", "locale", "\"ua\"" + buildConfigField "String", "flavor", "\"pip\"" } } - sourceSets.main { - jniLibs.srcDir 'jniLibs' + sourceSets { + + main.jniLibs.srcDir 'jniLibs' + + pip_ua { + 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' + } } } @@ -65,7 +107,7 @@ flutter { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:25.0.0' + compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.squareup.okhttp3:okhttp:3.8.1' compile 'com.squareup.okio:okio:1.13.0' compile 'me.dm7.barcodescanner:zxing:1.9.7' 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 67dba0c..6e2a1ff 100644 --- a/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java +++ b/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java @@ -37,6 +37,7 @@ import android.view.View; import android.view.Window; import android.widget.FrameLayout; import android.widget.Toast; +import android.widget.TextView; import com.dinect.checker.net.ApiClient; @@ -59,7 +60,9 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { "Перестань!", "Ну и зачем?..", }; + private final AtomicInteger counter = new AtomicInteger(0); + private int mColor; public static final String SCAN_MODES = "SCAN_MODES"; public static final String ERROR_INFO = "ERROR_INFO"; @@ -115,6 +118,8 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { 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); setSupportActionBar(toolbar); final ActionBar actionBar = getSupportActionBar(); @@ -295,7 +300,7 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.logout) { - logoutDialog = new AbstractScannerActivity.LogoutDialogFragment(); + logoutDialog = LogoutDialogFragment.newInstance(mColor); logoutDialog.show(getFragmentManager(), "logout"); return true; } else if (item.getItemId() == R.id.faq) { @@ -324,14 +329,25 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { public static class LogoutDialogFragment extends DialogFragment { + static LogoutDialogFragment newInstance(int color) { + LogoutDialogFragment f = new LogoutDialogFragment(); + Bundle bundle = new Bundle(); + bundle.putInt(MainActivity.PREF_APP_BAR_COLOR, color); + f.setArguments(bundle); + return f; + } + @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); final LayoutInflater inflater = getActivity().getLayoutInflater(); final View content = inflater.inflate(R.layout.f_logout_dialog, null); builder.setView(content); - final View positiveButton = content.findViewById(R.id.positiveButton); - final View negativeButton = content.findViewById(R.id.negativeButton); + final TextView positiveButton = (TextView) content.findViewById(R.id.positiveButton); + final TextView negativeButton = (TextView) content.findViewById(R.id.negativeButton); + // Можно делать через стили, но я не уверен, что необходимо в нашем случае + positiveButton.setTextColor(getArguments().getInt(MainActivity.PREF_APP_BAR_COLOR)); + negativeButton.setTextColor(getArguments().getInt(MainActivity.PREF_APP_BAR_COLOR)); negativeButton.setOnClickListener(new View.OnClickListener() { @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 67bf35c..80a56c9 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,11 @@ public class MainActivity extends FlutterActivity { static final String TAG = "Checker.MainActivity"; 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"; + static final String PREF_APP_BAR_COLOR = "pref_app_bar_color"; static final Class[] SCANNER_BACKEND = { ScannerActivity.class, @@ -60,6 +62,10 @@ public class MainActivity extends FlutterActivity { result.success(BuildConfig.locale); break; + case "getFlavor": + result.success(BuildConfig.flavor); + break; + case "startScanner": final Map arguments = call.arguments(); final int idx = mPreferences.getInt(SCANNER_BACKEND_KEY, 0); @@ -68,6 +74,7 @@ public class MainActivity extends FlutterActivity { 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; @@ -133,6 +140,10 @@ public class MainActivity extends FlutterActivity { } } + public void getFlavor() { + + } + public void getLocale() { } diff --git a/android/app/src/main/res/layout/activity_zbar_scanner.xml b/android/app/src/main/res/layout/activity_zbar_scanner.xml index 265a55e..f23117d 100644 --- a/android/app/src/main/res/layout/activity_zbar_scanner.xml +++ b/android/app/src/main/res/layout/activity_zbar_scanner.xml @@ -45,7 +45,6 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" - android:background="#eb0004" app:titleTextColor="@android:color/white" /> + + + + + + + + + + + + + + + + + + + + + + + \ 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 new file mode 100644 index 0000000..fd2adeb Binary files /dev/null and b/android/app/src/pip/ic_launcher-web.png differ diff --git a/android/app/src/pip/res/mipmap-hdpi/ic_launcher.png b/android/app/src/pip/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..8f0f040 Binary files /dev/null and b/android/app/src/pip/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/pip/res/mipmap-mdpi/ic_launcher.png b/android/app/src/pip/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..9338b03 Binary files /dev/null and b/android/app/src/pip/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/pip/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/pip/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..10d53ed Binary files /dev/null and b/android/app/src/pip/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/pip/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/pip/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..5e67e2d Binary files /dev/null and b/android/app/src/pip/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/pip/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/pip/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..c162d38 Binary files /dev/null and b/android/app/src/pip/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/pip/res/values-ru/strings.xml b/android/app/src/pip/res/values-ru/strings.xml new file mode 100644 index 0000000..67af2f6 --- /dev/null +++ b/android/app/src/pip/res/values-ru/strings.xml @@ -0,0 +1,3 @@ + + PIP + diff --git a/android/app/src/pip/res/values-ua/strings.xml b/android/app/src/pip/res/values-ua/strings.xml new file mode 100644 index 0000000..67af2f6 --- /dev/null +++ b/android/app/src/pip/res/values-ua/strings.xml @@ -0,0 +1,3 @@ + + PIP + diff --git a/android/app/src/pip/res/values/strings.xml b/android/app/src/pip/res/values/strings.xml new file mode 100644 index 0000000..67af2f6 --- /dev/null +++ b/android/app/src/pip/res/values/strings.xml @@ -0,0 +1,3 @@ + + PIP + diff --git a/assets/registration_logo.png b/assets/autobonus_logo.png similarity index 100% rename from assets/registration_logo.png rename to assets/autobonus_logo.png diff --git a/assets/splash.png b/assets/autobonus_splash.png similarity index 100% rename from assets/splash.png rename to assets/autobonus_splash.png diff --git a/assets/pip_logo.png b/assets/pip_logo.png new file mode 100644 index 0000000..7a1da89 Binary files /dev/null and b/assets/pip_logo.png differ diff --git a/assets/pip_splash.png b/assets/pip_splash.png new file mode 100644 index 0000000..3839a8e Binary files /dev/null and b/assets/pip_splash.png differ diff --git a/lib/base_state.dart b/lib/base_state.dart index 9e23923..0ceb4be 100644 --- a/lib/base_state.dart +++ b/lib/base_state.dart @@ -1,7 +1,9 @@ import 'dart:async'; +import 'package:checker/resources.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:intl/intl.dart'; import 'common.dart'; import 'consts.dart'; @@ -9,6 +11,9 @@ import 'strings.dart'; abstract class BaseState extends State { + /// Тип сборки. Определяет, какие брать ресурсы (цвета, картинки) + String app; + /// Ожидание ответа от сервера. bool loading = false; @@ -19,13 +24,42 @@ abstract class BaseState extends State { String textFieldValue = ''; @override Widget build(BuildContext ctx) { - return new Scaffold(appBar: getAppBar(), + + platform.invokeMethod('getLocale').then((locale) { + Intl.defaultLocale = locale; + if (app == null) { + platform.invokeMethod('getFlavor').then((flavor) { + setState(() { + app = flavor; + onStart(); + }); + }); + } + }); + + return getMainWidget(); + } + + Widget getMainWidget() { + return app == null ? getBackground() : new Scaffold(appBar: getAppBar(), body: new Stack(children: [ getScreenContent(), new Center(child: loading ? new CircularProgressIndicator() : null) ])); } + Widget getBackground() { + return new Container( + decoration: new BoxDecoration( + image: new DecorationImage( + image: new ExactAssetImage(Resources.getSplash(app)), + fit: BoxFit.cover))); + } + + void onStart() { + + } + /// Возвращает контейнер с всеми виджетами экрана. Widget getScreenContent(); @@ -34,7 +68,7 @@ abstract class BaseState extends State { AppBar getAppBar() { return new AppBar(title: new Text(getTitle(), style: new TextStyle(fontSize: 18.0)), - backgroundColor: primaryColor, actions: getMenuButtons()); + backgroundColor: Resources.getPrimaryColor(app), actions: getMenuButtons()); } List getMenuButtons() { @@ -55,7 +89,7 @@ abstract class BaseState 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 : primaryColor, fontSize: 14.0))])); + style: new TextStyle(fontWeight: FontWeight.w300, color: error == null ? greyTextColor : Resources.getLogo(app), fontSize: 14.0))])); } /// Возвращает подсказку, либо ошибку, если введенные в поле ввода данные неверны. @@ -118,14 +152,14 @@ abstract class BaseState extends State { return new RaisedButton(child: new Text(text, style: new TextStyle(color: Colors.white)), onPressed: onPressed, - color: primaryColor); + color: Resources.getButtonColor(app)); } /// Метод возвращает контейнер с отступами, который содержит картинку с логотипом. Widget getLogo() { double containerHeight = 92.0; double imageWidth = 156.0; - return new Container(height: containerHeight, child: new Image.asset(logo_png, width: imageWidth)); + return new Container(height: containerHeight, child: new Image.asset(Resources.getLogo(app), width: imageWidth)); } /// Возвращает текстовое поле, с однострочным пояснением над ним. diff --git a/lib/common.dart b/lib/common.dart index 0191204..ce2e840 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'consts.dart'; import 'network.dart'; +import 'resources.dart'; import 'package:checker/registration.dart'; import 'package:checker/purchase.dart'; import 'faq.dart'; @@ -67,9 +68,10 @@ forceLogout(SqliteHelper helper, BuildContext context) async { /// Запуск спецефичной для каждой платформы части приложения - сканера. /// Может производиться с нескольких экранов (splash, finish_registration). -startScanner(SqliteHelper helper, BuildContext context) async { +startScanner(BuildContext context, String app, SqliteHelper helper) async { String token = await helper.getToken(); + helper.close(); // Канал ловит вызовы методов из "нативной" части приложения. // Могут быть вызваны либо logout либо faq, либо purchase. if (token != null) { @@ -94,6 +96,7 @@ startScanner(SqliteHelper helper, BuildContext context) async { 'token' : token, 'url': url, 'appToken': appToken, + 'color': Resources.getPrimaryColor(app).value }); } } diff --git a/lib/consts.dart b/lib/consts.dart index 7234267..a098939 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -1,14 +1,12 @@ import 'package:flutter/material.dart'; // Serious constants -const String appName = "Dinect"; +const String appName = "AutoBonus"; const String url = 'https://pos-api-int.dinect.com/20130701/'; const String appToken = '9fec83cdca38c357e6b65dbb17514cdd36bf2a08'; // Assets -const String logo_png = 'assets/registration_logo.png'; -const String splash_png = 'assets/splash.png'; const String logout_png = 'assets/logout.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'; @@ -17,8 +15,6 @@ 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'; -// Colors -const Color primaryColor = const Color(0xffeb0004); const Color greyTextColor = const Color(0xffa5a5a5); const Color textBorderColor = const Color(0xffcfd8dc); const Color tokenActiveTextColor = const Color(0xff1f5a1f); @@ -27,6 +23,7 @@ const Color greenBackground = const Color(0xff8ae28a); const Color faqGrey = const Color(0xff5b5b5b); const Color faqTitlesColor = const Color(0xff404040); const Color inputFieldBackground = const Color(0xffefefef); + // Dimens const double verticalMargin = 28.0; const double buttonHeight = 48.0; diff --git a/lib/faq.dart b/lib/faq.dart index f7885bf..c13f87a 100644 --- a/lib/faq.dart +++ b/lib/faq.dart @@ -68,7 +68,7 @@ class FAQScreenState extends BaseState { onWillPop() { if(returnToScanner) { - return startScanner(context); + return startScanner(context, app); } else { return true; } diff --git a/lib/finish_registration.dart b/lib/finish_registration.dart index 46959a7..014e8e9 100644 --- a/lib/finish_registration.dart +++ b/lib/finish_registration.dart @@ -58,8 +58,7 @@ class _RegistrationScreenState extends BaseState { // Если нет, то отправляется запрос на проверку статуса токена. handleTap() async { if (_tokenActive) { - helper.close(); - startScanner(context); + startScanner(context, app, helper); } else { if (await platform.invokeMethod('isOnline')) { String token = await helper.getToken(); diff --git a/lib/purchase.dart b/lib/purchase.dart index 4a44169..53887df 100644 --- a/lib/purchase.dart +++ b/lib/purchase.dart @@ -3,12 +3,13 @@ import 'package:flutter/services.dart'; import 'dart:convert'; import 'dart:core'; -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/purchase_success.dart'; +import 'resources.dart'; +import 'strings.dart'; +import 'common.dart'; +import 'consts.dart'; +import 'network.dart'; +import 'base_state.dart'; +import 'purchase_success.dart'; /// Экран проведения покупки. class PurchaseScreen extends StatefulWidget { @@ -41,15 +42,15 @@ 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.card(), card), - getValueWithDescription(StringsLocalization.reward(), loyalty), - getHintLabel(), - getInputField(), - wrapButton(getScreenMargins(36.0), getCompleteButton()), - wrapButton(getScreenMargins(24.0), getScanButton(context, StringsLocalization.scan(), primaryColor)) - ]))]); + children: [new Expanded(child: new ListView(children: [ + getValueWithDescription(StringsLocalization.userName(), user['first_name'] == null ? '' : user['first_name']), + getValueWithDescription(StringsLocalization.card(), card), + getValueWithDescription(StringsLocalization.reward(), loyalty), + getHintLabel(), + getInputField(), + wrapButton(getScreenMargins(36.0), getCompleteButton()), + wrapButton(getScreenMargins(24.0), getScanButton(context, StringsLocalization.scan(), Resources.getPrimaryColor(app))) + ]))]); } getScreenMargins(double top) { @@ -62,16 +63,16 @@ class PurchaseScreenState extends BaseState { } Widget getScanButton(BuildContext context, String title, Color textColor) { - return new Container(height: buttonHeight, child: new FlatButton(child: new Text(title, - style: new TextStyle(color: textColor)), - onPressed: () => startScanner(context)), - decoration: getDecorationForScanButton()); - } - - getDecorationForScanButton() { - return new BoxDecoration( - border: new Border.all(color: primaryColor, width: 1.0), - borderRadius: new BorderRadius.all(new Radius.circular(4.0))); + return new Container( + height: buttonHeight, + child: new FlatButton( + child: new Text( + title, + style: new TextStyle(color: textColor)), + onPressed: () => startScanner(context, app)), + decoration: new BoxDecoration( + border: new Border.all(color: Resources.getButtonColor(app), width: 1.0), + borderRadius: new BorderRadius.all(new Radius.circular(4.0)))); } @override String getTitle() { @@ -88,19 +89,19 @@ class PurchaseScreenState extends BaseState { @override getTextWidget() { return new TextField( - keyboardType: TextInputType.number, - decoration: new InputDecoration.collapsed( + keyboardType: TextInputType.number, + decoration: new InputDecoration.collapsed( hintText: getHint(), hintStyle: new TextStyle(color: greyTextColor, fontSize: 16.0) - ), - controller: controller, - onSubmitted: (String text) { - setState(() { - controller.text = _parseSum(text); - }); - }, - textAlign: TextAlign.center, - autofocus: true, + ), + controller: controller, + onSubmitted: (String text) { + setState(() { + controller.text = _parseSum(text); + }); + }, + textAlign: TextAlign.center, + autofocus: true, ); } @@ -138,10 +139,10 @@ class PurchaseScreenState extends BaseState { String _cleanupNumber(String text){ String tmp = text - .replaceAll(' ', '') - .replaceAll('-', '') - .replaceAll(',', '.') - .replaceAll('..', '.'); + .replaceAll(' ', '') + .replaceAll('-', '') + .replaceAll(',', '.') + .replaceAll('..', '.'); while(tmp.indexOf('..') != -1){ tmp = tmp.replaceAll('..', '.'); @@ -175,22 +176,22 @@ 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); - }, - ) - ])); + 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); + }, + ) + ])); } purchase(String sumTotal) async { @@ -201,30 +202,30 @@ class PurchaseScreenState extends BaseState { String token = await sqliteHelper.getToken(); platform.invokeMethod('getDocID').then((result) { - String url = user['purchases_url']; + String url = user['purchases_url']; - var body = { - 'doc_id': result, - 'curr_iso_code': '643', - 'commit': 'true', - 'sum_total': sumTotal - }; + var body = { + 'doc_id': result, + 'curr_iso_code': '643', + '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); - Navigator.of(context).pop(); - pushRoute(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name'])); + print(response.body); + Navigator.of(context).pop(); + pushRoute(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()); + }); }); } } diff --git a/lib/purchase_success.dart b/lib/purchase_success.dart index f257fec..dfebd2d 100644 --- a/lib/purchase_success.dart +++ b/lib/purchase_success.dart @@ -50,7 +50,7 @@ class PurchaseSuccessScreenState extends BaseState { getScanButton() { String title = StringsLocalization.scan(); - return buildRaisedButton(title, () => startScanner(context)); + return buildRaisedButton(title, () => startScanner(context, app)); } getSuccessMessage() { diff --git a/lib/resources.dart b/lib/resources.dart new file mode 100644 index 0000000..3fb9aee --- /dev/null +++ b/lib/resources.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; + +class Resources { + + static String getLogo(String app) { + return app == null ? null : 'assets/${app}_logo.png'; + } + + static String getSplash(String app) { + return 'assets/${app != null ? app : 'pip'}_splash.png'; + } + + static Color getPrimaryColor(String app) { + switch (app) { + case 'pip': return new Color(0xff008794); + case 'autobonus': return new Color(0xffeb0004); + default: return new Color(0xffffffff); + } + } + + static Color getButtonColor(String app) { + switch (app) { + case 'pip': return new Color(0xfff49935); + case 'autobonus': return new Color(0xffeb0004); + default: return new Color(0xffffffff); + } + } +} \ No newline at end of file diff --git a/lib/splash.dart b/lib/splash.dart index 25611b3..cde2563 100644 --- a/lib/splash.dart +++ b/lib/splash.dart @@ -1,50 +1,73 @@ import 'package:flutter/material.dart'; import 'package:http/http.dart'; import 'package:intl/intl.dart'; - -import 'dart:async'; 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'; -class SplashScreen extends StatelessWidget { +class SplashScreen extends StatefulWidget { + @override State createState() => new _SplashScreenState(); +} + +class _SplashScreenState extends BaseState { @override - Widget build(BuildContext context) { - // Появляется splash screen, проверяется токен. + Widget getScreenContent() { + return app == null + ? getBackground() + : new Stack( + children: [ + getBackground(), + getLogo(), + new Align( + alignment: FractionalOffset.bottomRight, + child: new Container( + margin: new EdgeInsets.only( + right: 11.0, + bottom: 5.0), + child: new Image.asset(powered_by_dinect_splash_png, + height: 16.0, + width: 122.0)))]); + } - new Future.delayed(const Duration(milliseconds: 500), () { - platform.invokeMethod('getLocale').then((locale) { - Intl.defaultLocale = locale; - print(Intl.defaultLocale); - showNextScreen(context); - }); + + @override Widget getMainWidget() { + return getScreenContent(); + } + + @override + String getTitle() { + return null; + } + + @override void onStart() { + new Future.delayed(const Duration(milliseconds: 1000), () { + showNextScreen(context); }); - - return new Stack(children: [getSplashBackground(), getLogo(), - new Align(alignment: FractionalOffset.bottomRight, child: - new Container(margin: new EdgeInsets.only(right: 11.0, bottom: 5.0), child: - new Image.asset(powered_by_dinect_splash_png, height: 16.0, width: 122.0)))]); } /// Возвращает столбец с логотипом приложения и текстом под ним. /// Столбец занимает не все доступное пространство, а необходимый минимум в центре экрана. getLogo() { - return new Center(child: new Column(mainAxisSize: MainAxisSize.min, - children: [new Image.asset(logo_png, height: 112.0, width: 252.0), - new Image.asset(splash_text_png, height: 40.0, width: 240.0)])); - } - - /// Возвращает контейнер, который содержит decoration с фоновым изображением. - getSplashBackground() { - return new Container(decoration: - new BoxDecoration(image: - new DecorationImage(image: new ExactAssetImage(splash_png), fit: BoxFit.cover))); + return new Center( + child: new Column( + mainAxisSize: MainAxisSize.min, + children: [ + new Image.asset( + Resources.getLogo(app), + height: 112.0, + width: 252.0), + new Image.asset( + splash_text_png, + height: 40.0, + width: 240.0)])); } /// Запуск следующего экрана приложения. @@ -92,7 +115,7 @@ class SplashScreen extends StatelessWidget { bool active = status['active'] == null ? false : status['active']; if (active) { - startScanner(helper, context); + startScanner(context, app, helper); } else { if (await platform.invokeMethod('isOnline')) { _createToken(context, helper); diff --git a/pubspec.yaml b/pubspec.yaml index eb63b7f..9d607a0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -25,15 +25,20 @@ flutter: # To add assets to your application, add an assets section here, in # this "flutter" section, as in: assets: - - assets/registration_logo.png - - assets/splash.png + + - assets/autobonus_logo.png + - assets/pip_logo.png + + - assets/autobonus_splash.png + - assets/pip_splash.png + - assets/logout.png - assets/activate_token_message_background.png - assets/active_token_message_background.png - assets/expansion_icon.png - assets/powered_by_dinect_splash.png - assets/powered_by_dinect.png - - assets/registration_logo.png + - assets/autobonus_logo.png - assets/splash_text.png # To add assets from package dependencies, first ensure the asset