From 3367b588d9743720fb8925f399859ab536ad38a4 Mon Sep 17 00:00:00 2001 From: Alexey Egin Date: Thu, 9 Sep 2021 08:35:29 +0300 Subject: [PATCH 01/14] Implement zboom --- app/build.gradle | 9 ++++ app/google-services.json | 45 ++++++++++++++++++ .../ru/frogogo/whitelabel/util/Constants.kt | 4 +- app/src/main/res/values/strings_profile.xml | 25 ++++------ app/src/zboom/ic_launcher-playstore.png | Bin 0 -> 23120 bytes .../res/drawable/ic_launcher_background.xml | 12 +++++ .../res/drawable/ic_launcher_foreground.xml | 33 +++++++++++++ app/src/zboom/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2499 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4192 bytes app/src/zboom/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1782 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2767 bytes .../zboom/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3375 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 5887 bytes .../zboom/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 4950 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 9233 bytes .../zboom/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 6908 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 13133 bytes app/src/zboom/res/values/plurals.xml | 9 ++++ app/src/zboom/res/values/strings.xml | 6 +++ app/src/zboom/res/values/strings_auth.xml | 24 ++++++++++ app/src/zboom/res/values/strings_common.xml | 25 ++++++++++ app/src/zboom/res/values/strings_coupon.xml | 7 +++ app/src/zboom/res/values/strings_home.xml | 13 +++++ app/src/zboom/res/values/strings_item.xml | 6 +++ .../zboom/res/values/strings_onboarding.xml | 11 +++++ app/src/zboom/res/values/strings_profile.xml | 21 ++++++++ app/src/zboom/res/values/strings_receipt.xml | 9 ++++ app/src/zboom/res/values/strings_scanner.xml | 8 ++++ 28 files changed, 250 insertions(+), 17 deletions(-) create mode 100644 app/src/zboom/ic_launcher-playstore.png create mode 100644 app/src/zboom/res/drawable/ic_launcher_background.xml create mode 100644 app/src/zboom/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/zboom/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/zboom/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/zboom/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/zboom/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/zboom/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/zboom/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/zboom/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/zboom/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/zboom/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/zboom/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/zboom/res/values/plurals.xml create mode 100644 app/src/zboom/res/values/strings.xml create mode 100644 app/src/zboom/res/values/strings_auth.xml create mode 100644 app/src/zboom/res/values/strings_common.xml create mode 100644 app/src/zboom/res/values/strings_coupon.xml create mode 100644 app/src/zboom/res/values/strings_home.xml create mode 100644 app/src/zboom/res/values/strings_item.xml create mode 100644 app/src/zboom/res/values/strings_onboarding.xml create mode 100644 app/src/zboom/res/values/strings_profile.xml create mode 100644 app/src/zboom/res/values/strings_receipt.xml create mode 100644 app/src/zboom/res/values/strings_scanner.xml diff --git a/app/build.gradle b/app/build.gradle index a417b9f8..19162d07 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -44,6 +44,7 @@ android { buildConfigField 'int', 'API_VERSION', '1' buildConfigField 'boolean', 'DEBUG_STUFF', 'true' buildConfigField "java.util.Date", "BUILD_TIME", "new java.util.Date(" + System.currentTimeMillis() + "L)" + buildConfigField 'String', 'PHONE_PREFIX', '"+7"' } signingConfigs { @@ -72,6 +73,14 @@ android { buildConfigField 'String', 'BASE_URL', '"https://sboom.herokuapp.com"' } + zboom { + dimension 'server' + + applicationId "ru.frogogo.zboom.demo" + + buildConfigField 'String', 'BASE_URL', '"https://zboom-eu-staging.herokuapp.com"' + buildConfigField 'String', 'PHONE_PREFIX', '"+386"' + } } buildTypes { diff --git a/app/google-services.json b/app/google-services.json index 12e5538a..55ab7628 100644 --- a/app/google-services.json +++ b/app/google-services.json @@ -29,6 +29,51 @@ { "client_id": "99713790578-110snv82qvlm88eteflcf05sueu4o1cr.apps.googleusercontent.com", "client_type": 3 + }, + { + "client_id": "99713790578-lied9f35g5i1er1k538ef5g1444mhum6.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "ru.frogogo.WhiteLabel-iOS.sboom", + "app_store_id": "1565327032" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:99713790578:android:3348cc8c23709ab5f388eb", + "android_client_info": { + "package_name": "ru.frogogo.zboom.demo" + } + }, + "oauth_client": [ + { + "client_id": "99713790578-110snv82qvlm88eteflcf05sueu4o1cr.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyBmggdVETxVr4BYmlXjfQkeeaKkR7iV2pI" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "99713790578-110snv82qvlm88eteflcf05sueu4o1cr.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "99713790578-lied9f35g5i1er1k538ef5g1444mhum6.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "ru.frogogo.WhiteLabel-iOS.sboom", + "app_store_id": "1565327032" + } } ] } diff --git a/app/src/main/java/ru/frogogo/whitelabel/util/Constants.kt b/app/src/main/java/ru/frogogo/whitelabel/util/Constants.kt index b88965e4..80d3a629 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/util/Constants.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/util/Constants.kt @@ -22,9 +22,9 @@ object Constants { // Auth const val SMS_SENDER_NAME = "CodoPhone" // TODO: 19.07.2020 Change to own sender + const val PHONE_PREFIX = BuildConfig.PHONE_PREFIX const val PHONE_MASK = "([000]) [000]-[00]-[00]" - const val PHONE_MASK_FULL = "+7 ([000]) [000]-[00]-[00]" - const val PHONE_PREFIX = "+7" + const val PHONE_MASK_FULL = "$PHONE_PREFIX $PHONE_MASK" const val CONFIRMATION_CODE_LENGTH = 4 const val VENDING_MACHINE_ID_MAX_LENGTH = 8 diff --git a/app/src/main/res/values/strings_profile.xml b/app/src/main/res/values/strings_profile.xml index 2db80c91..efad0723 100644 --- a/app/src/main/res/values/strings_profile.xml +++ b/app/src/main/res/values/strings_profile.xml @@ -1,28 +1,23 @@ - Версия %1$s (%2$d) от %3$s Пригласить друга Приглашайте друзей и получайте бесплатные товары - - Мои чеки + My receipts Мои купоны Выход - - Мои чеки - У вас пока нет\nотсканированных чеков - Проверяется - Принят - Выполнен - Отклонен - + My receipts + You don\'t have scanned receipts yet + Being checked + Adopted + Completed + Rejected Мои купоны У вас пока нет доступных купонов - - Сканирование нового чека недоступно, т.к. у вас есть чек в - состоянии \"Принят\" или \"Проверяется\" - + You can scan the receipt + Scanning of a new receipt is not available, because you have a + receipt in the state \"Accepted\" or \" Checked\" diff --git a/app/src/zboom/ic_launcher-playstore.png b/app/src/zboom/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..a7278301967f14845c1392f7aacde7a0de51470a GIT binary patch literal 23120 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 bTK7HGmUPJCm7Vck1ph3}Y)p$yn8*GPqRirz literal 0 HcmV?d00001 diff --git a/app/src/zboom/res/drawable/ic_launcher_background.xml b/app/src/zboom/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..cdbb5150 --- /dev/null +++ b/app/src/zboom/res/drawable/ic_launcher_background.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/zboom/res/drawable/ic_launcher_foreground.xml b/app/src/zboom/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 00000000..128e8494 --- /dev/null +++ b/app/src/zboom/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + diff --git a/app/src/zboom/res/mipmap-hdpi/ic_launcher.png b/app/src/zboom/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..735120ca7b33a5c48874337c729502ce9b8fc929 GIT binary patch literal 2499 zcmV;!2|V_RP)&+$HTo8iNZR?iTT&X=5l$Qq zTgOc|xI5n7>g~APR@G-9(x>m0?~ytO0*llun*<|697?UPmrR!M5UN%Cd{s%c^7AF7kzoER&Q5n<`L5 zgpD4VF^J9|4UIT5?TSE$x0OE2&vXVV&~iy>v}poi9m$~=2XqS5vdz0nvVuSmXEYn+Pv0{^9AGtpaYJu@j-hDgt3@Jv=={>_Dioiak zVi$d|zf5er8T5C7V0(V|^9-@!W)W(EBH10dZA^mfFI_FS-W)GaE0oVlkDz1hgrc#Z zov5T&o-5#$OyrFhi|NdpW%T6-{$oEEPFB*pyGp5X>0ny)+bml0csA|fG9SNF0e?%# zZ<;^}ZU^n&SR_8U2bvoTDZ*)!%TFBVp^NV;oraM%)~_WiBZ7YQ({%cxGrvmPfigLG zmgI5h@;e+hx^{Rh?c7k*eH5U-3)Hx5aMyLCK$w2$Bz~&bTv0Z9;ZMH35;{KhHjl2H zk&M&`I=sC^XopOH7APatN$>CTE$v2uMpnntmQ@8bb%I`iUp$o7RR&Yfli(XUi9Cwn zl^e1 z8`oN4n5kGOIa0!H|cW9e9 z@3*clkVg;lXh(uSfv`d*CpswFrPwRriFeTIKjv9qpgX^vC@;O*#$bp~9GlRUXWvW3 zJqlDaGLGJQ*-P{1Wa_Tp&UL6|*05Nr!3PsYC&ongUBBG7HGqwKc={mur5N)9Y!Rv} zV|1%!SOu~%O)GpI&~`p8#rLMM^8NiUdYb@$3^pb<#;(I1YnN?N%{8$)`=f%DaM9c> zswj2IF{NmiQZALBH*IPX9e<-6ae&zZc?+V1l?(j(k#t=?IH;ezqZbIv^SPFCI>m2W z%eh1Pk=7k3-+r*1-rVAq-50nn#ykRM3WU{Z@nhLSBii07lLgV{Mf~Su!w52R_Fx$u z+Ulj_yN3t{AK*9$Q|C1MXsWxS<)1vVa35SeCEk}YQ=n}2mChd%gY7Gx$kDkA08Z*h z1{(yhPg=>#f8`LD{09m!x|lAg8@pkxEgA8(7>eV2m{#}j22r~|LR=fqknc18UYv|s z0>L|<^AmBUz$n2U#F#&UZH;m2zzLoEXa+?_`Zu_C7I}DOG=2ECQm&*hs_Pznw3Q2$ zebwhYS|;D3cTb-9Wj6sivjoCY`)+60LdynTaa>W#(yj#~N)2AY;+ z{U6+=xDBWqQ&PP?lm+l75K!G1BViQ?5k=$DjwScLDM>!P83WOcDQ6P*S zHA)FE6}5GRO&}P@ml_I$2mgatvst{o|IvLZesQw@1e>8X)TgvAtJ4tkjh2Fll zQ0K5-KO$BT2%!-*N&ulIkMAc&I*@=Fz-|{J?bkT02VeE-VmsIg&%9p@e$D8#cUpmv zXWR3IRQt_1nsTd$_HEY3gDfc!%0K#`FD3++0n^p^3@wNr?%kw_Y7_{;dH8&o?#6J3 zWd*9{ea&B6eADbho^n`;qC35Q6&T;DvS>Msp$6c!0>MGn){ot{wtUzG3gp-aI6I9f zY}m_x*4wZP>_fG_RwCOZ9N{c}JX?-qYlQ^6UnuT67CQKfS9cGa&R19aj*W0+B#2{% zK*3e^iW_WfdIA*_{$8TBcZ}-0s(bZGi4-MQ6PYDDbCkJE|OIR0>$}J zw6m#)zwHSIK@!OHZ#7hKLW*!opkEdKUsQp%TIgF1BdN(wS~f37IIRr^>gQ0c+xs?x zo|KfvhD9KN)ot1xNy14;pJ`VDzHndpUw-4UAlaxQvM_p z2aF9*4Ss;@ceb=tM@YR$HpanZFs+i(NQe|x>~^VRbd9^Cd3_#?jl4dXXTIhpAyuk?>Z-1%htZeIr&ri9Od+M(FI-f@yXBSOw1UkB%LcFpBH* z)YZweC7|SDGMQm^yL}e_T*GW+HZV=$CemqZ%1VuFnm9J0Y2NItrpBdtP0fu3P0j0y z6x84O=WA<=Ht;5NazP N002ovPDHLkV1gd3!uS9H literal 0 HcmV?d00001 diff --git a/app/src/zboom/res/mipmap-hdpi/ic_launcher_round.png b/app/src/zboom/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..b89278684f754efd82508be8fe197cb5b7650390 GIT binary patch literal 4192 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 Y0o>bk6g3kRzW@LL07*qoM6N<$g8IKbfdBvi literal 0 HcmV?d00001 diff --git a/app/src/zboom/res/mipmap-mdpi/ic_launcher_round.png b/app/src/zboom/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..7fdf9c9c75183db12306dd3d898febfb95d3d849 GIT binary patch literal 2767 zcmV;=3NZDFP)NklE$TP$M8(9!<636)2DJh5`v8v{V755(%WBWKaL^+l>3mikA_l5MCv0 zB(xLG63(l@cU;3gjKNquqY39@Eu4S-L|}R;*wGq76QP^H`+|rF#xv3^e0oh<_x81= zO&3piYWNvr2BMIA?t~3<;O8xZPZ6l&>5&T!Rnf&8DE>&rFZ_f$OSNN1f z==b(7JKb1A276VeD>6gu>3w0WMF@K(6y7PItHuQ(md0cq6~Jv&)G&IC(FwJxzp*VNdMvX!j&$P zE1ld?IfG%50Inn%#WB6Y3KxoviR5vyp%D`uq3!+?zswQ~li3k~KEO491r=QC5CJQ2 z(KHTq0-oyV6gE(nRoW@d@8*_l?p`MpxH=;CMd z_-#K*_QBM<()sHP^Zhc@uJvX7kq0xyn4eBa=F{&<=UY~n@=Jzx16IHW9Bpyj4@Heu zFs3FnW>7}+{r0Vue!FGHx`rY#cFcDZ$XAtWi!3DPFap+^KPOw;<)-DuJZG>~GCH%kTeZ_su1jdg|#-^AF;Pccj*EVK472kkjxN}m99|5G(Pxd)G z7Cf4t!VHp2IHNuokN^Vk4P#ayH(I)=K=?H7V=?Tgy#MoCQ-nfBq^3miq2%)`>g`&J zY-@4wJLuWLnHFJ5kiq$3()c8PsJS8_0ouf~OBUGeQh7)*;d52lfCR8`=MLS+&ypo> z8K>{^j4A0pg$mj0z1ItUuzp!FKe63EEra;RRV5;A*1s@>H@#KN&mHzZ{73@l4!O=R zud`Q3ZlS5zx#RXgoF>-i=;x23dRK&9~EaLht z;}QcBIJ@8V>7w5Zf!An)fCw7I4?U3KGZFGVs;6;`IlyrSj*3()l$;dB(^Hk;jHFtC zqPFM5a_%UN5!YbhTDpeJG-gzSHs_7sO9)8d-@Bb1HMb^YGJ`}DTGR)92o&Vn`1Uor ziGi8-W%!kTS4E8Bje|#I8hLL;eIehtvP4UdWyR4VT}lFgg-F~nF~!F%0};Sy$2JGr zeKejzkWYan>VrN6?xSNN{8CPGs@2Jp6ZKRlfotts9oo1`gK`^JmWm21i&+6xbPzHU zz=lYR$;}Bw0EKLCQ+Wg3x5|bN0Iq>{r0)44`~VdxNdOj6 zI6L4T+Hzz!Tz_Jg-i9N_rq!g0>+^m+SW&*i?WNuKA{O7RFM#`4%*RT3JR3r2V+slF zNEsg+8Zx^8=!uL4O?I8;BPCi9^isIqb<})a884HEJW_W2y|R61MT{ManvawaFp42O z&P-Ma2WXeqE>(8<`as|PmG$2?n{x3@Yj@9rYIElYZYJ&6*Xf`7zm{AQ>ETR zbLSCQV`K0?Wq}!r+9bjirYO|sx6l%38*q3x9(?+POC6r8$UJBEyRQ6p_TXxoJGwQ* zi!CW2kxY1oDGJFyT=*#(3Z+HSeCK-K3LXyBwCP1Wyi;d?j^<1b<~n9UYJ!P!*Z|&4 zBW0omr@qBcxobgHz8A^h!?%jxhA!3BEUK?BcOi%en5vNQ0n-%=+npYmoF-0RW+j6` zx($@4R(uW3QADtY^7~+d2M`ZvTk)P=DizirIMAHUx<5mEUla_;^$1uf54UMjcD{rV zEh}z+L(7E0V*#A?qp+1 zOx(%z6l)}c__!vS8%DkW5l+u~?jx~OnI-LE91G&VYI;RI|rg20AL z4JHgDBB*dT2^H1np2yx>4mwuk7p!X(FtSDKIQp=3U&sI#1gUy<%9`D z=1KZQ;Ni4{)g5i{ms`YSPTIMGI(bXMeGCz zVK`w7;fE^l9oKLVV=xxa;91P^jVf*ySOiKSMgVCY{Qtus75I*8xF^TpnF0Ix{{U#x VCJ_CrK-mBQ002ovPDHLkV1n&vO{xF@ literal 0 HcmV?d00001 diff --git a/app/src/zboom/res/mipmap-xhdpi/ic_launcher.png b/app/src/zboom/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..bd6b80e6941b9615f21ab06423e9a9a769d33c7b GIT binary patch literal 3375 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 FV1g*}RSy6F literal 0 HcmV?d00001 diff --git a/app/src/zboom/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/zboom/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..b0651fd597a9ee283c6d61f95209d97e32e98baa GIT binary patch literal 5887 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 V#3?7r7#aWo002ovPDHLkV1htI=<@&o literal 0 HcmV?d00001 diff --git a/app/src/zboom/res/mipmap-xxhdpi/ic_launcher.png b/app/src/zboom/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8f4ec950712975b09977bfbf74b056b6574149b4 GIT binary patch literal 4950 zcmZvgbzBqP_y5`0WH4fMh_KNeLsA-~JCu-8DM9c}Hvs{sn=7A>zLId&x)?rN1D!(j^w-y5TI4=Sh z{d>Opj-2KNp8bXJUh%Z@Sf2fL%B^<~to6+F8*N*57hniX0;DF;u!;1h?ZV4g@-^vx zmctc7erue%?r4V0u~?U581A3B{uMXqiu-}W%tCVozt9_K-zVa!4);OI{+v!K+h`C9 zotnA4`4BZNH_yc01K=B{BcN3J^k_!>ZOJ~3DP>)VSHYwZi`Uaio7_Lxp*P8O>>k*_ zTGP8gN;-F>_uW zoK2*8=kz7;>m?n0ret}qRCnIt$r)-_IA}y$V5O;%s1clyBa19W2OTL9+W3nCUPoH^ z)YNiUt((~BEzZ>icvCY)U>KpWpDEXoT%gH&EmbbUKe;UzDvV7n1pYy3VHQ0n&?@?g zGd)#Xqu9j4HNaNtUUK`=l1LTFgqz9Jrv57Z)D)|_DXXnfKZ4@=1Z@|2)<3)0;{AP$ ziDa(@E9;sg*2a&)zMN!INa{T~@_3W<^Tpn*o43sPEQw>l&f%{=zPbY2n(fiDa%_(~ zmhMn2Mu9W-mVjm}a*w_f>%$|u@8QpL{#f1se>HxtvETl&(!J@cnJX`c41xWKpm>$| zOWnGW#vmj^6?s>z;0iNCZY z&F|C_Dycrk!wk>|bR0>hp4EFIE(j0}z{r@Y|GpT%X(THJ1Q3~3qDs_!wa#YR*#}it zv;%dYi0S|2YHc*LGiva}+mjZ^cwhDnuv99)<3^*pRF$mR%nw{6D?3)n5CtNM8aH{G zk~9`>4sBw1F#rT@_iMK{o&AS_8DKQeIQr+%K}vo6%8CewV@7FQwC=x0+bfhn5(H1|g9sMZvv=CDwlwzC zS$K`*^21=jP<=;5-^Q)srJ1V#FDqltsA$oPNkUyplqTVC-dYkBmreBXOgo)UYqi-) z&;jE~yGUf0O>N0yp)>AM`v}{=&YYaKWpdM=T=Df@{tURbfZ-(N%xcy&5 z{gV-92Z&ELVTZO#4-@Z)Od?KrD_t0zD~Mm-wl{cI{pbE!FNoxszY@z_^)*YaX-c@z z-eQE~5+%!FK3QiEMnJgW=W`sv(KAm&c};^K#!C&KZ5mnBfJo?y&Iaiq;_gPH)rd9M zq^L!mc)`*?7#^MD&NytV4X~ruuD|ci{xgD3&;Kq)-M+kLl{gahQ(k=Dpj=te5C&_J zmCIL-3*0=Q6AU|K{CZngwJnop0D+9*X7VaVPqfjfA~@VVgzDl|!tH@2aZpLN*3;;# zWkrRfuN{AEct9YLfpCgm1y=k6V5V4py(7eHKpW0-kTUw5Hy=P0Fm}{S{!oMprYgJA zz>K^cVn*ir7%u>W`{+8BH}WaaC^i9jdB=zPpDhYKS zYoV*I&g*uwELAjSq5k08p{qMNcKag4yI}Kre zlXqLNFBC;4)bpJ?J~U|m!2=wIs42oq411#?6Y*`T3SZDbNE9L%sQ6vY$Gf&`j%u__`t>*y1V8%l_@(V z#*mTl)A&#E<8qLRVYbe~3}a-NyOVFg?}B6Um=~Sl-?(&${*6dP2!hb0vh|1nX0PWD zm85TtZl)DAc|hp14xMjL&PqXqgdoYJ{9y%lSmrOk)6Q|deGaNKpt8&l>N6kX;Qs^- z3?azF5d)7aZ|kXG3;3hN_8C%M-jIB-Ji}oYVN5iDJCG#!tcCCEGKRc^Uiq?ji`yZ| zcf&O2mQ--XT2XfrJE{F>t51Rv?O%X8-@D)T zHRAQq{{#zS{|Ze+f9+IfdebEHrvK>R<(?^n4`&S+y<9t2WBWH{4G>HO(}{B+T6v=A z-yCz;!hH*M33G-@rCy6QWcukYW%&t)oHr#2hiu8WZ`2F%SM zR!1Q;5~1ysu#F>%4D8rT*U&x%ed6cRn9O|DXq+FnAOd0Cz1a6x&PP$^;;%|DrEOw? zcstS3)$+4|+dRb|rKnL_u%}Q@Pw`N#YsZ)Cn}7mjt(3yZn>=lbp;-kVeaR`@`bYIa zlNlr|>AOBRfYs{a!D?IOZ!XUF#9Y0lC_QQUiQ`v;@6soe-5#&guOY}HLZj&V{Zw5d zrD*O*>usHp`GGGv;3!;Zb;RzdI9m#;-8u%Ah;xrUNgn-je)MGlrQ*vOap|ukz3xZU zcF|y4UhCs4Wh0P?N^F&@lrHP`5z9zIOs35g*EP<1AvRw9?(gu^I?MtYb9Rs96r zQW7sG2XFrcJI5^1FAAr@N8TPQ@}a_n@?(U)G%4;C@6h6}%tE?tigD+idz#k{AW*<` zX@8Y;V(LiQ+O}OF!0x1cZi;R*DzU2rf3CM!96QEHdo$Tmpu*sx2_6->=#bM}$W9Hg=RYF8et%7l3i@IhBh(@51 z78YXP2|Aw^Dkp!%&Xu=%k5O2F2KYG>^+sYwCZ!C)zIxD=v`!dpk($PlqW^U3tB%Yr}LjTd$SM@iE z`YRRdoG50*I0J6y;_d5$qW;TBc{jW(G6G&4cIsqR2HG@Me-NjFO}|5|7t>}dZZ0kJ zaz-hCDMhi>b<$+Y7Jlm9V6#taj|$T*J||;LRfJ(U?Gl*K56>z{RPssZ(7SVLz%I91 z%#C8f^_^V?g=-o&=m(`Bz#n?79&A%v#T}eIZn9qq3e>leldw7MI}o_NOMB+yb_H^S z1D2UE)PhXw;{>NI3!j>v=z%GLE0}Z?OeMf0J4AN#bf-7yG8T|zDwOnVo=SG^LOFeL08KM#4M8ea(%JGP_amnhiNT2-8 z;aL{gm?gh4;X8w};+}&)z;1_LAZfYQ9^QaDpNvsKl1hHXb@o$vnz?S)s6xvB2nfSP z3iPwLEm%IDcj>ITwgru_Lw3LVO^Tiog<*GyyIuG)B7g`{NccUGIhARdiebSL=E zbO1#9+t&99{e1&$Ur6NG{L?%i`rOD)^9J!Kh88Q#r} zDpauGnsQd4DGqYFN5^t_2EgH&#g?e+5Eu(SsFLvH(UN7uGv!kK>|T?56rMqwuD=O2 zx<=xm6GVs1HlL+;$D=4LzCdObW5I|A*6@dv@iphlZyoW9q0wS79kQ}jFn&E^t;Z~R zh~DcP-rc=7ym#aV;g zS{i=*Z@`{U+v;U!J#BgdH8G%vU>3ep+BYDOHOv47ZtFTHT}L`=0|2{w@wy|S3(u<= zuWi5$MK$(aQtqL=;Xtj_Yv8u#h4~?U$!qYBj=B|x5ve$ECTg?XIiW8uIC3`S)v<6atb^}z!RqofZHLDDzE5{_iDn4E ziu(ep2hji^?+335A@>@e`?KqPKP)2K`~DJONR+LUZxX~EyzzT|UG^Of0wB#Jq$Sa# zK8Lt~zLlN~mq;vEXtHVfcD17~I$n)knH#GI@7KSH+K1LkHm84g@o}!$O)qfkb~}ej zSz7UMrb0_km8sdr;rtW4?&%k&{PGhUg^`3@EK(!<8%q$~eW}Y3PF>xta_vdyA0Ut; zRM%Rxln;Se_Ni#=7<~_rnr3)U{Hy;!$}*a4_*H3$`i}4YZA($ASkP@ai zt`v8nJe|dg%1rGHm{cO68(P410piO1Y^$9umpaC@pnR*Dc6trMml zZ!^(w*=+YUI@P$HhFImGx|b6z2DFkb)yM{&v;G;JrF%nNEac6e%^%ufWDJ*b zBGt;n`F!RCf6ECc z!P_A3ZZx&niXl^=sFXc{Fh55Aqx|zHQUSfzW-zP&s~Gi&=Stz3-gEo%4zM`BUPhq# MSWmS^**5(D0X*m%r~m)} literal 0 HcmV?d00001 diff --git a/app/src/zboom/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/zboom/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..125b8b0a64f21c822c41094c973ff2e29fe1288c GIT binary patch literal 9233 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 c_QWkq+}$q%5lM;~0DGt@JyZNHZx!~x0A + + + + %1$d second + %1$d seconds + + + diff --git a/app/src/zboom/res/values/strings.xml b/app/src/zboom/res/values/strings.xml new file mode 100644 index 00000000..a6863a40 --- /dev/null +++ b/app/src/zboom/res/values/strings.xml @@ -0,0 +1,6 @@ + + + + Z-Boom + + diff --git a/app/src/zboom/res/values/strings_auth.xml b/app/src/zboom/res/values/strings_auth.xml new file mode 100644 index 00000000..9cf6e631 --- /dev/null +++ b/app/src/zboom/res/values/strings_auth.xml @@ -0,0 +1,24 @@ + + + Сontinue + By using this application, you agree to the use of Cooke technologies. and with the collection and processing of personal data. \n\nThese technologies are used to analyze and improve your user experience. + Сontinue + Enter + Enter your phone number + (000) 000-00-00 + Exceeded the number of attempts to request a confirmation code + Type code + The code was sent to the number + ・・・・ + Edit + Send a new code + Sending the code + Invalid code, please try again or request a new one + Sending error + Let’s meet! + What is your name? + Your name + Fine,\n%1$s! + It remains to enter your email + Your email address + diff --git a/app/src/zboom/res/values/strings_common.xml b/app/src/zboom/res/values/strings_common.xml new file mode 100644 index 00000000..eac363fb --- /dev/null +++ b/app/src/zboom/res/values/strings_common.xml @@ -0,0 +1,25 @@ + + + + OK + Сontinue + Cancel + Yes + No + + The phone number cannot be less than 10 characters + The phone number contains invalid characters + The name must consist of 2 to 20 letters + Name contains invalid characters + The code must consist of 4 digits + The code must consist only of digits + This email not correct + Необходимо ввести номер аппарата + Отсканированный QR-код имеет неверный формат + Something went wrong! + Repeat + An internal error has occurred, log in again + + loading error + Repeat + diff --git a/app/src/zboom/res/values/strings_coupon.xml b/app/src/zboom/res/values/strings_coupon.xml new file mode 100644 index 00000000..f58fd108 --- /dev/null +++ b/app/src/zboom/res/values/strings_coupon.xml @@ -0,0 +1,7 @@ + + + Coupon № %d + Show the code to the cashier + Instructions for receiving + Show the code to the cashier + diff --git a/app/src/zboom/res/values/strings_home.xml b/app/src/zboom/res/values/strings_home.xml new file mode 100644 index 00000000..8bc733d5 --- /dev/null +++ b/app/src/zboom/res/values/strings_home.xml @@ -0,0 +1,13 @@ + + + Remember 2 simple rules: + Scan receipts from stores that have any products from Lion Sabatier International promotional collection + After you collect the amount of the product for 3300 ₽, you will receive a coupon for the purchase of an electric kettle Lion Sabatier International for 1 ₽ + Scan the receipt + Coupon + Promotion products + When your receipt passes verification, you will be able to scan a new receipt. + Coupons + My receipts + Scan a new receipt + diff --git a/app/src/zboom/res/values/strings_item.xml b/app/src/zboom/res/values/strings_item.xml new file mode 100644 index 00000000..3ba7354e --- /dev/null +++ b/app/src/zboom/res/values/strings_item.xml @@ -0,0 +1,6 @@ + + + Parameter + Full price + Promotional price + diff --git a/app/src/zboom/res/values/strings_onboarding.xml b/app/src/zboom/res/values/strings_onboarding.xml new file mode 100644 index 00000000..012887e8 --- /dev/null +++ b/app/src/zboom/res/values/strings_onboarding.xml @@ -0,0 +1,11 @@ + + + Next + Sign in + Buy it + Promotional products of Lion Sabatier Internationall + Scan it + Receipts containing promotional items + Get a coupon + You can buy a kettle for 1 ruble. After the purchase Lion Sabatier international advertising products in the amount of 3,300 rubles + diff --git a/app/src/zboom/res/values/strings_profile.xml b/app/src/zboom/res/values/strings_profile.xml new file mode 100644 index 00000000..82b6a8c5 --- /dev/null +++ b/app/src/zboom/res/values/strings_profile.xml @@ -0,0 +1,21 @@ + + + + Версия %1$s (%2$d) от %3$s + Пригласить друга + Приглашайте друзей и получайте бесплатные товары + Мои чеки + Мои купоны + Выход + + Мои чеки + У вас пока нет\nотсканированных чеков + Проверяется + Принят + Отклонен + + Мои купоны + У вас пока нет доступных купонов + Вы можете отсканировать чек + Сканирование нового чека недоступно, т.к. у вас есть чек в состоянии \"Принят\" или \"Проверяется\" + diff --git a/app/src/zboom/res/values/strings_receipt.xml b/app/src/zboom/res/values/strings_receipt.xml new file mode 100644 index 00000000..924349f4 --- /dev/null +++ b/app/src/zboom/res/values/strings_receipt.xml @@ -0,0 +1,9 @@ + + + № %1$d + Great, the receipt has been accepted! + As soon as the total amount of receipts is equal to 3,300, you will receive a coupon for the purchase of an electric kettle Lion Sabatier International for 1 ruble + Your receipt has not been verified! + Your receipt is being checked + This usually takes a few minutes, but it is very rare when it takes more of time + diff --git a/app/src/zboom/res/values/strings_scanner.xml b/app/src/zboom/res/values/strings_scanner.xml new file mode 100644 index 00000000..685f7ddc --- /dev/null +++ b/app/src/zboom/res/values/strings_scanner.xml @@ -0,0 +1,8 @@ + + + To scan receipts, access to the camera is required + The permission must be granted in the settings + Point the camera at the QR code on the receipt + Help + How to scan a receipt + From c28c6bac4bb4e2ae4e0be10ada122982e55f2be6 Mon Sep 17 00:00:00 2001 From: Alexey Egin Date: Mon, 27 Sep 2021 01:45:49 +0300 Subject: [PATCH 02/14] Fix euro sign --- app/src/zboom/res/values/strings_home.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/zboom/res/values/strings_home.xml b/app/src/zboom/res/values/strings_home.xml index 8bc733d5..3b986198 100644 --- a/app/src/zboom/res/values/strings_home.xml +++ b/app/src/zboom/res/values/strings_home.xml @@ -2,7 +2,7 @@ Remember 2 simple rules: Scan receipts from stores that have any products from Lion Sabatier International promotional collection - After you collect the amount of the product for 3300 ₽, you will receive a coupon for the purchase of an electric kettle Lion Sabatier International for 1 ₽ + After you collect the amount of the product for 3300 €, you will receive a coupon for the purchase of an electric kettle Lion Sabatier International for 1 ₽ Scan the receipt Coupon Promotion products From a338a18477cf3bfbdf05877439966cfc72068a8b Mon Sep 17 00:00:00 2001 From: Alexey Egin Date: Mon, 27 Sep 2021 01:48:29 +0300 Subject: [PATCH 03/14] Remove phone length validation --- app/src/main/java/ru/frogogo/whitelabel/util/Validators.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/ru/frogogo/whitelabel/util/Validators.kt b/app/src/main/java/ru/frogogo/whitelabel/util/Validators.kt index f5753c9f..c31cfda4 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/util/Validators.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/util/Validators.kt @@ -26,7 +26,7 @@ object Validators { @StringRes fun isPhone(text: String): Int? = when { // Check length - text.replace(PATTERN_NON_DIGITS, "").length < MIN_LENGTH_PHONE -> R.string.error_phone_length + // text.replace(PATTERN_NON_DIGITS, "").length < MIN_LENGTH_PHONE -> R.string.error_phone_length // Check format !Patterns.PHONE.matcher(text).matches() -> R.string.error_phone_format // All is ok From 314e97b10740fcc8e0ca441a27dc13144762fdf2 Mon Sep 17 00:00:00 2001 From: Alexey Egin Date: Fri, 1 Oct 2021 00:48:56 +0300 Subject: [PATCH 04/14] Fix zboom --- app/build.gradle | 2 +- .../ui/auth/code/AuthCodeFragment.kt | 2 +- .../ui/auth/phone/AuthPhoneFragment.kt | 46 +++++++++++-------- .../ru/frogogo/whitelabel/util/Constants.kt | 1 - .../main/res/layout/fragment_auth_phone.xml | 12 ++++- app/src/zboom/res/drawable/ic_app_logo.xml | 35 ++++++++++++++ 6 files changed, 74 insertions(+), 24 deletions(-) create mode 100644 app/src/zboom/res/drawable/ic_app_logo.xml diff --git a/app/build.gradle b/app/build.gradle index 19162d07..97a33417 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -79,7 +79,7 @@ android { applicationId "ru.frogogo.zboom.demo" buildConfigField 'String', 'BASE_URL', '"https://zboom-eu-staging.herokuapp.com"' - buildConfigField 'String', 'PHONE_PREFIX', '"+386"' + buildConfigField 'String', 'PHONE_PREFIX', '"+"' } } diff --git a/app/src/main/java/ru/frogogo/whitelabel/ui/auth/code/AuthCodeFragment.kt b/app/src/main/java/ru/frogogo/whitelabel/ui/auth/code/AuthCodeFragment.kt index a9b56d4b..30941a67 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/ui/auth/code/AuthCodeFragment.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/ui/auth/code/AuthCodeFragment.kt @@ -68,7 +68,7 @@ class AuthCodeFragment : BaseFragment() { showKeyboard() } - textViewPhoneNumber.text = args.phoneNumber.formatWithMask(Constants.PHONE_MASK_FULL) + textViewPhoneNumber.text = args.phoneNumber//.formatWithMask(Constants.PHONE_MASK_FULL) textViewPhoneNumberChange.setSafeOnClickListener(viewModel::navigateBack) buttonResendCode.setSafeOnClickListener(viewModel::resendConfirmationCode) textViewError.movementMethod = LinkMovementMethod.getInstance() diff --git a/app/src/main/java/ru/frogogo/whitelabel/ui/auth/phone/AuthPhoneFragment.kt b/app/src/main/java/ru/frogogo/whitelabel/ui/auth/phone/AuthPhoneFragment.kt index 8c1ab4ee..d4456686 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/ui/auth/phone/AuthPhoneFragment.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/ui/auth/phone/AuthPhoneFragment.kt @@ -15,6 +15,7 @@ import ru.frogogo.whitelabel.extension.binding.editText import ru.frogogo.whitelabel.extension.binding.initPhoneType import ru.frogogo.whitelabel.extension.observe import ru.frogogo.whitelabel.extension.setNullableTextRes +import ru.frogogo.whitelabel.extension.setSafeOnClickListener import ru.frogogo.whitelabel.util.Constants import ru.frogogo.whitelabel.util.ParallelAutoTransition import ru.frogogo.whitelabel.util.SpannableUtils @@ -29,7 +30,7 @@ class AuthPhoneFragment : BaseFragment(), private val binding: FragmentAuthPhoneBinding by viewBinding() private val args: AuthPhoneFragmentArgs by navArgs() - private var textChangedListener: MaskedTextChangedListener? = null +// private var textChangedListener: MaskedTextChangedListener? = null override fun provideConfiguration(): Configuration = Configuration( layoutId = R.layout.fragment_auth_phone, @@ -40,10 +41,11 @@ class AuthPhoneFragment : BaseFragment(), override fun initViews() { binding.textInputLayout.apply { initPhoneType() - setEditGoAction { viewModel.requestCode(text, true) } + setEditGoAction { requestCode() } showKeyboard() } binding.textViewError.movementMethod = LinkMovementMethod.getInstance() + binding.buttonContinue.setSafeOnClickListener { requestCode() } } override fun initObservers() { @@ -53,15 +55,15 @@ class AuthPhoneFragment : BaseFragment(), } } - override fun onStart() { - super.onStart() - attachFormatter() - } +// override fun onStart() { +// super.onStart() +// attachFormatter() +// } - override fun onStop() { - super.onStop() - detachFormatter() - } +// override fun onStop() { +// super.onStop() +// detachFormatter() +// } override fun onTextChanged(maskFilled: Boolean, extractedValue: String, formattedValue: String) { viewModel.requestCode(extractedValue) @@ -101,16 +103,20 @@ class AuthPhoneFragment : BaseFragment(), } } - private fun attachFormatter() { - textChangedListener = MaskedTextChangedListener.installOn( - editText = binding.textInputLayout.editText, - primaryFormat = Constants.PHONE_MASK, - valueListener = this, - autocomplete = false, // Prevent handling focus change - ) + private fun requestCode() { + viewModel.requestCode(binding.textInputLayout.text, true) } - private fun detachFormatter() { - binding.textInputLayout.editText.removeTextChangedListener(textChangedListener) - } +// private fun attachFormatter() { +// textChangedListener = MaskedTextChangedListener.installOn( +// editText = binding.textInputLayout.editText, +// primaryFormat = Constants.PHONE_MASK, +// valueListener = this, +// autocomplete = false, // Prevent handling focus change +// ) +// } + +// private fun detachFormatter() { +// binding.textInputLayout.editText.removeTextChangedListener(textChangedListener) +// } } diff --git a/app/src/main/java/ru/frogogo/whitelabel/util/Constants.kt b/app/src/main/java/ru/frogogo/whitelabel/util/Constants.kt index 80d3a629..16447bba 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/util/Constants.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/util/Constants.kt @@ -17,7 +17,6 @@ object Constants { // Urls const val HELP_SCAN_RECEIPT_URL = "https://poprobuy.ru" // TODO: 14.07.2020 Change url - const val HELP_SCAN_MACHINE_URL = "https://google.com" // TODO: 14.07.2020 Change url // Auth const val SMS_SENDER_NAME = "CodoPhone" // TODO: 19.07.2020 Change to own sender diff --git a/app/src/main/res/layout/fragment_auth_phone.xml b/app/src/main/res/layout/fragment_auth_phone.xml index c2cc466f..b3d26da5 100644 --- a/app/src/main/res/layout/fragment_auth_phone.xml +++ b/app/src/main/res/layout/fragment_auth_phone.xml @@ -58,11 +58,21 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_6" - app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintBottom_toTopOf="@id/button_continue" app:layout_constraintLeft_toLeftOf="@id/text_input_layout" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@id/text_input_layout" /> + + diff --git a/app/src/zboom/res/drawable/ic_app_logo.xml b/app/src/zboom/res/drawable/ic_app_logo.xml new file mode 100644 index 00000000..e5d0264c --- /dev/null +++ b/app/src/zboom/res/drawable/ic_app_logo.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + From 6d7b01a050ee3420cd1ea6c9a0861239d9ca0630 Mon Sep 17 00:00:00 2001 From: Alexey Egin Date: Fri, 8 Oct 2021 12:06:42 +0300 Subject: [PATCH 05/14] Change prices to BigDecimal --- .../data/model/api/home/HomePromotion.kt | 5 +++-- .../whitelabel/data/model/api/item/Item.kt | 5 +++-- .../data/model/api/item/ItemInfo.kt | 5 +++-- .../data/model/api/receipt/Receipt.kt | 3 ++- .../model/ui/home/HomePromotionUiModel.kt | 5 +++-- .../data/model/ui/item/ItemInfoUiModel.kt | 6 ++++-- .../data/model/ui/item/ItemUiModel.kt | 5 +++-- .../data/model/ui/receipt/ReceiptUiModel.kt | 3 ++- .../ru/frogogo/whitelabel/util/PriceUtils.kt | 9 ++++++--- .../whitelabel/util/moshi/MoshiUtils.kt | 6 ++++-- .../adapter/AuthenticationResponseAdapter.kt | 2 +- .../util/moshi/adapter/PriceAdapter.kt | 19 +++++++++++++++++++ .../moshi/adapter/ReceiptStateJsonAdapter.kt | 2 +- 13 files changed, 54 insertions(+), 21 deletions(-) create mode 100644 app/src/main/java/ru/frogogo/whitelabel/util/moshi/adapter/PriceAdapter.kt diff --git a/app/src/main/java/ru/frogogo/whitelabel/data/model/api/home/HomePromotion.kt b/app/src/main/java/ru/frogogo/whitelabel/data/model/api/home/HomePromotion.kt index b55846db..c0cdbf19 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/data/model/api/home/HomePromotion.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/data/model/api/home/HomePromotion.kt @@ -3,6 +3,7 @@ package ru.frogogo.whitelabel.data.model.api.home import com.squareup.moshi.Json import com.squareup.moshi.JsonClass import ru.frogogo.whitelabel.data.model.api.Photo +import java.math.BigDecimal @JsonClass(generateAdapter = true) data class HomePromotion( @@ -13,7 +14,7 @@ data class HomePromotion( @Json(name = "steps") val steps: List, @Json(name = "price") - val price: Int, + val price: BigDecimal, @Json(name = "discounted_price") - val discountedPrice: Int, + val discountedPrice: BigDecimal, ) diff --git a/app/src/main/java/ru/frogogo/whitelabel/data/model/api/item/Item.kt b/app/src/main/java/ru/frogogo/whitelabel/data/model/api/item/Item.kt index d795e0a8..3fb03214 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/data/model/api/item/Item.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/data/model/api/item/Item.kt @@ -2,6 +2,7 @@ package ru.frogogo.whitelabel.data.model.api.item import com.squareup.moshi.Json import com.squareup.moshi.JsonClass +import java.math.BigDecimal @JsonClass(generateAdapter = true) data class Item( @@ -12,9 +13,9 @@ data class Item( @Json(name = "image_url") val imageUrl: String, @Json(name = "price") - val price: Int, + val price: BigDecimal, @Json(name = "discounted_price") - val discountedPrice: Int, + val discountedPrice: BigDecimal, @Json(name = "specs") val specs: String?, ) diff --git a/app/src/main/java/ru/frogogo/whitelabel/data/model/api/item/ItemInfo.kt b/app/src/main/java/ru/frogogo/whitelabel/data/model/api/item/ItemInfo.kt index 98610e27..bea5b370 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/data/model/api/item/ItemInfo.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/data/model/api/item/ItemInfo.kt @@ -2,6 +2,7 @@ package ru.frogogo.whitelabel.data.model.api.item import com.squareup.moshi.Json import com.squareup.moshi.JsonClass +import java.math.BigDecimal @JsonClass(generateAdapter = true) data class ItemInfo( @@ -12,9 +13,9 @@ data class ItemInfo( @Json(name = "image_url") val imageUrl: String, @Json(name = "price") - val price: Int, + val price: BigDecimal, @Json(name = "discounted_price") - val discountedPrice: Int, + val discountedPrice: BigDecimal, @Json(name = "specs") val specs: String?, @Json(name = "description") diff --git a/app/src/main/java/ru/frogogo/whitelabel/data/model/api/receipt/Receipt.kt b/app/src/main/java/ru/frogogo/whitelabel/data/model/api/receipt/Receipt.kt index 3e2af3d8..d922cc92 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/data/model/api/receipt/Receipt.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/data/model/api/receipt/Receipt.kt @@ -3,6 +3,7 @@ package ru.frogogo.whitelabel.data.model.api.receipt import com.squareup.moshi.Json import com.squareup.moshi.JsonClass import ru.frogogo.whitelabel.dictionary.ReceiptState +import java.math.BigDecimal import java.util.Date @JsonClass(generateAdapter = true) @@ -12,7 +13,7 @@ data class Receipt( @Json(name = "number") val number: Int, @Json(name = "sum") - val sum: Int, + val sum: BigDecimal, @Json(name = "state") val state: ReceiptState, @Json(name = "timestamp") diff --git a/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/home/HomePromotionUiModel.kt b/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/home/HomePromotionUiModel.kt index ce0a66f2..9b7d625a 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/home/HomePromotionUiModel.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/home/HomePromotionUiModel.kt @@ -4,6 +4,7 @@ import android.os.Parcelable import androidx.annotation.Keep import kotlinx.parcelize.Parcelize import ru.frogogo.whitelabel.data.model.ui.PhotoUiModel +import java.math.BigDecimal @Keep @Parcelize @@ -11,6 +12,6 @@ data class HomePromotionUiModel( val name: String, val photo: PhotoUiModel, val steps: List, - val price: Int, - val priceDiscounted: Int, + val price: BigDecimal, + val priceDiscounted: BigDecimal, ) : Parcelable diff --git a/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/item/ItemInfoUiModel.kt b/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/item/ItemInfoUiModel.kt index ece964af..b27b78db 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/item/ItemInfoUiModel.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/item/ItemInfoUiModel.kt @@ -1,11 +1,13 @@ package ru.frogogo.whitelabel.data.model.ui.item +import java.math.BigDecimal + data class ItemInfoUiModel( val id: Int, val name: String, val imageUrl: String, - val price: Int, - val discountedPrice: Int, + val price: BigDecimal, + val discountedPrice: BigDecimal, val specs: String?, val description: String, ) diff --git a/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/item/ItemUiModel.kt b/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/item/ItemUiModel.kt index 4b45b637..4c3a58fd 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/item/ItemUiModel.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/item/ItemUiModel.kt @@ -1,13 +1,14 @@ package ru.frogogo.whitelabel.data.model.ui.item import ru.frogogo.whitelabel.core.recycler.RecyclerViewItem +import java.math.BigDecimal data class ItemUiModel( val id: Int, val name: String, val imageUrl: String, - val price: Int, - val discountedPrice: Int, + val price: BigDecimal, + val discountedPrice: BigDecimal, val specs: String?, ) : RecyclerViewItem { diff --git a/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/receipt/ReceiptUiModel.kt b/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/receipt/ReceiptUiModel.kt index b6394fa5..380a3c01 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/receipt/ReceiptUiModel.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/receipt/ReceiptUiModel.kt @@ -5,6 +5,7 @@ import androidx.annotation.Keep import kotlinx.parcelize.Parcelize import ru.frogogo.whitelabel.core.recycler.RecyclerViewItem import ru.frogogo.whitelabel.dictionary.ReceiptState +import java.math.BigDecimal import java.util.Date @Keep @@ -13,7 +14,7 @@ data class ReceiptUiModel( val id: Int, val number: Int, val date: Date, - val value: Int, + val value: BigDecimal, val state: ReceiptState, val shopName: String, val rejectReason: ReceiptRejectReasonUiModel?, diff --git a/app/src/main/java/ru/frogogo/whitelabel/util/PriceUtils.kt b/app/src/main/java/ru/frogogo/whitelabel/util/PriceUtils.kt index 3b91ae00..082f22ed 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/util/PriceUtils.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/util/PriceUtils.kt @@ -1,5 +1,6 @@ package ru.frogogo.whitelabel.util +import java.math.BigDecimal import java.text.NumberFormat import java.util.Locale import kotlin.math.absoluteValue @@ -24,10 +25,12 @@ object PriceUtils { /** * Returns formatter price with currency symbol * @param price integer price value - * @param formatSign whether include sign or not */ - fun formatPrice(price: Int, formatSign: Boolean = false): String = - "${price.format(formatSign)} ${CURRENCY_SYMBOL[AppLocale.RU]}" + fun formatPrice(price: BigDecimal): String = + "${price.toPlainString()} €" + + fun formatPrice(price: Int): String = + "$price €" } private sealed class AppLocale { diff --git a/app/src/main/java/ru/frogogo/whitelabel/util/moshi/MoshiUtils.kt b/app/src/main/java/ru/frogogo/whitelabel/util/moshi/MoshiUtils.kt index 213bbbee..c3ecf6eb 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/util/moshi/MoshiUtils.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/util/moshi/MoshiUtils.kt @@ -3,6 +3,7 @@ package ru.frogogo.whitelabel.util.moshi import com.squareup.moshi.Moshi import com.squareup.moshi.adapters.Rfc3339DateJsonAdapter import ru.frogogo.whitelabel.util.moshi.adapter.AuthenticationResponseAdapter +import ru.frogogo.whitelabel.util.moshi.adapter.PriceAdapter import ru.frogogo.whitelabel.util.moshi.adapter.ReceiptStateJsonAdapter import java.util.Date @@ -13,7 +14,8 @@ object MoshiUtils { fun getNetworkAdapter(): Moshi = Moshi.Builder() .add(Date::class.java, Rfc3339DateJsonAdapter()) - .add(ReceiptStateJsonAdapter()) - .add(AuthenticationResponseAdapter()) + .add(ReceiptStateJsonAdapter) + .add(AuthenticationResponseAdapter) + .add(PriceAdapter) .build() } diff --git a/app/src/main/java/ru/frogogo/whitelabel/util/moshi/adapter/AuthenticationResponseAdapter.kt b/app/src/main/java/ru/frogogo/whitelabel/util/moshi/adapter/AuthenticationResponseAdapter.kt index 2fa8bd78..628c3268 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/util/moshi/adapter/AuthenticationResponseAdapter.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/util/moshi/adapter/AuthenticationResponseAdapter.kt @@ -5,7 +5,7 @@ import ru.frogogo.whitelabel.data.mapper.toResponse import ru.frogogo.whitelabel.data.model.api.auth.AuthenticationResponse import ru.frogogo.whitelabel.data.model.api.auth.AuthenticationResponseJson -class AuthenticationResponseAdapter { +object AuthenticationResponseAdapter { @FromJson fun fromJson(response: AuthenticationResponseJson): AuthenticationResponse = response.toResponse() diff --git a/app/src/main/java/ru/frogogo/whitelabel/util/moshi/adapter/PriceAdapter.kt b/app/src/main/java/ru/frogogo/whitelabel/util/moshi/adapter/PriceAdapter.kt new file mode 100644 index 00000000..9a025c3b --- /dev/null +++ b/app/src/main/java/ru/frogogo/whitelabel/util/moshi/adapter/PriceAdapter.kt @@ -0,0 +1,19 @@ +package ru.frogogo.whitelabel.util.moshi.adapter + +import com.squareup.moshi.FromJson +import com.squareup.moshi.ToJson +import java.math.BigDecimal + +object PriceAdapter { + + // @Price + @FromJson + fun fromJson(string: String): BigDecimal { + return BigDecimal(string) + } + + @ToJson + fun toJson(price: BigDecimal): String { + return price.toPlainString() + } +} diff --git a/app/src/main/java/ru/frogogo/whitelabel/util/moshi/adapter/ReceiptStateJsonAdapter.kt b/app/src/main/java/ru/frogogo/whitelabel/util/moshi/adapter/ReceiptStateJsonAdapter.kt index 49e3586e..5d66d3a8 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/util/moshi/adapter/ReceiptStateJsonAdapter.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/util/moshi/adapter/ReceiptStateJsonAdapter.kt @@ -4,7 +4,7 @@ import com.squareup.moshi.FromJson import ru.frogogo.whitelabel.dictionary.ReceiptState import java.util.Locale -class ReceiptStateJsonAdapter { +object ReceiptStateJsonAdapter { @FromJson fun fromJson(state: String): ReceiptState = From a659c68d77833b512b304862d29c7a2627d8da4e Mon Sep 17 00:00:00 2001 From: Alexey Egin Date: Sun, 10 Oct 2021 19:03:50 +0300 Subject: [PATCH 06/14] Fix PriceAdapter.kt --- .../ru/frogogo/whitelabel/util/moshi/adapter/PriceAdapter.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/ru/frogogo/whitelabel/util/moshi/adapter/PriceAdapter.kt b/app/src/main/java/ru/frogogo/whitelabel/util/moshi/adapter/PriceAdapter.kt index 9a025c3b..25d86a03 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/util/moshi/adapter/PriceAdapter.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/util/moshi/adapter/PriceAdapter.kt @@ -6,7 +6,6 @@ import java.math.BigDecimal object PriceAdapter { - // @Price @FromJson fun fromJson(string: String): BigDecimal { return BigDecimal(string) From 3d6bc702a5c4992f3f5b402009ba26c54707ed2d Mon Sep 17 00:00:00 2001 From: Alexey Egin Date: Mon, 11 Oct 2021 12:29:50 +0300 Subject: [PATCH 07/14] Fix home progress --- .../frogogo/whitelabel/data/model/api/home/HomeProgress.kt | 5 +++-- .../whitelabel/data/model/ui/home/HomeProgressUiModel.kt | 5 +++-- .../ru/frogogo/whitelabel/ui/home/HomeAdapterDelegates.kt | 5 +++-- app/src/main/java/ru/frogogo/whitelabel/util/PriceUtils.kt | 3 --- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/ru/frogogo/whitelabel/data/model/api/home/HomeProgress.kt b/app/src/main/java/ru/frogogo/whitelabel/data/model/api/home/HomeProgress.kt index 12aaf064..3fd3917b 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/data/model/api/home/HomeProgress.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/data/model/api/home/HomeProgress.kt @@ -2,11 +2,12 @@ package ru.frogogo.whitelabel.data.model.api.home import com.squareup.moshi.Json import com.squareup.moshi.JsonClass +import java.math.BigDecimal @JsonClass(generateAdapter = true) data class HomeProgress( @Json(name = "current") - val current: Int, + val current: BigDecimal, @Json(name = "target") - val target: Int, + val target: BigDecimal, ) diff --git a/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/home/HomeProgressUiModel.kt b/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/home/HomeProgressUiModel.kt index e861836e..9c59ffb2 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/home/HomeProgressUiModel.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/data/model/ui/home/HomeProgressUiModel.kt @@ -1,10 +1,11 @@ package ru.frogogo.whitelabel.data.model.ui.home import ru.frogogo.whitelabel.core.recycler.RecyclerViewItem +import java.math.BigDecimal data class HomeProgressUiModel( - val current: Int, - val target: Int, + val current: BigDecimal, + val target: BigDecimal, ) : RecyclerViewItem { override fun getId(): Any = "item_coupon_progress" diff --git a/app/src/main/java/ru/frogogo/whitelabel/ui/home/HomeAdapterDelegates.kt b/app/src/main/java/ru/frogogo/whitelabel/ui/home/HomeAdapterDelegates.kt index 9a800bf0..501fe40f 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/ui/home/HomeAdapterDelegates.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/ui/home/HomeAdapterDelegates.kt @@ -17,6 +17,7 @@ import ru.frogogo.whitelabel.ui.home.model.HomeReceiptsButton import ru.frogogo.whitelabel.ui.home.model.HomeScanUnavailable import ru.frogogo.whitelabel.ui.home.model.HomeSectionHeader import ru.frogogo.whitelabel.util.PriceUtils +import java.math.BigDecimal typealias OnReceiptsClickAction = () -> Unit @@ -41,8 +42,8 @@ object HomeAdapterDelegates { binding.textViewProgressCurrent.text = PriceUtils.formatPrice(item.current) binding.textViewProgressTarget.text = PriceUtils.formatPrice(item.target) binding.progressBar.apply { - max = item.target - progress = item.current + max = item.target.multiply(BigDecimal.valueOf(100)).toInt() + progress = item.current.multiply(BigDecimal.valueOf(100)).toInt() } } } diff --git a/app/src/main/java/ru/frogogo/whitelabel/util/PriceUtils.kt b/app/src/main/java/ru/frogogo/whitelabel/util/PriceUtils.kt index 082f22ed..d3473007 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/util/PriceUtils.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/util/PriceUtils.kt @@ -28,9 +28,6 @@ object PriceUtils { */ fun formatPrice(price: BigDecimal): String = "${price.toPlainString()} €" - - fun formatPrice(price: Int): String = - "$price €" } private sealed class AppLocale { From 388486f67f73b70ebfde166575d311be7867e26c Mon Sep 17 00:00:00 2001 From: Alexey Egin Date: Wed, 13 Oct 2021 16:23:39 +0300 Subject: [PATCH 08/14] Fix localization --- app/src/main/java/ru/frogogo/whitelabel/util/Validators.kt | 2 +- app/src/zboom/res/values/strings_home.xml | 2 +- app/src/zboom/res/values/strings_onboarding.xml | 2 +- app/src/zboom/res/values/strings_receipt.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/ru/frogogo/whitelabel/util/Validators.kt b/app/src/main/java/ru/frogogo/whitelabel/util/Validators.kt index c31cfda4..86468dad 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/util/Validators.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/util/Validators.kt @@ -42,7 +42,7 @@ object Validators { // Check length text.length !in MIN_USER_NAME_LENGTH..MAX_USER_NAME_LENGTH -> R.string.error_user_name_length // Check format - !PATTERN_USER_NAME.matches(text) -> R.string.error_user_name_format +// !PATTERN_USER_NAME.matches(text) -> R.string.error_user_name_format // All is ok else -> null } diff --git a/app/src/zboom/res/values/strings_home.xml b/app/src/zboom/res/values/strings_home.xml index 3b986198..e4bfef96 100644 --- a/app/src/zboom/res/values/strings_home.xml +++ b/app/src/zboom/res/values/strings_home.xml @@ -2,7 +2,7 @@ Remember 2 simple rules: Scan receipts from stores that have any products from Lion Sabatier International promotional collection - After you collect the amount of the product for 3300 €, you will receive a coupon for the purchase of an electric kettle Lion Sabatier International for 1 ₽ + After you collect the amount of the product for 38 €, you will receive a coupon for the purchase of an electric kettle Lion Sabatier International for 0,01 € Scan the receipt Coupon Promotion products diff --git a/app/src/zboom/res/values/strings_onboarding.xml b/app/src/zboom/res/values/strings_onboarding.xml index 012887e8..6c0b372f 100644 --- a/app/src/zboom/res/values/strings_onboarding.xml +++ b/app/src/zboom/res/values/strings_onboarding.xml @@ -7,5 +7,5 @@ Scan it Receipts containing promotional items Get a coupon - You can buy a kettle for 1 ruble. After the purchase Lion Sabatier international advertising products in the amount of 3,300 rubles + You can buy a kettle for 0,01 €. After the purchase Lion Sabatier international advertising products in the amount of 38 € diff --git a/app/src/zboom/res/values/strings_receipt.xml b/app/src/zboom/res/values/strings_receipt.xml index 924349f4..3766cb50 100644 --- a/app/src/zboom/res/values/strings_receipt.xml +++ b/app/src/zboom/res/values/strings_receipt.xml @@ -2,7 +2,7 @@ № %1$d Great, the receipt has been accepted! - As soon as the total amount of receipts is equal to 3,300, you will receive a coupon for the purchase of an electric kettle Lion Sabatier International for 1 ruble + As soon as the total amount of receipts is equal to 38 €, you will receive a coupon for the purchase of an electric kettle Lion Sabatier International for 0,01 € Your receipt has not been verified! Your receipt is being checked This usually takes a few minutes, but it is very rare when it takes more of time From 6ad2f89cc26bad92a61f9c70e84fad9cd6a6c0f6 Mon Sep 17 00:00:00 2001 From: Alexey Egin Date: Wed, 13 Oct 2021 16:30:03 +0300 Subject: [PATCH 09/14] Release 1.0.1 (9) --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 97a33417..6df7011e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -35,8 +35,8 @@ android { minSdkVersion 23 targetSdkVersion 30 - versionCode 8 - versionName "1.0.0" + versionCode 9 + versionName "1.0.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" setProperty("archivesBaseName", applicationName + "-v" + versionCode + "(" + versionName + ")-" + getDate()) From c23247c5324d1621b6d38ac0af96015b20b70628 Mon Sep 17 00:00:00 2001 From: Alexey Egin Date: Fri, 15 Oct 2021 11:32:15 +0300 Subject: [PATCH 10/14] Update dependencies --- app/build.gradle | 12 ++++++------ build.gradle | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6df7011e..da0eb1ba 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -135,13 +135,13 @@ dependencies { // Fragment https://developer.android.com/jetpack/androidx/releases/fragment implementation 'androidx.fragment:fragment-ktx:1.3.6' // ConstraintLayout https://developer.android.com/jetpack/androidx/releases/constraintlayout - implementation 'androidx.constraintlayout:constraintlayout:2.1.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.1' // ViewPager2 https://developer.android.com/jetpack/androidx/releases/viewpager2 implementation "androidx.viewpager2:viewpager2:1.0.0" // SwipeRefresh https://developer.android.com/jetpack/androidx/releases/swiperefreshlayout implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' // WorkManager https://developer.android.com/jetpack/androidx/releases/work - implementation 'androidx.work:work-runtime-ktx:2.6.0' + implementation 'androidx.work:work-runtime-ktx:2.7.0' // Google Play Services https://developers.google.com/android/guides/setup implementation 'com.google.android.gms:play-services-auth:19.2.0' @@ -192,7 +192,7 @@ dependencies { implementation 'com.redmadrobot:input-mask-android:6.0.0' // Coil https://github.com/coil-kt/coil/ - implementation 'io.coil-kt:coil:1.3.2' + implementation 'io.coil-kt:coil:1.4.0' // Koin https://github.com/InsertKoinIO/koin def koinVersion = '3.1.2' @@ -206,7 +206,7 @@ dependencies { implementation "com.squareup.retrofit2:converter-moshi:$retrofitVersion" // OkHttp https://github.com/square/okhttp/ - def okHttpVersion = '4.9.1' + def okHttpVersion = '4.9.2' implementation "com.squareup.okhttp3:okhttp:$okHttpVersion" implementation "com.squareup.okhttp3:logging-interceptor:$okHttpVersion" @@ -225,7 +225,7 @@ dependencies { implementation 'com.github.ajalt:timberkt:1.5.1' // Firebase https://firebase.google.com/support/release-notes/android - implementation platform('com.google.firebase:firebase-bom:28.4.0') + implementation platform('com.google.firebase:firebase-bom:28.4.2') implementation 'com.google.firebase:firebase-analytics-ktx' implementation 'com.google.firebase:firebase-crashlytics-ktx' implementation 'com.google.firebase:firebase-perf-ktx' @@ -259,7 +259,7 @@ dependencies { testImplementation 'org.robolectric:robolectric:4.6.1' // Junit 5 https://github.com/junit-team/junit5 - def junit5Version = "5.7.2" + def junit5Version = "5.8.1" testImplementation "org.junit.jupiter:junit-jupiter-api:$junit5Version" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junit5Version" testImplementation "org.junit.jupiter:junit-jupiter-params:$junit5Version" diff --git a/build.gradle b/build.gradle index 06791c7a..44ec16e5 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ apply from: './versions_plugin.gradle' buildscript { - ext.kotlinVersion = '1.5.30' + ext.kotlinVersion = '1.5.31' ext.detektVersion = '1.18.1' repositories { @@ -12,7 +12,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.0.2' + classpath 'com.android.tools.build:gradle:7.0.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" classpath 'com.google.gms:google-services:4.3.10' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' From 8befed3a03f00c29fb01680f97edf8a9daa8a02c Mon Sep 17 00:00:00 2001 From: Alexey Egin Date: Fri, 15 Oct 2021 11:32:33 +0300 Subject: [PATCH 11/14] Fix AuthCodeFragment sms retriever api permission --- .../ru/frogogo/whitelabel/ui/auth/code/AuthCodeFragment.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/ru/frogogo/whitelabel/ui/auth/code/AuthCodeFragment.kt b/app/src/main/java/ru/frogogo/whitelabel/ui/auth/code/AuthCodeFragment.kt index 30941a67..cce86ede 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/ui/auth/code/AuthCodeFragment.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/ui/auth/code/AuthCodeFragment.kt @@ -29,7 +29,6 @@ import ru.frogogo.whitelabel.databinding.FragmentAuthCodeBinding import ru.frogogo.whitelabel.extension.binding.editText import ru.frogogo.whitelabel.extension.binding.initCodeConfirmationType import ru.frogogo.whitelabel.extension.fetchDrawable -import ru.frogogo.whitelabel.extension.formatWithMask import ru.frogogo.whitelabel.extension.hideKeyboard import ru.frogogo.whitelabel.extension.observe import ru.frogogo.whitelabel.extension.setNullableTextRes @@ -105,7 +104,7 @@ class AuthCodeFragment : BaseFragment() { super.onStart() val intentFilter = IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION) - requireActivity().registerReceiver(smsVerificationReceiver, intentFilter) + requireActivity().registerReceiver(smsVerificationReceiver, intentFilter, SmsRetriever.SEND_PERMISSION, null) } override fun onStop() { From 011acbd003c9df4d4dbc461044b3031a16840550 Mon Sep 17 00:00:00 2001 From: Alexey Egin Date: Fri, 15 Oct 2021 11:36:42 +0300 Subject: [PATCH 12/14] Release 1.0.2 (10) --- app/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index da0eb1ba..fcca0aaf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,7 +27,7 @@ def applicationName = "S-Boom" android { - compileSdkVersion 30 + compileSdkVersion 31 defaultConfig { applicationId "ru.frogogo.sboom" @@ -35,8 +35,8 @@ android { minSdkVersion 23 targetSdkVersion 30 - versionCode 9 - versionName "1.0.1" + versionCode 10 + versionName "1.0.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" setProperty("archivesBaseName", applicationName + "-v" + versionCode + "(" + versionName + ")-" + getDate()) From e40122d8ab1fb60a02c64c52cfee772e393024df Mon Sep 17 00:00:00 2001 From: Alexey Egin Date: Sat, 4 Dec 2021 14:52:01 +0300 Subject: [PATCH 13/14] Update dependencies --- app/build.gradle | 28 +++++++++---------- .../core/recycler/BaseDelegationAdapter.kt | 2 +- build.gradle | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index fcca0aaf..dfbe8c5f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -129,19 +129,19 @@ kapt { dependencies { // AndroidX - implementation 'androidx.core:core-ktx:1.6.0' + implementation 'androidx.core:core-ktx:1.7.0' // AppCompat https://developer.android.com/jetpack/androidx/releases/appcompat - implementation 'androidx.appcompat:appcompat:1.3.1' + implementation 'androidx.appcompat:appcompat:1.4.0' // Fragment https://developer.android.com/jetpack/androidx/releases/fragment - implementation 'androidx.fragment:fragment-ktx:1.3.6' + implementation 'androidx.fragment:fragment-ktx:1.4.0' // ConstraintLayout https://developer.android.com/jetpack/androidx/releases/constraintlayout - implementation 'androidx.constraintlayout:constraintlayout:2.1.1' + implementation 'androidx.constraintlayout:constraintlayout:2.1.2' // ViewPager2 https://developer.android.com/jetpack/androidx/releases/viewpager2 implementation "androidx.viewpager2:viewpager2:1.0.0" // SwipeRefresh https://developer.android.com/jetpack/androidx/releases/swiperefreshlayout implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' // WorkManager https://developer.android.com/jetpack/androidx/releases/work - implementation 'androidx.work:work-runtime-ktx:2.7.0' + implementation 'androidx.work:work-runtime-ktx:2.7.1' // Google Play Services https://developers.google.com/android/guides/setup implementation 'com.google.android.gms:play-services-auth:19.2.0' @@ -157,14 +157,14 @@ dependencies { implementation "androidx.navigation:navigation-ui-ktx:$navVersion" // ViewModel and LiveData https://developer.android.com/jetpack/androidx/releases/lifecycle - def lifecycleVersion = '2.3.1' + def lifecycleVersion = '2.4.0' implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion" implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycleVersion" implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycleVersion" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" // Adapter Delegates https://github.com/sockeqwe/AdapterDelegates - def adapterDelegatesVersion = '4.3.0' + def adapterDelegatesVersion = '4.3.1' implementation "com.hannesdorfmann:adapterdelegates4:$adapterDelegatesVersion" implementation "com.hannesdorfmann:adapterdelegates4-kotlin-dsl-viewbinding:$adapterDelegatesVersion" @@ -178,7 +178,7 @@ dependencies { implementation "com.github.hadilq.liveevent:liveevent:1.2.0" // WhatIf https://github.com/skydoves/WhatIf - implementation 'com.github.skydoves:whatif:1.1.0' + implementation 'com.github.skydoves:whatif:1.1.1' // Coroutines https://github.com/Kotlin/kotlinx.coroutines def coroutinesVersion = '1.5.2' @@ -195,7 +195,7 @@ dependencies { implementation 'io.coil-kt:coil:1.4.0' // Koin https://github.com/InsertKoinIO/koin - def koinVersion = '3.1.2' + def koinVersion = '3.1.4' implementation "io.insert-koin:koin-android:$koinVersion" implementation "io.insert-koin:koin-androidx-workmanager:$koinVersion" @@ -206,7 +206,7 @@ dependencies { implementation "com.squareup.retrofit2:converter-moshi:$retrofitVersion" // OkHttp https://github.com/square/okhttp/ - def okHttpVersion = '4.9.2' + def okHttpVersion = '4.9.3' implementation "com.squareup.okhttp3:okhttp:$okHttpVersion" implementation "com.squareup.okhttp3:logging-interceptor:$okHttpVersion" @@ -225,7 +225,7 @@ dependencies { implementation 'com.github.ajalt:timberkt:1.5.1' // Firebase https://firebase.google.com/support/release-notes/android - implementation platform('com.google.firebase:firebase-bom:28.4.2') + implementation platform('com.google.firebase:firebase-bom:29.0.1') implementation 'com.google.firebase:firebase-analytics-ktx' implementation 'com.google.firebase:firebase-crashlytics-ktx' implementation 'com.google.firebase:firebase-perf-ktx' @@ -256,10 +256,10 @@ dependencies { testImplementation 'org.amshove.kluent:kluent:1.68' // Robolectric http://robolectric.org/getting-started/ - testImplementation 'org.robolectric:robolectric:4.6.1' + testImplementation 'org.robolectric:robolectric:4.7.3' // Junit 5 https://github.com/junit-team/junit5 - def junit5Version = "5.8.1" + def junit5Version = "5.8.2" testImplementation "org.junit.jupiter:junit-jupiter-api:$junit5Version" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junit5Version" testImplementation "org.junit.jupiter:junit-jupiter-params:$junit5Version" @@ -272,7 +272,7 @@ dependencies { testImplementation 'androidx.arch.core:core-testing:2.1.0' // MockK https://github.com/mockk/mockk - testImplementation 'io.mockk:mockk:1.12.0' + testImplementation 'io.mockk:mockk:1.12.1' // Add field to BuildConfig android.defaultConfig.buildConfigField 'String', 'RETROFIT_VERSION', "\"$retrofitVersion\"" diff --git a/app/src/main/java/ru/frogogo/whitelabel/core/recycler/BaseDelegationAdapter.kt b/app/src/main/java/ru/frogogo/whitelabel/core/recycler/BaseDelegationAdapter.kt index 9def2052..3f89d31c 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/core/recycler/BaseDelegationAdapter.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/core/recycler/BaseDelegationAdapter.kt @@ -17,7 +17,7 @@ open class BaseDelegationAdapter( } override fun setItems(items: MutableList) { - this.setItems(items, null) + this.setItems(items, commitCallback = null) } fun setItems(items: MutableList, commitCallback: (() -> Unit)?) { diff --git a/build.gradle b/build.gradle index 44ec16e5..11a115be 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ buildscript { classpath 'com.android.tools.build:gradle:7.0.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" classpath 'com.google.gms:google-services:4.3.10' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1' classpath 'com.google.firebase:perf-plugin:1.4.0' classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.5" // Detekt https://github.com/detekt/detekt From 9db4d224691099f6506ae1f67cbdcb1c61b1b3a0 Mon Sep 17 00:00:00 2001 From: Alex Egin <10329086+alaegin@users.noreply.github.com> Date: Sat, 25 Jan 2025 17:51:02 +0200 Subject: [PATCH 14/14] Coupon popup (#40) * Implement CouponReceivedDialogFragment.kt * Fix code style --- .../data/preferences/UserPreferences.kt | 1 + .../data/preferences/UserPreferencesImpl.kt | 4 ++ .../data/repository/UserRepository.kt | 4 ++ .../data/repository/UserRepositoryImpl.kt | 7 +++ .../whitelabel/di/ScreenModuleLegacy.kt | 2 + .../ru/frogogo/whitelabel/di/UseCaseModule.kt | 2 + .../frogogo/whitelabel/di/scope/HomeScope.kt | 7 ++- .../frogogo/whitelabel/ui/home/HomeEffect.kt | 6 ++ .../whitelabel/ui/home/HomeFragment.kt | 15 +++++ .../whitelabel/ui/home/HomeViewModel.kt | 3 + .../delegate/HomeCouponReceivedDelegate.kt | 21 +++++++ .../home/delegate/HomeStateHandlerDelegate.kt | 2 + .../usecase/home/WasCouponReceivedUseCase.kt | 27 +++++++++ .../dialog/CouponReceivedDialogFragment.kt | 46 +++++++++++++++ ...ReceivedDialogFragmentCallbackViewModel.kt | 20 +++++++ app/src/main/res/drawable/ic_coupon.xml | 22 +++++++ .../res/layout/dialog_coupon_received.xml | 59 +++++++++++++++++++ app/src/zboom/res/values/strings_home.xml | 4 ++ 18 files changed, 251 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/ru/frogogo/whitelabel/ui/home/delegate/HomeCouponReceivedDelegate.kt create mode 100644 app/src/main/java/ru/frogogo/whitelabel/usecase/home/WasCouponReceivedUseCase.kt create mode 100644 app/src/main/java/ru/frogogo/whitelabel/view/dialog/CouponReceivedDialogFragment.kt create mode 100644 app/src/main/java/ru/frogogo/whitelabel/view/dialog/CouponReceivedDialogFragmentCallbackViewModel.kt create mode 100644 app/src/main/res/drawable/ic_coupon.xml create mode 100644 app/src/main/res/layout/dialog_coupon_received.xml diff --git a/app/src/main/java/ru/frogogo/whitelabel/data/preferences/UserPreferences.kt b/app/src/main/java/ru/frogogo/whitelabel/data/preferences/UserPreferences.kt index 80d3b36b..ae805ad9 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/data/preferences/UserPreferences.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/data/preferences/UserPreferences.kt @@ -14,6 +14,7 @@ interface UserPreferences { // Data var user: User? + var receivedCouponsCount: Int fun clearData() diff --git a/app/src/main/java/ru/frogogo/whitelabel/data/preferences/UserPreferencesImpl.kt b/app/src/main/java/ru/frogogo/whitelabel/data/preferences/UserPreferencesImpl.kt index 31b40db5..fce7ef65 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/data/preferences/UserPreferencesImpl.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/data/preferences/UserPreferencesImpl.kt @@ -7,6 +7,7 @@ import com.squareup.moshi.Moshi import ru.frogogo.whitelabel.data.model.api.user.User import ru.frogogo.whitelabel.util.Constants import ru.frogogo.whitelabel.util.boolean +import ru.frogogo.whitelabel.util.int import ru.frogogo.whitelabel.util.json import ru.frogogo.whitelabel.util.stringNullable @@ -30,6 +31,7 @@ class UserPreferencesImpl(context: Context) : UserPreferences { // Data override var user: User? by preferences.json(moshi, KEY_USER, User::class) + override var receivedCouponsCount: Int by preferences.int(RECEIVED_COUPONS_COUNT, 0) override fun clearData() { preferences.edit { clear() } @@ -40,6 +42,7 @@ class UserPreferencesImpl(context: Context) : UserPreferences { refreshToken = null isLoggedIn = false user = null + receivedCouponsCount = 0 } companion object { @@ -53,5 +56,6 @@ class UserPreferencesImpl(context: Context) : UserPreferences { private const val KEY_ONBOARDING_COMPLETED = "onboarding_completed" private const val KEY_POLICY_ACCEPTED = "policy_accepted" private const val KEY_USER = "user" + private const val RECEIVED_COUPONS_COUNT = "received_coupons_count" } } diff --git a/app/src/main/java/ru/frogogo/whitelabel/data/repository/UserRepository.kt b/app/src/main/java/ru/frogogo/whitelabel/data/repository/UserRepository.kt index c49aaaf9..3e34d29c 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/data/repository/UserRepository.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/data/repository/UserRepository.kt @@ -14,4 +14,8 @@ interface UserRepository { fun getUser(): User? fun saveUser(user: User) + + fun getReceivedCouponsCount(): Int + + fun saveReceivedCouponsCount(count: Int) } diff --git a/app/src/main/java/ru/frogogo/whitelabel/data/repository/UserRepositoryImpl.kt b/app/src/main/java/ru/frogogo/whitelabel/data/repository/UserRepositoryImpl.kt index 8a79c5c4..f99c6089 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/data/repository/UserRepositoryImpl.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/data/repository/UserRepositoryImpl.kt @@ -32,4 +32,11 @@ class UserRepositoryImpl( override fun saveUser(user: User) { userPreferences.user = user } + + override fun getReceivedCouponsCount(): Int = + userPreferences.receivedCouponsCount + + override fun saveReceivedCouponsCount(count: Int) { + userPreferences.receivedCouponsCount = count + } } diff --git a/app/src/main/java/ru/frogogo/whitelabel/di/ScreenModuleLegacy.kt b/app/src/main/java/ru/frogogo/whitelabel/di/ScreenModuleLegacy.kt index 94af1f4b..d1f04871 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/di/ScreenModuleLegacy.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/di/ScreenModuleLegacy.kt @@ -16,6 +16,7 @@ import ru.frogogo.whitelabel.ui.profile.receipts.ReceiptsViewModel import ru.frogogo.whitelabel.ui.scanner.ScannerViewModel import ru.frogogo.whitelabel.ui.splash.SplashViewModel import ru.frogogo.whitelabel.ui.webview.WebViewViewModel +import ru.frogogo.whitelabel.view.dialog.CouponReceivedDialogFragmentCallbackViewModel import ru.frogogo.whitelabel.view.dialog.ErrorDialogFragmentCallbackViewModel @Deprecated("Use scopes") @@ -56,4 +57,5 @@ val screenModuleLegacy = module { // Stuff viewModel { ErrorDialogFragmentCallbackViewModel() } + viewModel { CouponReceivedDialogFragmentCallbackViewModel() } } diff --git a/app/src/main/java/ru/frogogo/whitelabel/di/UseCaseModule.kt b/app/src/main/java/ru/frogogo/whitelabel/di/UseCaseModule.kt index e4dcc64c..2d75d695 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/di/UseCaseModule.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/di/UseCaseModule.kt @@ -8,6 +8,7 @@ import ru.frogogo.whitelabel.usecase.auth.RefreshTokenUseCase import ru.frogogo.whitelabel.usecase.auth.RefreshTokenWorkerUseCase import ru.frogogo.whitelabel.usecase.auth.RequestConfirmationCodeUseCase import ru.frogogo.whitelabel.usecase.home.GetHomeUseCase +import ru.frogogo.whitelabel.usecase.home.WasCouponReceivedUseCase import ru.frogogo.whitelabel.usecase.item.GetItemUseCase import ru.frogogo.whitelabel.usecase.item.GetItemsUseCase import ru.frogogo.whitelabel.usecase.receipt.CreateReceiptUseCase @@ -25,6 +26,7 @@ val useCaseModule = module { // Home single { GetHomeUseCase(get(), get()) } + single { WasCouponReceivedUseCase(get()) } // User single { UpdateUserDetailsUseCase(get()) } diff --git a/app/src/main/java/ru/frogogo/whitelabel/di/scope/HomeScope.kt b/app/src/main/java/ru/frogogo/whitelabel/di/scope/HomeScope.kt index 328c290d..15c9c480 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/di/scope/HomeScope.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/di/scope/HomeScope.kt @@ -19,6 +19,7 @@ import ru.frogogo.whitelabel.ui.home.data.HomeDataFactory import ru.frogogo.whitelabel.ui.home.data.HomeDataFactoryImpl import ru.frogogo.whitelabel.ui.home.delegate.HomeClickHandlerDelegate import ru.frogogo.whitelabel.ui.home.delegate.HomeClickHandlerDelegateImpl +import ru.frogogo.whitelabel.ui.home.delegate.HomeCouponReceivedDelegate import ru.frogogo.whitelabel.ui.home.delegate.HomeDataLoadDelegate import ru.frogogo.whitelabel.ui.home.delegate.HomeDataLoadDelegateImpl import ru.frogogo.whitelabel.ui.home.delegate.HomeStateHandlerDelegate @@ -63,9 +64,13 @@ fun Module.homeScope() { mutableEffectLiveEvent = get(named(NAMED_EFFECT_LIVE_EVENT)), mutableScanButtonStateLive = get(named(NAMED_SCAN_BUTTON_STATE_LIVE)), dataFactory = get(), + couponReceivedDelegate = get(), ) } - scoped { HomeViewModel.DelegatesHolder(get(), get(), get()) } + scoped { + HomeCouponReceivedDelegate(get(), get(), get(named(NAMED_EFFECT_LIVE_EVENT))) + } + scoped { HomeViewModel.DelegatesHolder(get(), get(), get(), get()) } // Data scoped { HomeDataFactoryImpl() as HomeDataFactory } diff --git a/app/src/main/java/ru/frogogo/whitelabel/ui/home/HomeEffect.kt b/app/src/main/java/ru/frogogo/whitelabel/ui/home/HomeEffect.kt index d45401cc..a0f239ea 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/ui/home/HomeEffect.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/ui/home/HomeEffect.kt @@ -1,6 +1,12 @@ package ru.frogogo.whitelabel.ui.home +import ru.frogogo.whitelabel.data.model.ui.coupon.CouponUiModel + sealed class HomeEffect { object ShowLoadingError : HomeEffect() + + data class ShowCouponReceived( + val coupon: CouponUiModel, + ) : HomeEffect() } diff --git a/app/src/main/java/ru/frogogo/whitelabel/ui/home/HomeFragment.kt b/app/src/main/java/ru/frogogo/whitelabel/ui/home/HomeFragment.kt index 62d19014..057a711f 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/ui/home/HomeFragment.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/ui/home/HomeFragment.kt @@ -7,22 +7,28 @@ import by.kirich1409.viewbindingdelegate.viewBinding import org.koin.android.ext.android.inject import org.koin.android.scope.AndroidScopeComponent import org.koin.androidx.scope.fragmentScope +import org.koin.androidx.viewmodel.ext.android.sharedViewModel import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.scope.Scope import ru.frogogo.whitelabel.R import ru.frogogo.whitelabel.core.recycler.BaseDelegationAdapter import ru.frogogo.whitelabel.core.ui.BaseFragment +import ru.frogogo.whitelabel.data.model.ui.coupon.CouponUiModel import ru.frogogo.whitelabel.data.model.ui.item.ItemUiModel import ru.frogogo.whitelabel.databinding.FragmentHomeBinding import ru.frogogo.whitelabel.extension.animateToGone import ru.frogogo.whitelabel.extension.animateToVisible import ru.frogogo.whitelabel.extension.observe +import ru.frogogo.whitelabel.extension.observeEvent import ru.frogogo.whitelabel.extension.setSafeOnClickListener import ru.frogogo.whitelabel.extension.setVisible import ru.frogogo.whitelabel.ui.common.CommonAdapterDelegates import ru.frogogo.whitelabel.util.ItemDecoration import ru.frogogo.whitelabel.util.analytics.AnalyticsScreen import ru.frogogo.whitelabel.util.unsafeLazy +import ru.frogogo.whitelabel.view.dialog.CouponReceivedDialogFragment +import ru.frogogo.whitelabel.view.dialog.CouponReceivedDialogFragment.Companion.showIn +import ru.frogogo.whitelabel.view.dialog.CouponReceivedDialogFragmentCallbackViewModel private const val SPAN_COUNT = 2 private const val SPAN_COUNT_ITEM = 1 @@ -32,6 +38,7 @@ class HomeFragment : BaseFragment(), override val scope: Scope by fragmentScope() override val viewModel: HomeViewModel by viewModel() + private val couponReceivedCallbackViewModel: CouponReceivedDialogFragmentCallbackViewModel by sharedViewModel() private val binding: FragmentHomeBinding by viewBinding() private val recycledViewPool: RecyclerView.RecycledViewPool by inject() @@ -64,6 +71,9 @@ class HomeFragment : BaseFragment(), observe(effectLiveEvent, ::handleEffect) observe(scanButtonStateLive, ::handleScanButtonState) } + observeEvent(couponReceivedCallbackViewModel.onShowClickedEvent) { coupon -> + viewModel.onCouponClicked(coupon) + } } private fun renderState(isLoading: Boolean = false, isError: Boolean = false) { @@ -118,6 +128,7 @@ class HomeFragment : BaseFragment(), @Exhaustive when (effect) { HomeEffect.ShowLoadingError -> showLoadingError() + is HomeEffect.ShowCouponReceived -> showCouponReceivedDialog(effect.coupon) } } @@ -136,4 +147,8 @@ class HomeFragment : BaseFragment(), binding.swipeRefreshLayout.isRefreshing = false renderState(isError = true) } + + private fun showCouponReceivedDialog(coupon: CouponUiModel) { + CouponReceivedDialogFragment.newInstance(coupon).showIn(childFragmentManager) + } } diff --git a/app/src/main/java/ru/frogogo/whitelabel/ui/home/HomeViewModel.kt b/app/src/main/java/ru/frogogo/whitelabel/ui/home/HomeViewModel.kt index e88f5864..dbd84df5 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/ui/home/HomeViewModel.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/ui/home/HomeViewModel.kt @@ -7,6 +7,7 @@ import ru.frogogo.whitelabel.core.recycler.RecyclerViewItem import ru.frogogo.whitelabel.core.ui.BaseViewModel import ru.frogogo.whitelabel.ui.home.delegate.HomeClickHandlerDelegate import ru.frogogo.whitelabel.ui.home.delegate.HomeClickHandlerDelegateImpl +import ru.frogogo.whitelabel.ui.home.delegate.HomeCouponReceivedDelegate import ru.frogogo.whitelabel.ui.home.delegate.HomeDataLoadDelegate import ru.frogogo.whitelabel.ui.home.delegate.HomeDataLoadDelegateImpl import ru.frogogo.whitelabel.ui.home.delegate.HomeStateHandlerDelegate @@ -38,6 +39,7 @@ class HomeViewModel( dataLoadDelegate.cancelJob() clicksHandlerDelegate.cancelJob() stateHandlerDelegate.cancelJob() + couponReceivedDelegate.cancelJob() } } @@ -45,6 +47,7 @@ class HomeViewModel( val dataLoadDelegate: HomeDataLoadDelegateImpl, val clicksHandlerDelegate: HomeClickHandlerDelegateImpl, val stateHandlerDelegate: HomeStateHandlerDelegate, + val couponReceivedDelegate: HomeCouponReceivedDelegate, ) data class LiveDataHolder( diff --git a/app/src/main/java/ru/frogogo/whitelabel/ui/home/delegate/HomeCouponReceivedDelegate.kt b/app/src/main/java/ru/frogogo/whitelabel/ui/home/delegate/HomeCouponReceivedDelegate.kt new file mode 100644 index 00000000..103a0e6b --- /dev/null +++ b/app/src/main/java/ru/frogogo/whitelabel/ui/home/delegate/HomeCouponReceivedDelegate.kt @@ -0,0 +1,21 @@ +package ru.frogogo.whitelabel.ui.home.delegate + +import com.hadilq.liveevent.LiveEvent +import ru.frogogo.whitelabel.core.ui.BaseViewModelDelegate +import ru.frogogo.whitelabel.data.model.ui.home.HomeState +import ru.frogogo.whitelabel.ui.home.HomeEffect +import ru.frogogo.whitelabel.usecase.home.WasCouponReceivedUseCase +import ru.frogogo.whitelabel.util.dispatcher.DispatchersProvider + +class HomeCouponReceivedDelegate( + dispatchers: DispatchersProvider, + private val wasCouponReceivedUseCase: WasCouponReceivedUseCase, + private val homeEffectLiveEvent: LiveEvent, +) : BaseViewModelDelegate(dispatchers) { + + fun showCouponReceived(state: HomeState) { + wasCouponReceivedUseCase(state)?.let { coupon -> + homeEffectLiveEvent.postValue(HomeEffect.ShowCouponReceived(coupon)) + } + } +} diff --git a/app/src/main/java/ru/frogogo/whitelabel/ui/home/delegate/HomeStateHandlerDelegate.kt b/app/src/main/java/ru/frogogo/whitelabel/ui/home/delegate/HomeStateHandlerDelegate.kt index efa7d118..9a9b9e49 100644 --- a/app/src/main/java/ru/frogogo/whitelabel/ui/home/delegate/HomeStateHandlerDelegate.kt +++ b/app/src/main/java/ru/frogogo/whitelabel/ui/home/delegate/HomeStateHandlerDelegate.kt @@ -21,6 +21,7 @@ class HomeStateHandlerDelegate( private val mutableEffectLiveEvent: LiveEvent, private val mutableScanButtonStateLive: MutableLiveData, private val dataFactory: HomeDataFactory, + private val couponReceivedDelegate: HomeCouponReceivedDelegate, ) : BaseViewModelDelegate(dispatchersProvider) { fun showLoader() { @@ -36,6 +37,7 @@ class HomeStateHandlerDelegate( } else { HomeScanButtonState.SHOWN_DISABLED } + couponReceivedDelegate.showCouponReceived(data) } fun showError() { diff --git a/app/src/main/java/ru/frogogo/whitelabel/usecase/home/WasCouponReceivedUseCase.kt b/app/src/main/java/ru/frogogo/whitelabel/usecase/home/WasCouponReceivedUseCase.kt new file mode 100644 index 00000000..5324dea0 --- /dev/null +++ b/app/src/main/java/ru/frogogo/whitelabel/usecase/home/WasCouponReceivedUseCase.kt @@ -0,0 +1,27 @@ +package ru.frogogo.whitelabel.usecase.home + +import ru.frogogo.whitelabel.data.model.ui.coupon.CouponUiModel +import ru.frogogo.whitelabel.data.model.ui.home.HomeState +import ru.frogogo.whitelabel.data.repository.UserRepository + +class WasCouponReceivedUseCase( + private val userRepository: UserRepository, +) { + + operator fun invoke(state: HomeState): CouponUiModel? { + if (state !is HomeState.Progress) { + return null + } + + val receivedCouponsRemote = state.coupons.size + val receivedCouponsLocal = userRepository.getReceivedCouponsCount() + val newCouponReceived = receivedCouponsLocal < receivedCouponsRemote + + return if (newCouponReceived) { + userRepository.saveReceivedCouponsCount(receivedCouponsRemote) + state.coupons.first() + } else { + null + } + } +} diff --git a/app/src/main/java/ru/frogogo/whitelabel/view/dialog/CouponReceivedDialogFragment.kt b/app/src/main/java/ru/frogogo/whitelabel/view/dialog/CouponReceivedDialogFragment.kt new file mode 100644 index 00000000..e3267f20 --- /dev/null +++ b/app/src/main/java/ru/frogogo/whitelabel/view/dialog/CouponReceivedDialogFragment.kt @@ -0,0 +1,46 @@ +package ru.frogogo.whitelabel.view.dialog + +import androidx.core.os.bundleOf +import androidx.fragment.app.FragmentManager +import by.kirich1409.viewbindingdelegate.viewBinding +import org.koin.androidx.viewmodel.ext.android.sharedViewModel +import ru.frogogo.whitelabel.R +import ru.frogogo.whitelabel.core.ui.BaseDialogFragment +import ru.frogogo.whitelabel.data.model.ui.coupon.CouponUiModel +import ru.frogogo.whitelabel.databinding.DialogCouponReceivedBinding +import ru.frogogo.whitelabel.util.argument + +class CouponReceivedDialogFragment : BaseDialogFragment(R.layout.dialog_coupon_received) { + + private val binding: DialogCouponReceivedBinding by viewBinding() + private val callbackViewModel: CouponReceivedDialogFragmentCallbackViewModel by sharedViewModel() + private val coupon: CouponUiModel by argument(ARG_COUPON) + + override fun initViews() { + binding.apply { + textViewSubtitle.text = getString(R.string.home_coupon_received_text, coupon.name) + buttonContinue.setOnClickListener { + callbackViewModel.onShow(coupon) + dismissAllowingStateLoss() + } + } + } + + companion object : DialogCompanion { + + private const val TAG = "ErrorDialogFragment" + private const val ARG_COUPON = "arg:coupon" + + override fun CouponReceivedDialogFragment.showIn(fragmentManager: FragmentManager) { + show(fragmentManager, TAG) + } + + fun newInstance( + coupon: CouponUiModel, + ): CouponReceivedDialogFragment = CouponReceivedDialogFragment().apply { + arguments = bundleOf( + ARG_COUPON to coupon, + ) + } + } +} diff --git a/app/src/main/java/ru/frogogo/whitelabel/view/dialog/CouponReceivedDialogFragmentCallbackViewModel.kt b/app/src/main/java/ru/frogogo/whitelabel/view/dialog/CouponReceivedDialogFragmentCallbackViewModel.kt new file mode 100644 index 00000000..fa1aa79a --- /dev/null +++ b/app/src/main/java/ru/frogogo/whitelabel/view/dialog/CouponReceivedDialogFragmentCallbackViewModel.kt @@ -0,0 +1,20 @@ +package ru.frogogo.whitelabel.view.dialog + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.github.ajalt.timberkt.e +import ru.frogogo.whitelabel.core.Event +import ru.frogogo.whitelabel.data.model.ui.coupon.CouponUiModel +import ru.frogogo.whitelabel.extension.asLiveData +import ru.frogogo.whitelabel.extension.setEvent + +class CouponReceivedDialogFragmentCallbackViewModel : ViewModel() { + + private val _onShowClickedEvent = MutableLiveData>() + val onShowClickedEvent = _onShowClickedEvent.asLiveData() + + fun onShow(coupon: CouponUiModel) { + e { "Coupon1 $coupon" } + _onShowClickedEvent.setEvent(coupon) + } +} diff --git a/app/src/main/res/drawable/ic_coupon.xml b/app/src/main/res/drawable/ic_coupon.xml new file mode 100644 index 00000000..c2296643 --- /dev/null +++ b/app/src/main/res/drawable/ic_coupon.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/app/src/main/res/layout/dialog_coupon_received.xml b/app/src/main/res/layout/dialog_coupon_received.xml new file mode 100644 index 00000000..d0ef912b --- /dev/null +++ b/app/src/main/res/layout/dialog_coupon_received.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + diff --git a/app/src/zboom/res/values/strings_home.xml b/app/src/zboom/res/values/strings_home.xml index e4bfef96..dc2d6c54 100644 --- a/app/src/zboom/res/values/strings_home.xml +++ b/app/src/zboom/res/values/strings_home.xml @@ -10,4 +10,8 @@ Coupons My receipts Scan a new receipt + + You have received a coupon! + Congratulations you have received a coupon for %s + Watch