From a1d208163b57dff2d31124d5df22449a4bc3bf14 Mon Sep 17 00:00:00 2001 From: "jinwoo.shin" Date: Mon, 31 Aug 2015 21:10:32 +0900 Subject: [PATCH 01/16] Delete toast object when timeout Change-Id: I40fed1988382923ae1495523640954f9849974c8 Signed-off-by: jinwoo.shin --- include/define.h | 1 + src/util.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/include/define.h b/include/define.h index 2229a34..6e6279a 100644 --- a/include/define.h +++ b/include/define.h @@ -46,6 +46,7 @@ #define SIGNAL_NO_FAVORITE "elm,state,no_favorite" #define SIGNAL_TOGGLE "elm,state,toggle" #define SIGNAL_UNTOGGLE "elm,state,untoggle" +#define SIGNAL_TIMEOUT "timeout" #define FONT_REGULAR "TizenSans" #define FONT_LIGHT "TizenSans:style=Light" diff --git a/src/util.c b/src/util.c index 518fad5..041d77b 100644 --- a/src/util.c +++ b/src/util.c @@ -159,6 +159,14 @@ Evas_Object *util_add_button(Evas_Object *parent, const char *part, return btn; } +static void _notify_timeout_cb(void *data, Evas_Object *obj, void *ei) +{ + if (!obj) + return; + + evas_object_del(obj); +} + Evas_Object *util_add_toast(Evas_Object *parent, char *text) { Evas_Object *toast, *content; @@ -177,6 +185,8 @@ Evas_Object *util_add_toast(Evas_Object *parent, char *text) elm_object_style_set(toast, STYLE_TOAST); elm_notify_align_set(toast, 0.0, 1.0); elm_notify_timeout_set(toast, TOAST_TIMEOUT); + evas_object_smart_callback_add(toast, SIGNAL_TIMEOUT, + _notify_timeout_cb, NULL); content = elm_label_add(toast); if (!content) { -- 2.7.4 From cf24548ef200fedb5909f94766c01c726f3a4690 Mon Sep 17 00:00:00 2001 From: "jinwoo.shin" Date: Thu, 3 Sep 2015 14:16:07 +0900 Subject: [PATCH 02/16] Update action menu Change-Id: I12d012f4d832fdc37fd27f2d22aa5886cf6e8d3c Signed-off-by: jinwoo.shin --- include/define.h | 12 +++ include/strings.h | 2 + res/images/btn_menu_add_ch_dis.png | Bin 0 -> 1472 bytes res/images/btn_menu_add_ch_foc.png | Bin 0 -> 1464 bytes res/images/btn_menu_add_ch_nor.png | Bin 0 -> 1548 bytes res/images/btn_menu_add_ch_sel.png | Bin 0 -> 1527 bytes res/images/btn_menu_add_remove_ch_dis.png | Bin 0 -> 3355 bytes res/images/btn_menu_add_remove_ch_foc.png | Bin 0 -> 3352 bytes res/images/btn_menu_add_remove_ch_nor.png | Bin 0 -> 3383 bytes res/images/btn_menu_add_remove_ch_sel.png | Bin 0 -> 3461 bytes res/images/btn_menu_remove_favorite_dis.png | Bin 0 -> 1741 bytes res/images/btn_menu_remove_favorite_foc.png | Bin 0 -> 1729 bytes res/images/btn_menu_remove_favorite_nor.png | Bin 0 -> 1780 bytes res/images/btn_menu_remove_favorite_sel.png | Bin 0 -> 1786 bytes src/view_action_menu.c | 114 ++++++++++++++++++++++++---- 15 files changed, 114 insertions(+), 14 deletions(-) create mode 100644 res/images/btn_menu_add_ch_dis.png create mode 100644 res/images/btn_menu_add_ch_foc.png create mode 100644 res/images/btn_menu_add_ch_nor.png create mode 100644 res/images/btn_menu_add_ch_sel.png create mode 100644 res/images/btn_menu_add_remove_ch_dis.png create mode 100644 res/images/btn_menu_add_remove_ch_foc.png create mode 100644 res/images/btn_menu_add_remove_ch_nor.png create mode 100644 res/images/btn_menu_add_remove_ch_sel.png create mode 100644 res/images/btn_menu_remove_favorite_dis.png create mode 100644 res/images/btn_menu_remove_favorite_foc.png create mode 100644 res/images/btn_menu_remove_favorite_nor.png create mode 100644 res/images/btn_menu_remove_favorite_sel.png diff --git a/include/define.h b/include/define.h index 6e6279a..4ff5bfd 100644 --- a/include/define.h +++ b/include/define.h @@ -67,6 +67,10 @@ #define IMAGE_FAV_FOC IMAGEDIR"/btn_menu_favorite_foc.png" #define IMAGE_FAV_SEL IMAGEDIR"/btn_menu_favorite_sel.png" #define IMAGE_FAV_DIS IMAGEDIR"/btn_menu_favorite_dis.png" +#define IMAGE_UNFAV_NOR IMAGEDIR"/btn_menu_remove_favorite_nor.png" +#define IMAGE_UNFAV_FOC IMAGEDIR"/btn_menu_remove_favorite_foc.png" +#define IMAGE_UNFAV_SEL IMAGEDIR"/btn_menu_remove_favorite_sel.png" +#define IMAGE_UNFAV_DIS IMAGEDIR"/btn_menu_remove_favorite_dis.png" #define IMAGE_LOCK_NOR IMAGEDIR"/btn_menu_lock_nor.png" #define IMAGE_LOCK_FOC IMAGEDIR"/btn_menu_lock_foc.png" #define IMAGE_LOCK_SEL IMAGEDIR"/btn_menu_lock_sel.png" @@ -75,6 +79,14 @@ #define IMAGE_UNLOCK_FOC IMAGEDIR"/btn_menu_unlock_foc.png" #define IMAGE_UNLOCK_SEL IMAGEDIR"/btn_menu_unlock_sel.png" #define IMAGE_UNLOCK_DIS IMAGEDIR"/btn_menu_unlock_dis.png" +#define IMAGE_ADD_CH_NOR IMAGEDIR"/btn_menu_add_ch_nor.png" +#define IMAGE_ADD_CH_FOC IMAGEDIR"/btn_menu_add_ch_foc.png" +#define IMAGE_ADD_CH_SEL IMAGEDIR"/btn_menu_add_ch_sel.png" +#define IMAGE_ADD_CH_DIS IMAGEDIR"/btn_menu_add_ch_dis.png" +#define IMAGE_REMOVE_CH_NOR IMAGEDIR"/btn_menu_add_remove_ch_nor.png" +#define IMAGE_REMOVE_CH_FOC IMAGEDIR"/btn_menu_add_remove_ch_foc.png" +#define IMAGE_REMOVE_CH_SEL IMAGEDIR"/btn_menu_add_remove_ch_sel.png" +#define IMAGE_REMOVE_CH_DIS IMAGEDIR"/btn_menu_add_remove_ch_dis.png" #define IMAGE_FAVORITE_DEFAULT IMAGEDIR"/ic_default_tv.png" #define VIEW_CHANNELINFO "VIEW_CHANNELINFO" diff --git a/include/strings.h b/include/strings.h index a1dfb08..d21f511 100644 --- a/include/strings.h +++ b/include/strings.h @@ -28,6 +28,8 @@ #define STR_BUTTON_FAVORITE "Favorite" #define STR_BUTTON_LOCK "Lock" #define STR_BUTTON_UNLOCK "Unlock" +#define STR_BUTTON_ADD_CHANNEL "Channel" +#define STR_BUTTON_REMOVE_CHANNEL "Channel" #define STR_NOFAVORITE "No favorite channels" #define STR_FAVORITE_TOAST "Added to your favorite." #define STR_UNFAVORITE_TOAST "Removed from your favorite." diff --git a/res/images/btn_menu_add_ch_dis.png b/res/images/btn_menu_add_ch_dis.png new file mode 100644 index 0000000000000000000000000000000000000000..d2f2052e6be69720d87c08e669097111247a6dbe GIT binary patch literal 1472 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ-L~|l`=yjN+NuHtdjF{^%6m9^eS=-fVzQ(*;f=KCTFLXC?ut( zXXe=|z2CiGNg*@ERw>-n*TA>HIW;5GqpB!1xXLdixhgx^GDXSWPQj+a3TQxXYDuC( zMQ%=Bu~mhw64+cTAR8pCucQE0Qj%?}1aVY^Z-9bxeo?A|sh+WJvVozYf|;3~p^2%P znW2t?k%6I+z5x)K=^C0?nVMM{nJYkn6417ylr*a#7dNO~K%T8qMoCG5mA-y?dAVM> zv0i>ry1t>Mr6tG=BO_g)3fZ zE`@j@w*YQzUNJP7fB~jokyxN_sAmB35=^15FMg%Dxp39RB|)hO_hL1;IHa;5RX-@T zIKQ+g85nVC${?!>telHd6HD@oLh|!-V4)b0kzbNuoRMFk;2dnGpb?&#my%yztO-`{ z>ucqiS6q^qmz?V9Vygr+K`%2i#mdms#nRZo(%8t*#L>{u)zrek#m&jw!qC{j$<@Wh z!VIR@B|o_|H#M&WrZ)wl*950tP*TV(0NU)5T9jFqn&MWJpQ`}&vQ;K-w;19y52`l> zw_A*G>eUB2MjsThND&Pa0;V1i6P|2=9C*S{%>$EaktaqG>@ z{rb* zMSkC<)r2^|3b4sO*mmNy)j`<}K`W=?KMQO%kLv4+l>vN*surX|2e|^Q$k}2!Ao~Szc zqF(Z$gv6B+=`T&9{nwuz(7f@j+DrSU$&QN?jEhwFxU=v~ao*9k={KXecd$;@k}V>M zf?|o8{CnN3C79MenA&?JGH&6-lx_Aa*d7`hFxxq>ZE2{Ji)TN7)#T9K1hF~IvVH4f zBad2q+P2}A$_pmnoPYCuMC6`}-!HmyQas^mVUCE;v(UJ#F8Nt%YqS<5PhWPRa!up^ z8SVy*%OX!MU2W=p-*}>JL#*FNxy#d3OZC5Pl>MW7@6){7->dd!9?F`T$;LfrQ<=+6 ze)EhUJ+*q-qJ{kN&9-{pr{}EejhSUMHQ>dMjePQkKX0@i=XQ^~yZ*hs&*M$U;ru%cGJ0sUR~dN zFn}|9iChb_>_ge0a}mXn)4HV2PHOr4FZEvF6OT(miGtVe*qnex93%z{9{vzXVEA^h V-hJZV5)M$A>gnp|vd$@?2>?SXE3W_m literal 0 HcmV?d00001 diff --git a/res/images/btn_menu_add_ch_foc.png b/res/images/btn_menu_add_ch_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..9f59e84e0668a163ef33f2135febafc718fb6b85 GIT binary patch literal 1464 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ-L~|l`=yjN+NuHtdjF{^%6m9^eS=-fVzQ(*;f=KCTFLXC?ut( zXXe=|z2CiGNg*@ERw>-n*TA>HIW;5GqpB!1xXLdixhgx^GDXSWPQj+a3TQxXYDuC( zMQ%=Bu~mhw64+cTAR8pCucQE0Qj%?}1aVY^Z-9bxeo?A|sh+WJvVozYf|;3~p^2%P znW2t?k%6I+z5x)K=^C0?nVMM{nJYkn6417ylr*a#7dNO~K%T8qMoCG5mA-y?dAVM> zv0i>ry1t>Mr6tG=BO_g)3fZ zE`@j@w*YQzUNJP7fB~jokyxN_sAmB35=^15FMg%Dxp39RB|)hO_hL1;IHa;5RX-@T zIKQ+g85nVC${?!>telHd6HD@oLh|!-V4)b0kzbNuoRMFk;2dnGpb?&#my%yztO-`{ z>ucqiS6q^qmz?V9Vygr+K`%2i#mdOo(#X)o#n{Nu#L>{u)zs3`!obPM+0`5vUS{T& z&M>_$`N^fZsd*(Zy(tL2COGwil0t3)&}Ns^qRg_?6t|-MTm`U~tuk@D#So`?P`xR* z-C~4OuRhQ*`k;tKifEV+F!g|#@MH_*z!QFI9x$~R0h9Ht%%#i>3`{znE{-7;x8BS+ z>n$26av=SSrFN`j%addMxgwc2l$8Wn0$B>h^MvMY6+Y+38#>JRsQR*Sc@kH7C)ceu6!@^!|-sy`?){&9^UL$_Cu35a4yxlHH~RYuiUZ<4+i$Q1M(Vwm&bbETH__JojFP7 zj-a6Z%PXmq#lCs@r|D*I2wu@HTfydBaQ#pB1HnBlh87;h)3ya$F%)=5N1kMxyHxyv zhmpvXT8U{(k5BvkcS7>a{EA6#ZD+gf4pp_t?+9GCU%97Hc%74?&vT~({jtqAd(6F4 zcPxwc2D|PdN1>qH0quyU+nav=2;Y2QZmiGnw&w=ywp(qy>l>DD;4NRWLgLKq57rW2&zz{+_%NDK_GneCk$Ys+Oze#O&@@=~x@3Out zb3b%)di>5~SuMZZs+wihnMuwU9yzv#?%->^Y`4r-caQ0(*}}KJoGLxNJgPf4(#Z5} zi|E4+la_*Il6KywCv{5yk_Sf7wNy{zHHWm2kmBR@49pDME{89yy=rR;DoZ_G{an^L HB{Ts5QB@q9 literal 0 HcmV?d00001 diff --git a/res/images/btn_menu_add_ch_nor.png b/res/images/btn_menu_add_ch_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..3e3e14badd50608e842c8d51ac1c762686f84a2b GIT binary patch literal 1548 zcmb7EeM}Q)7%$+&35YX{s3@M-I8kY@ckNwiV>NBBg{rLuDs=H99_`Vd(7W?`&_Xt3 z;^vHF4yQ&mOax|})6EH)Zkl0b4pBB`nL4yC!_6&hY<>i{3|zAJ5Y#`6$u7^``;q7O zd%kar(~+Gtar#7=OqOKJA@jhxP zc{Js%Sl>khL|g&ma*J;JGQEcjC@D!t84mCO4agRUdCF5li%=2mV^{-x`(!%|FLyG#z4|RkHGLE!?BRW zNELBqq5%e;J`5qi+wG5t+2ClRK+2FX#UrRvg#-dpTqD{+F^_)i##6O}t_q$;^5`H} zCU`(SisfTqkh^Cak`#eA`sD%xib9o=oTn^6v!abOz^GM65*j0}Ld{yUnbcxto!V;F zqAClXrNVLJ81_jFU{iV-uim235<06H$5gluMJ>3|sKYE~Bc@gnT8+s>j$v(VP^4H7 zE!mT>%ww$PnOMD9ped0PTpU+AR(YqN6S<(D;~{fC0c8|2td|P~=SgLG7$r#yOgZhf z3S0mh$*Z1uihZq>B&=#RhHEhpDvBCOEQ=)67NZ8oOk|c79>se9Pp%N)1R^!V6U{Mp z1v*aJK5BJvcr+|D3noMWqo6TIqcU0SG8<`hg|7|l{d&Q;^;0{2ry8+r z&MS34$XeTwfn5W>l6Bsg)9VUra%T5ihuE#9n$^4Ovnyjx<-XBRnOtaANxtsvF7|h>baQ9jgvJsna-xq$_@VbiY7<;j?TeJ zqW`O|>ri3q$FttL^jF&Dh7?6d`gu0T_e;y$;-%-8L|)o0yLC6ZWM9n+K559G*8}aj zGtb}CcCPYn)3vImi>{tcoyJA(_-Tj!t<}tO9PgXnvHkTI9VgR{ysDaT;I!dHY<;6F zy7A}mjBs}~rb>SAgXINRTIWY<4n>>O&Nz-RH=GCVn}`!g(Sx?Z!RyDiz3J)qY@C}6 zs_>vHt0-gXhh=NKBf~x4)FoGCz6sXxDN+9?s)SDQ-jCkz_&4mEx;MnEl@c`~eeScHWpOe(TwA<9wl+ihKie!0 K@*~sQjsF4o;5^;{ literal 0 HcmV?d00001 diff --git a/res/images/btn_menu_add_ch_sel.png b/res/images/btn_menu_add_ch_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..cdea71be4d9a01f25697fcf6b177c1bbc47fa62f GIT binary patch literal 1527 zcmb7EeNYr-7(Y7`M6tmN1sYoyVl=tiFLv*4 zp7-}W@7wImTM{3a9H-G};_bO?0T{E?KXw}E>9Ii>3`vUBr4&l#N`RAjjm0Ca<{`V6 ztKbWG&QrVQI1dooVxh>TxE#xAx8&7xs*OJA^#L>>%MSWDcNMQdtN98+G{e{X55kb( zF~cRK19kWqzEa4ollj8Bydrm9mD}Wjvll~IK^hQvd4+?5-fGcL2hH#}FAe7EHUdNA zCQ6kVo(Rh2a6*hE^AM>gbZ!*GAd1psnIuJF84!+QID&#k>99+aQ=<$l?{~|BPZ1;$ zQW?3`(ptp~gGeWi;Pp8i_lQORq)!8k9MRQf@tWMWC0|Ft7awlS}!jucGe7IHWN!_T1XUQ3=G2>aK=Q~ z7z2h{Nh3;9XoDxQp8um20)jx)VtAl9qFbQi z)akua2a9``g%`mMk-=3scYGJ6(L83bvzDUZ(6yG6i>7jOzYgf~T8r)BG2`wHx-{X3 zNbZH#w7pl;KJUJx?Qo$CLJ z*5J%x=YiHITFaWw_8+?v;S79DOn7~|b2@EF=!*Q*|MblUyzlJki)3hOsF$vt6FxCy zJCqi>+fh|95V>GGA-cGP`SCCO9z&L;EN}cmnb(ONqW5W2BilngRNwTCj(+{%hL4`Q z{?^Go$^fy=rwKQLM@Nu$-Rd#V8ohDm$2Vs;o}E88rtkdp;f5UNlzA`a(TVd$+7dJB z4J})ay;5urMsBXda*X*avqr;0XU_-Kzm_JiS$gAQebWk~wyFE&f15AIy~@__32ZC= z?jn=CB>x}dm7p#=;ihT$uhz)XmYQ#NxHlFx_N+;|n>u1!z6@?z_~BSeIhXjG&`gZ0 hGNBFVKmKa3MyuI3wJtXWIdDXMitW}sc6Ux$!++wrFsA?j literal 0 HcmV?d00001 diff --git a/res/images/btn_menu_add_remove_ch_dis.png b/res/images/btn_menu_add_remove_ch_dis.png new file mode 100644 index 0000000000000000000000000000000000000000..b095ef75ffe5e96035cdd022bd9ab9e55bdc1d71 GIT binary patch literal 3355 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 literal 0 HcmV?d00001 diff --git a/res/images/btn_menu_add_remove_ch_foc.png b/res/images/btn_menu_add_remove_ch_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..a61de3a342143958f7039af3542905a3c7c07101 GIT binary patch literal 3352 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 N002ovPDHLkV1nnjP5b}= literal 0 HcmV?d00001 diff --git a/res/images/btn_menu_add_remove_ch_sel.png b/res/images/btn_menu_add_remove_ch_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..593a830223a89d649cde51acd49a34e86c9b10c8 GIT binary patch literal 3461 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 literal 0 HcmV?d00001 diff --git a/res/images/btn_menu_remove_favorite_foc.png b/res/images/btn_menu_remove_favorite_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..086e86423eb14129ee4b1436d4be9d5361317e33 GIT binary patch literal 1729 zcmb7FdrT8|9It|4WZ+O7U_g)JCLn!X+biuT2zRZNmryDc*@My^aD(2}yTcYlfueD+ zI5a#QKG4j$sS{_gV+@#r;uJ+u%ocPQ>R!emf)64p>aGatAI4;tyZiorzkENR?>oPW zq{J2Oa~95Fu~_b^7(~s;aK|^>h55@Su9A%Kr4?E_g~+DOIud0?8Hg+tP#JYOs2bH7 z3fFX_48kcD(`adJLcB~*7`Zx!4%cEdF=&P?(qhu-^H3VdLUS-&&K_wy!3HpcoSi04 z;3t@1G#860BGHthM2)^EPcJpFBO`!ti;N*KqO=aM81r#TW|6Zed1cJnam-@_lPYwc zoc+QnZ9)(NE=`+cJf7KX=9-0Eg3RFwq*AGa0|YsY28SxdX`O|GQ-RYA2ukTm%tT`Z z4mcQfSwsOXXEUC@2*GGdNO(z%Q&WjzQpU6BOgsUX&odewaZPGdv>JWo#v8RMO`!?p zsZok3AoWZ=vID2VOzz%p$f3x1BU?#gOi^_C2%#@9qByNWK2r zuvDmoB?7)e9L5)mqo%R1V;DBB0W-*8sVG_^5y2o|!c>3(gdre;@L>oMf{;=PPh(X$ zMeA@q>agd)Vz02#Z^g=B64lWJsUe8`>B=YN5;Q^O5+(pnfqD+E9MeZk$2pcSTb;Ji){WZBA*%vb zY0fw9gS2{rtfp>W>@oK~mw!3b8WOjn_FTViRz_#)(FOTaqTSxO z*Z*+0)vn5nJmBQo1hja@yUblK*XFm{uV%6aW=3|ji-`N-m)zx^-Xr6xXI z!+cd4hna6ve?+|IEB`<}Q%0TnKsik6+7PfJDBskgCrg0k{! z5}QU3r8*F_3LeR-Q|3xgZ6i;T5a06<)qN1X2kP|(A##@ zZ`ehWZv8ABQ=RMYu36(sD_fMy%KK`A%7Tag?Hqg1p1inud&xlNembsia6^dAXSQef zp?P0rEUmAL^}p0DI=1rZo|09?Kh-?$0*7amN)8OOy!&>LHPq%D(AcPXbmL=AMw>@- z{pzt(oBV{@vsIg%LErAwW9H%P$Jb7?3XC(q*!nQ}1U+ygHT9$6fWeW}N9I_k25~U= zxRnUtni~}H-{BFV_Yb*@7Fj9$N!Pi%5y;`M_ZKG#E;jz<)n3Q#J2eEIz9b53Z_r+t zcfGi!qITQ(C{}gw_!d*6!tP~>N_lVbU{Z9z{I}z`-Mt?@U1d3( mxvYOqv$b(b*yG)vE$v|0)NP-4CC`m_Tq-I>B61`;)A}Fh%$xfF literal 0 HcmV?d00001 diff --git a/res/images/btn_menu_remove_favorite_nor.png b/res/images/btn_menu_remove_favorite_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4a97270dd69d5046bf1b0fd7936206f893d2d4 GIT binary patch literal 1780 zcmb7Fc~BEq7>~-;cp!(Mm6A2q12xBPvN@JRb1LN!V?fkVvnC5HkZjy6Bp`=CM>$mR zsEk*2q_!$T(LpR8BUCD*C?g&yFe-(LM`fUlf-+LNQBePIoaxT)e($~ce!uUYmlqMf zcp~#_CWFD47`#NOp=E&mb8({o$lDf@7SkwIG_{ zPlH*ABvMb;BWC6(n9kjo4cQfGZ;+)VP8S7DR1*3mBW9w4m4R$fEmewyGMEo4#0rH{ z3@M}nwL%Q?Rj`B)!?IEArx==zYrqYNM4*zwa!3mC#dHN!uv{gVtHnaOS|O3ir2^F` zHrQmLP?H|B+p}Zwk66hUv511iP>LY61d%ve`G`1zA}n!)8Bi=20drU2CIex$_}RnmnO%g`nU0xCVGxpVLHKc-t5)lZ|p@N`H2}zV9fl4NXA-PhbW{+SE|0h>G z+6kV$89r%_(IdL!?8^_WPH#R83udAxgrr9y9z0S;Pna-RDbw0oU+fEs^N>xg7gyyv zvW``1m1#3p9j%IMDoAy!&2c&Ma9+OKx8gs%H5c!&nQH@%W;>Tg%#*u0EaT-D=e9<( za+&$IV}uWKf_?2y>L-;YmkP5IO?Mm`7GyXt^%)v!_m1|0YsrT}j7*=Q%btM?;W$Cw@Y)d>JjO&sPVlm0m!SL#|j99mUxm}jVgp8cF_LK3oux?W9^Vw6^ zXI^>Sy0*~c=IRdkc5R>Lbh*Z%fee^f1szGw@ppVtvZ8I}b@+5^l%Oxu>7c9|l`7U{ zb?clt9SkL0Mwg=ZIwm@a-!=U&FC@Qti3ccHa)Cq%xlLMOye zDe!1WnH+lS1|Bv>P=i)znyjl``?LSiWt*;af^p7mi{=+HznZ%)U~8mvM`ej0ati(C zV&zY%b81yL9hy^p7Uypi;85c+_vzZcqK1Z)+rITrpRDxPa$9!(b+)HwJS$re#Yp=5 z@Xjssn}_8Gi)WXIGhY$c{8){H7X}houAv2E7iBb`aq?l6&08G(rlRs{K$RE&NPYFv z^9^Sh{2l5be>t#gXW|sgJa@qN54t6|ffWPPdcPUN%MIkHuUu#%u^_vMHKzzHmf1T&4+a=Kjkw5ru zuRi2@YS}N-%DXa3^^>1>oa(GEe54D=6?CVS?$Sx2?O<&B&o^h}wINKeKBBC@chM%V tS398nu^E8LVS25)!Yy%Bl;W9=QyH$8jz4%Qm=k2bhk{k%%5u3b`#(@*sZjs` literal 0 HcmV?d00001 diff --git a/res/images/btn_menu_remove_favorite_sel.png b/res/images/btn_menu_remove_favorite_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..7a56a9fa8836a5f7e2ca28ddc9ca781e26fd7b39 GIT binary patch literal 1786 zcmb7Fc~BEq7)L=65K)*q;89~xkt_EmBsE~n0a1vYnh{$G$r6^3Y}hPGz^fc8hgPY8 z3ZdQ=wP=t-Dk@MFR8%f23f2Nz#Y!8j2Redw!=e4dai%-F`@Q$(`~ALqURH=Gz`<^& zorQ&kgD{X6hRMa|Z?ZM^XARv&FyV^w#b`Jji|Ql@Xu*-eF(6K;l*qv_P$ElCyb59n z%au@s7!?Nxv81q)ATjF@^hz~`#>o8jYKc?nT(^;31k{Tr<1*L6cU+2Bw;VzhfHGubQXny8+-7WHAEK63gZdJ zY+*Y#J`P3IEFw{-(-Cx30*uIsWG0ho=Ack~Fby9~vI>>xeN-B^aRwf!ks^>9g)>r8+qH1F=domMAP`M7=~!BojzPrP3VNh_(g|13$X)No`F;vKl0Y zff_gokz)0TbsGm`x%<2!vm)jVYXt&fMUf=%U}=&PRG~s18&4K6d2|{FAd$HYE|b237$+z~oQ>rhw0ih~<73%iseBF%pe*J23h-lC+5gEE z5p#lQZifFf$M_M}apvWRR>w9Uh6Pk%6M|r)pjL+uU=zj?@;DLt&i=x+nL(km8%@Tn zf7~}|qlE7k%urlzuwRCEbb3~ee{MV_>sWZsc-1c@D!HttGPg6&>6^eTWBX~RYYQFU z`Q&)dP&5p7Y;-@<1>7)bw2!VAYyNB($^SO2s~yzcG!1R6Eia4k{3AbX)`NVpCapNy z{f@16RNRd6YM&F$ZIb5iE43-ApVV?f^L|!v(@$pxe2va|>0ciq9oe1!tea3`r8z{< zv-%#RUs_Rf;vKvy6y2b+dFmOy)2iQ3H@an~T|VnoXR~&n z_%&5*8x!ihhHo-VexYm6^~o%ZF6-3|&{}@C+?e`nsI&LmzuX4gTl{&gIR~qJio5fs zDjwJGD6thG%eGd+Z&EVFRY}l%+g`q7+UC?#mnd&7H^`T6DQWJd-yI_8Z@_9tA+H9q zUt#eaIu;fE?eN8U9a@i>`@I?!v8llR&g#t&_^e{xqO;EM%L_3nC2VTFz*yXL_>1N? z`5F?xxo+QvdyM8Zn@Q8oO}*7xqg&G7T_V2YzPhTsvRiwFzKbaLf@1L<6PE-Hl1i6^ zcV=e?EO1UoE*8q3%(f0s$f@`-^=`LI$DS;Cm-Wm#9_eaT-2+?Ssju1&Tv^#V;ezM3 z$O*ku0!$>QS*OVb1ra7%wN-rGjLV6Ks~KB44b1SE0I%f0H^}{rUKjQ~g-!N?sPBhf zvHRMmEjBE-itKyXbA0er$kDd>De=~Dj>lY4{QbAv8|=#uT6FJ7XQURak7U~AJ1#G} zrc{vGDTb#NSAmMJ_f?5gQJW3NrGMmfKCoycO&71vu%wUwSi-zm5*r zi?8y`&VQ9{o4zeMlUUZd(0+H~`N$UA%EYeLtVXzP?xnrj3*|y%g6q*e<$es8dBTb$ vC+{Bla7p8EZH05c)mQZ*<456DSvzrx1yx&{K?8IB&9{+|FXEkC8lCnp(iFUv literal 0 HcmV?d00001 diff --git a/src/view_action_menu.c b/src/view_action_menu.c index 4f36cf0..a73131b 100644 --- a/src/view_action_menu.c +++ b/src/view_action_menu.c @@ -41,6 +41,7 @@ enum _button_id { BUTTON_LIVETV, BUTTON_FAV, BUTTON_LOCK, + BUTTON_CHANNEL, }; enum _button_state { @@ -138,8 +139,61 @@ static int _lock_state(void) return r; } +static void _channel_clicked(void) +{ + const struct tv_channel_info *channel_info; + int r; + + channel_info = tv_channel_get_info(); + if (!channel_info) { + _ERR("failed to get channel info"); + return; + } + + if (channel_info->remembered) + r = tv_channel_del_channel(channel_info->service_id); + else + r = tv_channel_add_channel(channel_info->service_id); + + if (r < 0) + _ERR("failed to set channel"); + else { + if (channel_info->remembered) + viewmgr_update_view(VIEW_ACTION_MENU, + UPDATE_TYPE_SHOW_TOAST, + STR_REMOVE_CHANNEL_TOAST); + else + viewmgr_update_view(VIEW_ACTION_MENU, + UPDATE_TYPE_SHOW_TOAST, + STR_ADD_CHANNEL_TOAST); + } + + tv_channel_del_info(channel_info); + + viewmgr_hide_view(VIEW_ACTION_MENU); +} + +static int _channel_state(void) +{ + const struct tv_channel_info *channel_info; + int r; + + channel_info = tv_channel_get_info(); + if (!channel_info) { + _ERR("failed to get channel info"); + return STATE_INVALID; + } + + r = channel_info->remembered ? STATE_TOGGLE : STATE_UNTOGGLE; + + tv_channel_del_info(channel_info); + + return r; +} + struct _button { int id; + const char *style; struct _button_data data[2]; void (*clicked)(void); @@ -149,12 +203,13 @@ struct _button { static struct _button buttons[] = { { .id = BUTTON_FAV, + .style = STYLE_ACTION_MENU_BTN, .data[UNTOGGLE] = { .text = STR_BUTTON_FAVORITE, - .normal = IMAGE_FAV_NOR, - .focused = IMAGE_FAV_FOC, - .selected = IMAGE_FAV_SEL, - .disabled = IMAGE_FAV_DIS + .normal = IMAGE_UNFAV_NOR, + .focused = IMAGE_UNFAV_FOC, + .selected = IMAGE_UNFAV_SEL, + .disabled = IMAGE_UNFAV_DIS }, .data[TOGGLE] = { .text = STR_BUTTON_FAVORITE, @@ -168,24 +223,45 @@ static struct _button buttons[] = { }, { .id = BUTTON_LOCK, + .style = STYLE_ACTION_MENU_BTN, .data[UNTOGGLE] = { .text = STR_BUTTON_LOCK, - .normal = IMAGE_LOCK_NOR, - .focused = IMAGE_LOCK_FOC, - .selected = IMAGE_LOCK_SEL, - .disabled = IMAGE_LOCK_DIS - }, - .data[TOGGLE] = { - .text = STR_BUTTON_UNLOCK, .normal = IMAGE_UNLOCK_NOR, .focused = IMAGE_UNLOCK_FOC, .selected = IMAGE_UNLOCK_SEL, .disabled = IMAGE_UNLOCK_DIS }, + .data[TOGGLE] = { + .text = STR_BUTTON_UNLOCK, + .normal = IMAGE_LOCK_NOR, + .focused = IMAGE_LOCK_FOC, + .selected = IMAGE_LOCK_SEL, + .disabled = IMAGE_LOCK_DIS + }, .clicked = _lock_clicked, .state = _lock_state }, { + .id = BUTTON_CHANNEL, + .style = STYLE_ACTION_MENU_BTN, + .data[UNTOGGLE] = { + .text = STR_BUTTON_ADD_CHANNEL, + .normal = IMAGE_REMOVE_CH_NOR, + .focused = IMAGE_REMOVE_CH_FOC, + .selected = IMAGE_REMOVE_CH_SEL, + .disabled = IMAGE_REMOVE_CH_DIS + }, + .data[TOGGLE] = { + .text = STR_BUTTON_REMOVE_CHANNEL, + .normal = IMAGE_ADD_CH_NOR, + .focused = IMAGE_ADD_CH_FOC, + .selected = IMAGE_ADD_CH_SEL, + .disabled = IMAGE_ADD_CH_DIS + }, + .clicked = _channel_clicked, + .state = _channel_state + }, + { .id = BUTTON_INVALID } }; @@ -355,6 +431,17 @@ static void _update_favorite(struct _priv *priv) tv_channel_del_list(channel_list); } +static void _update_menu(struct _priv *priv) +{ + int i; + + i = 0; + while (buttons[i].id != BUTTON_INVALID && i < BUTTON_MAX) { + _update_button_state(priv->menu_btn[i], &buttons[i]); + i++; + } +} + static bool _draw_channel_info(struct _priv *priv) { Evas_Object *layout; @@ -406,7 +493,7 @@ static bool _draw_menu_area(struct _priv *priv) while (buttons[i].id != BUTTON_INVALID && i < BUTTON_MAX) { btn = util_add_button(priv->base, NULL, buttons[i].data[UNTOGGLE].text, - STYLE_ACTION_MENU_BTN); + buttons[i].style); if (!btn) { _ERR("Add button failed."); evas_object_del(table); @@ -434,8 +521,6 @@ static bool _draw_menu_area(struct _priv *priv) inputmgr_add_callback(btn, buttons[i].id, &button_handler, &buttons[i]); - _update_button_state(btn, &buttons[i]); - col = i % ITEMS_IN_ROW; row = i / ITEMS_IN_ROW; elm_table_pack(table, btn, col, row, 1, 1); @@ -565,6 +650,7 @@ static void _show(void *data) priv = data; _update_channel_info(priv); + _update_menu(priv); _update_favorite(priv); evas_object_show(priv->base); -- 2.7.4 From 434964e8ceb787d44fc369e1eecf90faaf0322c2 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Mon, 7 Sep 2015 20:15:56 +0900 Subject: [PATCH 03/16] add manifest file to avoid smack error Change-Id: I4f6f59163a05bc0c2a7acb915eab88d81d881bea Signed-off-by: Minkyu Kang --- packaging/org.tizen.live-tv.manifest | 5 +++++ packaging/org.tizen.live-tv.spec | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 packaging/org.tizen.live-tv.manifest diff --git a/packaging/org.tizen.live-tv.manifest b/packaging/org.tizen.live-tv.manifest new file mode 100644 index 0000000..97e8c31 --- /dev/null +++ b/packaging/org.tizen.live-tv.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/packaging/org.tizen.live-tv.spec b/packaging/org.tizen.live-tv.spec index 67c2ce5..256fda5 100644 --- a/packaging/org.tizen.live-tv.spec +++ b/packaging/org.tizen.live-tv.spec @@ -7,6 +7,7 @@ License: Apache-2.0 Source0: %{name}-%{version}.tar.gz Source1: %{name}.service Source2: %{name}.path +Source3: %{name}.manifest BuildRequires: cmake BuildRequires: pkgconfig(capi-appfw-application) @@ -27,7 +28,6 @@ BuildRequires: edje-bin %define _pkgdir %{_prefix}/apps/%{name} %define _bindir %{_pkgdir}/bin %define _resdir %{_pkgdir}/res -%define _datadir %{_pkgdir}/data %define _edjedir %{_resdir}/edje %define _manifestdir %{_datarootdir}/packages %define _sysuserdir /systemd/user @@ -38,6 +38,7 @@ Live TV application for Tizen TV. %prep %setup -q +cp %{SOURCE3} . %build cmake \ @@ -52,7 +53,6 @@ make %{?jobs:-j%jobs} %install %make_install -install --directory %{buildroot}/%{_datadir} install --directory %{buildroot}%{_libdir}%{_servicedir} install -m 0644 %{SOURCE1} %{buildroot}%{_libdir}%{_sysuserdir} install -m 0644 %{SOURCE2} %{buildroot}%{_libdir}%{_sysuserdir} @@ -62,10 +62,10 @@ ln -sf ../%{name}.path %{buildroot}%{_libdir}%{_servicedir} rm -rf %{buildroot} %files +%manifest %{name}.manifest %defattr(-,root,root,-) %{_bindir}/* %{_resdir}/* -%{_datadir} %{_manifestdir}/%{name}.xml %{_libdir}%{_sysuserdir}/%{name}.service %{_libdir}%{_sysuserdir}/%{name}.path -- 2.7.4 From 2b91dc0f82b09c863c3dc5996a6b6a2d9c1aead0 Mon Sep 17 00:00:00 2001 From: "jinwoo.shin" Date: Tue, 8 Sep 2015 14:36:23 +0900 Subject: [PATCH 04/16] Delays to call tune after tv service resume Change-Id: Id9c9c4c10f5955ff2d70c48eba804cc09c9dd3df Signed-off-by: jinwoo.shin --- src/main.c | 47 +++++++++++++++++++++++++---------------------- src/view_pin.c | 2 +- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/main.c b/src/main.c index b400730..324e5d3 100644 --- a/src/main.c +++ b/src/main.c @@ -41,6 +41,7 @@ struct _appdata { tzsh_h tzsh; tzsh_tvsrv_h ta; Ecore_Timer *pause_timer; + int service_id; int is_signal; int is_channel; @@ -273,14 +274,30 @@ static void _resume(void *data) r = tv_resume(); if (r < 0) { _ERR("Resume tv service failed"); + ui_app_exit(); + return; - } else if (r > 0) { - r = tv_channel_tune(); - if (r < 0) { - _ERR("Tune channel failed"); + } + + /* Try to tune with service id if supplied from app control */ + if (ad->service_id > 0) { + r = tv_channel_tune_with_service_id(ad->service_id); + ad->service_id = 0; + + if (!r) { + ad->is_channel = true; return; } } + + r = tv_channel_tune(); + if (r < 0) { + ad->is_channel = false; + viewmgr_show_view(VIEW_ERROR); + viewmgr_update_view(VIEW_ERROR, UPDATE_TYPE_NOCHANNEL, NULL); + } else { + ad->is_channel = true; + } } static bool _create(void *data) @@ -409,25 +426,11 @@ static void _control(app_control_h control, void *data) ad = data; r = app_control_get_extra_data(control, KEY_SVCID, &svcid); - if (r == SERVICE_ERROR_NONE) { - r = tv_channel_tune_with_service_id(atoll(svcid)); - free(svcid); - if (!r) { - ad->is_channel = true; - viewmgr_show_view(VIEW_CHANNELINFO); - return; - } - } - - r = tv_channel_tune(); + if (r != SERVICE_ERROR_NONE) + return; - if (r < 0) { - ad->is_channel = false; - viewmgr_show_view(VIEW_ERROR); - viewmgr_update_view(VIEW_ERROR, UPDATE_TYPE_NOCHANNEL, NULL); - } else { - ad->is_channel = true; - } + ad->service_id = atoll(svcid); + free(svcid); } int main(int argc, char *argv[]) diff --git a/src/view_pin.c b/src/view_pin.c index bab97bc..b91800e 100644 --- a/src/view_pin.c +++ b/src/view_pin.c @@ -53,7 +53,7 @@ static void _send_message(struct _priv *priv, const char *result) service_destroy(service); } -static void _check_pincode(struct _priv *priv, const char *pincode) +static void _check_pincode(struct _priv *priv, char *pincode) { const struct tv_channel_info *channel_info; int r; -- 2.7.4 From d0579bc65a13b832594675da02b78f2006504c6b Mon Sep 17 00:00:00 2001 From: "jinwoo.shin" Date: Tue, 8 Sep 2015 16:56:14 +0900 Subject: [PATCH 05/16] Temporal patch to disable channel lock Change-Id: Icc6c3aa28d20527a313f83016a4141e334ee158a Signed-off-by: jinwoo.shin --- src/view_action_menu.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/view_action_menu.c b/src/view_action_menu.c index a73131b..bee69a3 100644 --- a/src/view_action_menu.c +++ b/src/view_action_menu.c @@ -123,6 +123,11 @@ static void _lock_clicked(void) static int _lock_state(void) { + return STATE_DISABLED; + + /* + FIXME: Temporal fix until video mute is ready. + const struct tv_channel_info *channel_info; int r; @@ -137,6 +142,7 @@ static int _lock_state(void) tv_channel_del_info(channel_info); return r; + */ } static void _channel_clicked(void) -- 2.7.4 From b91df1bcae3e185b381283a04f02c8afa9170619 Mon Sep 17 00:00:00 2001 From: "jinwoo.shin" Date: Wed, 9 Sep 2015 21:23:45 +0900 Subject: [PATCH 06/16] Update key event handler - Replaces ecore event handler to elm event handler Change-Id: I3824e5e219006cf6713ef9526a56a1f312e7d08e Signed-off-by: jinwoo.shin --- src/layout_channelinfo_search.c | 1 - src/main.c | 88 +++++++++++------------------------------ src/view_action_menu.c | 4 ++ src/view_channelnumber.c | 8 ++-- 4 files changed, 33 insertions(+), 68 deletions(-) diff --git a/src/layout_channelinfo_search.c b/src/layout_channelinfo_search.c index 3849fdf..6aaa01e 100644 --- a/src/layout_channelinfo_search.c +++ b/src/layout_channelinfo_search.c @@ -61,7 +61,6 @@ static void _tune_channel(void *data) _ERR("failed to tune with service id"); viewmgr_hide_view(VIEW_CHANNELINFO); - viewmgr_show_view(VIEW_CHANNELINFO); } static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, diff --git a/src/main.c b/src/main.c index 324e5d3..4c74363 100644 --- a/src/main.c +++ b/src/main.c @@ -77,84 +77,50 @@ static struct key_map g_kmap[] = { }, }; -static Eina_Bool _key_down_cb(void *data, int type, void *ei) +static Eina_Bool _event(void *data, Evas_Object *obj, Evas_Object *src, + Evas_Callback_Type type, void *ei) { struct _appdata *ad; - Evas_Event_Key_Down *ev = ei; size_t i, j; + char *keyname; + int update_type; if (!data) { _ERR("failed to get data"); - return false; + return EINA_FALSE; } ad = data; - if (!ad->is_channel) - return ECORE_CALLBACK_DONE; - - if (viewmgr_get_view_state(VIEW_PIN) == - VIEW_STATE_VISIBLE) - return ECORE_CALLBACK_PASS_ON; - - if (!strcmp(ev->keyname, KEY_ENTER) || - !strcmp(ev->keyname, KEY_ENTER_REMOTE)) { - if (viewmgr_active_view_count() > 0) - return ECORE_CALLBACK_PASS_ON; - } - - for (i = 0; i < sizeof(g_kmap) / sizeof(*g_kmap); i++) { - j = 0; - while (g_kmap[i].key[j]) { - if (!strcmp(ev->keyname, g_kmap[i].key[j])) { - viewmgr_update_view(g_kmap[i].view, - UPDATE_TYPE_INPUT_KEY_DOWN, ev); - return ECORE_CALLBACK_DONE; - } - j++; - } - } - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool _key_up_cb(void *data, int type, void *ei) -{ - struct _appdata *ad; - Evas_Event_Key_Up *ev = ei; - size_t i, j; - - if (!data) { - _ERR("failed to get data"); - return false; - } - - ad = data; if (!ad->is_channel) - return ECORE_CALLBACK_DONE; - - if (viewmgr_get_view_state(VIEW_PIN) == - VIEW_STATE_VISIBLE) - return ECORE_CALLBACK_PASS_ON; - - if (!strcmp(ev->keyname, KEY_ENTER) || - !strcmp(ev->keyname, KEY_ENTER_REMOTE)) { - if (viewmgr_active_view_count() > 0) - return ECORE_CALLBACK_PASS_ON; + return EINA_TRUE; + + switch (type) { + case EVAS_CALLBACK_KEY_DOWN: + keyname = ((Evas_Event_Key_Down *)ei)->keyname; + update_type = UPDATE_TYPE_INPUT_KEY_DOWN; + break; + case EVAS_CALLBACK_KEY_UP: + keyname = ((Evas_Event_Key_Up *)ei)->keyname; + update_type = UPDATE_TYPE_INPUT_KEY_UP; + break; + default: + return EINA_FALSE; } for (i = 0; i < sizeof(g_kmap) / sizeof(*g_kmap); i++) { j = 0; while (g_kmap[i].key[j]) { - if (!strcmp(ev->keyname, g_kmap[i].key[j])) { + if (!strcmp(keyname, g_kmap[i].key[j])) { viewmgr_update_view(g_kmap[i].view, - UPDATE_TYPE_INPUT_KEY_UP, ev); - return ECORE_CALLBACK_DONE; + update_type, ei); + return EINA_TRUE; } j++; } } - return ECORE_CALLBACK_PASS_ON; + return EINA_FALSE; } static Evas_Object *_add_win(const char *name) @@ -360,10 +326,7 @@ static bool _create(void *data) ad->win = win; tv_signal_cb_set(_tv_signal_cb, ad); - ad->key_down = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, - _key_down_cb, ad); - ad->key_up = ecore_event_handler_add(ECORE_EVENT_KEY_UP, - _key_up_cb, ad); + elm_object_event_callback_add(win, _event, ad); elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_IN); @@ -389,10 +352,7 @@ static void _terminate(void *data) if (ad->win) { tv_destroy(); - if (ad->key_down) - ecore_event_handler_del(ad->key_down); - if (ad->key_up) - ecore_event_handler_del(ad->key_up); + elm_object_event_callback_del(ad->win, _event, ad); viewmgr_remove_view(VIEW_CHANNELINFO); viewmgr_remove_view(VIEW_CHANNELNUMBER); diff --git a/src/view_action_menu.c b/src/view_action_menu.c index bee69a3..6c21921 100644 --- a/src/view_action_menu.c +++ b/src/view_action_menu.c @@ -278,6 +278,8 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_BACK_REMOTE)) viewmgr_hide_view(VIEW_ACTION_MENU); + + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; } static input_handler key_handler = { @@ -363,6 +365,8 @@ static void _favorite_clicked_cb(int id, void *data, Evas_Object *obj) { if (id > 0) tv_channel_tune_with_service_id(id); + + viewmgr_hide_view(VIEW_ACTION_MENU); } static input_handler favorite_handler = { diff --git a/src/view_channelnumber.c b/src/view_channelnumber.c index 6a63655..bf1ce0c 100644 --- a/src/view_channelnumber.c +++ b/src/view_channelnumber.c @@ -75,7 +75,6 @@ static Eina_Bool _done_input(void *data) _ERR("invalid channel"); viewmgr_hide_view(VIEW_CHANNELNUMBER); - viewmgr_show_view(VIEW_CHANNELINFO); return ECORE_CALLBACK_CANCEL; } @@ -115,8 +114,11 @@ static void _channel_key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { if (!strcmp(ev->keyname, KEY_ENTER) || - !strcmp(ev->keyname, KEY_ENTER_REMOTE)) + !strcmp(ev->keyname, KEY_ENTER_REMOTE)) { + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + _tune_channel(data); + } } static void _channel_mouse_down_cb(int id, void *data, Evas *e, @@ -245,7 +247,7 @@ static void _update_number_info(struct _priv *priv) static int _get_number(const char *keyname) { - static const char const *keys[] = { + static const char * const keys[] = { KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9 }; -- 2.7.4 From fbfc2393cf390509957d19b78c9c8d19bff09f56 Mon Sep 17 00:00:00 2001 From: "jinwoo.shin" Date: Tue, 15 Sep 2015 19:41:26 +0900 Subject: [PATCH 07/16] Restructuring channelinfo view and added animations - Each layout creates its own base layout to show animation effect - Added show/hide effect on each layout except search layout Change-Id: Ibf11a7e21cc6f43754886533b7207602b638fc5b Signed-off-by: jinwoo.shin --- data/view/channelinfo.edc | 282 +++++++++++++++++++++++++++++++++------- include/define.h | 8 +- include/view.h | 2 - src/layout_channelinfo.c | 100 ++++++++++---- src/layout_channelinfo_list.c | 137 ++++++++++++------- src/layout_channelinfo_search.c | 104 ++++++++++----- src/util.c | 3 +- src/view_channelinfo.c | 70 +--------- 8 files changed, 490 insertions(+), 216 deletions(-) diff --git a/data/view/channelinfo.edc b/data/view/channelinfo.edc index 0ebf575..8b7ece3 100644 --- a/data/view/channelinfo.edc +++ b/data/view/channelinfo.edc @@ -36,7 +36,53 @@ group { } group { - name, GRP_CHANNELINFO_LIST; + name, GRP_LAYOUT_CHANNELINFO; + parts { + part { + name, PART_CONTENT; + type, SWALLOW; + scale, 1; + description { + state, "default" 0.0; + rel1.relative, 1.0 0.5; + rel2.relative, 1.0 0.5; + min, 536 486; + align, 0.0 0.5; + fixed, 1 1; + visible, 0; + } + description { + state, "show" 0.0; + inherit, "default" 0.0; + align, 1.0 0.5; + visible, 1; + } + } + } + programs { + program { + signal, SIGNAL_SHOW; + action, STATE_SET "show" 0.0; + target, PART_CONTENT; + transition, CUBIC_BEZIER 0.5 0.45 0.03 0.41 1.0; + } + program { + signal, SIGNAL_HIDE; + source, SOURCE_ELM; + action, STATE_SET "default" 0.0; + target, PART_CONTENT; + transition, CUBIC_BEZIER 0.167 0.25 0.46 0.45 1.0; + after, "hide_finished"; + } + program { + name, "hide_finished"; + action, SIGNAL_EMIT SIGNAL_HIDE_FINISHED SOURCE_ELM; + } + } +} + +group { + name, GRP_LAYOUT_CHANNELINFO_LIST; images { image, "btn_navigation_up.png" COMP; image, "btn_navigation_down.png" COMP; @@ -48,18 +94,24 @@ group { scale, 1; description { state, "default" 0.0; - rel1.relative, 0.0 0.5; - rel2.relative, 0.0 0.5; + rel1.relative, 1.0 0.5; + rel2.relative, 1.0 0.5; min, 536 486; align, 0.0 0.5; fixed, 1 1; } + description { + state, "show" 0.0; + inherit, "default" 0.0; + align, 1.0 0.5; + } } part { name, "part.navigation_up"; type, IMAGE; scale, 1; description { + state, "default" 0.0; image.normal, "btn_navigation_up.png"; rel1 { to, "bg"; @@ -79,115 +131,194 @@ group { name, "padding.next_channel"; type, SPACER; description { + state, "default" 0.0; rel1 { - to_y, "part.navigation_up"; - relative, 0.0 1.0; + to, "part.navigation_up"; + relative, 0.5 1.0; } rel2 { - to_y, "part.navigation_up"; - relative, 1.0 1.0; + to, "part.navigation_up"; + relative, 0.5 1.0; } min, 0 20; - align, 0.0 0.0; + align, 0.5 0.0; fixed, 1 1; } } part { - name, PART_CHANNELINFO_LIST_NEXT; - type, SWALLOW; + name, "clip_next"; + type, RECT; description { + state, "default" 0.0; rel1 { - to_y, "padding.next_channel"; - relative, 0.0 1.0; + to, "padding.next_channel"; + relative, 0.5 1.0; } rel2 { - to_y, "padding.next_channel"; - relative, 1.0 1.0; + to, "padding.next_channel"; + relative, 0.5 1.0; } min, 536 70; - align, 0.0 0.0; + align, 0.5 0.0; fixed, 1 1; + color, 255 255 255 0; + } + description { + state, "show" 0.0; + inherit, "default" 0.0; + color, 255 255 255 255; + } + } + part { + name, PART_CHANNELINFO_LIST_NEXT; + type, SWALLOW; + clip_to, "clip_next"; + description { + state, "default" 0.0; + rel1 { + to, "clip_next"; + offset, 0 20; + } + rel2 { + to, "clip_next"; + offset, 0 20; + } + } + description { + state, "show" 0.0; + inherit, "default" 0.0; + rel1.offset, 0 0; + rel2.offset, 0 0; } } part { name, "padding.current_channel"; type, SPACER; description { + state, "default" 0.0; rel1 { - to_y, PART_CHANNELINFO_LIST_NEXT; - relative, 0.0 1.0; + to, "clip_next"; + relative, 0.5 1.0; } rel2 { - to_y, PART_CHANNELINFO_LIST_NEXT; - relative, 1.0 1.0; + to, "clip_next"; + relative, 0.5 1.0; } min, 0 32; - align, 0.0 0.0; + align, 0.5 0.0; fixed, 1 1; } } part { - name, PART_CHANNELINFO_LIST_CURRENT; - type, SWALLOW; + name, "clip_current"; + type, RECT; description { + state, "default" 0.0; rel1 { - to_y, "padding.current_channel"; - relative, 0.0 1.0; + to, "padding.current_channel"; + relative, 0.5 1.0; } rel2 { - to_y, "padding.current_channel"; - relative, 1.0 1.0; + to, "padding.current_channel"; + relative, 0.5 1.0; } min, 536 174; - align, 0.0 0.0; + align, 0.5 0.0; fixed, 1 1; + color, 255 255 255 0; + } + description { + state, "show" 0.0; + inherit, "default" 0.0; + color, 255 255 255 255; + } + } + part { + name, PART_CHANNELINFO_LIST_CURRENT; + type, SWALLOW; + clip_to, "clip_current"; + description { + state, "default" 0.0; + rel1.to, "clip_current"; + rel2.to, "clip_current"; } } part { name, "padding.prev_channel"; type, SPACER; description { + state, "default" 0.0; rel1 { - to_y, PART_CHANNELINFO_LIST_CURRENT; - relative, 0.0 1.0; + to, PART_CHANNELINFO_LIST_CURRENT; + relative, 0.5 1.0; } rel2 { - to_y, PART_CHANNELINFO_LIST_CURRENT; - relative, 1.0 1.0; + to, PART_CHANNELINFO_LIST_CURRENT; + relative, 0.5 1.0; } min, 0 32; - align, 0.0 0.0; + align, 0.5 0.0; fixed, 1 1; } } part { - name, PART_CHANNELINFO_LIST_PREV; - type, SWALLOW; + name, "clip_prev"; + type, RECT; description { + state, "default" 0.0; rel1 { - to_y, "padding.prev_channel"; - relative, 0.0 1.0; + to, "padding.prev_channel"; + relative, 0.5 1.0; } rel2 { - to_y, "padding.prev_channel"; - relative, 1.0 1.0; + to, "padding.prev_channel"; + relative, 0.5 1.0; } min, 536 70; - align, 0.0 0.0; + align, 0.5 0.0; fixed, 1 1; + color, 255 255 255 0; + } + description { + state, "show" 0.0; + inherit, "default" 0.0; + color, 255 255 255 255; + } + } + part { + name, PART_CHANNELINFO_LIST_PREV; + type, SWALLOW; + clip_to, "clip_prev"; + description { + state, "default" 0.0; + rel1 { + to, "clip_prev"; + offset, 0 -20; + } + rel2 { + to, "clip_prev"; + offset, 0 -20; + } + } + description { + state, "show" 0.0; + inherit, "default" 0.0; + rel1.offset, 0 0; + rel2.offset, 0 0; } } part { name, "padding.navigation_down"; type, SPACER; description { + state, "default" 0.0; rel1 { - to_y, PART_CHANNELINFO_LIST_PREV; - relative, 0.0 1.0; + to, "clip_prev"; + relative, 0.5 1.0; } rel2 { - to_y, PART_CHANNELINFO_LIST_PREV; - relative, 1.0 1.0; + to, "clip_prev"; + relative, 0.5 1.0; } min, 0 20; align, 0.0 0.0; @@ -199,13 +330,14 @@ group { type, IMAGE; scale, 1; description { + state, "default" 0.0; image.normal, "btn_navigation_down.png"; rel1 { - to_y, "padding.navigation_down"; + to, "padding.navigation_down"; relative, 0.5 1.0; } rel2 { - to_y, "padding.navigation_down"; + to, "padding.navigation_down"; relative, 0.5 1.0; } min, 98 34; @@ -215,6 +347,66 @@ group { } } } + programs { + program { + signal, SIGNAL_SHOW; + action, STATE_SET "show" 0.0; + target, "bg"; + after, "show_current"; + after, "show_other"; + } + program { + name, "show_current"; + action, STATE_SET "show" 0.0; + target, "clip_current"; + transition, CUBIC_BEZIER 0.334 0.45 0.03 0.41 1.0; + } + program { + name, "show_other"; + action, STATE_SET "show" 0.0; + target, "clip_next"; + target, PART_CHANNELINFO_LIST_NEXT; + target, "clip_prev"; + target, PART_CHANNELINFO_LIST_PREV; + transition, CUBIC_BEZIER 0.401 0.45 0.03 0.41 1.0; + } + program { + signal, SIGNAL_HIDE; + source, SOURCE_ELM; + action, STATE_SET "default" 0.0; + target, "bg"; + transition, CUBIC_BEZIER 0.167 0.25 0.46 0.45 1.0; + sequence { + action, STATE_SET "default" 0.0; + target, "clip_next"; + target, PART_CHANNELINFO_LIST_NEXT; + target, "clip_prev"; + target, PART_CHANNELINFO_LIST_PREV; + target, "clip_current"; + + action, SIGNAL_EMIT SIGNAL_HIDE_FINISHED SOURCE_ELM; + } + } + } +} + +group { + name, GRP_LAYOUT_CHANNELINFO_SEARCH; + parts { + part { + name, PART_CONTENT; + type, SWALLOW; + scale, 1; + description { + state, "default" 0.0; + rel1.relative, 1.0 0.0; + rel2.relative, 1.0 1.0; + min, 536 0; + align, 1.0 0.0; + fixed, 1 0; + } + } + } } group { diff --git a/include/define.h b/include/define.h index 4ff5bfd..ac98f3d 100644 --- a/include/define.h +++ b/include/define.h @@ -46,6 +46,9 @@ #define SIGNAL_NO_FAVORITE "elm,state,no_favorite" #define SIGNAL_TOGGLE "elm,state,toggle" #define SIGNAL_UNTOGGLE "elm,state,untoggle" +#define SIGNAL_SHOW "show" +#define SIGNAL_HIDE "hide" +#define SIGNAL_HIDE_FINISHED "elm,action,hide,finished" #define SIGNAL_TIMEOUT "timeout" #define FONT_REGULAR "TizenSans" @@ -95,11 +98,12 @@ #define LAYOUT_CHANNELINFO_SEARCH "LAYOUT_CHANNELINFO_SEARCH" #define GRP_VIEW_CHANNELINFO "grp.view.channelinfo" - -#define GRP_CHANNELINFO_LIST "grp.channelinfo.list" +#define GRP_LAYOUT_CHANNELINFO "grp.lavout.channelinfo.list" +#define GRP_LAYOUT_CHANNELINFO_LIST "grp.layout.channelinfo.list" #define PART_CHANNELINFO_LIST_NEXT "part.channelinfo.list.next" #define PART_CHANNELINFO_LIST_CURRENT "part.channelinfo.list.current" #define PART_CHANNELINFO_LIST_PREV "part.channelinfo.list.prev" +#define GRP_LAYOUT_CHANNELINFO_SEARCH "grp.layout.channelinfo.search" #define GRP_CHANNELINFO "grp.channelinfo" #define GRP_CHANNELINFO_SIMPLE "grp.channelinfo.simple" diff --git a/include/view.h b/include/view.h index 34abc88..db1a783 100644 --- a/include/view.h +++ b/include/view.h @@ -33,8 +33,6 @@ enum _update_op { STOP_HIDE_TIMER }; -void draw_channel_info(Evas_Object *obj, const struct tv_channel_info *channel_info); - view_class *view_channelnumber_get_vclass(void); view_class *view_channelinfo_get_vclass(void); view_class *view_error_get_vclass(void); diff --git a/src/layout_channelinfo.c b/src/layout_channelinfo.c index 3d9dec9..6226ae0 100644 --- a/src/layout_channelinfo.c +++ b/src/layout_channelinfo.c @@ -25,14 +25,22 @@ #include "view.h" #include "util.h" +static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev); + struct _priv { Evas_Object *base; Evas_Object *layout; + Evas_Object *channel; layoutmgr *lmgr; const struct tv_channel_info *channel_info; }; +static input_handler key_handler = { + .key_down = _key_down_cb, +}; + static void _update_channel_info(struct _priv *priv) { if (priv->channel_info) { @@ -47,13 +55,50 @@ static void _update_channel_info(struct _priv *priv) return; } - util_draw_channel_info(priv->layout, priv->channel_info); + util_draw_channel_info(priv->channel, priv->channel_info); +} + +static bool _draw_channel_layout(struct _priv *priv) +{ + priv->channel = elm_layout_add(priv->base); + if (!priv->channel) { + _ERR("failed to create channel layout"); + return false; + } + + elm_layout_file_set(priv->channel, EDJEFILE, GRP_CHANNELINFO); + elm_object_content_set(priv->base, priv->channel); + + return true; +} + +static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev) +{ + if (!strcmp(ev->keyname, KEY_BACK) || + !strcmp(ev->keyname, KEY_BACK_REMOTE) || + !strcmp(ev->keyname, KEY_EXIT)) { + viewmgr_hide_view(VIEW_CHANNELINFO); + } +} + +static void _hide_finished_cb(void *data, Evas_Object *obj, + const char *emission, const char *source) +{ + struct _priv *priv; + + if (!data) + return; + + priv = data; + + evas_object_hide(priv->base); } static bool _create(layoutmgr *lmgr, void *data) { struct _priv *priv; - Evas_Object *base, *layout; + Evas_Object *win; priv = calloc(1, sizeof(*priv)); if (!priv) { @@ -61,32 +106,39 @@ static bool _create(layoutmgr *lmgr, void *data) return false; } - base = layoutmgr_get_base(lmgr); + win = layoutmgr_get_base(lmgr); - layout = elm_layout_add(base); - if (!layout) { + priv->base = elm_layout_add(win); + if (!priv->base) { _ERR("failed to create layout"); free(priv); return false; } - if (!elm_layout_file_set(layout, EDJEFILE, GRP_CHANNELINFO)) - goto error; - priv->base = base; - priv->layout = layout; - priv->lmgr = lmgr; + elm_layout_file_set(priv->base, EDJEFILE, GRP_LAYOUT_CHANNELINFO); + evas_object_size_hint_weight_set(priv->base, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, priv->base); + elm_object_focus_allow_set(priv->base, EINA_TRUE); - layoutmgr_set_layout_data(lmgr, LAYOUT_CHANNELINFO, priv); + if (!_draw_channel_layout(priv)) { + _ERR("failed to create channel layout"); - return true; + evas_object_del(priv->base); + free(priv); -error: - _ERR("failed to create layout"); - evas_object_del(layout); - free(priv); + return false; + } - return false; + inputmgr_add_callback(priv->base, 0, &key_handler, priv); + elm_layout_signal_callback_add(priv->base, SIGNAL_HIDE_FINISHED, + SOURCE_ELM, _hide_finished_cb, priv); + layoutmgr_set_layout_data(lmgr, LAYOUT_CHANNELINFO, priv); + + priv->lmgr = lmgr; + + return true; } static void _destroy(void *layout_data) @@ -103,7 +155,11 @@ static void _destroy(void *layout_data) priv->channel_info = NULL; } - evas_object_del(priv->layout); + inputmgr_remove_callback(priv->base, &key_handler); + elm_layout_signal_callback_del(priv->base, SIGNAL_HIDE_FINISHED, + SOURCE_ELM, _hide_finished_cb); + + evas_object_del(priv->base); free(priv); } @@ -118,8 +174,9 @@ static void _show(void *layout_data) _update_channel_info(priv); - elm_object_content_set(priv->base, priv->layout); - evas_object_show(priv->layout); + evas_object_show(priv->base); + + elm_object_focus_set(priv->base, EINA_TRUE); } static void _hide(void *layout_data) @@ -131,8 +188,7 @@ static void _hide(void *layout_data) priv = layout_data; - evas_object_hide(priv->layout); - elm_object_content_unset(priv->base); + elm_layout_signal_emit(priv->base, SIGNAL_HIDE, SOURCE_ELM); } static void _update(void *layout_data, int update_type, void *data) diff --git a/src/layout_channelinfo_list.c b/src/layout_channelinfo_list.c index 6cb64de..760d565 100644 --- a/src/layout_channelinfo_list.c +++ b/src/layout_channelinfo_list.c @@ -25,6 +25,9 @@ #include "tv.h" #include "view.h" +static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev); + enum _order { CHANNEL_NEXT, CHANNEL_PREV @@ -32,7 +35,6 @@ enum _order { struct _priv { Evas_Object *base; - Evas_Object *layout; Evas_Object *prev_channel; Evas_Object *current_channel; Evas_Object *next_channel; @@ -41,6 +43,10 @@ struct _priv { layoutmgr *lmgr; }; +static input_handler key_handler = { + .key_down = _key_down_cb, +}; + static int _set_next_channel(struct _priv *priv, int order) { const struct tv_channel_info *next, *current, *channel; @@ -140,9 +146,61 @@ static void _update_channel_info(struct _priv *priv) tv_channel_del_list(channel_list); } +static bool _draw_channel_layout(struct _priv *priv) +{ + priv->next_channel = util_add_layout(priv->base, + GRP_CHANNELINFO_SIMPLE); + if (!priv->next_channel) + return false; + + elm_object_part_content_set(priv->base, + PART_CHANNELINFO_LIST_NEXT, priv->next_channel); + + priv->current_channel = util_add_layout(priv->base, GRP_CHANNELINFO); + if (!priv->current_channel) + return false; + + elm_object_part_content_set(priv->base, + PART_CHANNELINFO_LIST_CURRENT, priv->current_channel); + + priv->prev_channel = util_add_layout(priv->base, + GRP_CHANNELINFO_SIMPLE); + if (!priv->prev_channel) + return false; + + elm_object_part_content_set(priv->base, + PART_CHANNELINFO_LIST_PREV, priv->prev_channel); + + return true; +} + +static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev) +{ + if (!strcmp(ev->keyname, KEY_BACK) || + !strcmp(ev->keyname, KEY_BACK_REMOTE) || + !strcmp(ev->keyname, KEY_EXIT)) { + viewmgr_hide_view(VIEW_CHANNELINFO); + } +} + +static void _hide_finished_cb(void *data, Evas_Object *obj, + const char *emission, const char *source) +{ + struct _priv *priv; + + if (!data) + return; + + priv = data; + + evas_object_hide(priv->base); +} + static bool _create(layoutmgr *lmgr, void *data) { struct _priv *priv; + Evas_Object *win; priv = calloc(1, sizeof(*priv)); if (!priv) { @@ -150,57 +208,40 @@ static bool _create(layoutmgr *lmgr, void *data) return false; } - priv->base = layoutmgr_get_base(lmgr); + win = layoutmgr_get_base(lmgr); + + priv->base = elm_layout_add(win); + if (!priv->base) { + _ERR("failed to create base layout"); + free(priv); - priv->layout = elm_layout_add(priv->base); - if (!priv->layout) { - _ERR("failed to create layout"); return false; } - if (!elm_layout_file_set(priv->layout, EDJEFILE, GRP_CHANNELINFO_LIST)) - goto error; - priv->next_channel = util_add_layout(priv->layout, - GRP_CHANNELINFO_SIMPLE); - if (!priv->next_channel) - goto error; - elm_object_part_content_set(priv->layout, - PART_CHANNELINFO_LIST_NEXT, priv->next_channel); + elm_layout_file_set(priv->base, EDJEFILE, GRP_LAYOUT_CHANNELINFO_LIST); - priv->current_channel = util_add_layout(priv->layout, GRP_CHANNELINFO); - if (!priv->current_channel) - goto error; - elm_object_part_content_set(priv->layout, - PART_CHANNELINFO_LIST_CURRENT, priv->current_channel); + evas_object_size_hint_weight_set(priv->base, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, priv->base); + elm_object_focus_allow_set(priv->base, EINA_TRUE); - priv->prev_channel = util_add_layout(priv->layout, - GRP_CHANNELINFO_SIMPLE); - if (!priv->prev_channel) - goto error; - elm_object_part_content_set(priv->layout, - PART_CHANNELINFO_LIST_PREV, priv->prev_channel); - - priv->lmgr = lmgr; + if (!_draw_channel_layout(priv)) { + _ERR("failed to create channel layout"); - layoutmgr_set_layout_data(lmgr, LAYOUT_CHANNELINFO_LIST, priv); + evas_object_del(priv->base); + free(priv); - return true; - -error: - _ERR("failed to create layout"); + return false; + } - if (priv->layout) - evas_object_del(priv->layout); - if (priv->prev_channel) - evas_object_del(priv->prev_channel); - if (priv->current_channel) - evas_object_del(priv->current_channel); - if (priv->next_channel) - evas_object_del(priv->next_channel); + priv->lmgr = lmgr; + layoutmgr_set_layout_data(lmgr, LAYOUT_CHANNELINFO_LIST, priv); - free(priv); + inputmgr_add_callback(priv->base, 0, &key_handler, priv); + elm_layout_signal_callback_add(priv->base, SIGNAL_HIDE_FINISHED, + SOURCE_ELM, _hide_finished_cb, priv); - return false; + return true; } static void _destroy(void *layout_data) @@ -215,7 +256,11 @@ static void _destroy(void *layout_data) if (priv->channel_info) tv_channel_del_info(priv->channel_info); - evas_object_del(priv->layout); + inputmgr_remove_callback(priv->base, &key_handler); + elm_layout_signal_callback_del(priv->base, SIGNAL_HIDE_FINISHED, + SOURCE_ELM, _hide_finished_cb); + + evas_object_del(priv->base); free(priv); } @@ -228,8 +273,9 @@ static void _show(void *layout_data) priv = layout_data; - elm_object_content_set(priv->base, priv->layout); - evas_object_show(priv->layout); + evas_object_show(priv->base); + + elm_object_focus_set(priv->base, EINA_TRUE); } static void _hide(void *layout_data) @@ -246,8 +292,7 @@ static void _hide(void *layout_data) priv->channel_info = NULL; } - evas_object_hide(priv->layout); - elm_object_content_unset(priv->base); + elm_layout_signal_emit(priv->base, SIGNAL_HIDE, SOURCE_ELM); } static void _update(void *layout_data, int type, void *data) diff --git a/src/layout_channelinfo_search.c b/src/layout_channelinfo_search.c index 6aaa01e..4267b7f 100644 --- a/src/layout_channelinfo_search.c +++ b/src/layout_channelinfo_search.c @@ -27,10 +27,10 @@ #define DIVIDER_WIDTH 536 #define DIVIDER_HEIGHT 1 -#define DIVIDER_COLOR_R 0 -#define DIVIDER_COLOR_G 0 -#define DIVIDER_COLOR_B 0 -#define DIVIDER_COLOR_A (255 * 0.1) +#define DIVIDER_COLOR_R 154 +#define DIVIDER_COLOR_G 154 +#define DIVIDER_COLOR_B 154 +#define DIVIDER_COLOR_A 255 struct _priv { Evas_Object *base; @@ -66,9 +66,23 @@ static void _tune_channel(void *data) static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { + int op; + if (!strcmp(ev->keyname, KEY_ENTER) || - !strcmp(ev->keyname, KEY_ENTER_REMOTE)) + !strcmp(ev->keyname, KEY_ENTER_REMOTE)) { + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + _tune_channel(data); + } else if (!strcmp(ev->keyname, KEY_BACK) || + !strcmp(ev->keyname, KEY_BACK_REMOTE) || + !strcmp(ev->keyname, KEY_EXIT)) { + viewmgr_hide_view(VIEW_CHANNELINFO); + } else if (!strcmp(ev->keyname, KEY_UP) || + !strcmp(ev->keyname, KEY_DOWN)) { + op = START_HIDE_TIMER; + viewmgr_update_view(VIEW_CHANNELINFO, + UPDATE_TYPE_TIMER, &op); + } } static void _mouse_down_cb(int id, void *data, Evas *e, Evas_Object *obj, @@ -77,9 +91,20 @@ static void _mouse_down_cb(int id, void *data, Evas *e, Evas_Object *obj, _tune_channel(data); } +static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Mouse_Move *ev) +{ + int op; + + op = START_HIDE_TIMER; + viewmgr_update_view(VIEW_CHANNELINFO, + UPDATE_TYPE_TIMER, &op); +} + static input_handler channel_handler = { .key_down = _key_down_cb, .mouse_down = _mouse_down_cb, + .mouse_move = _mouse_move_cb, }; static void _release_channel_handler(Evas_Object *obj) @@ -156,6 +181,26 @@ static void _load_channel_list(struct _priv *priv, Eina_List *channel_list) } } +static bool _draw_channel_layout(struct _priv *priv) +{ + priv->scroll = util_add_scroller(priv->base, NULL); + if (!priv->scroll) { + _ERR("failed to create scroll"); + return false; + } + + priv->box = util_add_box(priv->scroll, false); + if (!priv->box) { + _ERR("failed to create box"); + evas_object_del(priv->scroll); + + return false; + } + elm_box_align_set(priv->box, 0.0, 0.5); + + return true; +} + static void _update_channel_list(struct _priv *priv) { Eina_List *channel_list; @@ -179,6 +224,7 @@ static void _update_channel_list(struct _priv *priv) static bool _create(layoutmgr *lmgr, void *data) { struct _priv *priv; + Evas_Object *win; priv = calloc(1, sizeof(*priv)); if (!priv) { @@ -186,35 +232,35 @@ static bool _create(layoutmgr *lmgr, void *data) return false; } - priv->base = layoutmgr_get_base(lmgr); + win = layoutmgr_get_base(lmgr); - priv->scroll = elm_scroller_add(priv->base); - if (!priv->scroll) { - _ERR("failed to create scroll"); - goto error; + priv->base = elm_layout_add(win); + if (!priv->base) { + _ERR("failed to create layout"); + free(priv); + + return false; } - evas_object_size_hint_weight_set(priv->scroll, + + elm_layout_file_set(priv->base, EDJEFILE, + GRP_LAYOUT_CHANNELINFO_SEARCH); + evas_object_size_hint_weight_set(priv->base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, priv->base); - priv->box = util_add_box(priv->scroll, false); - if (!priv->box) { - _ERR("failed to create box"); - goto error; + if (!_draw_channel_layout(priv)) { + _ERR("failed to create channel layout"); + + evas_object_del(priv->base); + free(priv); + + return false; } - elm_box_align_set(priv->box, 0.0, 0.5); priv->lmgr = lmgr; - layoutmgr_set_layout_data(lmgr, LAYOUT_CHANNELINFO_SEARCH, priv); return true; - -error: - evas_object_del(priv->scroll); - evas_object_del(priv->box); - free(priv); - - return false; } static void _destroy(void *layout_data) @@ -226,7 +272,9 @@ static void _destroy(void *layout_data) priv = layout_data; - evas_object_del(priv->scroll); + _release_channel_handler(priv->box); + + evas_object_del(priv->base); free(priv); } @@ -241,8 +289,7 @@ static void _show(void *layout_data) _update_channel_list(priv); - elm_object_content_set(priv->base, priv->scroll); - evas_object_show(priv->scroll); + evas_object_show(priv->base); } static void _hide(void *layout_data) @@ -254,8 +301,7 @@ static void _hide(void *layout_data) priv = layout_data; - elm_object_content_unset(priv->base); - evas_object_hide(priv->scroll); + evas_object_hide(priv->base); } static void _update(void *layout_data, int update_type, void *data) diff --git a/src/util.c b/src/util.c index 041d77b..272c63e 100644 --- a/src/util.c +++ b/src/util.c @@ -94,8 +94,7 @@ Evas_Object *util_add_scroller(Evas_Object *parent, const char *part) elm_scroller_policy_set(scroll, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); - if (part) - elm_object_part_content_set(parent, part, scroll); + elm_object_part_content_set(parent, part, scroll); evas_object_show(scroll); diff --git a/src/view_channelinfo.c b/src/view_channelinfo.c index 6a44cbf..20d40c4 100644 --- a/src/view_channelinfo.c +++ b/src/view_channelinfo.c @@ -60,48 +60,6 @@ static void _set_current_layout(struct _priv *priv, const char *layout_id) priv->current_layout = layout_id; } -static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, - Evas_Event_Key_Down *ev) -{ - struct _priv *priv; - int op; - - if (!data) { - _ERR("failed to get data"); - return; - } - - priv = data; - - if (!strcmp(ev->keyname, KEY_ENTER) || - !strcmp(ev->keyname, KEY_ENTER_REMOTE)) { - _set_current_layout(priv, LAYOUT_CHANNELINFO_SEARCH); - } else if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE) || - !strcmp(ev->keyname, KEY_EXIT)) { - viewmgr_hide_view(VIEW_CHANNELINFO); - } else { - op = START_HIDE_TIMER; - viewmgr_update_view(VIEW_CHANNELINFO, - UPDATE_TYPE_TIMER, &op); - } -} - -static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, - Evas_Event_Mouse_Move *ev) -{ - int op; - - op = START_HIDE_TIMER; - viewmgr_update_view(VIEW_CHANNELINFO, - UPDATE_TYPE_TIMER, &op); -} - -static input_handler key_handler = { - .key_down = _key_down_cb, - .mouse_move = _mouse_move_cb, -}; - static Eina_Bool _hide_timer(void *data) { struct _priv *priv; @@ -149,20 +107,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) return NULL; } - priv->base = elm_layout_add(win); - if (!priv->base) { - _ERR("failed to create base object"); - free(priv); - return NULL; - } - elm_layout_file_set(priv->base, EDJEFILE, GRP_VIEW_CHANNELINFO); - elm_object_focus_allow_set(priv->base, EINA_TRUE); - - evas_object_size_hint_weight_set(priv->base, - EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_win_resize_object_add(win, priv->base); - - priv->lmgr = layoutmgr_create(priv->base); + priv->lmgr = layoutmgr_create(win); layoutmgr_add_layout(priv->lmgr, layout_channelinfo_get_lclass(), NULL); layoutmgr_add_layout(priv->lmgr, layout_channelinfo_list_get_lclass(), NULL); @@ -171,9 +116,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) viewmgr_set_view_data(VIEW_CHANNELINFO, priv); - inputmgr_add_callback(priv->base, 0, &key_handler, priv); - - return priv->base; + return win; } static void _show(void *view_data) @@ -187,9 +130,6 @@ static void _show(void *view_data) priv = view_data; - evas_object_show(priv->base); - elm_object_focus_set(priv->base, EINA_TRUE); - if (!priv->current_layout) _set_current_layout(priv, LAYOUT_CHANNELINFO); } @@ -206,8 +146,6 @@ static void _hide(void *view_data) priv = view_data; _hide_current_layout(priv); - - evas_object_hide(priv->base); } static void _destroy(void *view_data) @@ -226,10 +164,6 @@ static void _destroy(void *view_data) layoutmgr_remove_layout(priv->lmgr, LAYOUT_CHANNELINFO_SEARCH); layoutmgr_destroy(priv->lmgr); - inputmgr_remove_callback(priv->base, &key_handler); - - evas_object_del(priv->base); - free(priv); } -- 2.7.4 From a1334e19feac5e2c29323e84625d33b47257cd59 Mon Sep 17 00:00:00 2001 From: "jinwoo.shin" Date: Wed, 16 Sep 2015 13:54:21 +0900 Subject: [PATCH 08/16] Add action menu show/hide animation Change-Id: I15c3de46050f0635811b89ccc51d0934459f6a1a Signed-off-by: jinwoo.shin --- data/view/action_menu.edc | 25 ++++++++++++++++++++++++- data/view/channelinfo.edc | 10 +++++----- include/define.h | 3 +++ src/view_action_menu.c | 17 ++++++++++++++++- 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/data/view/action_menu.edc b/data/view/action_menu.edc index 1905e50..5d02e59 100644 --- a/data/view/action_menu.edc +++ b/data/view/action_menu.edc @@ -35,9 +35,14 @@ group { color, 255 255 255 255; rel1.relative, 1.0 0.0; min, 500 0; - align, 1.0 0.0; + align, 0.0 0.0; fixed, 1 1; } + description { + state, "show" 0.0; + inherit, "default" 0.0; + align, 1.0 0.0; + } } part { @@ -367,6 +372,24 @@ group { programs { program { + signal, SIGNAL_SHOW; + action, STATE_SET "show" 0.0; + target, "menu_area"; + transition, CUBIC_BEZIER 0.667 TRANSITION_EASE_IN_OUT; + } + program { + signal, SIGNAL_HIDE; + source, SOURCE_ELM; + action, STATE_SET "default" 0.0; + target, "menu_area"; + transition, CUBIC_BEZIER 0.334 TRANSITION_EASE_OUT; + after, "hide_finished"; + } + program { + name, "hide_finished"; + action, SIGNAL_EMIT SIGNAL_HIDE_FINISHED SOURCE_ELM; + } + program { name, "no_favorite"; signal, SIGNAL_NO_FAVORITE; source, SOURCE_ELM; diff --git a/data/view/channelinfo.edc b/data/view/channelinfo.edc index 8b7ece3..f9ce6a8 100644 --- a/data/view/channelinfo.edc +++ b/data/view/channelinfo.edc @@ -64,14 +64,14 @@ group { signal, SIGNAL_SHOW; action, STATE_SET "show" 0.0; target, PART_CONTENT; - transition, CUBIC_BEZIER 0.5 0.45 0.03 0.41 1.0; + transition, CUBIC_BEZIER 0.5 TRANSITION_EASE_IN_OUT; } program { signal, SIGNAL_HIDE; source, SOURCE_ELM; action, STATE_SET "default" 0.0; target, PART_CONTENT; - transition, CUBIC_BEZIER 0.167 0.25 0.46 0.45 1.0; + transition, CUBIC_BEZIER 0.167 TRANSITION_EASE_OUT; after, "hide_finished"; } program { @@ -359,7 +359,7 @@ group { name, "show_current"; action, STATE_SET "show" 0.0; target, "clip_current"; - transition, CUBIC_BEZIER 0.334 0.45 0.03 0.41 1.0; + transition, CUBIC_BEZIER 0.334 TRANSITION_EASE_IN_OUT; } program { name, "show_other"; @@ -368,14 +368,14 @@ group { target, PART_CHANNELINFO_LIST_NEXT; target, "clip_prev"; target, PART_CHANNELINFO_LIST_PREV; - transition, CUBIC_BEZIER 0.401 0.45 0.03 0.41 1.0; + transition, CUBIC_BEZIER 0.401 TRANSITION_EASE_IN_OUT; } program { signal, SIGNAL_HIDE; source, SOURCE_ELM; action, STATE_SET "default" 0.0; target, "bg"; - transition, CUBIC_BEZIER 0.167 0.25 0.46 0.45 1.0; + transition, CUBIC_BEZIER 0.167 TRANSITION_EASE_OUT; sequence { action, STATE_SET "default" 0.0; target, "clip_next"; diff --git a/include/define.h b/include/define.h index ac98f3d..b919392 100644 --- a/include/define.h +++ b/include/define.h @@ -66,6 +66,9 @@ #define COLOR_NOFAVORITE_BG 229 229 229 255 #define COLOR_NOFAVORITE_TEXT 0 0 0 178 +#define TRANSITION_EASE_IN_OUT 0.45 0.03 0.41 1.0 +#define TRANSITION_EASE_OUT 0.25 0.46 0.45 1.0 + #define IMAGE_FAV_NOR IMAGEDIR"/btn_menu_favorite_nor.png" #define IMAGE_FAV_FOC IMAGEDIR"/btn_menu_favorite_foc.png" #define IMAGE_FAV_SEL IMAGEDIR"/btn_menu_favorite_sel.png" diff --git a/src/view_action_menu.c b/src/view_action_menu.c index 6c21921..119708b 100644 --- a/src/view_action_menu.c +++ b/src/view_action_menu.c @@ -605,6 +605,19 @@ static void _draw_view_content(struct _priv *priv) _ERR("Draw bottom area failed."); } +static void _hide_finished_cb(void *data, Evas_Object *obj, + const char *emission, const char *source) +{ + struct _priv *priv; + + if (!data) + return; + + priv = data; + + evas_object_hide(priv->base); +} + static Evas_Object *_create(Evas_Object *win, void *data) { struct _priv *priv; @@ -645,6 +658,8 @@ static Evas_Object *_create(Evas_Object *win, void *data) _draw_view_content(priv); inputmgr_add_callback(priv->base, 0, &key_handler, priv); + elm_layout_signal_callback_add(priv->base, SIGNAL_HIDE_FINISHED, + SOURCE_ELM, _hide_finished_cb, priv); return base; } @@ -678,7 +693,7 @@ static void _hide(void *data) } priv = data; - evas_object_hide(priv->base); + elm_layout_signal_emit(priv->base, SIGNAL_HIDE, SOURCE_ELM); } static void _destroy(void *data) -- 2.7.4 From 8bbcaa610b7952edf0f3058b0099d874c1cd71b9 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 16 Sep 2015 14:25:04 +0900 Subject: [PATCH 09/16] modify key values as key_define Change-Id: If3e317a0ff95d5acb98176afdb94cca4d2e704ec Signed-off-by: Minkyu Kang --- src/layout_channelinfo.c | 5 ++--- src/layout_channelinfo_list.c | 12 ++++-------- src/layout_channelinfo_search.c | 5 ++--- src/main.c | 8 ++++---- src/view_action_menu.c | 9 +++------ src/view_channelinfo.c | 11 +++-------- src/view_channelnumber.c | 6 ++---- 7 files changed, 20 insertions(+), 36 deletions(-) diff --git a/src/layout_channelinfo.c b/src/layout_channelinfo.c index 6226ae0..1f28e94 100644 --- a/src/layout_channelinfo.c +++ b/src/layout_channelinfo.c @@ -76,10 +76,9 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE) || - !strcmp(ev->keyname, KEY_EXIT)) { + !strcmp(ev->keyname, KEY_ESC) || + !strcmp(ev->keyname, KEY_EXIT)) viewmgr_hide_view(VIEW_CHANNELINFO); - } } static void _hide_finished_cb(void *data, Evas_Object *obj, diff --git a/src/layout_channelinfo_list.c b/src/layout_channelinfo_list.c index 760d565..d64743c 100644 --- a/src/layout_channelinfo_list.c +++ b/src/layout_channelinfo_list.c @@ -178,7 +178,7 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE) || + !strcmp(ev->keyname, KEY_ESC) || !strcmp(ev->keyname, KEY_EXIT)) { viewmgr_hide_view(VIEW_CHANNELINFO); } @@ -315,15 +315,13 @@ static void _update(void *layout_data, int type, void *data) return; } - if (!strcmp(ev->keyname, KEY_CHANNELUP) || - !strcmp(ev->keyname, KEY_CHANNELUP_REMOTE)) { + if (!strcmp(ev->keyname, KEY_CHANNELUP)) { r = _set_next_channel(priv, CHANNEL_NEXT); if (r < 0) _ERR("failed to set next channel"); else _update_channel_info(priv); - } else if (!strcmp(ev->keyname, KEY_CHANNELDOWN) || - !strcmp(ev->keyname, KEY_CHANNELDOWN_REMOTE)) { + } else if (!strcmp(ev->keyname, KEY_CHANNELDOWN)) { r = _set_next_channel(priv, CHANNEL_PREV); if (r < 0) _ERR("failed to set prev channel"); @@ -339,9 +337,7 @@ static void _update(void *layout_data, int type, void *data) } if (!strcmp(ev->keyname, KEY_CHANNELUP) || - !strcmp(ev->keyname, KEY_CHANNELUP_REMOTE) || - !strcmp(ev->keyname, KEY_CHANNELDOWN) || - !strcmp(ev->keyname, KEY_CHANNELDOWN_REMOTE)) { + !strcmp(ev->keyname, KEY_CHANNELDOWN)) { if (!priv->channel_info) { _ERR("failed to get channel info"); return; diff --git a/src/layout_channelinfo_search.c b/src/layout_channelinfo_search.c index 4267b7f..bd89866 100644 --- a/src/layout_channelinfo_search.c +++ b/src/layout_channelinfo_search.c @@ -68,13 +68,12 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, { int op; - if (!strcmp(ev->keyname, KEY_ENTER) || - !strcmp(ev->keyname, KEY_ENTER_REMOTE)) { + if (!strcmp(ev->keyname, KEY_ENTER)) { ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; _tune_channel(data); } else if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE) || + !strcmp(ev->keyname, KEY_ESC) || !strcmp(ev->keyname, KEY_EXIT)) { viewmgr_hide_view(VIEW_CHANNELINFO); } else if (!strcmp(ev->keyname, KEY_UP) || diff --git a/src/main.c b/src/main.c index 4c74363..f73507d 100644 --- a/src/main.c +++ b/src/main.c @@ -56,9 +56,9 @@ static struct key_map g_kmap[] = { { VIEW_CHANNELINFO, { - KEY_ENTER, KEY_ENTER_REMOTE, - KEY_CHANNELUP, KEY_CHANNELUP_REMOTE, - KEY_CHANNELDOWN, KEY_CHANNELDOWN_REMOTE + KEY_ENTER, + KEY_CHANNELUP, + KEY_CHANNELDOWN } }, { @@ -72,7 +72,7 @@ static struct key_map g_kmap[] = { { VIEW_ACTION_MENU, { - KEY_MENU, KEY_MENU_REMOTE + KEY_MENU, KEY_CONTEXT_MENU } }, }; diff --git a/src/view_action_menu.c b/src/view_action_menu.c index 6c21921..a7d56b7 100644 --- a/src/view_action_menu.c +++ b/src/view_action_menu.c @@ -276,7 +276,7 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE)) + !strcmp(ev->keyname, KEY_ESC)) viewmgr_hide_view(VIEW_ACTION_MENU); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; @@ -332,11 +332,8 @@ static void _button_clicked(Evas_Object *obj, int id, void *data) static void _button_key_up_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev) { - if (strcmp(ev->keyname, KEY_ENTER) && - strcmp(ev->keyname, KEY_ENTER_REMOTE)) - return; - - _button_clicked(obj, id, data); + if (!strcmp(ev->keyname, KEY_ENTER)) + _button_clicked(obj, id, data); } static void _button_mouse_up_cb(int id, void *data, Evas *e, diff --git a/src/view_channelinfo.c b/src/view_channelinfo.c index 20d40c4..610e5a3 100644 --- a/src/view_channelinfo.c +++ b/src/view_channelinfo.c @@ -195,17 +195,14 @@ static void _update(void *view_data, int type, void *data) return; } - if (!strcmp(ev->keyname, KEY_ENTER) || - !strcmp(ev->keyname, KEY_ENTER_REMOTE)) { + if (!strcmp(ev->keyname, KEY_ENTER)) { if (!priv->current_layout) _set_current_layout(priv, LAYOUT_CHANNELINFO); else _set_current_layout(priv, LAYOUT_CHANNELINFO_SEARCH); } else if (!strcmp(ev->keyname, KEY_CHANNELUP) || - !strcmp(ev->keyname, KEY_CHANNELUP_REMOTE) || - !strcmp(ev->keyname, KEY_CHANNELDOWN) || - !strcmp(ev->keyname, KEY_CHANNELDOWN_REMOTE)) { + !strcmp(ev->keyname, KEY_CHANNELDOWN)) { if (priv->current_layout && !strcmp(priv->current_layout, LAYOUT_CHANNELINFO_SEARCH)) @@ -226,9 +223,7 @@ static void _update(void *view_data, int type, void *data) } if (!strcmp(ev->keyname, KEY_CHANNELUP) || - !strcmp(ev->keyname, KEY_CHANNELUP_REMOTE) || - !strcmp(ev->keyname, KEY_CHANNELDOWN) || - !strcmp(ev->keyname, KEY_CHANNELDOWN_REMOTE)) { + !strcmp(ev->keyname, KEY_CHANNELDOWN)) { if (priv->current_layout && !strcmp(priv->current_layout, LAYOUT_CHANNELINFO_SEARCH)) diff --git a/src/view_channelnumber.c b/src/view_channelnumber.c index bf1ce0c..44971cd 100644 --- a/src/view_channelnumber.c +++ b/src/view_channelnumber.c @@ -43,9 +43,8 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE)) { + !strcmp(ev->keyname, KEY_ESC)) viewmgr_hide_view(VIEW_CHANNELNUMBER); - } } static input_handler key_handler = { @@ -113,8 +112,7 @@ static void _tune_channel(void *data) static void _channel_key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { - if (!strcmp(ev->keyname, KEY_ENTER) || - !strcmp(ev->keyname, KEY_ENTER_REMOTE)) { + if (!strcmp(ev->keyname, KEY_ENTER)) { ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; _tune_channel(data); -- 2.7.4 From 102671981c31d0e8f0a3c2da34395e40e7df9e4e Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 17 Sep 2015 08:37:16 +0900 Subject: [PATCH 10/16] version update: m1 Change-Id: I563f7b157ebc13ca62a7a40c42af043f206de26c Signed-off-by: Minkyu Kang --- packaging/org.tizen.live-tv.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/org.tizen.live-tv.spec b/packaging/org.tizen.live-tv.spec index 256fda5..101d908 100644 --- a/packaging/org.tizen.live-tv.spec +++ b/packaging/org.tizen.live-tv.spec @@ -1,6 +1,6 @@ Name: org.tizen.live-tv Summary: Live TV application for Tizen TV -Version: 0.1 +Version: 0.2 Release: 1 Group: Applications License: Apache-2.0 -- 2.7.4 From 730ebf24ebca441310443f6dfe7541bfedb663f3 Mon Sep 17 00:00:00 2001 From: "jinwoo.shin" Date: Fri, 18 Sep 2015 18:06:07 +0900 Subject: [PATCH 11/16] Update action menu layout - Supports action menu scrolling - Added more button on the bottom Change-Id: Ie91f1ca23802575b9ba1bbd3a58b7763faeda82d Signed-off-by: jinwoo.shin --- data/view/action_menu.edc | 276 ++++++++++++++++++++++------------------------ include/define.h | 7 +- include/strings.h | 1 + src/view_action_menu.c | 188 ++++++++++++++++++------------- 4 files changed, 250 insertions(+), 222 deletions(-) diff --git a/data/view/action_menu.edc b/data/view/action_menu.edc index 5d02e59..ff4b944 100644 --- a/data/view/action_menu.edc +++ b/data/view/action_menu.edc @@ -27,16 +27,27 @@ group { } } part { - name, "menu_area"; + name, "menu_bg"; type, RECT; scale, 1; description { state, "default" 0.0; color, 255 255 255 255; + rel1.to, PART_CONTENT; + rel2.to, PART_CONTENT; + } + } + + part { + name, PART_CONTENT; + type, SWALLOW; + scale, 1; + description { + state, "default" 0.0; rel1.relative, 1.0 0.0; min, 500 0; align, 0.0 0.0; - fixed, 1 1; + fixed, 1 0; } description { state, "show" 0.0; @@ -52,9 +63,9 @@ group { description { state, "default" 0.0; color, 0 0 0 25; - rel1.to, "menu_area"; + rel1.to, PART_CONTENT; rel2 { - to, "menu_area"; + to, PART_CONTENT; relative, 0.0 1.0; } min, 1 0; @@ -64,17 +75,82 @@ group { } part { - name, "padding.livetv.btn"; + name, "padding.channelinfo"; type, SPACER; scale, 1; description { state, "default" 0.0; - rel1.to, "menu_area"; + rel1.relative, 0.0 0.0; + rel2.relative, 0.0 0.0; + min, 40 40; + align, 0.0 0.0; + fixed, 1 1; + } + } + + part { + name, PART_CHANNELINFO; + type, SWALLOW; + scale, 1; + description { + state, "default" 0.0; + rel1 { + to, "padding.channelinfo"; + relative, 1.0 1.0; + } rel2 { - to, "menu_area"; - relative, 1.0 0.0; + to, "padding.channelinfo"; + relative, 1.0 1.0; } - min, 0 118; + min, 536 174; + align, 0.0 0.0; + fixed, 1 1; + } + } + + } + programs { + program { + signal, SIGNAL_SHOW; + action, STATE_SET "show" 0.0; + target, PART_CONTENT; + transition, CUBIC_BEZIER 0.667 TRANSITION_EASE_IN_OUT; + } + program { + signal, SIGNAL_HIDE; + source, SOURCE_ELM; + action, STATE_SET "default" 0.0; + target, PART_CONTENT; + transition, CUBIC_BEZIER 0.334 TRANSITION_EASE_OUT; + after, "hide_finished"; + } + program { + name, "hide_finished"; + action, SIGNAL_EMIT SIGNAL_HIDE_FINISHED SOURCE_ELM; + } + } +} + +group { + name, GRP_ACTION_MENU_TOP; + parts { + part { + name, "area"; + type, SPACER; + scale, 1; + description { + state, "default" 0.0; + min, 500 346; + } + } + part { + name, "padding.livetv.btn"; + type, SPACER; + scale, 1; + description { + state, "default" 0.0; + rel2.relative, 1.0 0.0; + min, 0 120; align, 0.5 0.0; fixed, 0 1; } @@ -113,7 +189,7 @@ group { } rel2.to, "padding.livetv.btn"; min, 0 1; - align, 0.5 1.0; + align, 0.0 1.0; fixed, 0 1; } } @@ -124,16 +200,9 @@ group { scale, 1; description { state, "default" 0.0; - rel1 { - to, PART_MENU; - relative, 0.0 0.0; - } - rel2 { - to, PART_MENU; - relative, 1.0 1.0; - } + rel1.to, PART_MENU; + rel2.to, PART_MENU; align, 0.0 0.0; - fixed, 1 1; color, 224 224 224 255; } } @@ -146,14 +215,14 @@ group { state, "default" 0.0; rel1 { to, "padding.menu.divider.up"; - relative, 0.0 1.0; + relative, 0.5 1.0; } rel2 { to, "padding.menu.divider.up"; - relative, 0.0 1.0; + relative, 0.5 1.0; } - min, 500 0; - align, 0.0 0.0; + min, 500 126; + align, 0.5 0.0; fixed, 1 1; } } @@ -245,165 +314,80 @@ group { fixed, 1 1; } } + } +} +group { + name, GRP_ACTION_MENU_BOTTOM; + parts { part { - name, PART_FAVORITE; - type, SWALLOW; + name, "padding.more.btn"; + type, SPACER; scale, 1; description { state, "default" 0.0; - rel1 { - to, "padding.favorite.list"; - relative, 0.5 1.0; - } - rel2 { - to, "padding.favorite.list"; - relative, 0.5 1.0; - } - min, 440 0; - align, 0.5 0.0; - fixed, 1 1; + rel1.relative, 0.0 0.0; + rel2.relative, 1.0 0.0; + min, 0 116; + align, 0.0 0.0; + fixed, 1 0; } } part { - name, "padding.favorite.list_bottom"; - type, SPACER; + name, PART_MORE_BUTTON; + type, SWALLOW; scale, 1; description { state, "default" 0.0; rel1 { - to, "menu_area"; - relative, 0.0 1.0; + to, "padding.more.btn"; + relative, 0.5 0.5; } rel2 { - to, "menu_area"; - relative, 1.0 1.0; + to, "padding.more.btn"; + relative, 0.5 0.5; } - min, 0 32; - align, 0.0 1.0; + min, 184 60; + align, 0.5 0.5; fixed, 1 1; } } + } +} +group { + name, GRP_ACTION_MENU_NO_FAVORITE; + parts { part { name, "part.favorite.no_favorite"; type, RECT; scale, 1; description { state, "default" 0.0; - rel1 { - to, "padding.favorite.list"; - relative, 0.5 1.0; - } - rel2 { - to, "padding.favorite.list_bottom"; - relative, 0.5 0.0; - } - min, 440 0; + rel1.relative, 0.5 0.0; + rel2.relative, 0.5 0.0; + min, 440 616; align, 0.5 0.0; - fixed, 1 1; color, COLOR_NOFAVORITE_BG; - visible, 0; - } - description { - state, "no_favorite" 0.0; - inherit, "default" 0.0; - visible, 1; - } - - part { - name, "part.favorite.no_favorite.text"; - type, TEXT; - scale, 1; - description { - state, "default" 0.0; - text { - font, FONT_LIGHT; - size, 28; - align, 0.5 0.5; - text, STR_NOFAVORITE; - } - color, COLOR_NOFAVORITE_TEXT; - visible, 0; - } - description { - state, "no_favorite" 0.0; - inherit, "default" 0.0; - visible, 1; - } } } - part { - name, "padding.channelinfo"; - type, SPACER; - scale, 1; - description { - state, "default" 0.0; - rel1.relative, 0.0 0.0; - rel2.relative, 0.0 0.0; - min, 40 40; - align, 0.0 0.0; - fixed, 1 1; - } - } - - part { - name, PART_CHANNELINFO; - type, SWALLOW; + name, "part.favorite.no_favorite.text"; + type, TEXT; scale, 1; description { state, "default" 0.0; - rel1 { - to, "padding.channelinfo"; - relative, 1.0 1.0; - } - rel2 { - to, "padding.channelinfo"; - relative, 1.0 1.0; + rel1.to, "part.favorite.no_favorite"; + rel2.to, "part.favorite.no_favorite"; + text { + font, FONT_LIGHT; + size, 28; + align, 0.5 0.5; + text, STR_NOFAVORITE; } - min, 536 174; - align, 0.0 0.0; - fixed, 1 1; + color, COLOR_NOFAVORITE_TEXT; } } } - - programs { - program { - signal, SIGNAL_SHOW; - action, STATE_SET "show" 0.0; - target, "menu_area"; - transition, CUBIC_BEZIER 0.667 TRANSITION_EASE_IN_OUT; - } - program { - signal, SIGNAL_HIDE; - source, SOURCE_ELM; - action, STATE_SET "default" 0.0; - target, "menu_area"; - transition, CUBIC_BEZIER 0.334 TRANSITION_EASE_OUT; - after, "hide_finished"; - } - program { - name, "hide_finished"; - action, SIGNAL_EMIT SIGNAL_HIDE_FINISHED SOURCE_ELM; - } - program { - name, "no_favorite"; - signal, SIGNAL_NO_FAVORITE; - source, SOURCE_ELM; - action, STATE_SET "no_favorite" 0.0; - target, "part.favorite.no_favorite"; - target, "part.favorite.no_favorite.text"; - } - program { - name, "favorite"; - signal, SIGNAL_FAVORITE; - action, STATE_SET "default" 0.0; - source, SOURCE_ELM; - target, "part.favorite.no_favorite"; - target, "part.favorite.no_favorite.text"; - } - } } diff --git a/include/define.h b/include/define.h index b919392..369ce08 100644 --- a/include/define.h +++ b/include/define.h @@ -130,10 +130,13 @@ #define VIEW_ACTION_MENU "VIEW_ACTION_MENU" #define GRP_VIEW_ACTION_MENU "grp.view.action_menu" +#define PART_CHANNELINFO "part.channelinfo" +#define GRP_ACTION_MENU_TOP "grp.action_menu_top" #define PART_TOP_BUTTON "part.top.button" #define PART_MENU "part.menu" -#define PART_FAVORITE "part.favorite" -#define PART_CHANNELINFO "part.channelinfo" +#define GRP_ACTION_MENU_BOTTOM "grp.action_menu_bottom" +#define PART_MORE_BUTTON "part.more.button" +#define GRP_ACTION_MENU_NO_FAVORITE "grp.action_menu_no_favorite" #define VIEW_PIN "VIEW_PIN" #define MESSAGE_SUCCESS "success" diff --git a/include/strings.h b/include/strings.h index d21f511..21aba70 100644 --- a/include/strings.h +++ b/include/strings.h @@ -25,6 +25,7 @@ #define STR_NOSIGNAL_TITLE "Weak or No Signal" #define STR_NOSIGNAL_TEXT "Check the antenna cable connection" #define STR_LIVETV "Live TV" +#define STR_BUTTON_MORE "More" #define STR_BUTTON_FAVORITE "Favorite" #define STR_BUTTON_LOCK "Lock" #define STR_BUTTON_UNLOCK "Unlock" diff --git a/src/view_action_menu.c b/src/view_action_menu.c index a116748..10362f1 100644 --- a/src/view_action_menu.c +++ b/src/view_action_menu.c @@ -28,6 +28,10 @@ #define BUTTON_BORDER 1 #define ITEMS_IN_ROW 4 #define FAVORITE_PADDING_Y 32 +#define FAVORITE_MAX 10 +#define SCROLLER_STEP_SIZE 334 + +#define TAG_FAVORITE "TAG_FAVORITE" #define STYLE_LIVETV_BTN "style.livetv.button" #define STYLE_ACTION_MENU_BTN "style.action.menu.button" @@ -39,6 +43,7 @@ enum _button_id { BUTTON_INVALID = -1, BUTTON_LIVETV, + BUTTON_MORE, BUTTON_FAV, BUTTON_LOCK, BUTTON_CHANNEL, @@ -54,6 +59,9 @@ enum _button_state { struct _priv { Evas_Object *win; Evas_Object *base; + Evas_Object *scroller; + Evas_Object *box; + Evas_Object *menu; Evas_Object *channel_info; Evas_Object *menu_btn[BUTTON_MAX]; Evas_Object *favorite; @@ -355,7 +363,7 @@ static void _button_mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, static input_handler button_handler = { .key_up = _button_key_up_cb, .mouse_up = _button_mouse_up_cb, - .mouse_move = _button_mouse_move_cb + .mouse_move = _button_mouse_move_cb, }; static void _favorite_clicked_cb(int id, void *data, Evas_Object *obj) @@ -389,26 +397,28 @@ static void _update_favorite(struct _priv *priv) { Eina_List *channel_list, *l; const struct tv_channel_info *channel_info; - Evas_Object *btn, *obj; + Evas_Object *btn, *no_favorite; char buf[BUF_MAX]; int i; channel_list = tv_channel_get_favorite_list(); - i = 0; - while ((obj = elm_table_child_get(priv->favorite, 0, i++))) - inputmgr_remove_callback(obj, &favorite_handler); - - elm_table_clear(priv->favorite, EINA_TRUE); + inputmgr_remove_all_by_tag(TAG_FAVORITE); + elm_box_clear(priv->favorite); if (!channel_list) { - elm_object_signal_emit(priv->base, - SIGNAL_NO_FAVORITE, SOURCE_ELM); + no_favorite = util_add_layout(priv->favorite, + GRP_ACTION_MENU_NO_FAVORITE); + if (!no_favorite) { + _ERR("failed to create no favorite layout"); + return; + } + + elm_box_pack_end(priv->favorite, no_favorite); + return; } - elm_object_signal_emit(priv->base, SIGNAL_FAVORITE, SOURCE_ELM); - i = 0; EINA_LIST_FOREACH(channel_list, l, channel_info) { if (channel_info->channel_minor > 0 && @@ -421,18 +431,22 @@ static void _update_favorite(struct _priv *priv) snprintf(buf, sizeof(buf), "%lu %s", channel_info->channel_major, channel_info->channel_name); - btn = util_add_button(priv->base, NULL, buf, + btn = util_add_button(priv->menu, NULL, buf, STYLE_ACTION_MENU_FAVORITE); if (!btn) { - _ERR("Add button failed."); + _ERR("failed to create favorite item"); continue; } util_add_icon(btn, IMAGE_FAVORITE_DEFAULT, PART_CONTENT); inputmgr_add_callback(btn, channel_info->service_id, &favorite_handler, NULL); + inputmgr_set_tags(btn, TAG_FAVORITE); + + elm_box_pack_end(priv->favorite, btn); - elm_table_pack(priv->favorite, btn, 0, i++, 1, 1); + if (++i == FAVORITE_MAX) + break; } tv_channel_del_list(channel_list); @@ -455,7 +469,7 @@ static bool _draw_channel_info(struct _priv *priv) layout = util_add_layout(priv->base, GRP_CHANNELINFO); if (!layout) { - _ERR("Add layout failed."); + _ERR("failed to create channel info layout"); return false; } @@ -466,43 +480,27 @@ static bool _draw_channel_info(struct _priv *priv) return true; } -static bool _draw_top_area(struct _priv *priv) -{ - Evas_Object *btn; - - btn = util_add_button(priv->base, - PART_TOP_BUTTON, STR_LIVETV, STYLE_LIVETV_BTN); - if (!btn) { - _ERR("Add button failed."); - return false; - } - - elm_object_disabled_set(btn, EINA_TRUE); - - return true; -} - -static bool _draw_menu_area(struct _priv *priv) +static bool _draw_action_area(struct _priv *priv) { Evas_Object *table, *btn; int i, row, col; - table = elm_table_add(priv->base); + table = elm_table_add(priv->menu); if (!table) { - _ERR("Add table failed."); + _ERR("failed to create action table"); return false; } elm_table_padding_set(table, BUTTON_BORDER, BUTTON_BORDER); evas_object_show(table); - elm_object_part_content_set(priv->base, PART_MENU, table); + elm_object_part_content_set(priv->menu, PART_MENU, table); i = 0; while (buttons[i].id != BUTTON_INVALID && i < BUTTON_MAX) { - btn = util_add_button(priv->base, NULL, + btn = util_add_button(priv->menu, NULL, buttons[i].data[UNTOGGLE].text, buttons[i].style); if (!btn) { - _ERR("Add button failed."); + _ERR("failed to create action button"); evas_object_del(table); return false; } @@ -537,16 +535,11 @@ static bool _draw_menu_area(struct _priv *priv) i++; } - elm_object_focus_next_object_set(priv->menu_btn[0], - priv->menu_btn[i - 1], ELM_FOCUS_LEFT); - elm_object_focus_next_object_set(priv->menu_btn[i - 1], - priv->menu_btn[0], ELM_FOCUS_RIGHT); - while (col + 1 != ITEMS_IN_ROW) { - btn = util_add_button(priv->base, NULL, NULL, + btn = util_add_button(priv->menu, NULL, NULL, STYLE_ACTION_MENU_BTN); if (!btn) { - _ERR("Add button failed."); + _ERR("failed to create action button"); evas_object_del(table); return false; } @@ -563,20 +556,66 @@ static bool _draw_menu_area(struct _priv *priv) return true; } +static bool _draw_top_area(struct _priv *priv) +{ + Evas_Object *layout, *btn; + + layout = util_add_layout(priv->box, GRP_ACTION_MENU_TOP); + if (!layout) { + _ERR("failed to create menu layout"); + return false; + } + elm_box_pack_end(priv->box, layout); + + btn = util_add_button(layout, + PART_TOP_BUTTON, STR_LIVETV, STYLE_LIVETV_BTN); + if (!btn) { + _ERR("failed to create live button"); + return false; + } + + elm_object_disabled_set(btn, EINA_TRUE); + + priv->menu = layout; + + return _draw_action_area(priv); +} + +static bool _draw_favorite_area(struct _priv *priv) +{ + Evas_Object *box; + + box = elm_box_add(priv->box); + if (!box) { + _ERR("failed to create favorite box"); + return false; + } + elm_box_padding_set(box, 0, FAVORITE_PADDING_Y); + evas_object_show(box); + elm_box_pack_end(priv->box, box); + + priv->favorite = box; + + return true; +} + static bool _draw_bottom_area(struct _priv *priv) { - Evas_Object *table; + Evas_Object *layout, *btn; - table = elm_table_add(priv->base); - if (!table) { - _ERR("Add table failed."); + layout = util_add_layout(priv->box, GRP_ACTION_MENU_BOTTOM); + if (!layout) { + _ERR("failed to create menu layout"); return false; } - elm_table_padding_set(table, 0, FAVORITE_PADDING_Y); - evas_object_show(table); - elm_object_part_content_set(priv->base, PART_FAVORITE, table); + elm_box_pack_end(priv->box, layout); - priv->favorite = table; + btn = util_add_button(layout, + PART_MORE_BUTTON, STR_BUTTON_MORE, STYLE_LIVETV_BTN); + if (!btn) { + _ERR("failed to create more button"); + return false; + } return true; } @@ -584,22 +623,22 @@ static bool _draw_bottom_area(struct _priv *priv) static void _draw_view_content(struct _priv *priv) { if (!_draw_channel_info(priv)) { - _ERR("Draw channel info failed."); + _ERR("failed to draw channel info"); return; } if (!_draw_top_area(priv)) { - _ERR("Draw top area failed."); + _ERR("failed to draw top"); return; } - if (!_draw_menu_area(priv)) { - _ERR("Draw menu area failed."); + if (!_draw_favorite_area(priv)) { + _ERR("failed to draw favorite"); return; } if (!_draw_bottom_area(priv)) - _ERR("Draw bottom area failed."); + _ERR("failed to draw bottom"); } static void _hide_finished_cb(void *data, Evas_Object *obj, @@ -618,16 +657,16 @@ static void _hide_finished_cb(void *data, Evas_Object *obj, static Evas_Object *_create(Evas_Object *win, void *data) { struct _priv *priv; - Evas_Object *base; + Evas_Object *base, *scroller, *box; if (!win) { - _ERR("Get window object failed."); + _ERR("failed to get win object"); return NULL; } priv = calloc(1, sizeof(*priv)); if (!priv) { - _ERR("Calloc failed."); + _ERR("failed to allocate priv"); return NULL; } @@ -642,18 +681,20 @@ static Evas_Object *_create(Evas_Object *win, void *data) EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, base); + scroller = util_add_scroller(base, NULL); + elm_scroller_step_size_set(scroller, 0, SCROLLER_STEP_SIZE); + + box = util_add_box(scroller, NULL); + elm_box_align_set(box, 0.5, 0.0); + + priv->box = box; + priv->scroller = scroller; priv->base = base; priv->win = win; - if (!viewmgr_set_view_data(VIEW_ACTION_MENU, priv)) { - _ERR("Set view data failed."); - evas_object_del(base); - free(priv); - return NULL; - } - _draw_view_content(priv); + viewmgr_set_view_data(VIEW_ACTION_MENU, priv); inputmgr_add_callback(priv->base, 0, &key_handler, priv); elm_layout_signal_callback_add(priv->base, SIGNAL_HIDE_FINISHED, SOURCE_ELM, _hide_finished_cb, priv); @@ -666,7 +707,7 @@ static void _show(void *data) struct _priv *priv; if (!data) { - _ERR("Get data failed."); + _ERR("failed to get data"); return; } priv = data; @@ -675,6 +716,8 @@ static void _show(void *data) _update_menu(priv); _update_favorite(priv); + elm_scroller_region_show(priv->scroller, 0, 0, 0, 0); + evas_object_show(priv->base); elm_object_focus_set(priv->menu_btn[0], EINA_TRUE); @@ -685,7 +728,7 @@ static void _hide(void *data) struct _priv *priv; if (!data) { - _ERR("Get data failed."); + _ERR("failed to get data"); return; } priv = data; @@ -696,11 +739,10 @@ static void _hide(void *data) static void _destroy(void *data) { struct _priv *priv; - Evas_Object *obj; int i; if (!data) { - _ERR("Get data failed."); + _ERR("failed to get data"); return; } priv = data; @@ -713,9 +755,7 @@ static void _destroy(void *data) i++; } - i = 0; - while ((obj = elm_table_child_get(priv->favorite, 0, i++))) - inputmgr_remove_callback(obj, &favorite_handler); + inputmgr_remove_all_by_tag(TAG_FAVORITE); evas_object_del(priv->base); -- 2.7.4 From c580e3fc89378fc0cf395f67fd360f10332b1304 Mon Sep 17 00:00:00 2001 From: "jinwoo.shin" Date: Fri, 18 Sep 2015 19:11:12 +0900 Subject: [PATCH 12/16] Fix wrong while statement Change-Id: Ib939327c8281d5c6af517f80aa146bf08430b14d Signed-off-by: jinwoo.shin --- src/view_action_menu.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/view_action_menu.c b/src/view_action_menu.c index 10362f1..76265fe 100644 --- a/src/view_action_menu.c +++ b/src/view_action_menu.c @@ -457,7 +457,7 @@ static void _update_menu(struct _priv *priv) int i; i = 0; - while (buttons[i].id != BUTTON_INVALID && i < BUTTON_MAX) { + while (i < BUTTON_MAX && buttons[i].id != BUTTON_INVALID) { _update_button_state(priv->menu_btn[i], &buttons[i]); i++; } @@ -495,7 +495,7 @@ static bool _draw_action_area(struct _priv *priv) elm_object_part_content_set(priv->menu, PART_MENU, table); i = 0; - while (buttons[i].id != BUTTON_INVALID && i < BUTTON_MAX) { + while (i < BUTTON_MAX && buttons[i].id != BUTTON_INVALID) { btn = util_add_button(priv->menu, NULL, buttons[i].data[UNTOGGLE].text, buttons[i].style); @@ -750,7 +750,7 @@ static void _destroy(void *data) inputmgr_remove_callback(priv->base, &key_handler); i = 0; - while (priv->menu_btn[i] && i < BUTTON_MAX) { + while (i < BUTTON_MAX && priv->menu_btn[i]) { inputmgr_remove_callback(priv->menu_btn[i], &button_handler); i++; } -- 2.7.4 From f936f9376b8f813f13a791e36dc695fe8b794290 Mon Sep 17 00:00:00 2001 From: "jinwoo.shin" Date: Mon, 21 Sep 2015 18:33:16 +0900 Subject: [PATCH 13/16] Change font to BreezeSans Change-Id: Id6cd7255e2cb8283b227c6a9b0bdadd476690aed Signed-off-by: jinwoo.shin --- data/widget/notify.edc | 2 +- include/define.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/widget/notify.edc b/data/widget/notify.edc index f574396..369bcf4 100644 --- a/data/widget/notify.edc +++ b/data/widget/notify.edc @@ -132,7 +132,7 @@ group { styles { style { name: "toast_style"; - base: "font=TizenSans:style=Light font_size=28 align=center color=#515151"; + base: "font=BreezeSans:style=Light font_size=28 align=center color=#515151"; tag: "br" "\n"; tag: "tab" "\t"; } diff --git a/include/define.h b/include/define.h index 369ce08..0012083 100644 --- a/include/define.h +++ b/include/define.h @@ -51,9 +51,9 @@ #define SIGNAL_HIDE_FINISHED "elm,action,hide,finished" #define SIGNAL_TIMEOUT "timeout" -#define FONT_REGULAR "TizenSans" -#define FONT_LIGHT "TizenSans:style=Light" -#define FONT_BOLD "TizenSans:style=Bold" +#define FONT_REGULAR "BreezeSans" +#define FONT_LIGHT "BreezeSans:style=Light" +#define FONT_BOLD "BreezeSans:style=Bold" #define COLOR_BG_NORMAL 255 255 255 255 #define COLOR_BG_FOCUSED 0 119 246 255 -- 2.7.4 From a73bb7a2bb3d14225df86c329038008ba08f107e Mon Sep 17 00:00:00 2001 From: "jinwoo.shin" Date: Mon, 21 Sep 2015 19:04:28 +0900 Subject: [PATCH 14/16] Add default focus for key event Change-Id: Iaf13892c902434d7dcf87ec35b450b20cdeeacfa Signed-off-by: jinwoo.shin --- src/view_channelnumber.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/view_channelnumber.c b/src/view_channelnumber.c index 44971cd..310ed2a 100644 --- a/src/view_channelnumber.c +++ b/src/view_channelnumber.c @@ -323,6 +323,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) evas_object_size_hint_weight_set(priv->base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, priv->base); + elm_object_focus_allow_set(priv->base, EINA_TRUE); scroll = util_add_scroller(priv->base, PART_CHANNELNUMBER_LIST); if (!scroll) { @@ -374,6 +375,7 @@ static void _show(void *view_data) evas_object_show(priv->base); viewmgr_hide_view(VIEW_CHANNELINFO); + elm_object_focus_set(priv->base, EINA_TRUE); } static void _hide(void *view_data) -- 2.7.4 From a535d1d699ebe7d72f760dde3b4c11f97b969117 Mon Sep 17 00:00:00 2001 From: "jinwoo.shin" Date: Mon, 21 Sep 2015 19:20:22 +0900 Subject: [PATCH 15/16] Update action menu - Launch favorite when user press more button - Set tag on action menu input callbacks to delete them Change-Id: I3e9a768418db8d7949935aeb03290d05dd793abc Signed-off-by: jinwoo.shin --- org.tizen.live-tv.xml.in | 3 ++ src/view_action_menu.c | 86 +++++++++++++++++++++++++++++++++++++----------- 2 files changed, 69 insertions(+), 20 deletions(-) diff --git a/org.tizen.live-tv.xml.in b/org.tizen.live-tv.xml.in index 5c8c0fa..7727803 100644 --- a/org.tizen.live-tv.xml.in +++ b/org.tizen.live-tv.xml.in @@ -7,4 +7,7 @@ @DESKTOP_ICON@ + + http://tizen.org/privilege/appmanager.launch + diff --git a/src/view_action_menu.c b/src/view_action_menu.c index 76265fe..c998f29 100644 --- a/src/view_action_menu.c +++ b/src/view_action_menu.c @@ -17,7 +17,9 @@ #include #include #include +#include #include +#include #include "define.h" #include "util.h" @@ -32,6 +34,7 @@ #define SCROLLER_STEP_SIZE 334 #define TAG_FAVORITE "TAG_FAVORITE" +#define KEY_BUTTON "KEY_BUTTON" #define STYLE_LIVETV_BTN "style.livetv.button" #define STYLE_ACTION_MENU_BTN "style.action.menu.button" @@ -320,21 +323,67 @@ static void _update_button_state(Evas_Object *obj, struct _button *button) } } -static void _button_clicked(Evas_Object *obj, int id, void *data) +static void _launch_favorite(void) { - struct _button *button; + app_control_h app_ctrl; + int r; - if (!data) { - _ERR("failed to get data"); + r = app_control_create(&app_ctrl); + if (r != APP_CONTROL_ERROR_NONE) { + _ERR("failed to create app control handle"); return; } - button = data; + r = app_control_set_operation(app_ctrl, APP_CONTROL_OPERATION_DEFAULT); + if (r != APP_CONTROL_ERROR_NONE) { + _ERR("failed to set app control operation"); + app_control_destroy(app_ctrl); + return; + } + + r = app_control_set_app_id(app_ctrl, APP_ID_FAVORITE); + if (r != APP_CONTROL_ERROR_NONE) { + _ERR("failed to set app control app id"); + app_control_destroy(app_ctrl); + return; + } - if (button->clicked) - button->clicked(); + r = app_control_send_launch_request(app_ctrl, NULL, NULL); + if (r != APP_CONTROL_ERROR_NONE) { + _ERR("failed to send app control launch request"); + app_control_destroy(app_ctrl); + return; + } - _update_button_state(obj, button); + app_control_destroy(app_ctrl); +} + +static void _button_clicked(Evas_Object *obj, int id, void *data) +{ + struct _button *button; + + switch (id) { + case BUTTON_MORE: + _launch_favorite(); + + viewmgr_hide_view(VIEW_ACTION_MENU); + break; + case BUTTON_FAV: + case BUTTON_LOCK: + case BUTTON_CHANNEL: + button = evas_object_data_get(obj, KEY_BUTTON); + if (!button) { + _ERR("failed to get button"); + return; + } + + if (button->clicked) + button->clicked(); + + _update_button_state(obj, button); + + break; + } } static void _button_key_up_cb(int id, void *data, Evas *e, Evas_Object *obj, @@ -441,7 +490,7 @@ static void _update_favorite(struct _priv *priv) util_add_icon(btn, IMAGE_FAVORITE_DEFAULT, PART_CONTENT); inputmgr_add_callback(btn, channel_info->service_id, &favorite_handler, NULL); - inputmgr_set_tags(btn, TAG_FAVORITE); + inputmgr_set_tags(btn, TAG_FAVORITE, VIEW_ACTION_MENU); elm_box_pack_end(priv->favorite, btn); @@ -523,8 +572,10 @@ static bool _draw_action_area(struct _priv *priv) PART_ICON_1_SELECTED); util_add_icon(btn, buttons[i].data[TOGGLE].disabled, PART_ICON_1_DISABLED); + evas_object_data_set(btn, KEY_BUTTON, &buttons[i]); inputmgr_add_callback(btn, buttons[i].id, - &button_handler, &buttons[i]); + &button_handler, priv); + inputmgr_set_tags(btn, VIEW_ACTION_MENU); col = i % ITEMS_IN_ROW; row = i / ITEMS_IN_ROW; @@ -616,6 +667,9 @@ static bool _draw_bottom_area(struct _priv *priv) _ERR("failed to create more button"); return false; } + inputmgr_add_callback(btn, BUTTON_MORE, + &button_handler, priv); + inputmgr_set_tags(btn, VIEW_ACTION_MENU); return true; } @@ -696,6 +750,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) viewmgr_set_view_data(VIEW_ACTION_MENU, priv); inputmgr_add_callback(priv->base, 0, &key_handler, priv); + inputmgr_set_tags(priv->base, VIEW_ACTION_MENU); elm_layout_signal_callback_add(priv->base, SIGNAL_HIDE_FINISHED, SOURCE_ELM, _hide_finished_cb, priv); @@ -739,7 +794,6 @@ static void _hide(void *data) static void _destroy(void *data) { struct _priv *priv; - int i; if (!data) { _ERR("failed to get data"); @@ -747,15 +801,7 @@ static void _destroy(void *data) } priv = data; - inputmgr_remove_callback(priv->base, &key_handler); - - i = 0; - while (i < BUTTON_MAX && priv->menu_btn[i]) { - inputmgr_remove_callback(priv->menu_btn[i], &button_handler); - i++; - } - - inputmgr_remove_all_by_tag(TAG_FAVORITE); + inputmgr_remove_all_by_tag(VIEW_ACTION_MENU); evas_object_del(priv->base); -- 2.7.4 From 7a786bb412a9e777f3664404d600ee3487b2abd4 Mon Sep 17 00:00:00 2001 From: "jinwoo.shin" Date: Tue, 22 Sep 2015 14:33:52 +0900 Subject: [PATCH 16/16] Do not add to recent when live tv is resumed Change-Id: I4c503697a8bd1719d971399299d5ea2a5baf3398 Signed-off-by: jinwoo.shin --- src/main.c | 2 +- src/tv.c | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main.c b/src/main.c index f73507d..6bc6797 100644 --- a/src/main.c +++ b/src/main.c @@ -310,9 +310,9 @@ static bool _create(void *data) return false; } + viewmgr_add_view(view_error_get_vclass(), NULL); viewmgr_add_view(view_channelinfo_get_vclass(), NULL); viewmgr_add_view(view_channelnumber_get_vclass(), NULL); - viewmgr_add_view(view_error_get_vclass(), NULL); viewmgr_add_view(view_action_menu_get_vclass(), NULL); viewmgr_add_view(view_pin_get_vclass(), NULL); diff --git a/src/tv.c b/src/tv.c index 418d579..d764ae5 100644 --- a/src/tv.c +++ b/src/tv.c @@ -714,8 +714,6 @@ int tv_channel_tune(void) return -1; } - _tv_channel_add_history(service_id); - g_tv_info.viewing_locked_channel = -1; return 0; -- 2.7.4