From a2779d90b5fad7f42990549436b374dbf8bdb8d3 Mon Sep 17 00:00:00 2001 From: Dawid Wojtas Date: Wed, 26 Oct 2022 12:17:37 +0200 Subject: [PATCH] [BH-1594] Add shortcuts instruction Shortcuts instruction is a new functionality during the Onboarding process. It shows hints on how to use buttons. --- art/bell/shortcuts_step_bedside_lamp_W_G.png | Bin 0 -> 3877 bytes art/bell/shortcuts_step_deep_press_W_G.png | Bin 0 -> 2789 bytes .../shortcuts_step_home_and_battery_W_G.png | Bin 0 -> 2642 bytes art/bell/shortcuts_step_light_click_W_G.png | Bin 0 -> 3045 bytes art/bell/shortcuts_step_restart_W_G.png | Bin 0 -> 4615 bytes art/bell/shortcuts_step_rotate_W_G.png | Bin 0 -> 3068 bytes art/bell/shortcuts_step_turn_off_W_G.png | Bin 0 -> 2754 bytes harmony_changelog.md | 3 + image/assets/lang/English.json | 11 ++ .../apps-common/widgets/BellBaseLayout.hpp | 6 +- products/BellHybrid/CMakeLists.txt | 4 +- .../ApplicationBellOnBoarding.cpp | 53 +++++--- .../CMakeLists.txt | 12 ++ .../BellOnBoardingNames.hpp | 12 +- .../OnBoardingShortcutsLayoutClassic.cpp | 124 ++++++++++++++++++ .../OnBoardingShortcutsLayoutClassic.hpp | 33 +++++ .../OnBoardingShortcutsLayoutProvider.hpp | 30 +++++ .../layouts/OnBoardingShortcutsLayouts.cpp | 44 +++++++ .../layouts/OnBoardingShortcutsLayouts.hpp | 19 +++ .../OnBoardingShortcutsWindowPresenter.cpp | 37 ++++++ .../OnBoardingShortcutsWindowPresenter.hpp | 47 +++++++ .../windows/OnBoardingSettingsWindow.cpp | 3 +- .../OnBoardingShortcutsOptionWindow.cpp | 41 ++++++ .../OnBoardingShortcutsOptionWindow.hpp | 22 ++++ .../windows/OnBoardingShortcutsWindow.cpp | 67 ++++++++++ .../windows/OnBoardingShortcutsWindow.hpp | 31 +++++ .../windows/BellSettingsTimeUnitsWindow.hpp | 1 + .../windows/BellSettingsTimeUnitsWindow.cpp | 6 + .../src/options/BellShortOptionWindow.cpp | 3 +- products/BellHybrid/assets/assets_common.json | 8 +- 30 files changed, 585 insertions(+), 32 deletions(-) create mode 100644 art/bell/shortcuts_step_bedside_lamp_W_G.png create mode 100644 art/bell/shortcuts_step_deep_press_W_G.png create mode 100644 art/bell/shortcuts_step_home_and_battery_W_G.png create mode 100644 art/bell/shortcuts_step_light_click_W_G.png create mode 100644 art/bell/shortcuts_step_restart_W_G.png create mode 100644 art/bell/shortcuts_step_rotate_W_G.png create mode 100644 art/bell/shortcuts_step_turn_off_W_G.png create mode 100644 products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayoutClassic.cpp create mode 100644 products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayoutClassic.hpp create mode 100644 products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayoutProvider.hpp create mode 100644 products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayouts.cpp create mode 100644 products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayouts.hpp create mode 100644 products/BellHybrid/apps/application-bell-onboarding/presenter/OnBoardingShortcutsWindowPresenter.cpp create mode 100644 products/BellHybrid/apps/application-bell-onboarding/presenter/OnBoardingShortcutsWindowPresenter.hpp create mode 100644 products/BellHybrid/apps/application-bell-onboarding/windows/OnBoardingShortcutsOptionWindow.cpp create mode 100644 products/BellHybrid/apps/application-bell-onboarding/windows/OnBoardingShortcutsOptionWindow.hpp create mode 100644 products/BellHybrid/apps/application-bell-onboarding/windows/OnBoardingShortcutsWindow.cpp create mode 100644 products/BellHybrid/apps/application-bell-onboarding/windows/OnBoardingShortcutsWindow.hpp diff --git a/art/bell/shortcuts_step_bedside_lamp_W_G.png b/art/bell/shortcuts_step_bedside_lamp_W_G.png new file mode 100644 index 0000000000000000000000000000000000000000..324e97af2a6f3c7c463b3e33c30cf1d7a93cab1a GIT binary patch literal 3877 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 NSeROw)Eax-`zN9WIne+B literal 0 HcmV?d00001 diff --git a/art/bell/shortcuts_step_home_and_battery_W_G.png b/art/bell/shortcuts_step_home_and_battery_W_G.png new file mode 100644 index 0000000000000000000000000000000000000000..def82d1a07437d896c66d1ee331f6fdbc412d2d9 GIT binary patch literal 2642 zcmV-Y3a#~tP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0RM-N%)bBt00(qQO+^Rh3k3=iFOqdzKmY&B;rPX5ID#%TfVULH?+&F%o6|BT}jN_|zg3Uiz!e@c2eSJF4% zZ84S-jSEsS-lSD&(@mL}aBrJ`*J24Cse(F;GRus2lY(9Cd?P*pUSg}2EwwSmm~2!0 zP4*Jq0=&cyBlq0XN%6!|-JkkR8>HnMj{zXM*B?nk`*Oy&TyX7XwoJe3WZ`#ihUH*Ym~B$_j~F~*o| z+N(DG7Wf(vt7dhr1hDW;d>?!P$bHkwQrRE!>)Wa|-5J<`a%XkE`88C-l@YD5Rz$elnheR5xhmp61) z>#Vv{bzRQEQ`vfjev+x@Vt!u6M{$P*FaM@dkv~sAE92W3qOQ0R8;IBbz)!B8%9eX< z*PK1`=IST#5M-ySGwHL_egsc}O}DxuJa*uY;L5|>q5|a${7|dEy+SHGu3z*J%8|Lw zj2ooSlB+Od^ud?4L*4B0c$g3a)}@*e}ocj6SbQ zC9~>0Gr%HQk@H2tp4RU)542?wKY(mgi}xA1Jv4s$wK}zsU|Uw>ix)}dR6AVAK!aPi z$r3#Z$~%3lP8`_ZzlN_DfBaJyJfU1U)-d{!{NL&fpCPwbFK%7P-?oeOo3_kmTCc;H zP9)qfVFz#DRA%N-t?z>K8JGLBYW*0xQ`HKMF^pkXt9D4|vZ87!2Z5_woQ>t%!so|u zdSZ(+W7_l?QT5{h=}O)OH>C|K^SA9hevOK=1e69mB=YW6RhYcBnA-9f6^|i2lyNyF-&X$Dy*YD{B21A~C6o5; z___StBFcA0eb5CkwrS)Zw0MOm0P?@BWS-1mE{|XH<0oO8L;WIdQwXuB-Rj)L#T>2Z zq9?oCRG0B~!OOw-O$*?uJZ}mz3DN@hB<;F-dy;(G9KdA8N-dq>Nfe70KM&@!6HIQ#2{rt=4k33tsx-zG?8qjS$CvSHN5J z{0Z6|x+=nSl`+)FF@&_ZSA6ypY{C-*S+Db8C+~nopd*Jb4!QnXz-oN{i{8E+KL^{D z&7joai_^QXo0QuFRSwK)r@r|pl|3@N&O8D0y?x#nZ$wzK^`9e@h4d4{pbrSmsOkf`+&g8Xs_v~WU ze=04IaEa|YNmg=OJXVKW2(QoHn4Y!kSzyziJ(;0qZ|!LIq7T*0Cag*tj|ldb*$(yL zo$nyiF~xcZ!if+hzqh&7N-8sHWqA5DqFJ5Rc7Wa(V?F~F3N8k*ZB~E}9*IrgvEgAf zPg;yF|M_UdJMtO42tdembGQ`D_tp01$;2aM+8}hEB=7Ozi?F$eZ%H%LIuosPDXJTh zLW~iWz4cUydbeUVX6QUIpb;5B02RxiMsZ$?`#73%S7Nu(yM|-{FYtE%&UC%Jl@+(k zY_le%aJB57S8Qr!Y`vL^s6WX4fMBZUpx8}<`+#k|58AHlWnYC1fJwz`oUmw;F8?sz zq}G$-JbC()fp~;S@7`zf=0Gi+rhwnbQc^s?@&96J-r&(vwo2Ru8LV)<1(f=qZ&uZQ@l+RD*VrC{wt{SrLw%Uv$9 ztZva-5j}+6*b8_$Xs8sqhqaDNkbbz2+ldSLMiyswelq>Pu!>BSr7Xb zY;a%M*_fQhrKfgNjT;o{b1%OWcqTgDq+{WAgW9v12&-q)`b9wNT6Tyww30u8rj_rYS-n1 z2Sjwxs|cyPETTF2G^21u>;0G+9q$}x1>XJ+!HYg{U)ywg+AjG5-xc~Ta5HJs+h=sJ z$8k+?GXcV^4Ru-A6Yd*F2~276D1oVO<~!hKP8;uxd)bS6?H;(9)BJHEYe5e-R<8gz zJ4v%=_+&FcM81J5!J9tACu%mk7Qu@%d>U%e8$D2}ZSV$9>xv{G8px<4@baLyN6+PJ z=D4^{!Aqk*gkBzsxbjWv2>$44jOET)eJb6S;0I5wg&u_fsK_^FE%35U2j#SQ(_|~v zTWsqidUpkb2zR#BQ7C$hZ4F+oW5e-KW-;z5_QxpeUD5GU7oURQ>#bAea~&T~qgUT& zqSbieBjR@Oda`}jhtGkO&r+Nnysq=VIyqjJ6Qx|T?l(A)#P3O7kwyeBW9gf$X>foz z`K^;1*QB~x40P$IxsmpGBPVLFgh?WUa%FC0000bbVXQnWMOn= zI&E)cX=Zr=1=+s5oLa`;;;an-F)#q)69L%bwBlz0Aix2b_W?lf0RWKT zhp!zBI0J4!D{~~+y_Me6#HskgQ8uQ0(}KJL;xgP_W*-3%SVSRBoT7#o^P3_{^tf-u zjaR3V-(PY>)(6BsP_4b$BN#Qk?|UppCKtkN{lkqa@L@q-p`HxmREAYAeHo4DL#qu8 zle)&Lc$pftJcoIhX^mmi`}ey4g^?58GFMJC>BEq0X*+&&1r1#GVT5H0RNgFAyu>Wo zp``Vx!+&kFYvy>qAHN>k=un;frQio2ydIXYyrWiU=9 zIVppX{_zrM^OGJ|kK$VF=k>8ElC^SQt`$qGJ2Lg_Mgmb_`HXW`9dx3Z%o+qbvLq zmjZcd8BfJ_)-2wOh|RmzdMSKraXrTVSba}Y!IziTOm>K&s&%_@ftSM3qwuWkW1*V7 zKvP-r&t!$~z(V)p<5_Od*no}uVyy4MBrbKtW-v_wINHhu42ZiK%gcu`1T;zyf|-f@ z_{kte$8xu)xjZ9wUrVsmqV%mbmp3bwbcMHxzK35^T*wTlicaNt25F`D3Gq`N5x&1k zEj3Wd;a2D^zwwsyg83s0SsVSVmV>k(g`yKBJDXB!EnknkzK>a&_GpGlqw^c!DOU8~ zD>G1|t{!y{O#OrFY!j=UW+QG|3jIO$+q1`3PX9?01Sbo* zU%h>%f%p?fL9KE7zs~04htH3*t3`ZEU)vYcpsm`hqca+4RZ=+g1LwA@6#``#>Wln~K5nEWI5TKsTcl}qkk@OEit zIddknRH*q)O-9XD*L2I5zxA!JT)y)|&jZ7pE&DE~SEGzIYCICOo`LH|G^J^(%g}D} zf$i?}mBOTxm8Ob-f6~r9RNDlfZ~Kr}g*i^?-g?Er)u1CKigWyZyfbreT-vx`rC&pS zuad5_^a-T!Hb)hchb@U-Xui6q1* zR!;Z!zWFdDO$?Zs)~_Fan{8hmn#EYlULl}F&P%D!IL9iMoR1DQB_B`EzY<#N-F`n- z@i8nyOL1$XCgh@}Zf~?=8SF|a#Wpu)WcWg%ReQYlyu6D3`fXyYi-hoy(VNu$fM>JL zqoEV)S79|ZD}`xsmx)^XFi0s10LzXR?=tE81QPYM$NUkj9bdFj&O0|(VaDNnGX(3J zKQ({vEXENZGUpg}>Y&goW}-K4;r++QX6&Ezdnq@x}ETDFoY( z@ViFR%C0NoOjJSBXx~wX2kD-;q@Y;odM~XPM?KT8P2g!(Jebsk!IyW8({PhT@+DgC zyl%pkb(ncFxy#KkHrxBS^8PSG1#5I@rS_gcl)Y|F*oSr~tBZQB`2BF4*mmUA5jS^q zNUY@cDHVtfQuyks_Y3C*tig45*q|=#9U}+7`ZPM@wL5~2OfHX8B0hW-NmrG2Y|N`u z*WSFxc+|g=lJb1pK#W1#h5)@!VTzdN659e`y~#$|UG|z-eAQ3 zd@&$)-}M0F=g-F{eSf>ITDCtbHl9N}pOp@|V~Gi}oPi1#O*0%dWj@jt3$b4nDQ1AF zj#vraMSTtw4(IyeWV?^j?p>Myz$SvK=wb1j2x_)mL7XzcP{mF z+)HGMRqq7UiP|Y*h_g;O`|nbn37cr7x&bZZu6AG@S9k)9Y(=PWSNW^DP5j%{$q0zo z%aO&1hB4E+F(VkFx-Cc}PxbuW>*~^l^70W4vk@a>5p}EkopVWTEW*m`C{-n7XV4+v zx)CFMVXd8rd9UA3y}UWss@|ZaQ(Q$?hm8#Jg*bJb9;3%Q;Q8}v(C&7r-plUwV+JyLH`3@(;=_c@1NNswMZU4V zh_cE=9sjNhc+>9AZ#?H-giX@jYK#e?>F`tS6m*N7x@Di94%RqyMJZ}pq=ky_uJp1Q zR_fQtc3V$j-lqsCzxpz099%HfQQXG)a%Efvd zFDO=Lp2Pkc6?Bq#Ulsd1)UFmfc}iJ8jHb3h!niHs+a~p+1q+O73$(ADyAqs7&@`Jv*KdGUc9-Ba#4yfjkfv4wCzUhZ+K zt@-KRn6iV5h}}C|P@hhLuC0RuiKNQgI-X^AdA8yBU*lSLb+W1%LqvgBcRxu|W>ka! zw0>JK^~+6x@7ICYM*WHi9VJ2#53lN@#vjecZ7(0TR+R0YOS6L_kK4mhK*~ z;eg9~zugb_%ca9{}(iZ|%1vw*ok97lPg@0tZEH zMF6NzBFDWZy!AP3H1xFrAcz|P!lMD;@-`H{1pvOn0I*{P05Vws!03_JswZ~~+_BbD zR{?HflZHBPJz^hCZB^n8azZj%*|)Vx@&G_XrKzH55HP!L-swH3krQeyT`I!oZsKP5 zaoiBZ;#Bp+qmIpCD(%a+=My#b@0(5^`W|ac6gvz*r#$=g)Q?;C0guSOhQXvGE3Ig| z$b)PAmICHS3KHS9-9!a5p`;o`*yUiVgafsU=>>A3l@>|;Q9r^gl?EnpZafaMT? zc`6;=1M1R86W$3_rKddi<`jb=l`aHXb)WdJb7!#MJ9&RM=r_;~L`w zaY*|{U`5DhdyR9{{^R0TWJ5|^i z(str5$DQ>laX=hB`z&q<8$+@HbdC5n?l$HY`JCg{l%|2K&@0>}cX$r0tzsYoZm`84 ze)jr4MeHt6;bdZ@$cD33GRAW$QS}lCEAd|Dp=l*5_{cUKv{<741ZN-PR=i7m@u>g4 z2oFq5NpdWtMyd%AA8%KYI$4nvMDvB8A%522JC=pgNPDeHa{0jVHiX9pGZWgvu+pNv zH-eC9B0bVK+*auEQUUx3IMD!xFovxGbNzN*zuaK`62CNY5 zIR(F{qBI2TSy6M!eFaD3_@q$yR;b$N56~kDW(#rfDM8o|)XZQ<7WeUZj1vr2D5&3! z6>oKri8z zzEgD8uZ5}w+q8E4I<5L9gQGQWcveTqlx-(019c@i$z9uWWv)_eG3?cbr5VSz;XL40 zpS%CKIHY%P;SjImmN0Md9g`2z1`z%wJgSCL1x)`u>|s>-mwUv#xdkeC$+b`}`n%?n ze~P#IH^b%=!QKycc-eMN|IJPp3BR*NcbMjABA1>=tDT}8B;-7vGD1!doBgx7xxTfj zkWO6#SYUTI**} znF1fo`8ADh{w^|W`i-sP)O!I&KYGM3y$Gi@)W`LEW)8hSfFbAS0W zoyS}-SoW6yZcMkYIZyqWC5?*`)yn;`(Vn! z3kPIGsQRXFDfOWHRJ!GP-XF+R)QmyADSze#=BpcB0Owb_XuI`2K(+#oSIKJ6{TcKZqjs=I0<;+#c#5B}^O9UXz~!RMEoZH4Br>NH|1 z!I$bja6Wk+G+#yDQsjGgmI0xYt+Brb<qy;qMlDJ2BdTBS69i+r{AFl1KFtlOHpgE;oYgRX?YY-|y1tn?PP!;~sN=iDTHT(bGvNxJzPiD= z|4e5C;}^u5VOTL1ewQ=6)OsF12sC)q%pfy+G=1(w!Ii|dWnp6R+m6Wg@;9AD>Ka{O) z-CZ>&KTUd(ORZj&9pX`)L^l@mA>8{c+Y9)+zaQ9%f5#4gcYCI3?yfPv-+mAP2gQxG z2U}gmEK4e2TA!--v*Roe;Q??q^EX!|xWyOVf*uefi)h305y`GmjbdxLJPnvwR?16m z9}ariB>#CV5fj7S0B4mKF8PAp)2B0tGTzr>26lsm--Il&_;Z1-C3NJmHlC+fo{m+q z-5eRmT6hxmZ_lG;x9Be6sEFyr`mi`%SK%%pl){>`=~rw$)^gRIvym-u{dDl>abpQ* zodNdjlX0ZKf7H8(^nKlglDE!Td{b{cakiZL#pi?ZBe|F#+@k_$4kJHu_4S3|2P-x; z3tg!vC6L^VTVC}L{a^g(lkL+m}ON$-VPkv*(HQYIcS)Yw)0*r<>jvDji^o_*wLU0z3<45qZu6!AhNpkbG|A}05F;I0K|KLM2cF=xPCEjP;V)qsri z@#?OL4UsTdDqOMcy!oRor*fu4e-%G8?(Rx(^3>n{aDi5${HQ2O`N#Q7h!+Wdsj8)Q z-~-(%Ns1PJR98_EIj4u3gv3_5U|gO)_!Hd`bDQDnLqs8UJ}WC(r_w7<(tz=o_b<3) z@`x?zhZbz>1{yiFQv2j=a{U`y*5p}EL`({=i7P~s602XZK_{?$;Z)>kUL5V3BQo`o zyVg8aG1fSi5b)roe|D!(bxvn7r)8MxhF?{kf(iOu=AV=_B#Yg4tk&NbB%y(nv@<5J4~DdC9(}@>V~mJW^BbQjQt(`1X!I;G z61?Go;*^8*(K~`PuAZp0=H{O#msxUE)AcNqSiY|1SScQtaIOL5`U(j^$=r~-VyNmY z_twgW>}8@D8^+41FN%7Uu7)OMQ8c`xs7=cpU}Du=H2J0p=38^@VSX)-QfOCe$`5B} zb;oc$yVH5+MVKjdEq_}|U&EGI@z5r^Td!Ik6f{PF+X^5L7q0sQG?O>~^u-wKn$T3s zX5~{J^t%5TA)xxMGu5MZCm$~J<6K#n7e~gupO|z$ozWRQQo^RI|Iz4DgMy^$ZHmoi z+l|R5G-O6I7)8QyqD6o_H!V48vwP06-66|@C)Iil0*?0RjYIs=V@rv1$3zx6xaUj6 ztqTi(A*&UA0$)7kxjtaHdb*i`@SiKR7I^mE@$3r$%}v~Cp*#&}El>L!We=kUhR1Do<;86Bi^O3SK!r#zx`{B zH15KeZYR*dXW6lYB_2^xAVkI5M0u~M)P)OB5M2xgdd!F#U+2Eo3|W2$)UBo8?UX;U zwjqit*KgTNU|~4ay_O9~9BizUup|~9|8NJO9)?Ko!CkH&JejD+&r-vqQi>%}lTC^g z5nf;VrrW#f_14g`c+8Ju82L&40lkfG^)FO~kzmXk6^Sy(&Q^e@e>4|eP#5dn@8tEy zzuF=^iqrQmQu{kuXsK4m?`ic9hfiew4*MWP?X&E=H`eu1u=KeB_Yfs5nY; za^_SZEY+!Dj59QX9W^^O5t%7caG=uA`~_4nUp(fLDls+9r+ z(CPhOJQ*-kq4cNDwKe75*49Vs9@4f(8F+cSaL%<{!n=~5P3ao;CmWo3@T}39j1nnX zoB~3%CpKUCr>pF+wUUGEPDlz_WCsNP=XPlCesyzyt{vJvY67cpE@i5$F68edWZaUA zMoJnSZci6wL?}8SyT6wA=<}{%&lX3k@4XpIxoZQf*=^0ZoS%f=PT()ulc4KOx9##3 z#9yNwE_Ke^{pnZ$=)!le3XktzYU@IxnYBX0q7QOjrj6}VWE|>mmQk_YR*?&?)Gn7> zu`z<IP+JP69m%~2UdG4=EEi8vGhP!9q;l4Y;O>D7xM6_NZXugRch&oE^{A_ z;T5nYXRwRdufYQ{7Ky{I6EpAgpzBS8X`GB>G%-#+(d<;DjbJO?<(mhUp0PDYOmVJV zqT`#DgSyPzxPU|>mt_zP;MnH4FPH=rVBXChH8MtwPg0QZICqbL*r7CQj;8$Y?QaID z#JE&YWJ!f6BGf+&@sk**s3iCR^0xNpt6nlXxcz0a(%^xxZAKwIb~_RdXKZpd?IJq9 zS+4Y4+RVl^Xo(>}CY3WDM$2U&7;F`@B@-%bq$i3q^y0VIde1>g8Ez}@Kw8kH%NU94 zJB%}%Fn?MkQTldq%$f{5J^~i~cazOk!AZt@YG{c6_%*m>w;5+0lN}nF@0u%)C?~gt zwF>vTd*SDB2wH60y$sw$vg?_>B=~@ppjG)7(hVgqQx>vAExL-x$|W4Te~Y1eSsW{1 z|JaQtgVBuDZEn?c*EFI}m(Cu8Jyaq;W^Jx->s;V+4Qz}Zx_}oRk4N8wbtgP*23F-} zzgM>88~O2?)uR(A{J*_eDI;#gr8O(b$IlhM04szsY!m-&o+EoKRXFa*To>k5H2AUK z4nR>HN~|bauCqUMk%G=x1wNyBbTp2~*I6EnRGT;ZkvV&EQaNx}_Lu*sY1LZJX8Oui ztW$XW(h$*}c5%nP8|dC4IDif_OtL?PCq9P$lw3CQ^*EP)cH!xCDv_6y$J($iC!+1+ z#<(GV-A6WUGOuMGx>+Zy%ws-B*M*@%D)6WKr(taJQ zxdT-B<>(K;cfrs^Gq~z>>1UzWTMz1-u1IZ1;@CAEr{&ir5_b3|-}_BsQU~%tw6O?OG!j&d9DEzA)2-!P&Az3l7*mz zg?MPn#o0xN)Oy(=E9+1QbJPB-nf7C+CO1?5Qg?#e`=47p++x#pkDv1m);4{;bSgyS z{p}wC7~Q^NGqFWc*~dKb3%g(34M`pa{-FGRfAw;y*Wrxnjz0vY-V3ZOCT+!DL5;lU zz{EH6_iw)?Tt2EMKDMuY>||`b>~0kxDl950C?X;#{MbN5SVmY{MpRTl_|_1%sH0E$ eAA+m9t&@G=|0h89tA%a}fTpUBN{y0Lp7t`a|;Vg+Xvx5T=EdxM8G5|jht%OAY(5e6|-vB_b5CFko zT$8Q-;o^wr6__dblbSQwemJp(nZqx$ed9XD$uH8=SBeCH3u10+46<#+-H@=!AhZL4F?rp}hU~Zv-|%)KF$wBK%KNdaBO+ zf8+0_HAst8`9t*%z>)}(BwXN9$YrU%R6Q%)MK0&I9u4=Y48+bc0=hHLwEbp<76Lg?d#n9=THdQ6!ND#!0#+Qabz zX?}~$cr@`V^rvx)jaF}w^t$0Kt3IZcqq(ny-C4i-J5DPVRdSWttiV^Pq^W(16);C6 zb2j2w5>(bN5IvUIlK8z8zr>vshP~d40eh6MR6cq4oi~+zE0L`q&m9C8Ue`74JzY?0xBdU{oRSonCbq(G!t>xXrK3!c}5W@wOFdCno1TQ_Z zIR}6>kSU%|r0BG*3T7-jT;4`W2_aV@j3W zT&F$l{7NS)?NjYd;qzzI`5ZL|Y}<-_MD!)Y#nt+RVhRHSJR_oEBZ1h8+eB7bglGf^ zwnJGs7F!1f4mBH`ALdqeaG_Lb6gp>vgt$p7?ve^u0jYp($EPLkvg;IcP5f3+$0N{C ztbK%}d=Z~VgNUi1Ma;w>MJSH|DKOrcv_*}iKdQGGv18;b-D``Lq4N5e?AuHU!TZGMlWP#)_x>)QtQ z$kX-n^Zl9b^B)UDmnbn97SK_2mor56D)=F0VJa&JgR5$sE4p_;I{MiXiMznb6af0D z(!qEh@JTt>jTb!4O0tl%>AdX)jg1Oulpl$hd=kXcK{G7=`8ppS^3vcLR7r^Q7w;;Cx2Gjm%b^CKfdK#td~o(7s`L^Gs#mz zZ{}eGdO=!w&t(vIzlDk^Z0Lc=UKLM17LY4lWg99^CN_TqAELy(Ao<^EC&RAH>y&0_ zE{kaxvfD337t(7YFN*lpbij6tuv#4mJa#4jR~2yr(sU- zZiXj`SL$Kw_IgN!7shR`Osr%pP8AeYa3_w>X--)8JP+Rf>*dCWiQ9r8em<%!QVRs* z9lK9aG;80rm18Ou@mF{EtuA0K%Y3F=xTh9sY64#)u+r5}IAaL7IdqTZip_M9URJ66+mpbS6qR^ssFiNCX`mdro}o<^|27-Y9pgB&qCdbE`6m}_6yh^@ z=8ImX%NPIJKYg|RZdf&DQJIi#srXtQ7VdDzz$;m_)sd}@rt{v4U|SlCe!ZN6XN-P~ z=5vf<_~lU!O|i;rPlWK+3Q@Zt8`f>K9sL-@jQA1)H3f zW8FXhcHtQ=p{4KM6x6$Q)4}j&iI=vZRj?T7$ggj({bA@c9Jf7&G}%@B8|zg5Q}lv&od2ofe)MT;iF`ta<+sW{%F@ z-hPGw9eeS}oy@&%WkW_DmHE@B*6wUdJ1p?Spq92Jxq;C!8c6KiFsvoF)z+ft2kGMM z^L8p>{WM7?<|6N8K$9NF7-lMtPP@U3n$_i))f8}oUkhEkgTHz-_CQqm_f3vsiD0vn zu4x{}sgg|Qj&9l1S_S50o%lkfOr#xQ@dwbaf%u}5toGZ^r@u! zS~+w0I8SQ#r^~6KJ9SJ(IjVzofBL#@ihOEnUEW1p7s_GT(4UazB=Hp&O7Zv&?9N8! z+3}t*!=m^0e*NH`Rzc8DE}e(C4S)BRIc-dB)Hy$U{~Ta1=VlF&Op@HT37ok1Qkw*g zo>EkBx#mKB&zDySapz4m%H2e8)w^W6`H=#&;v(8`KKzN!j5|tWSB4Q8(VZRE8eSZ9 za_RN#AI)wSK773O7Z$u|HY(BiQXGMe_kLNT%4as;)%z#A)@QUtx{Ac*%Dg38FCH_d z+n+li!Te^s_=XBXIPss{K5Y9L1YSqAOuL4h`O-xWi1|m{EVdoCe_KQZZJi<#MPHLb z@!e~MQr<){Ni*9IR65W-lc<(?yPjM9BPwJSuoTgp9-;akuHgJo=eIkAERmRNP zMJY|)KW_?%UUW?ne^651)|?=j4(ouCApYxLI_ zh%k;(!J%d60J86EWaGCw!$0^^-17xXoC=+H!tKea!|GxhVlj@5PW^ zo}Ts#$Lp^ot{#iq9b+pfXu3D^gc;v?bL*CDm;z)ver0nZ)U7XmCi4Djx4`4!WLpzY zYOau$6qG0Ze?z9k_hHG!t@5Fv!xvdP?DDlRFOM*9J!FXYp#XJNb#)~*H6>Lo2Q^ha sRb4%Gbp_Q!P<4BGD(^o6w}QNG`b7QrfXdnn<--6lzieenGQN@cFE+8Q%K!iX literal 0 HcmV?d00001 diff --git a/art/bell/shortcuts_step_turn_off_W_G.png b/art/bell/shortcuts_step_turn_off_W_G.png new file mode 100644 index 0000000000000000000000000000000000000000..7c6e6bb135e7b8398fe0c973a4402324e5339a8b GIT binary patch literal 2754 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 literal 0 HcmV?d00001 diff --git a/harmony_changelog.md b/harmony_changelog.md index c83dca09dcc09f1e6495204fe2e030d44166645c..f87a98dcec88f9a2bf0ef2b6574dd13549d44b6d 100644 --- a/harmony_changelog.md +++ b/harmony_changelog.md @@ -13,6 +13,9 @@ #### UI/UX: * Improve refreshing of the display. +#### Onboarding +* Shortcuts instruction + ### Fixed ## [1.7.0 2022-11-14] diff --git a/image/assets/lang/English.json b/image/assets/lang/English.json index 28b669cfb3a1569c9829130e52de0638c582f3ca..3439174e4008ce340b68bb1ca62820f5ecc354fd 100644 --- a/image/assets/lang/English.json +++ b/image/assets/lang/English.json @@ -639,6 +639,17 @@ "app_bell_onboarding_info_deep_click_warning": "You've deep pressed", "app_bell_onboarding_info_deep_click_correction": "Be more gentle,

try
light click this time", "app_bell_onboarding_welcome": "Welcome", + "app_bell_onboarding_shortcuts_question": "Do you want to see Shortcuts instruction?", + "app_bell_onboarding_shortcuts_start": "Start", + "app_bell_onboarding_shortcuts_skip": "Skip", + "app_bell_onboarding_shortcuts_step_rotate": "Rotate to select", + "app_bell_onboarding_shortcuts_step_light_click": "Light click to accept and move forward", + "app_bell_onboarding_shortcuts_step_deep_press": "Deep press to active or deactivate the alarm", + "app_bell_onboarding_shortcuts_step_home": "Long press back (2s) to return to the home view", + "app_bell_onboarding_shortcuts_step_battery": "Long press back (2s) on the home view to see status battery", + "app_bell_onboarding_shortcuts_step_turn_off": "Press back for 10s to turn off the device", + "app_bell_onboarding_shortcuts_step_restart": "Press both side buttons for 10s to restart the device", + "app_bell_onboarding_shortcuts_step_bedside_lamp": "Long press frontlight (2s) to turn on a bedside lamp", "app_bell_settings_advanced": "Advanced", "app_bell_settings_time_units": "Time", "app_bell_settings_temp_scale": "Temperature scale", diff --git a/module-apps/apps-common/widgets/BellBaseLayout.hpp b/module-apps/apps-common/widgets/BellBaseLayout.hpp index 05208b8c84bd8fe2d6ca78e40e5e8c46ccacd972..a67117fadd0d36f3e3c03263085abe2f696df006 100644 --- a/module-apps/apps-common/widgets/BellBaseLayout.hpp +++ b/module-apps/apps-common/widgets/BellBaseLayout.hpp @@ -11,9 +11,9 @@ namespace style::bell_base_layout constexpr inline auto w = style::window_width; constexpr inline auto h = style::window_height; constexpr inline auto first_layout_min_h = 30U; - constexpr inline auto outer_layouts_w = 390U; - constexpr inline auto outer_layouts_h = 100U; - constexpr inline auto outer_layout_margin = 40U; + constexpr inline auto outer_layouts_w = 448U; + constexpr inline auto outer_layouts_h = 102U; + constexpr inline auto outer_layout_margin = 38U; constexpr inline auto center_layout_w = 504U; constexpr inline auto center_layout_h = h - 2 * outer_layout_margin - 2 * outer_layouts_h; diff --git a/products/BellHybrid/CMakeLists.txt b/products/BellHybrid/CMakeLists.txt index 366b3df1f9e41a1bb4adfb55fe838e93e2bef9be..6b3d85bbe7feecf3ccd02df141a7f3adba93d00b 100644 --- a/products/BellHybrid/CMakeLists.txt +++ b/products/BellHybrid/CMakeLists.txt @@ -115,14 +115,14 @@ download_asset_release_json(json-common-target ${CMAKE_CURRENT_SOURCE_DIR}/assets/assets_common.json ${CMAKE_BINARY_DIR}/sysroot/sys/current/ MuditaOSPublicAssets - 0.0.12 + 0.0.13 ${MUDITA_CACHE_DIR} ) download_asset_release_json(json-community-target ${CMAKE_CURRENT_SOURCE_DIR}/assets/assets_community.json ${CMAKE_BINARY_DIR}/sysroot/sys/current/ MuditaOSPublicAssets - 0.0.12 + 0.0.13 ${MUDITA_CACHE_DIR} ) download_asset_json(json-rt1051-target diff --git a/products/BellHybrid/apps/application-bell-onboarding/ApplicationBellOnBoarding.cpp b/products/BellHybrid/apps/application-bell-onboarding/ApplicationBellOnBoarding.cpp index 0f88afc69a4b9a96a82bd4db1050cd33439c433f..d9ddf633d3b5d22b7ee12006f1da2d8be1085324 100644 --- a/products/BellHybrid/apps/application-bell-onboarding/ApplicationBellOnBoarding.cpp +++ b/products/BellHybrid/apps/application-bell-onboarding/ApplicationBellOnBoarding.cpp @@ -4,12 +4,15 @@ #include "ApplicationBellOnBoarding.hpp" #include +#include #include #include #include #include #include #include +#include +#include #include #include @@ -45,7 +48,7 @@ namespace app connect(typeid(manager::GetCurrentDisplayLanguageResponse), [&](sys::Message *msg) { if (gui::window::name::onBoardingLanguageWindow == getCurrentWindow()->getName()) { - switchWindow(gui::window::name::onBoardingSettingsWindow); + switchWindow(gui::window::name::onBoardingShortcutsOptionWindow); return sys::msgHandled(); } return sys::msgNotHandled(); @@ -74,6 +77,17 @@ namespace app return std::make_unique(app, std::move(presenter), name); }); + windowsFactory.attach(gui::window::name::onBoardingShortcutsOptionWindow, + [this](ApplicationCommon *app, const std::string &name) { + return std::make_unique(app, name); + }); + + windowsFactory.attach( + gui::window::name::onBoardingShortcutsWindow, [this](ApplicationCommon *app, const std::string &name) { + auto presenter = std::make_unique(this); + return std::make_unique(app, std::move(presenter), name); + }); + windowsFactory.attach( gui::window::name::onBoardingSettingsWindow, [this](ApplicationCommon *app, const std::string &name) { auto layoutModel = std::make_unique(this); @@ -234,24 +248,26 @@ namespace app if (inputEvent.isKeyRelease(gui::KeyCode::KEY_UP) || inputEvent.isKeyRelease(gui::KeyCode::KEY_DOWN)) { informationState = OnBoarding::InformationStates::LightClickInfo; } - else if (inputEvent.isKeyRelease(gui::KeyCode::KEY_RIGHT) || - inputEvent.isKeyRelease(gui::KeyCode::KEY_LEFT)) { - informationState = OnBoarding::InformationStates::DeepClickWarningInfo; - if (getCurrentWindow()->getName() == gui::window::name::informationOnBoardingWindow) { - displayInformation(*getPreviousWindow()); - } - else { - displayInformation(getCurrentWindow()->getName()); - } - } - else if (inputEvent.isKeyRelease(gui::KeyCode::KEY_ENTER)) { - if (informationState == OnBoarding::InformationStates::DeepClickWarningInfo) { - informationPromptTimer.stop(); - informationState = OnBoarding::InformationStates::DeepClickCorrectionInfo; - displayInformation(*getPreviousWindow()); + else if (getCurrentWindow()->getName() != gui::window::name::onBoardingShortcutsWindow) { + if (inputEvent.isKeyRelease(gui::KeyCode::KEY_RIGHT) || + inputEvent.isKeyRelease(gui::KeyCode::KEY_LEFT)) { + informationState = OnBoarding::InformationStates::DeepClickWarningInfo; + if (getCurrentWindow()->getName() == gui::window::name::informationOnBoardingWindow) { + displayInformation(*getPreviousWindow()); + } + else { + displayInformation(getCurrentWindow()->getName()); + } } - else { - informationState = OnBoarding::InformationStates::RotateInfo; + else if (inputEvent.isKeyRelease(gui::KeyCode::KEY_ENTER)) { + if (informationState == OnBoarding::InformationStates::DeepClickWarningInfo) { + informationPromptTimer.stop(); + informationState = OnBoarding::InformationStates::DeepClickCorrectionInfo; + displayInformation(*getPreviousWindow()); + } + else { + informationState = OnBoarding::InformationStates::RotateInfo; + } } } } @@ -283,7 +299,6 @@ namespace app } } } - return false; } diff --git a/products/BellHybrid/apps/application-bell-onboarding/CMakeLists.txt b/products/BellHybrid/apps/application-bell-onboarding/CMakeLists.txt index 933ccd159ef7abdda488c657d7ef08a6a36204d4..758494573bbafd7e44a6a04fd90af038044962d7 100644 --- a/products/BellHybrid/apps/application-bell-onboarding/CMakeLists.txt +++ b/products/BellHybrid/apps/application-bell-onboarding/CMakeLists.txt @@ -19,16 +19,27 @@ target_sources(application-bell-onboarding windows/OnBoardingOnOffWindow.cpp windows/OnBoardingInstructionPromptWindow.cpp windows/OnBoardingWelcomeWindow.cpp + windows/OnBoardingShortcutsOptionWindow.cpp + windows/OnBoardingShortcutsWindow.cpp presenter/OnBoardingLanguageWindowPresenter.cpp presenter/OnBoardingFinalizeWindowPresenter.cpp + presenter/OnBoardingShortcutsWindowPresenter.cpp + layouts/OnBoardingShortcutsLayouts.cpp + layouts/OnBoardingShortcutsLayoutClassic.cpp presenter/OnBoardingLanguageWindowPresenter.hpp presenter/OnBoardingFinalizeWindowPresenter.hpp + presenter/OnBoardingShortcutsWindowPresenter.hpp windows/OnBoardingLanguageWindow.hpp windows/OnBoardingOnOffWindow.hpp windows/OnBoardingSettingsWindow.hpp windows/OnBoardingInstructionPromptWindow.hpp windows/OnBoardingWelcomeWindow.hpp + windows/OnBoardingShortcutsOptionWindow.hpp + windows/OnBoardingShortcutsWindow.hpp + layouts/OnBoardingShortcutsLayouts.hpp + layouts/OnBoardingShortcutsLayoutProvider.hpp + layouts/OnBoardingShortcutsLayoutClassic.hpp PUBLIC include/application-bell-onboarding/ApplicationBellOnBoarding.hpp @@ -38,6 +49,7 @@ target_link_libraries(application-bell-onboarding PRIVATE app apps-common + bell::keymap bell::app-settings PUBLIC diff --git a/products/BellHybrid/apps/application-bell-onboarding/include/application-bell-onboarding/BellOnBoardingNames.hpp b/products/BellHybrid/apps/application-bell-onboarding/include/application-bell-onboarding/BellOnBoardingNames.hpp index 36bb3eee2b33b8247ee1dce7e9bd8d247e1ba183..c4225d890da57603d5a7ec6eaafb8f746424f126 100644 --- a/products/BellHybrid/apps/application-bell-onboarding/include/application-bell-onboarding/BellOnBoardingNames.hpp +++ b/products/BellHybrid/apps/application-bell-onboarding/include/application-bell-onboarding/BellOnBoardingNames.hpp @@ -10,10 +10,12 @@ namespace app namespace gui::window::name { - inline constexpr auto onBoardingOnOffWindow = "BellOnBoardingOnOff"; - inline constexpr auto onBoardingLanguageWindow = "BellOnBoardingLanguage"; - inline constexpr auto onBoardingSettingsWindow = "BellOnBoardingSettings"; - inline constexpr auto finalizeOnBoardingWindow = "BellOnBoardingFinalize"; - inline constexpr auto informationOnBoardingWindow = "BellOnBoardingInformation"; + inline constexpr auto onBoardingOnOffWindow = "BellOnBoardingOnOff"; + inline constexpr auto onBoardingLanguageWindow = "BellOnBoardingLanguage"; + inline constexpr auto onBoardingShortcutsOptionWindow = "BellOnBoardingShortcutsOption"; + inline constexpr auto onBoardingShortcutsWindow = "BellOnBoardingShortcuts"; + inline constexpr auto onBoardingSettingsWindow = "BellOnBoardingSettings"; + inline constexpr auto finalizeOnBoardingWindow = "BellOnBoardingFinalize"; + inline constexpr auto informationOnBoardingWindow = "BellOnBoardingInformation"; } // namespace gui::window::name diff --git a/products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayoutClassic.cpp b/products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayoutClassic.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d65129021531ded7cfbf729bfd556a203b9b5265 --- /dev/null +++ b/products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayoutClassic.cpp @@ -0,0 +1,124 @@ +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "OnBoardingShortcutsLayoutClassic.hpp" +#include +#include +#include +#include +#include + +namespace +{ + namespace container + { + constexpr inline auto width = 544U; + constexpr inline auto height = 220U; + constexpr inline auto top_margin = 74U; + + namespace separator + { + constexpr inline auto height = 22U; + } // namespace separator + + namespace image + { + constexpr inline auto height = container::height - separator::height; + constexpr inline auto width = 448U; + } // namespace image + + namespace text + { + constexpr inline auto height = 146U; + constexpr inline auto width = 448U; + } // namespace text + + } // namespace container +} // namespace + +namespace gui +{ + OnBoardingShortcutsLayoutClassic::OnBoardingShortcutsLayoutClassic(const UTF8 &image, + const UTF8 &description, + bool leftArrowVisible, + bool rightArrowVisible) + : OnBoardingShortcutsLayoutProvider(image, description), + VBox(nullptr, 0, 0, style::bell_base_layout::w, style::bell_base_layout::h), image{image}, + description{description}, leftArrowVisible{leftArrowVisible}, rightArrowVisible{rightArrowVisible} + { + buildInterface(); + } + + void OnBoardingShortcutsLayoutClassic::buildInterface() + { + setAlignment(Alignment::Horizontal::Center); + + auto containerThreeBox = new HThreeBox(this); + containerThreeBox->setMinimumSize(container::width, container::image::height); + containerThreeBox->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Bottom)); + containerThreeBox->setMargins(Margins(0, container::top_margin, 0, 0)); + containerThreeBox->setEdges(RectangleEdge::None); + + containerThreeBox->firstBox = new HBox(containerThreeBox); + containerThreeBox->firstBox->setAlignment(Alignment(Alignment::Vertical::Top)); + containerThreeBox->firstBox->setEdges(RectangleEdge::None); + containerThreeBox->firstBox->activeItem = false; + + auto leftArrowBox = new ImageBox(containerThreeBox->firstBox, new Image("bell_arrow_left_W_M")); + leftArrowBox->setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Bottom)); + leftArrowBox->setMinimumSizeToFitImage(); + leftArrowBox->setVisible(leftArrowVisible); + leftArrowBox->setEdges(RectangleEdge::None); + containerThreeBox->firstBox->setMinimumSize(leftArrowBox->widgetMinimumArea.w, + leftArrowBox->widgetMinimumArea.h); + + containerThreeBox->centerBox = new HBox(containerThreeBox); + containerThreeBox->centerBox->setEdges(RectangleEdge::None); + containerThreeBox->centerBox->setAlignment( + Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Bottom)); + containerThreeBox->centerBox->setMaximumSize(container::image::width, container::image::height); + + auto imageBox = new ImageBox(containerThreeBox->centerBox, new Image(image, ImageTypeSpecifier::W_G)); + imageBox->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Bottom)); + imageBox->setMinimumSizeToFitImage(); + imageBox->setVisible(true); + + containerThreeBox->lastBox = new HBox(containerThreeBox); + containerThreeBox->lastBox->setAlignment(Alignment(Alignment::Vertical::Bottom)); + containerThreeBox->lastBox->setEdges(RectangleEdge::None); + containerThreeBox->lastBox->activeItem = false; + + auto rightArrowBox = new ImageBox(containerThreeBox->lastBox, new Image("bell_arrow_right_W_M")); + rightArrowBox->setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Bottom)); + rightArrowBox->setMinimumSizeToFitImage(); + rightArrowBox->setVisible(rightArrowVisible); + rightArrowBox->setEdges(RectangleEdge::None); + containerThreeBox->lastBox->setMinimumSize(rightArrowBox->widgetMinimumArea.w, + rightArrowBox->widgetMinimumArea.h); + + auto containerSeparator = new VBox(this, 0, 0, container::width, container::separator::height); + containerSeparator->setAlignment(Alignment(gui::Alignment::Horizontal::Center)); + containerSeparator->setEdges(RectangleEdge::None); + containerSeparator->activeItem = false; + + auto containerText = new VBox(this, 0, 0, container::text::width, container::text::height); + containerText->setAlignment(Alignment(gui::Alignment::Horizontal::Center)); + containerText->setEdges(RectangleEdge::None); + containerText->activeItem = false; + + auto textBox = new Text(containerText, 0, 0, 0, 0); + textBox->setMinimumSize(container::text::width, container::text::height); + textBox->setAlignment(Alignment::Horizontal::Center); + textBox->setTextType(TextType::MultiLine); + textBox->setEditMode(EditMode::Browse); + textBox->setFont(style::window::font::verybiglight); + textBox->setRichText(utils::translate(description)); + + this->resizeItems(); + } + + auto OnBoardingShortcutsLayoutClassic::getLayout() -> Item * + { + return this; + } +}; // namespace gui diff --git a/products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayoutClassic.hpp b/products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayoutClassic.hpp new file mode 100644 index 0000000000000000000000000000000000000000..36e04ee223cca2980b7fb820748e72862cad8242 --- /dev/null +++ b/products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayoutClassic.hpp @@ -0,0 +1,33 @@ +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +#include "OnBoardingShortcutsLayoutProvider.hpp" + +#include + +namespace gui +{ + class BellBaseLayout; + + class OnBoardingShortcutsLayoutClassic : public OnBoardingShortcutsLayoutProvider, VBox + { + private: + const UTF8 image; + const UTF8 description; + + const bool leftArrowVisible; + const bool rightArrowVisible; + + void buildInterface(); + + public: + OnBoardingShortcutsLayoutClassic(const UTF8 &image, + const UTF8 &description, + bool leftArrowVisible = true, + bool rightArrowVisible = true); + + auto getLayout() -> Item * override; + }; +}; // namespace gui diff --git a/products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayoutProvider.hpp b/products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayoutProvider.hpp new file mode 100644 index 0000000000000000000000000000000000000000..6b5540d2a1955e27ba57581c781915c917b4a63e --- /dev/null +++ b/products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayoutProvider.hpp @@ -0,0 +1,30 @@ +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +#include + +namespace gui +{ + class Item; + + class OnBoardingShortcutsLayoutProvider + { + private: + const UTF8 image; + const UTF8 description; + const bool leftArrow; + const bool rightArrow; + + public: + OnBoardingShortcutsLayoutProvider(const UTF8 &image, + const UTF8 &description, + bool leftArrow = true, + bool rightArrow = true) + : image{image}, description{description}, leftArrow{leftArrow}, rightArrow{rightArrow} {}; + virtual ~OnBoardingShortcutsLayoutProvider() noexcept = default; + + virtual Item *getLayout() = 0; + }; +}; // namespace gui diff --git a/products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayouts.cpp b/products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayouts.cpp new file mode 100644 index 0000000000000000000000000000000000000000..25721a56e659d7e4c8e9006a3a93aad489329f57 --- /dev/null +++ b/products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayouts.cpp @@ -0,0 +1,44 @@ +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "OnBoardingShortcutsLayouts.hpp" +#include "OnBoardingShortcutsLayoutClassic.hpp" + +namespace gui::factory +{ + std::vector getLayouts() + { + return {{[]() { + return new OnBoardingShortcutsLayoutClassic( + "shortcuts_step_rotate", "app_bell_onboarding_shortcuts_step_rotate", false, true); + }}, + {[]() { + return new OnBoardingShortcutsLayoutClassic("shortcuts_step_light_click", + "app_bell_onboarding_shortcuts_step_light_click"); + }}, + {[]() { + return new OnBoardingShortcutsLayoutClassic("shortcuts_step_deep_press", + "app_bell_onboarding_shortcuts_step_deep_press"); + }}, + {[]() { + return new OnBoardingShortcutsLayoutClassic("shortcuts_step_home_and_battery", + "app_bell_onboarding_shortcuts_step_home"); + }}, + {[]() { + return new OnBoardingShortcutsLayoutClassic("shortcuts_step_home_and_battery", + "app_bell_onboarding_shortcuts_step_battery"); + }}, + {[]() { + return new OnBoardingShortcutsLayoutClassic("shortcuts_step_turn_off", + "app_bell_onboarding_shortcuts_step_turn_off"); + }}, + {[]() { + return new OnBoardingShortcutsLayoutClassic("shortcuts_step_restart", + "app_bell_onboarding_shortcuts_step_restart"); + }}, + {[]() { + return new OnBoardingShortcutsLayoutClassic( + "shortcuts_step_bedside_lamp", "app_bell_onboarding_shortcuts_step_bedside_lamp", true, false); + }}}; + } +} // namespace gui::factory diff --git a/products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayouts.hpp b/products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayouts.hpp new file mode 100644 index 0000000000000000000000000000000000000000..1e950a3a3edf7825bca2826757a47eaac92c36ef --- /dev/null +++ b/products/BellHybrid/apps/application-bell-onboarding/layouts/OnBoardingShortcutsLayouts.hpp @@ -0,0 +1,19 @@ +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +#include +#include +#include + +namespace gui +{ + class OnBoardingShortcutsLayoutProvider; + using LayoutGenerator = std::function; + + namespace factory + { + std::vector getLayouts(); + } // namespace factory +}; // namespace gui diff --git a/products/BellHybrid/apps/application-bell-onboarding/presenter/OnBoardingShortcutsWindowPresenter.cpp b/products/BellHybrid/apps/application-bell-onboarding/presenter/OnBoardingShortcutsWindowPresenter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..133a8c0e45ea45da93518ef5704c3b6cd7928974 --- /dev/null +++ b/products/BellHybrid/apps/application-bell-onboarding/presenter/OnBoardingShortcutsWindowPresenter.cpp @@ -0,0 +1,37 @@ +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "OnBoardingShortcutsWindowPresenter.hpp" +#include "layouts/OnBoardingShortcutsLayoutProvider.hpp" + +namespace app::OnBoarding +{ + OnBoardingShortcutsWindowPresenter::OnBoardingShortcutsWindowPresenter(app::ApplicationCommon *app) + { + initLayoutOptions(); + } + + std::vector OnBoardingShortcutsWindowPresenter::getLayouts() const + { + return layoutOptions; + } + + gui::Item *OnBoardingShortcutsWindowPresenter::getFirstLayout() const + { + return layoutOptions.front(); + } + + bool OnBoardingShortcutsWindowPresenter::isLastLayout(const gui::Item *layout) const + { + return layoutOptions.back() == layout; + } + + void OnBoardingShortcutsWindowPresenter::initLayoutOptions() + { + auto layoutsList = gui::factory::getLayouts(); + + for (auto &layoutEntry : layoutsList) { + layoutOptions.push_back(layoutEntry()->getLayout()); + } + } +} // namespace app::OnBoarding diff --git a/products/BellHybrid/apps/application-bell-onboarding/presenter/OnBoardingShortcutsWindowPresenter.hpp b/products/BellHybrid/apps/application-bell-onboarding/presenter/OnBoardingShortcutsWindowPresenter.hpp new file mode 100644 index 0000000000000000000000000000000000000000..66c2fe083b028ef3560d94fd8ce69a1e3cee7745 --- /dev/null +++ b/products/BellHybrid/apps/application-bell-onboarding/presenter/OnBoardingShortcutsWindowPresenter.hpp @@ -0,0 +1,47 @@ +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +#include +#include +#include + +#include +#include +#include + +namespace app::OnBoarding +{ + class OnBoardingShortcutsWindowContract + { + public: + class View + { + public: + virtual ~View() = default; + }; + + class Presenter : public BasePresenter + { + public: + virtual std::vector getLayouts() const = 0; + virtual bool isLastLayout(const gui::Item *layout) const = 0; + virtual gui::Item *getFirstLayout() const = 0; + }; + }; + + class OnBoardingShortcutsWindowPresenter : public OnBoardingShortcutsWindowContract::Presenter + { + private: + std::vector layoutOptions; + void initLayoutOptions(); + + public: + explicit OnBoardingShortcutsWindowPresenter(app::ApplicationCommon *app); + + std::vector getLayouts() const override; + bool isLastLayout(const gui::Item *layout) const override; + gui::Item *getFirstLayout() const override; + }; +} // namespace app::OnBoarding diff --git a/products/BellHybrid/apps/application-bell-onboarding/windows/OnBoardingSettingsWindow.cpp b/products/BellHybrid/apps/application-bell-onboarding/windows/OnBoardingSettingsWindow.cpp index dac1a1868b591a689ddfc1ea9860430d61e3a726..5f26a17788c42d9d50c6db0c8793c19b5151a28b 100644 --- a/products/BellHybrid/apps/application-bell-onboarding/windows/OnBoardingSettingsWindow.cpp +++ b/products/BellHybrid/apps/application-bell-onboarding/windows/OnBoardingSettingsWindow.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "OnBoardingSettingsWindow.hpp" @@ -13,5 +13,6 @@ namespace gui : BellSettingsTimeUnitsWindow(app, std::move(windowPresenter), name) { finishedCallback = [this]() { application->switchWindow(window::name::finalizeOnBoardingWindow); }; + returnCallback = [this]() { application->switchWindow(window::name::onBoardingShortcutsOptionWindow); }; } } // namespace gui diff --git a/products/BellHybrid/apps/application-bell-onboarding/windows/OnBoardingShortcutsOptionWindow.cpp b/products/BellHybrid/apps/application-bell-onboarding/windows/OnBoardingShortcutsOptionWindow.cpp new file mode 100644 index 0000000000000000000000000000000000000000..703c460bb3a53cb94f967c1833d86e8f9ab4f0cc --- /dev/null +++ b/products/BellHybrid/apps/application-bell-onboarding/windows/OnBoardingShortcutsOptionWindow.cpp @@ -0,0 +1,41 @@ +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "OnBoardingShortcutsOptionWindow.hpp" +#include "BellOnBoardingNames.hpp" + +#include +#include +#include + +namespace gui +{ + OnBoardingShortcutsOptionWindow::OnBoardingShortcutsOptionWindow(app::ApplicationCommon *app, + const std::string &name) + : BellShortOptionWindow(app, name), startString{utils::translate("app_bell_onboarding_shortcuts_start")}, + skipString{utils::translate("app_bell_onboarding_shortcuts_skip")} + { + addOptions(settingsOptionsList()); + setListTitle(utils::translate("app_bell_onboarding_shortcuts_question")); + } + + std::list