diff --git a/android/app/src/main/java/com/dinect/checker/activity/CameraActivity.java b/android/app/src/main/java/com/dinect/checker/activity/CameraActivity.java index e4b2bc1..d20af8c 100644 --- a/android/app/src/main/java/com/dinect/checker/activity/CameraActivity.java +++ b/android/app/src/main/java/com/dinect/checker/activity/CameraActivity.java @@ -37,14 +37,15 @@ import net.sourceforge.zbar.Symbol; import net.sourceforge.zbar.SymbolSet; import net.sourceforge.zbar.Config; import android.graphics.YuvImage; +import android.view.MenuItem; import com.dinect.checker.R; public class CameraActivity extends AppCompatActivity { private Camera mCamera; - private Handler mAutoFocusHandler; - private ImageScanner mScanner; + private Handler mAutoFocusHandler = new Handler(); + private ImageScanner mScanner = new ImageScanner(); private HashMap mContours = new HashMap<>(); private boolean mBarcodeScanned = false; @@ -56,13 +57,7 @@ public class CameraActivity extends AppCompatActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.a_scanner); - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); - - mAutoFocusHandler = new Handler(); - mCamera = getCameraInstance(); - mScanner = new ImageScanner(); SurfaceView preview = (SurfaceView) findViewById(R.id.cameraPreview); SurfaceHolder holder = preview.getHolder(); @@ -71,16 +66,18 @@ public class CameraActivity extends AppCompatActivity { setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { actionBar.setTitle(getString(R.string.scanner_title)); actionBar.setDisplayHomeAsUpEnabled(true); } + holder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { try { - + mCamera = getCameraInstance(); mCamera.setPreviewDisplay(holder); mCamera.startPreview(); mCamera.setPreviewCallback(previewCallback); @@ -98,7 +95,7 @@ public class CameraActivity extends AppCompatActivity { @Override public void surfaceDestroyed(SurfaceHolder holder) { - + mCamera = null; } }); } @@ -109,6 +106,16 @@ public class CameraActivity extends AppCompatActivity { return true; } + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == R.id.logout) { + setResult(RESULT_OK); + finish(); + return true; + } + return super.onOptionsItemSelected(item); + } + private void initCountours() { diff --git a/android/app/src/main/java/com/dinect/checker/activity/MainActivity.java b/android/app/src/main/java/com/dinect/checker/activity/MainActivity.java index a57c639..04c410e 100644 --- a/android/app/src/main/java/com/dinect/checker/activity/MainActivity.java +++ b/android/app/src/main/java/com/dinect/checker/activity/MainActivity.java @@ -7,72 +7,73 @@ import android.util.Log; import android.content.SharedPreferences; import com.dinect.checker.activity.CameraActivity; import com.dinect.checker.service.RegistrationIntentService; - 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 com.google.android.gms.iid.InstanceID; - import java.util.Map; public class MainActivity extends FlutterActivity { - private static final String INSTANCE_ID_CHANNEL = "com.dinect.checker/instance_id"; - private static final String PREF_POS_TOKEN = "pref_pos_token"; + private static final int START_SCANNER_REQUEST_CODE = 2017; + + private MethodChannel mChannel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GeneratedPluginRegistrant.registerWith(this); + final String INSTANCE_ID_CHANNEL = "com.dinect.checker/instance_id"; + final String PREF_POS_TOKEN = "pref_pos_token"; final SharedPreferences preferences = getPreferences(Context.MODE_PRIVATE); - new MethodChannel(getFlutterView(), INSTANCE_ID_CHANNEL).setMethodCallHandler( - new MethodCallHandler() { - @Override - public void onMethodCall(MethodCall call, Result result) { - switch (call.method) { - - case "getInstanceID": - - InstanceID instanceID = InstanceID.getInstance(MainActivity.this); - String id = instanceID.getId(); - - if (id != null) { - result.success(id); - } else { - result.error("UNAVAILABLE", "Can't get instanceID.", null); - } - break; - - case "saveToken": - Map arguments = call.arguments(); - String token = (String) arguments.get("token"); - Log.d("kifio", token); - preferences.edit().putString(PREF_POS_TOKEN, token).apply(); - break; - - case "getToken": - result.success(preferences.getString(PREF_POS_TOKEN, null)); - break; - - case "startScanner": - startActivity(new Intent(MainActivity.this, CameraActivity.class)); - break; - - default: - result.notImplemented(); - break; - } + mChannel = new MethodChannel(getFlutterView(), INSTANCE_ID_CHANNEL); + mChannel.setMethodCallHandler( + new MethodCallHandler() { + @Override + public void onMethodCall(MethodCall call, Result result) { + switch (call.method) { + case "getInstanceID": + InstanceID instanceID = InstanceID.getInstance(MainActivity.this); + String id = instanceID.getId(); + if (id != null) { + result.success(id); + } else { + result.error("UNAVAILABLE", "Can't get instanceID.", null); + } + break; + case "saveToken": + Map arguments = call.arguments(); + String token = (String) arguments.get("token"); + Log.d("kifio", token); + preferences.edit().putString(PREF_POS_TOKEN, token).apply(); + break; + case "getToken": + result.success(preferences.getString(PREF_POS_TOKEN, null)); + break; + case "startScanner": + Intent cameraIntent = new Intent(MainActivity.this, CameraActivity.class); + startActivityForResult(cameraIntent, START_SCANNER_REQUEST_CODE); + break; + default: + result.notImplemented(); + break; } + } }); } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == START_SCANNER_REQUEST_CODE && resultCode == RESULT_OK) { + mChannel.invokeMethod("foo", null); + } + } + public void startScanner() { } diff --git a/android/app/src/main/res/drawable-xxxhdpi/shape_bottom_left.png b/android/app/src/main/res/drawable-xxxhdpi/shape_bottom_left.png deleted file mode 100644 index 15ffb91..0000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/shape_bottom_left.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/shape_bottom_right.png b/android/app/src/main/res/drawable-xxxhdpi/shape_bottom_right.png deleted file mode 100644 index edfd514..0000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/shape_bottom_right.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/shape_top_left.png b/android/app/src/main/res/drawable-xxxhdpi/shape_top_left.png deleted file mode 100644 index d2552af..0000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/shape_top_left.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/shape_top_right.png b/android/app/src/main/res/drawable-xxxhdpi/shape_top_right.png deleted file mode 100644 index e392c7f..0000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/shape_top_right.png and /dev/null differ diff --git a/android/app/src/main/res/drawable/button_blue.xml b/android/app/src/main/res/drawable/button_blue.xml deleted file mode 100644 index b32220f..0000000 --- a/android/app/src/main/res/drawable/button_blue.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/lib/main.dart b/lib/main.dart index ff905c2..76023a8 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -51,7 +51,7 @@ void checkToken(BuildContext context, Callback callback) { callback.call(context); } else { // Запускается экран сканера, токен кассы активирован, с его помощью можно делать запросы к pos-api. - startScanner(); + startScanner(context); } }).catchError((error) { @@ -61,11 +61,24 @@ void checkToken(BuildContext context, Callback callback) { /// Запуск спецефичной для каждой платформы части приложения - сканера. /// Может производиться с нескольких экранов (splash, finish_registration). -startScanner() async{ +startScanner(BuildContext context) async{ const platform = const MethodChannel('com.dinect.checker/instance_id'); + platform.setMethodCallHandler((MethodCall call) async { + logout(); + print(call.method); + // dynamic arguments = call.arguments; + // handle call then + return result; + // or + // throw new PlatformException(errorCode, anErrorMessage, someDetails); + }); await platform.invokeMethod('startScanner'); } +logout() { + pushRute(_context, new RegistrationScreen()); +} + /// Навигация по приложению. /// widget - следующий экран приложения. pushRoute(BuildContext context, Widget widget) { @@ -73,11 +86,16 @@ pushRoute(BuildContext context, Widget widget) { builder: (BuildContext context) { return widget; })); -} +} class Checker extends StatelessWidget { @override Widget build(BuildContext context) { - return new MaterialApp(title: "DemoApp", home: new SplashScreen()); + return new MaterialApp(title: "DemoApp", + home: new SplashScreen(), + theme: new ThemeData( + primaryColor: primaryColor, + accentColor: primaryColor + )); } } @@ -87,9 +105,6 @@ abstract class BaseState extends State { } - void logout() { - - } } abstract class Callback { diff --git a/lib/registration.dart b/lib/registration.dart index 87dacf0..8bcc4c0 100644 --- a/lib/registration.dart +++ b/lib/registration.dart @@ -12,6 +12,7 @@ class RegistrationScreen extends StatefulWidget { class _RegistrationScreenState extends BaseState { String _merchantID = ""; + bool _loading = false; @override Widget build(BuildContext context) { return new Scaffold(appBar: _getAppBar(), body: _getScreen(context)); @@ -19,16 +20,14 @@ class _RegistrationScreenState extends BaseState { AppBar _getAppBar() { return new AppBar(title: new Text("Регистрация"), - backgroundColor: primaryColor, actions: [ - new IconButton( - icon: new Icon(Icons.help_outline), - tooltip: 'Air it', - onPressed: faq, - ) - ]); + actions: [new IconButton(icon: new Icon(Icons.help_outline), onPressed: faq)]); } Widget _getScreen(BuildContext context) { + return new Stack(children: [_getScreenContent(), _getProgressIndicator()]); + } + + Widget _getScreenContent() { return new Container(height: 332.0, child: new ListView(reverse: true, children: [ new Center(child: new Column(children: [ @@ -38,6 +37,10 @@ class _RegistrationScreenState extends BaseState { ].reversed.toList())); } + Widget _getProgressIndicator() { + return new Center(child: _loading ? new CircularProgressIndicator() : null); + } + Widget _getLogo() { return new Container(height: 192.0, width: 156.0, child: new Image.asset(logo_png, height: 24.0, width: 156.0)); @@ -56,14 +59,6 @@ class _RegistrationScreenState extends BaseState { onChanged: (text) => _handleUserInput(text)); } - void _handleUserInput(String text) { - if (text.length > 0) { - setState(() { - _merchantID = text; - }); - } - } - Decoration _getDecoraionForInputField() { return new BoxDecoration(color: Colors.white, border: new Border.all(color: const Color(0xffcfd8dc), width: 1.0,), @@ -71,19 +66,35 @@ class _RegistrationScreenState extends BaseState { } Widget _getButton(BuildContext context) { - return new Container(margin: new EdgeInsets.only(top: 36.0), height: 42.0, padding: new EdgeInsets.only(left: 40.0, right: 40.0), + return new Container(margin: new EdgeInsets.only(top: 36.0), height: 42.0, + padding: new EdgeInsets.only(left: 40.0, right: 40.0), child: new RaisedButton(child: new Text('ЗАРЕГИСТРИРОВАТЬ', style: new TextStyle(color: Colors.white)), onPressed: _isValidMerchantID() ? () => _registerShop(context, _merchantID) : null, color: primaryColor)); } - bool _isValidMerchantID() { + Widget _getCircularProgressIndicator() { + return new Center(child: new CircularProgressIndicator()); + } + + _isValidMerchantID() { return _merchantID.length == 5; } - void _registerShop(BuildContext context, String merchantShop) { - _register(context, merchantShop); + _handleUserInput(String text) { + if (text.length > 0) { + setState(() { + _merchantID = text; + }); + } + } + + _registerShop(BuildContext context, String merchantShop) { + setState(() { + loading = true; + _register(context, merchantShop); + }); } _register(BuildContext context, String merchantShop) async { @@ -113,6 +124,9 @@ class _RegistrationScreenState extends BaseState { platform.invokeMethod('saveToken', {'token' : token}).then((value) { print(value.toString()); }); + setState(() { + loading = false; + }); pushRoute(context, new FinishRegistrationScreen()); }).catchError((error) { print(error.toString()); diff --git a/lib/splash.dart b/lib/splash.dart index fa6796f..bec8c2c 100644 --- a/lib/splash.dart +++ b/lib/splash.dart @@ -27,11 +27,12 @@ class SplashScreen extends StatelessWidget { // В случае, если в приложении отсутствует токен, // необходимо запустить регистрацию кассы. - if (token == null) { - pushRoute(context, new RegistrationScreen()); - } else { - checkToken(context, new CheckTokenCallback()); - } + // if (token == null) { + // pushRoute(context, new RegistrationScreen()); + // } else { + // checkToken(context, new CheckTokenCallback()); + // } + startScanner(context); } } @@ -41,6 +42,7 @@ class CheckTokenCallback extends Callback { /// Запускается экран ожидания активации токена. /// В реальности токен активируется в админке вручную, /// на тестовом сервере токен активируется через несколько минут после создания. + call(BuildContext context) { pushRoute(context, new FinishRegistrationScreen()); }