From 7207c6e2470cbeb9adf9f8139252e9586a16da69 Mon Sep 17 00:00:00 2001 From: Ivan Murashov Date: Fri, 28 Jul 2017 18:36:51 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F,=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BA?= =?UTF-8?q?=D0=BB=D1=83=D0=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/src/main/AndroidManifest.xml | 8 +- .../{activity => }/CameraActivity.java | 16 +-- .../checker/{activity => }/CameraPreview.java | 2 +- .../checker/{activity => }/MainActivity.java | 31 +++--- .../dinect/checker/{activity => }/Utils.java | 2 +- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2278 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1454 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3133 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 5243 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 7554 bytes lib/activate_token.dart | 30 +++--- lib/consts.dart | 8 +- lib/faq.dart | 58 +++++++---- lib/purchase.dart | 91 +++++++++--------- lib/registration.dart | 59 +++++++----- lib/splash.dart | 69 ++++++------- 16 files changed, 203 insertions(+), 171 deletions(-) rename android/app/src/main/java/com/dinect/checker/{activity => }/CameraActivity.java (96%) rename android/app/src/main/java/com/dinect/checker/{activity => }/CameraPreview.java (99%) rename android/app/src/main/java/com/dinect/checker/{activity => }/MainActivity.java (88%) rename android/app/src/main/java/com/dinect/checker/{activity => }/Utils.java (91%) create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 987c67a..89c9540 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ + android:versionName="0.1"> @@ -18,8 +18,8 @@ In most cases you can leave this as-is, but you if you want to provide additional functionality it is fine to subclass or reimplement FlutterApplication and put your custom class here. --> - - + - diff --git a/android/app/src/main/java/com/dinect/checker/activity/CameraActivity.java b/android/app/src/main/java/com/dinect/checker/CameraActivity.java similarity index 96% rename from android/app/src/main/java/com/dinect/checker/activity/CameraActivity.java rename to android/app/src/main/java/com/dinect/checker/CameraActivity.java index d8ce8f9..01d8367 100644 --- a/android/app/src/main/java/com/dinect/checker/activity/CameraActivity.java +++ b/android/app/src/main/java/com/dinect/checker/CameraActivity.java @@ -1,4 +1,4 @@ -package com.dinect.checker.activity; +package com.dinect.checker; import android.support.v7.app.AppCompatActivity; import android.content.pm.ActivityInfo; @@ -64,7 +64,7 @@ import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.content.DialogInterface; import android.view.LayoutInflater; -import com.dinect.checker.activity.Utils; +import com.dinect.checker.Utils; import com.dinect.checker.R; public class CameraActivity extends AppCompatActivity implements Camera.PreviewCallback { @@ -209,15 +209,11 @@ public class CameraActivity extends AppCompatActivity implements Camera.PreviewC int result = mScanner.scanImage(barcode); if (result != 0) { - mCamera.cancelAutoFocus(); - mCamera.setPreviewCallback(null); - mCamera.stopPreview(); mPreviewing = false; SymbolSet syms = mScanner.getResults(); for (Symbol sym : syms) { String symData = sym.getData(); if (!TextUtils.isEmpty(symData) && Utils.isOnline(this)) { - mPreviewing = false; requestUser(sym.getData()); break; } else { @@ -288,7 +284,6 @@ public class CameraActivity extends AppCompatActivity implements Camera.PreviewC if (code == 200) { try { String s = response.body().string(); - Log.d("kifio", s); JSONArray users = new JSONArray(s); if (users.length() > 0) { Intent intent = new Intent(); @@ -325,7 +320,7 @@ public class CameraActivity extends AppCompatActivity implements Camera.PreviewC private CameraActivity mActivity; private String mCode = ""; - private String mUrl = "https://pos-api-int.dinect.com/20130701/users?auto="; + private String mUrl = "http://pos-api-autoclub.dinect.com/20130701/users?auto="; private String mCard = ""; private String mToken = ""; @@ -347,11 +342,8 @@ public class CameraActivity extends AppCompatActivity implements Camera.PreviewC @Override public void run() { - Log.d("kifio", mUrl); - Log.d("kifio", mToken); - Request request = new Request.Builder() - .addHeader("DM-Authorization", "dmapptoken 9fec83cdca38c357e6b65dbb17514cdd36bf2a08") + .addHeader("DM-Authorization", "dmapptoken bdea0f3ba9034b688019a7cac753d1209e2b227f") .addHeader("Authorization", "dmtoken " + mToken) .url(mUrl) .build(); diff --git a/android/app/src/main/java/com/dinect/checker/activity/CameraPreview.java b/android/app/src/main/java/com/dinect/checker/CameraPreview.java similarity index 99% rename from android/app/src/main/java/com/dinect/checker/activity/CameraPreview.java rename to android/app/src/main/java/com/dinect/checker/CameraPreview.java index d8bd559..e653d4c 100644 --- a/android/app/src/main/java/com/dinect/checker/activity/CameraPreview.java +++ b/android/app/src/main/java/com/dinect/checker/CameraPreview.java @@ -1,4 +1,4 @@ -package com.dinect.checker.activity; +package com.dinect.checker; import android.content.Context; import android.app.Activity; diff --git a/android/app/src/main/java/com/dinect/checker/activity/MainActivity.java b/android/app/src/main/java/com/dinect/checker/MainActivity.java similarity index 88% rename from android/app/src/main/java/com/dinect/checker/activity/MainActivity.java rename to android/app/src/main/java/com/dinect/checker/MainActivity.java index 76eadf8..1b39811 100644 --- a/android/app/src/main/java/com/dinect/checker/activity/MainActivity.java +++ b/android/app/src/main/java/com/dinect/checker/MainActivity.java @@ -1,11 +1,12 @@ -package com.dinect.checker.activity; +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 com.dinect.checker.activity.CameraActivity; +import com.dinect.checker.CameraActivity; import io.flutter.app.FlutterActivity; import io.flutter.plugins.GeneratedPluginRegistrant; import io.flutter.plugin.common.MethodCall; @@ -32,10 +33,9 @@ public class MainActivity extends FlutterActivity { super.onCreate(savedInstanceState); GeneratedPluginRegistrant.registerWith(this); - final String INSTANCE_ID_CHANNEL = "com.dinect.checker/instance_id"; mPreferences = getPreferences(Context.MODE_PRIVATE); - mChannel = new MethodChannel(getFlutterView(), INSTANCE_ID_CHANNEL); + mChannel = new MethodChannel(getFlutterView(), "com.dinect.checker/instance_id"); mChannel.setMethodCallHandler( new MethodCallHandler() { @Override @@ -73,19 +73,20 @@ public class MainActivity extends FlutterActivity { mPreferences.edit().putInt(PREF_DOC_ID, docId).apply(); result.success(String.valueOf(docId)); break; + case "isOnline": + boolean online = Utils.isOnline(MainActivity.this); + if (!online) { + Toast.makeText(MainActivity.this, "Проверьте интернет соединение", Toast.LENGTH_SHORT).show(); + } + result.success(online); + break; case "getPosID": - String posId = mPreferences.getString(PREF_POS_ID, null); - if (posId == null) { posId = String.valueOf(System.currentTimeMillis()); } - - Log.d("kifio", posId); - mPreferences.edit().putString(PREF_POS_ID, posId).apply(); result.success(posId); - break; default: result.notImplemented(); @@ -119,15 +120,15 @@ public class MainActivity extends FlutterActivity { } } - private void handleItemClick() { + public void handleItemClick() { } - private void getDocID() { + public void getDocID() { } - private void removeKeys() { + public void removeKeys() { } @@ -159,4 +160,8 @@ public class MainActivity extends FlutterActivity { } + public void isOnline() { + + } + } \ No newline at end of file diff --git a/android/app/src/main/java/com/dinect/checker/activity/Utils.java b/android/app/src/main/java/com/dinect/checker/Utils.java similarity index 91% rename from android/app/src/main/java/com/dinect/checker/activity/Utils.java rename to android/app/src/main/java/com/dinect/checker/Utils.java index 5a0474a..f7cf8f9 100644 --- a/android/app/src/main/java/com/dinect/checker/activity/Utils.java +++ b/android/app/src/main/java/com/dinect/checker/Utils.java @@ -1,4 +1,4 @@ -package com.dinect.checker.activity; +package com.dinect.checker; import android.content.Context; import android.net.NetworkInfo; diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..1fde2099289df447a65c36b0652174b89435449a GIT binary patch literal 2278 zcmVYBiEJM@Wsh^~5C=CFj%%xCR7SjE&%_%5H2* zl7bCdk)0Vp89B?3NOM$h6vtsz(XaRSm6S3HeOOQ6YaeF*({ccVJlg z!X)WFDC!|XBun$&FP>;Pnw#VsJy(~#SruJ5M=Q21*=(C0=IR9jmcVeSN# zm6e^52$Ber2$Ber2$Ber2$BeTRRq=5)lqJ4F3II`x^(Fh-Me@1^(9EF)lyzw9?4`f zA(@n!nL$^s6i|J=mReexsiC2sii!%k9sRftu_ zCgtSh(Ea=O3_#{lL_|34+_{4s9UN%*uwgXJ(vs^5Z@oo3+}&x?#EJTLh{M8#OkTJk zF^@@k$m4;$ygUWpM|aPHf&!s|4gHUxT4%8D$94(*YQ-V)qrq`04x(-PXhe?QLy^XXRvLA@Ir8))-~AJX`7^U*0Ra?p>=>O(NT8VLXyK?&ky2SE%*>Cx zy}jtzvCruE@lg8P7hlk+Qzxmk^jiuF4AlE5o#26N+qRW83FdX@&TUFhPw#fF=qoQT z?_Gi_Dk@qlDz38n_9V^CO=M>`vrAK$W^GOObLP;*2@}YA>QtI;Ys*?ObH)tr!#T9> zSF>hu8#DvjgFc+2Z^8Weoe0tiH1mh%2dS*QfladBH!+w|P0byuuD;13_uRPzijIz= z$jC^FiHT-`76po@+}nO;)X0%EW%A@6uQ?tXO0~5$`nkY?L*nD(IhDA1vq~hOYD!B> z>pLHG{``4rYHHL!jfW34bp85u%F2?niNwan(s$qeM<2R7n!@+r|Cb}(*I$3dZN)`J z9I6q@(H;~Sz_m^yBO~aLuP;X@+z(p3eA%*2Vq`9=V#Bx zchaK2o;kyP{}ft?`hzuVSR+&_73Vc*I}#ksJ_^TQ3T<5H=Elc|4*BvJ<>e~Ytd6-+ zN=kB%^C>9Er>d%|mlx(sOH1kM)ql~A8~+v&EQL;R?Gt&(J~lHXZj&cX(t|*9 z2lIj%Ad+Cx@DIt!Nt_-adZ7)`&yXNEW<({J7(jCSm$B^#nlXJkn?0f(=5XM^eqOqy zr>C()#vBU^3txU7l#!9aPFeSqp#BKOhyDHec#pTY9>g!FO%v;@zi^&}bC}X6pByB+ znKOCm0pD=&-~sj}Fg;wmZR=LP7Lf~NA|3Gc^`UWN$F?Kr@L_+kkgcP=d-t+7>Xsr9 zv_rdIS)vGF@DW|9HJoH$XVWk*Xi0abm5}g_p;LbO1Yu#AlytG%2`*c@lz|}c=?Wn7 zAZXB^cI_gMojYme$`!0-p&=ohJUTnC>hg28wl-X^UcI{8dn24{G@4hx)PU2*idrt0 z=>_K^`{q0e;T?XbE0VCa5fE^g{6+R07x#CLRG*(d%~1<`LOx;%(eX127c3Cz#yQT^ zC>eh`))$V0}A9?gEGnHp2Pj`H*I3S zgL7olUFAFw1OWsCEP+gN!wktI0ATHfd}hhw#qIWgjPW;!hD)8CXwM#R))FMD*mE*T zf?8Ty=)#2ytn#{Ohj5JrZBS4kxrk(P{P^+RI&!q5A4z9$a1fg*q7ueIPJ<|V@nRx9 zdi2P&_oP7-{E2Rt5x|g}04Va8l9FNy4-coUTeh%?ZP~n8oQH8c`gPYB?i`B6b5GI9 z^xtY!R#xhrDG0;9wQiY!913Rh|NUnfWoKuJMQE+`+6S+D@Y)A&Jh0g>y%&>S97+U9 z1W5!*1W5!*1W5!*1W5!*1ii)tg}(*_8UI@iwOVbq8l?L$`vbCECxm& zAD=-3j46(ejz1CAa3Rw}LPGW?B_+jXWo7*%Gcz+@E|;G*6q!uc?zrRmkG-ZZ#%!zO zF?V197GMH4dwctzzQ~_1SlHRw{Y=!BLM8~Y7BbDm#kvj4P#YVYp9A9y|Hp+OX|T|y zH$^=}4EhUG7GP+@GI&5A6bmyEsYpdCQZb40KR#5r-Z&<(PXGV_07*qoM6N<$f`I)} AT>t<8 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..5dea603dee87b7dda315d9e4a159eba4359b55f5 GIT binary patch literal 1454 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a03095cfc3a9330478b260a66a444f396db0f8ce GIT binary patch literal 5243 zcmZvgcQhPMyT_HqYSG(jtBdF*qVFop>McUF1QES=QC5rIyAVM{XT?U15{o6G_YxvV zh;H@Z`rUiqd)|A_JLk;I^UQPR`De~EGoNpqzOFhs35Wy-2ZtQ4p=x+Hr~cD{gm>dF z*jft?4y`g=6>1!?uxm+VYCJoGIuzBjF{UL2k*Xs5BH%?-G=1xiB|U%R75sQaoY1;t z0wl;110=(aP)Uh_sEMRaoE{Z9r+9DDKGff z(#P55m(AY%#<9%OZc8nmKl_vZqcQKKYHV5@3o(Fo;)(OSz{~E(=pJ*~`8D1z!IU?& z`ZbuwbS01)Q&kA-C#8v0)M1KS6wUJR1LLb$X?}B2a;Ab)1rM~r(P<(9dCEW?*eCqvTJDw(-=6^rvTM4@0@HbZ&r+ zGPG^0PGvmT(B>uhDPzQa6EEMH(wDiv&CJ9;0)vZj?VPBEXzA$*uRfRt1O!-CKzUPN zDCe@LLuTtNwF;HOZh}*{(s{IMwAH}Xsi~=#2OYVPY@OojC-vo*S69-}+B(YM4fUGn zHfIb#fDv$Xa^gyur~Bs7Av-VE*xj))iy=q|5dcq%TnJeLr@kkzK7#9Rq>Lm+Kf@Et zg=m9$DQRMR05+ls#{aSZH$e8!Ix!kxgD3V+gz*2IyF~wNx0~!ULOvy-zC!rDTG{Ra&mDw_Qlh!|N6xT7x&$!T|nB(WnaaQzAfwh zR?s!Br?kr(cFV*~_>|gZyhP1s4Na`6t80%(XNRW{d`i}?Kem8!_O;8CzmOv#S z>7UHtOR?rm0Kj=k z-*t}BGe4~PK*~@;o=)&K(ijSbVt1QYCNODSj>~N*pPRpdL0JBIFjCmMQ+2VKXfpGD z22Ul#)S*@4ZwG4O%MC1+W=dk5927SZlsfw$Z_${S(dS$+AJM0aRI)2}%IvJZs`mjr7t4nBCQYU4w|HC(=+W z;y|Esrq-OVX`LV=wW^y2Xg7~?X84vXrt*te$f_eY^kO6GAc_q%CHSPyg5GYC13vSv z_tu~`U&`7cTM&~@Rcm3n(M0qG<$6`wv;Q-HgVs<+R@U(9)J-zjOTUlMTZufhf z>iVI*!r-=wpE=BjZxsm8$GxIr$OYtg=3- z=y3XIT({qy#gE14>a9LMUGV(=ePxI!fjE=k0KMGeX}Mo))fJkgtfKO}eZRAGq)^VF zP!_czY5b7EZjdZ%cek?dHM^lV1B2t$`n2z3!>pj6H%s;uLA!K~Jw@JP{dqzra)~F@GkYnF=7_P&>#x?>N zB8km7Ki3{3XN(A;8_KzT`(%Axl{K2xKp%drmcr(>Jrx+_=hx&guDl$O$SRkeRldbQFys6<=$0`Ci(YJ^Bdh@X=%qdKjlwe$@IlK z@82WOiaN!zX!=Ge;P z0<$m!bOCtF9f3w|^|9{jfKpfzt4_xb=iQ9p zo|wmIz>}+=WH|I=9h*FQ@bXsT6XjKoHwpAzv=d*g>|CF1Vbb0@?iVSDjL0#=r>h^A z+N!6d2M;7Sy&Tm`pNfULF0`cS7G8?*@LF&ay$1R0Etx&-a$`N&nk?8HE^?(sY?Chj zVh{@nyS)}%MuuKrZuLJu+tWWfIvP4`NoJN#rlzJIehU#j3cbCy`sA%;hU-VwK~GkZ zVI*{46*!d&q1=kj#zAzliK`Nxd$734Ed70uBQlxDG|7YT+nIwdMn>`=I;oVu_}-#f$s%fX zS@CN4S=cyV6lw9`L9=U~I4!-O=xD!~%!MAD^CKUn{QZ`KK;NHXHy1=QvXAT*i+)eG zH)EGpc_TeM20c5}Q})Dz$ab;sUlXC+uHBvHig8aE^yFeES`4_DLiX18boV=tlc&Vl zQBFL&GytyGWK4qfCx`0n<74$*Fd)B6O2+tNAK(PeP>*os<)A2+lL!p zz6~IYtY4+=T{U!xTd5>Gbbb2u_?b~p!_0yZ9R9>%W;kzMzZCYVX>_DeX}fN`*8Itq zYWK+HcJ-|WACIW0eh|XIplhN~uK8nAmcE*d(^Q2v4U!%T1`xg`XSO$1mgEvWFO+Tl z3hiDwaN3cAK2#Zld7vPP>eu%yd``|k)tax1QKTTYIw^Y1td*49SFGfJNSuTc!Oa-= z`mu|HgYaxj72L+bE(+Kv7pf7Q$SB5g%RJqPA19LNw9k^0^u68x$(eMNbB$PSl7sVC zB`_H);?y1nPVor||C8J@HJH&=*8Fv(C~M$HoZ~(@==tnOp^uoN;_?~a72LzopYyK{dXO17@3uO5Nj$)Nr)j9* zcYCuh-cWI>Qjm`5sjeRt%``~LEkHuQyP#vKV2?$fawFIjf>eu&iY9oW4y>o&NS7pl z)ATr0LjsjaHQ^}B7?O|ASVXKpY5S9HF_bB$HtMHv(3d8Vy@Z0fEhL<90yItcN)VrI zcO_!@>eU+-t$+wq{tL}aZbiK(eb7I$oifDG#%88s*2crY^g(F%_`h%fhN*Sq;1){9j4|;DW z3L|meeH6t$SLtC2pPBxZ^n+u*Bk;KTF-4Qd4`taP$t8!MfqP3bvUsa;DjnPs&mq5a z-HaVbn<#lqQhLW`?7u)epw=NgQj@{^odu3bO{Z;neZC$cs&gB@mnZMTKA#mCuyK_f zZhz)Pi;OB0iLqr}eRTw&E3AzpK=9HOP`t!N4~eTTzsYT#QTh5m>?rv#iTFDvWF zr;D50!h=bb*X-P5qhFl|G0}+oFLj2$`W?$E0M`e+*~I%KGtuw?3}EA zsppv6cK5b^;Fuz=Jf(2q$LSfs#lM{7b6voU5@Gj6J~S@fgx=msF(0@VdkH%I|`0gW9sMH3k^9qCUm6!P|c`a(?*JE&vxL zgQ6oU_WTLk%C>pgp?7jKeTb7Po2L-`uzmRrdJU*nq82iR6J=^X33EJvYQoCy1fPo;0=;!mq*A z?Kh}oWp+P&BcT++Z-FA75PKnZWDoA;RcjupqyL= z4PjT@3JePJ^2a=8RS3eq2TJVJ-vR6Ky%*(dIDj$z{Q|L+EKecY(^+VdQ+GJ7xSJ7g z&K2R-Vk5z<+XUK7IL!*lsqeN^DPor3frD3RmQ^T@&~8xTJc7(+I*q)M8Om-C11%+z z)QO$Ss7BCNM(yYZp9_!lwDM1=YZA)kF)b_tVG>ILJBRr7&fhx%VL8^Kh#UK*R&Vva zzXZz9eFd{yiiefkyL3%ZP}9$dXn)gVVd?o{(cQ{PgCx-O3wpMb{zvL7Bo^GSkec}K zJ48O=6!FtwJo=8EZFP9{ABL|<&9RJWQ-X2Mm zsb;^7Ab}#qRjK|}BH@4`GE77%me#7E?STMZyi=8G!3AvFX1?)-Vf$)(ZZf6J2>d<) zO$E;FN4hf2)UBDDQo5-}^=2Popxw;sb;Q|88+yW8CpGs6v_Zt(K+6MkS-JzOBYuas}uVn{l4%14kVFIt3b9*-iXiBXA( z7p&EWgBi^qo}Qj&^*QUjBjg)EqcPXM#UNZp#|A9Z1x4SpY_Gse?EON;5YVlAFMDIP zait+0#xSiC4m8%td+_eaWp`(X1?_C9q}27}uFW3aLNhWlpxkTrisXb64>1c}VYlS& z?)ze?d7N_QYT0Tec@1i@QxV-es<5`UR-~@3u0%C5QhTSCNGSgS0GT*8jjYqm2-IRs%BK{c3IS}}GQ&UHBu;;9 zY;@uuo9pT6LD>!@7Y1X0k6W6aC%*bedTICnJ@!s(y6UlIwDubgW{gH!)@M#RXCr6! zT6%%13MHSibQB6@dq?JfviJ?wTo2C{N%9yk$S`=~2p2FHMl;RKQ!OT%bi-&ey`l^v zgUdKGt)}igKQ}jZrz7|%z;1BGDH|(@^Y|O@f4~T=3}&RMYM`%;wphp{5vWxNH+ok5(*43gi1<-bcaZXbc2%8N`rKZ z!~nzDzjN<%{yFzP=iWc|-tY6Qcds4qTHn3aXTL+}sF4sd5`sV=67?sK^?+mNzZ(n> z*y}C0;DbOc>gtab4SatdnBn_U8_r@oK|hoUR16f}Cyuv7{($1@Qow%bD#7I2G~h}K zPOwZAj4&57frjzOCMuA_biabB(TD;~g4|C>?Gb4=2_tw7_greW9SbT@PvF*07jgXY|2sI}SAD!gZLa68KL~esY;vrL8>K;Kxfz9n9MuOS<#>uT zJwx0!Zy|)XG~WnJ8RLQ>b{m|3sT3C#{5y|>0>T&wR|)ND4taZdWyqVjj`xq8Ysf2y zRBsD5?oVsmhtD4IxD<2!Ot}9PD)63*(dIXcXHDWR`tD?X0L(3Z@nrFm^KZKXNM`1R zvOrYG=}K2K^RA2C!&=lvmK zuI5HDKDM;99AUS{CuJU7@q*5^2S~$?^-N6{_;mxIF;E)ru%jpD~Fu41a)Ji-f za_4xpM^I5w(H8FPxjF2?D(Y}``kO%zQ%+P-CLm@6%&QZH?VYpYeRP{f&f(`&CSF_XZO=I+aCF#X~AavgPk=7ZuO*o=Y8A znJ?Aak3D~1>S0k%uCU?&xj7kNBMS`;U5=>G&XSR=t)+n1nh>=R=wJ~AJX4qgoZ7t(drTUIrqbyzrKc^pezvO+n z_*Dg;j5Vj(b4zb5OE#4{Q_4FJNS;Yx6}G=6{R2FU!Z&sx_Bl8?cYe8b6do?N)K&#y z{p<;ei3>hIZ~XE5dx{I~YfXHPS?@d`b@Q;}Mk__Ytj@&uXt|@`+w|QeuZ+wmdtP82;Oa8I$DmA2AbRo@ zL-9^RsJrFfUb+*Km}%ONVQnWJNGz9I{iw?Mk!Q)g`r$S9V>*YDo*&hgS`Dfc!2X36 zir=?U_DLrnFD;JL?0t7i}0a*X4HY5n@FdP0NPv z3eh*`F8fWDGwgSSVAFUI@=2DYXSmU46P3WgK>lslUk!!1%C`=E?`gbt4eGS>kCXmM zas1WbTEH47^@8d2?94`S%#mZii01~g_im}jUXjp8>S}d!G+mejYK^0RAIXs#I&dseFT_8UZNx|uBGobt|Q%y6OKX-i~c5<=B zr-HVCNxZVQUDo!Sjni_wtYHZvI83yda;9~R{I$M_(;4e?fBq}}Q34LZ(y60FUbA%j zq|Q!)R(OA;+XoFiq0+7XnIck_pS75&79TgGTT(VTt+`w?SR5e?g^z1F%Vswa!(y!9 zf4;9yL_1u(9CSBQ6n~5P>wJO{RUH8$N1wE?zp83$$hx|U=|puR&xzzw`s;mIKF;-p zeq6ffl0klJ{nmtfurYUwUiPKhN#of1-E-j+`HmVWWg#i7b_zy(VNsoQe9ZD`etVn79})Tz#|ouh@Y+56IFckZnLzKD7=Yv1^@ zetE5Zg06R4SQA6*j0a>m1*mMytwUwv=4x60i@EF$kiNc_>9@FqZ=8a42+xutBJkVF z4TRCQGG^p=Sv+W*U8Wg)B^2Fb(00DAZUp6a+3#;j>-ee9We0DrPTyJlA~<88QAFCz zmOm2*gI9`Eh3#X=S5zog009$m81ICV{r>*2V`Jj`nPT#@Uf+5IJH_r+j&HRU@#KY| zu*HP)zBBUE%Y`O(sBgSc4v-4>ki9IDuaGk_wQ*%eJkjJJAa*kQM zh$t~8++r;gof%rbp6)9Md7o3p`l}``v=2=l3kuTF6VZkDX5%>HY-9T6 z!o?Xz71&WUP*kl`FeUWG@=F(gFX$r@ao3+BT|HOW>m#IF^hFaNxQE|^PwM9`MfLN> zm#rXv<2-1#^cbX;*Z#+wO^(^=6Lo~8Z@58O1XUA^@ z(ObH#ZR{=PMAA}`F)xs5kBuMm-OvBjYMOR{G4lP9RTaP28Jv1 zErL|#bej;OKo0kXgJMEKhUEsiT}}@m^`M3m6AcMCSBikS0oehUVX0|aNA2qa6D$#X zKR=3rOA13qYJYy})W<0`I=_DR^-tuoVmy<&5VFPVaN(Uj?pr$2&mRN@Z3VE%b#z|tZ36Eh{GCA(^D(6|9*Qay;fDpYau>Wa#4szpYD5QME?svS#C0c!Ve@%ikUM6jjXlmi9@tM_iC&P#s?AHod-swIYG$ zK!%3eOz%h}3H zl3o4=D=R3~-oQ2=GujN@bxx9`}~=xvweBKF zmRTYE#00C4V4ml%6IHsZmE+^5`ng!u@C|4rRzI#Fjk=nglk*nUW zuOn1RCks~=t&Nq(rh4CQ)QC*!@1h=$uA-)=0jRVNR%CIg?XyT3|fJ=$ES3VOTq z@!q?bpub7-H2%MneAQAN{dts#t0d~Vv22pPL&o!!et$OK&uwurPDKJG_A7_l2eumg zU}pYiV(_bE2;`H(7MtWpYon;6&t@&$Dlin!({(|EkHT$B43ow8r6NStFH(60Gq~u$ zZvz5=N;;F0)RlB^=JPr_d1Ko*3OzFlBH5jN>Xk*d6qFr~xw_{|HbWYasI3F(^m34C z2)g_7u9D$Isc36lnV(cjMB|jIiX3oVh;PCLZqagU=;?x6e>iuo>&@`84Ph)DtHx(?opIT zxjUtqL`QK}@4R6Wt9W{xF_r;_Z){cwO8DqG5ovWM8=*VbrY_AAKUUXe;}dU>)f?Fl zr*@HQBA3R4+`YP)f_A5PhhVjMy1KeDRH;8RR}XskL2vGwJl5wDBBvCamME~FL^Wx# zM9;;Fylk==I%1uM{PL^ z?7{q{Ee^`tpc=l(Ei88arA-?-$fP&Tn zbB$1RuP~V|8{-0dU9<;axG>t9Fc3U+AL#Pm+FinEKh5;w(fo6+8d62gHLoxy76uq6C8psI!lRCQ2>!H!nt{GA-X}%iMB&GK zM{>rRl&EaQ(+`2noNg@*uEyj+Hy)y~m725f_2bd8ZAe4^cZdbrmSv6C8~H>xTea!IY*=jypY&ev{a*i{;$6k7V*DkbD^s} z9c!7d3j`2C)cr~VpbF9$Uj(9*IbP(BAFhg@WiD$pU~Kt43%rSX3h=GN1CAZqmj=sXo}uP@eT zaWEHK9iR%M)fS)Hu)#_aNj^gnrpxfhv}$MfhI1ZCbjI^SpQu6>+TNtFh|N{^E=7cw zE}Np5-}}sSx{xr6Slr=4*^(KD#U8PB7dVQfK>QE8ucMg~?y4+r80`j%i6#O}H7LH^ zf0}Od=Pyd8HYAj)jqF$8<6iTYYYJ|wiV1-i?fiul`gvm8^R@QPJrurpE%Jm~;JG>Q z9TV7XQ=i#_zW9yA%c#xq8S~FPUI!-TTs_U9A0rxI%q}+)@>+?eud2LwUuV_3&5rUx zI@2Mios6NTpy!piq|#{dg;tMHdmU?2#B`Y<6->zG&R<@(uj}#cRb4FS`ZY86(o?xB zWSbmUy`p}N#39fHJ6yezXzf2Ongp3=Kw{`w=5XlKvIBD0u-kD~2m&5zZpn~klIry|TdL1+#X<@_N$Ny7Ls9}Mw$IpE#pM}v z{$39^q3%_FWL~Vpa+eMAJ3S`0CZ-z*9IAQh&UharR@2}9wO^s8%&?s6_?YqTC!vAu z_GF8A>~Z_zR}YWHZ%KT*9qj?@!MHqfADBZu*85+zgAAw>`NRWBb7x`})QFwfUQcV$ zk6>6nn>Opg;${fkcYfR>wR|LZGn8<@T4O~cYdM-JNPQf?bgT=LG zely%byvHp~c0WaamHw*hia81jS{W(O6(WBp2CG%2P2!y9{zOzpKN`(NQ{pgKr!<}> zTAyff(kVBurv#IyNM+bt+U4LN$W~`_979B&=?ofe&8;9Osw9n|Sg##3@qA!p^Rp`>i!m#f z93B>o))q__SDK#>*}9+B_yfLbyyOZLsjloUF* zV?nniQ!zG^1ktdue+khA>)~`c-E@U<=(@*OpQF*OfquUk>g=!!dc)oJn^%vHgx;B2 z?r&m6GWO&O!?1J^33l@9yu+k$5~luD5+wE0)JMS|?2HpcUb+_1K-R02xnu_699BM6 ztB<|BL<*}_++KaA-V+1nQu9{$?*cm?cO+ern?lRkms zI2jmFj&% zB4hdH`S2M293THD1Ft1txfeDJklV3hY`d8KD6^ZEF|ujUM8P6HcO`0BK-%;)Z+UJXL_C5kO}M<)^ZNTI5Ho z-=AdVBKY$-!NGK43WXQ=os@~3KtuDTq{EHJ7hCWX&_F+NFD=_9_JvPziWWNCqRpsL zwg_)7bWm3aZU$U4u2jbFv=fr3oKSx@s)`~`=N0*4LWTml@g=_a>a|ldIQZoKyLXmJ zu;H2Dq7hOEUDy)wD@A}K=b5#Y?wGX7!1_l4V<;gc=+(-RUslxPVmoj{|k z!&b;<5Wx;M^(S(nXym7b2BJgMxxOR6fwU>e)mBiS^4+B@!Pf zO=C$}q|Oj4AAJjK;4cAI`b=3_IbT^xNsNp|$}9C_(rz5XAgK+kreG*hKL%S=3zG4g zxBSvqCaYhhb??vb@A%xI&?IWUmgeSZC!p#gVq;@-djY^C$Sm5aJq|nwv4PZp8GK8}`@3|AuXZz`B)7CiFoYZjt^Rm?VSXoPIP6eJzE*)`S0kDlG8_K?^w0A8*BywJmZkm@TCoiLTLr1B=sd1e HvIzMPd`s)v literal 0 HcmV?d00001 diff --git a/lib/activate_token.dart b/lib/activate_token.dart index f19cb9f..31f78ea 100644 --- a/lib/activate_token.dart +++ b/lib/activate_token.dart @@ -40,24 +40,28 @@ class _RegistrationScreenState extends BaseState { ]); } - handleTap() { + // Если токен активирован, то открывается экран со сканером, + // Если нет, то отправляется запрос на проверку статуса токена. + handleTap() async { if (_tokenActive) { startScanner(context); } else { - checkTokenStatus(token).then((response) { + if (await platform.invokeMethod('isOnline')) { + checkTokenStatus(token).then((response) { - print(response.body); - Map parsedMap = JSON.decode(response.body); + print(response.body); + Map parsedMap = JSON.decode(response.body); - // Обновить экран, заменить сообщение о необходимости активации токена, на сообщние о том, что токен активен. - setState(() { - _tokenActive = parsedMap['active']; + // Обновить экран, заменить сообщение о необходимости активации токена, на сообщние о том, что токен активен. + setState(() { + _tokenActive = parsedMap['active']; + }); + + }).catchError((error) { + print(error.toString()); + return false; }); - - }).catchError((error) { - print(error.toString()); - return false; - }); + } } } @@ -92,7 +96,7 @@ class _RegistrationScreenState extends BaseState { /// Получаем текст сообщения, в зависимости от статуса активации. getMessageString() { - return _tokenActive ? 'Программа активирована' : 'Запрос на активацию программы отправлен, дождитесь подтверждения активации администратором'; + return _tokenActive ? tokenActiveMessage : tokenWaitMessage; } /// Фоновое изображение для сообщения. diff --git a/lib/consts.dart b/lib/consts.dart index a63481b..6ce6193 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -1,12 +1,14 @@ import 'package:flutter/material.dart'; // Serious constants -const String url = 'https://pos-api-int.dinect.com/20130701/'; -const String appToken = '9fec83cdca38c357e6b65dbb17514cdd36bf2a08'; +const String url = 'http://pos-api-autoclub.dinect.com/20130701/'; +const String appToken = 'bdea0f3ba9034b688019a7cac753d1209e2b227f'; -// Hints +// Texts const String merchantIDHint = 'ID магазина'; const String posIDHint = 'Номер кассы'; +const String tokenActiveMessage = 'Программа активирована'; +const String tokenWaitMessage = 'Запрос на активацию программы отправлен, дождитесь подтверждения активации администратором'; // Assets const String logo_png = 'assets/registration_logo.png'; diff --git a/lib/faq.dart b/lib/faq.dart index 3143a0b..23efb1e 100644 --- a/lib/faq.dart +++ b/lib/faq.dart @@ -80,29 +80,49 @@ class FAQScreenState extends BaseState { ]; static const String registrationGuide = ''' - mPreviewing = true;После запуска приложения вы окажетесь на странице регистрации магазина. - Введите DIN код магазина (выдается партнером/менеджером International Auto Club, дублируется на почту) - Кликнете по кнопке: «Зарегистрировать» - Дождитесь подтверждение активации программы, кликом по кнопке «Обновите статус активации» обновите статус. - После подтверждения запроса на активацию программы Партнером/менеджером кликнете по кнопке «Завершить регистрацию», приложение готово к использованию. +После запуска приложения вы окажетесь на странице регистрации магазина. - При желании изменить номер кассы, необходимо кликнуть на «значок» верхнем правом углу и вернуться на шаг регистрации. +Введите DIN код магазина (выдается партнером/менеджером International Auto Club, дублируется на почту) + +Кликните по кнопке: «Зарегистрировать» +Дождитесь подтверждение активации программы, кликом по кнопке «Обновите статус активации» обновите статус. + +После подтверждения запроса на активацию программы Партнером/менеджером кликните по кнопке «Завершить регистрацию», приложение готово к использованию. + +При желании изменить номер кассы, необходимо кликнуть на «значок» верхнем правом углу и вернуться на шаг регистрации. '''; - static const String usageGuide = '''Действие 1: - При предъявлении покупателем штрих кода участника системы лояльности, запустите данное приложение. - На экране появиться сканер штрих кодов. Поднесите гаджет к смартфону или карте покупателя и отсканируйте предъявленный штрих код сканером. - При успешном сканировании на вашем экране появятся данные партнера. - Действие 2: - Необходимо ввести сумму покупки данного покупателя и нажать на кнопку «Зафиксировать». - Всплывет окно “Подтверждения правильности ввода суммы” в случае правильного ввода суммы, нажмите “ДА”, сумма будет проведена и вознаграждение будет начислено участнику системы лояльности. + static const String usageGuide = ''' +Действие 1: + +При предъявлении покупателем штрих-кода участника системы лояльности, запустите данное приложение. - Если же сумма введена с ошибкой, нажмите “НЕТ” вы вернетесь на шаг ввода суммы и скорректируете ее.'''; +На экране появится сканер штрих кодов. Отсканируйте предъявленный штрих-код сканером. - static const String supportGuide = '''При некорректной работе приложения AUTO BONUS просьба сразу обратиться по телефону нашей технической поддержки: 8-800-234-6064 (звонок бесплатный), вас свяжут с менеджером. При звонке приготовьтесь назвать ИНН и наименование вашей организации. - Рекомендуйте покупателям установить мобильное приложение дисконтной системы International Auto Club AUTO BONUS, и получайте кэш бэк и их покупок в любых наземных или интернет магазинов. - Наш сайт https://www.auto-club.biz'''; +При успешном сканировании на вашем экране появятся данные партнера. + +Действие 2: + +Необходимо ввести сумму покупки данного покупателя и кликнуть по кнопке «Зафиксировать». - static const String commonGuide = '''Для эффективного считывания штрих кода участника системы лояльности необходимо камеру сканера поднести так, чтобы в неё не попадали вертикальные полосы рамки. - Долгое сканирование происходит из-за черной рамки, в которую помещен штрих-код, вертикальные полосы этой рамки расцениваются сканером как часть штрих-кода.'''; +Всплывет окно подтверждения правильности ввода суммы». В случае правильного ввода суммы, кликните «ДА», сумма будет проведена и вознаграждение будет начислено участнику системы лояльности. + +Если сумма введена с ошибкой, кликните «НЕТ» и Вы вернетесь на шаг ввода суммы и сможете её скорректировать. + '''; + + 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/purchase.dart b/lib/purchase.dart index c2cc575..723865a 100644 --- a/lib/purchase.dart +++ b/lib/purchase.dart @@ -24,12 +24,11 @@ class PurchaseScreen extends StatefulWidget { class PurchaseScreenState extends BaseState { - RegExp exp; + RegExp moneyRegexp = new RegExp(r'''^(?!0\.00)\d{1,11}(\.\d{0,2})?$'''); PurchaseScreenState(String userString, String card) { this.user = JSON.decode(userString); this.card = card; - exp = new RegExp(r'''^(?!0\.00)\d{1,11}(\.\d{0,2})?$'''); getLoyality(user['loyalty_url']); } @@ -40,15 +39,15 @@ class PurchaseScreenState extends BaseState { @override Widget getScreenContent() { return new Column( - children: [new Expanded(child: new ListView(children: [ - getValueWithTitle('ФИО', user['first_name'] == null ? '' : user['first_name']), - getValueWithTitle('Карта', card), - getValueWithTitle('Вознаграждение', loyality), - getHintLabel(), - getDecoratedTextWidget(), - buildButton(new EdgeInsets.only(top: 36.0, left: buttonVerticalMargin, right: buttonVerticalMargin), buildRaisedButton(context, 'ЗАВЕРШИТЬ ПОКУПКУ', () => onPurchaseClick(context))), - buildButton(new EdgeInsets.only(top: 24.0, left: buttonVerticalMargin, right: buttonVerticalMargin), buildFlatButton(context, 'СКАНИРОВАТЬ', primaryColor)) - ]))]); + children: [new Expanded(child: new ListView(children: [ + getValueWithTitle('ФИО', user['first_name'] == null ? '' : user['first_name']), + getValueWithTitle('Карта', card), + getValueWithTitle('Вознаграждение', loyality), + getHintLabel(), + getDecoratedTextWidget(), + buildButton(new EdgeInsets.only(top: 36.0, left: buttonVerticalMargin, right: buttonVerticalMargin), buildRaisedButton(context, 'ЗАВЕРШИТЬ ПОКУПКУ', () => onPurchaseClick(context))), + buildButton(new EdgeInsets.only(top: 24.0, left: buttonVerticalMargin, right: buttonVerticalMargin), buildFlatButton(context, 'СКАНИРОВАТЬ', primaryColor)) + ]))]); } @override String getTitle() { @@ -72,7 +71,7 @@ class PurchaseScreenState extends BaseState { setState(() { - if (tmpString.length == 0 || exp.hasMatch(tmpString)) { + if (tmpString.length == 0 || moneyRegexp.hasMatch(tmpString)) { if (tmpString.contains('.')) { int dotIndex = tmpString.indexOf('.'); integerPart = tmpString.substring(0, dotIndex); @@ -102,15 +101,14 @@ class PurchaseScreenState extends BaseState { onChanged: (text) => handleUserInput(text)); } - getLoyality(String url) { + getLoyality(String url) async { - print(url); - print(token); + if (await platform.invokeMethod('isOnline')) { - var headers = { - 'DM-Authorization': 'dmapptoken 9fec83cdca38c357e6b65dbb17514cdd36bf2a08', - 'Authorization': 'dmtoken ${token}' - }; + var headers = { + 'DM-Authorization': 'dmapptoken 9fec83cdca38c357e6b65dbb17514cdd36bf2a08', + 'Authorization': 'dmtoken ${token}' + }; httpClient.get(url, headers: headers).then((response) { @@ -118,24 +116,18 @@ class PurchaseScreenState extends BaseState { Map bonuses = JSON.decode(response.body); String type = bonuses['type']; - setState(() { if (type == 'amount') { this.loyality = '${user['discount']}%'; } else { List amountToBonus = bonuses['amount_to_bonus']; - // print(amountToBonus[0]); - // print(amountToBonus[1]); this.loyality = '${(amountToBonus[0] / double.parse(amountToBonus[1])).toStringAsFixed(0)}%'; } - - }); - }).catchError((error) { print(error.toString()); }); - + } } _buildSum() { @@ -175,33 +167,36 @@ class PurchaseScreenState extends BaseState { ])); } - purchase(String sum_total) { + purchase(String sum_total) async { - platform.invokeMethod('getDocID').then((result) { + if (await platform.invokeMethod('isOnline')) { - String url = user['purchases_url']; + platform.invokeMethod('getDocID').then((result) { - var body = { - 'doc_id': result, - 'curr_iso_code': '643', - 'commit': 'true', - 'sum_total': sum_total - }; + String url = user['purchases_url']; - var headers = { - 'DM-Authorization': 'dmapptoken 9fec83cdca38c357e6b65dbb17514cdd36bf2a08', - 'Authorization': 'dmtoken ${token}' - }; + var body = { + 'doc_id': result, + 'curr_iso_code': '643', + 'commit': 'true', + 'sum_total': sum_total + }; - httpClient.post(url, body: body, headers: headers).then((response) { - - print(response.body); - Navigator.of(context).pop(); - pushRoute(context, new PurchaseSuccessScreen(sum_total, user['first_name'] == null ? '' : user['first_name'])); + var headers = { + 'DM-Authorization': 'dmapptoken 9fec83cdca38c357e6b65dbb17514cdd36bf2a08', + 'Authorization': 'dmtoken ${token}' + }; - }).catchError((error) { - print(error.toString()); - }); - }); + httpClient.post(url, body: body, headers: headers).then((response) { + + print(response.body); + Navigator.of(context).pop(); + pushRoute(context, new PurchaseSuccessScreen(sum_total, user['first_name'] == null ? '' : user['first_name'])); + + }).catchError((error) { + print(error.toString()); + }); + }); + } } } \ No newline at end of file diff --git a/lib/registration.dart b/lib/registration.dart index d8d26ac..e217134 100644 --- a/lib/registration.dart +++ b/lib/registration.dart @@ -22,19 +22,29 @@ class _RegistrationScreenState extends BaseState { return 'ID магазина'; } - /// Высота контейнера задана для того, чтобы элементы располагались вверху экрана - /// и список скроллился снизу вверх при открытии клавиатуры. + // Список виджетов, автоматически прокручиваемый вверх при открытии клавиатуры. @override Widget getScreenContent() { return new Container( child: new ListView(children: [ - new Center(child: new Column(children: [ + new Column(children: [ getLogo(), getHintLabel(), getDecoratedTextWidget(), - new Container(margin: new EdgeInsets.only(top: 36.0), child: buildRaisedButton(context, 'ЗАРЕГИСТРИРОВАТЬ', _isValidMerchantID() && !loading ? () => _registerShop(context) : null))])) + getButton()]) ])); } + // Возвращает кнопку регистрации. + getButton() { + return new Container(margin: new EdgeInsets.only(top: 36.0), child: + buildRaisedButton(context, 'ЗАРЕГИСТРИРОВАТЬ', getOnPressed())); + } + + // Возвращает обработчик нажатий на кнопку регистрации. + getOnPressed() { + return _isValidMerchantID() && !loading ? () => _registerShop(context) : null; + } + /// Токен кассы - это DIN код. DIN код - это специальный код динекта, максимальная его длина - 25 символов. _isValidMerchantID() { print("${textFieldValue.length}"); @@ -51,28 +61,29 @@ class _RegistrationScreenState extends BaseState { /// Получение от платформы id установки, формирование запроса на получение токена, сохранение токена. _register(BuildContext context) async { + if (await platform.invokeMethod('isOnline')) { + createToken(textFieldValue, await platform.invokeMethod('getPosID')).then((response) { - createToken(textFieldValue, await platform.invokeMethod('getPosID')).then((response) { - - setState(() { - error = null; - loading = false; - }); - - print(response.body); - Map parsedMap = JSON.decode(response.body); - if (response.statusCode == 201) { - token = parsedMap['token']; - platform.invokeMethod('saveToken', {'token' : token}); - platform.invokeMethod('saveMerchantID', {'merchantID' : textFieldValue}); - pushRoute(context, new FinishRegistrationScreen()); - } else { setState(() { - error = parsedMap['errors'][0]; + error = null; + loading = false; }); - } - }).catchError((error) { - print(error.toString()); - }); + + print(response.body); + Map parsedMap = JSON.decode(response.body); + if (response.statusCode == 201) { + token = parsedMap['token']; + platform.invokeMethod('saveToken', {'token' : token}); + platform.invokeMethod('saveMerchantID', {'merchantID' : textFieldValue}); + pushRoute(context, new FinishRegistrationScreen()); + } else { + setState(() { + error = parsedMap['errors'][0]; + }); + } + }).catchError((error) { + print(error.toString()); + }); + } } } \ No newline at end of file diff --git a/lib/splash.dart b/lib/splash.dart index cb3535b..96bec76 100644 --- a/lib/splash.dart +++ b/lib/splash.dart @@ -18,27 +18,28 @@ class SplashScreen extends StatelessWidget { showNextScreen(context); }); - return new Stack(children: [getBackgroundContainer(), getLogo(), + 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)))]); + 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)])); } - getBackgroundContainer() { - const margin = 48.0; - return new Container(padding: new EdgeInsets.only(left: margin, right: margin), decoration: getSplashBackground()); - } - + // Возвращает контейнер, который содержит decoration с фоновым изображением. getSplashBackground() { - return new BoxDecoration(image: new DecorationImage(image: new ExactAssetImage(splash_png), fit: BoxFit.cover)); + return new Container(decoration: + new BoxDecoration(image: + new DecorationImage(image: new ExactAssetImage(splash_png), fit: BoxFit.cover))); } - /// Запуск следующего экрана приложения. + // Запуск следующего экрана приложения. showNextScreen(BuildContext context) async { token = await platform.invokeMethod('getToken'); @@ -49,12 +50,14 @@ class SplashScreen extends StatelessWidget { if (token == null) { pushRoute(context, new RegistrationScreen()); } else { - checkTokenStatus(token).then((statusResponse) { - handleStatusResponse(context, statusResponse); - }).catchError((error) { - print(error.toString()); - return false; - }); + if (await platform.invokeMethod('isOnline')) { + checkTokenStatus(token).then((statusResponse) { + handleStatusResponse(context, statusResponse); + }).catchError((error) { + print(error.toString()); + return false; + }); + } } } @@ -78,25 +81,25 @@ class SplashScreen extends StatelessWidget { if (active) { startScanner(context); } else { - createToken(await platform.invokeMethod('getMerchantID'), await platform.invokeMethod('getPosID')).then((response) { - print('response.body: ${response.body}'); - - if (response.statusCode == 409) { - pushRoute(context, new FinishRegistrationScreen()); - } else if (response.statusCode == 201) { - platform.invokeMethod('removeKeys').then((result) { - Map parsedMap = JSON.decode(result); - String t = parsedMap['token']; - deleteToken(t).then((response) { - print(response.body); - Navigator.of(context).pop(); // Убираем текущий route - pushRoute(context, new RegistrationScreen()); // Запускаем регистрацию - }).catchError((error) { - print(error.toString()); + if (await platform.invokeMethod('isOnline')) { + createToken(await platform.invokeMethod('getMerchantID'), await platform.invokeMethod('getPosID')).then((response) { + if (response.statusCode == 409) { + pushRoute(context, new FinishRegistrationScreen()); + } else if (response.statusCode == 201) { + platform.invokeMethod('removeKeys').then((result) { + Map parsedMap = JSON.decode(result); + String t = parsedMap['token']; + deleteToken(t).then((response) { + print(response.body); + Navigator.of(context).pop(); // Убираем текущий route + pushRoute(context, new RegistrationScreen()); // Запускаем регистрацию + }).catchError((error) { + print(error.toString()); + }); }); - }); - } - }).catchError((error) => print(error.toString())); + } + }).catchError((error) => print(error.toString())); + } } } }