From 914360e259329b7d06a596e8acf59ae6a4b7835e Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Fri, 11 Sep 2015 13:35:13 +0900 Subject: [PATCH 01/16] movie: add date view mode Change-Id: I7b4b7263b57c2867e68b28fb9f239d00b8e4d44e Signed-off-by: Jehun Lim --- src/grid/grid_movie.c | 33 ++++++++++++++++++++++++++++----- src/layout/movie.c | 4 ++++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/grid/grid_movie.c b/src/grid/grid_movie.c index 359f834..c262626 100644 --- a/src/grid/grid_movie.c +++ b/src/grid/grid_movie.c @@ -188,12 +188,22 @@ static Eina_List *_get_genre_list(struct mediadata *md) return list; } -static void _free_name_list(Eina_List *list) +static Eina_List *_get_date_list(struct mediadata *md) +{ + if (!md) { + _ERR("invalid argument"); + return NULL; + } + + return mediadata_get_list(md, E_LIST_DATE); +} + +static void _free_media_list(Eina_List *list) { mediadata_free_list(list); } -static void _free_genre_list(Eina_List *list) +static void _free_group_list(Eina_List *list) { Eina_List *l; struct group_info *gi; @@ -271,6 +281,11 @@ static struct grid_class _gclass[] = { .text_get = _group_text_get, .content_get = _group_content_get }, + [E_MOVIE_DATE] = { + .item_style = STYLE_MOVIE_NAME, + .text_get = _media_text_get, + .content_get = _media_content_get + }, /* Other view mode class will be added later */ }; @@ -282,7 +297,7 @@ static struct grid_data _gdata[] = { .grid_padding = MOVIE_NAME_GRID_PADDING, .gclass = &_gclass[E_MOVIE_NAME], .get_item_list = _get_name_list, - .free_item_list = _free_name_list, + .free_item_list = _free_media_list, .key_down_cb = _key_down_cb, .selected_cb = _selected_cb }, @@ -293,7 +308,16 @@ static struct grid_data _gdata[] = { .grid_padding = MOVIE_GENRE_GRID_PADDING, .gclass = &_gclass[E_MOVIE_GENRE], .get_item_list = _get_genre_list, - .free_item_list = _free_genre_list + .free_item_list = _free_group_list + }, + [E_MOVIE_DATE] = { + .item_x = MOVIE_NAME_ITEM_X, + .item_y = MOVIE_NAME_ITEM_Y, + .item_num = MOVIE_NAME_ITEM_NUM, + .grid_padding = MOVIE_NAME_GRID_PADDING, + .gclass = &_gclass[E_MOVIE_DATE], + .get_item_list = _get_date_list, + .free_item_list = _free_media_list }, /* Other view mode data will be added later */ }; @@ -305,6 +329,5 @@ struct grid_data *get_movie_grid_data(int type) return NULL; } - /* It will be fixed later */ return &_gdata[type]; } diff --git a/src/layout/movie.c b/src/layout/movie.c index 97d5389..9477c4c 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -618,6 +618,10 @@ static void _update(void *layout_data, int update_type, void *data) vdata = data; mode = vdata->index; + /* Folder view mode will be implemented later */ + if (mode == E_MOVIE_FOLDER) + return; + if (mode == priv->view_mode) return; -- 2.7.4 From ed0ef8c8af34ef4ff879eb3abcb28d332e1a9a4a Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Fri, 11 Sep 2015 14:12:26 +0900 Subject: [PATCH 02/16] grid: modify padding value Change-Id: I01f2ba45fe3dfd058c105cdf49961f5b3d5fff36 Signed-off-by: Jehun Lim --- include/grid/grid.h | 3 ++- res/edc/widgets/gengrid.edc | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/include/grid/grid.h b/include/grid/grid.h index c67dc5b..f7232dd 100644 --- a/include/grid/grid.h +++ b/include/grid/grid.h @@ -66,8 +66,9 @@ struct grid_data *get_music_grid_data(int type); #define MOVIE_NAME_ITEM_NUM 2 #define MOVIE_NAME_GRID_PADDING (62 - MOVIE_NAME_ITEM_PADDING) +/* Padding is modified as 7 to fit height with play info */ #define STYLE_GALLERY_EVENT "gallery_item" -#define GALLERY_EVENT_ITEM_PADDING 6 +#define GALLERY_EVENT_ITEM_PADDING 7 #define GALLERY_EVENT_ITEM_X (200 + GALLERY_EVENT_ITEM_PADDING) #define GALLERY_EVENT_ITEM_Y (200 + GALLERY_EVENT_ITEM_PADDING) #define GALLERY_EVENT_ITEM_NUM 3 diff --git a/res/edc/widgets/gengrid.edc b/res/edc/widgets/gengrid.edc index 68bd968..fb6f153 100644 --- a/res/edc/widgets/gengrid.edc +++ b/res/edc/widgets/gengrid.edc @@ -492,7 +492,7 @@ group { description { state: "default" 0.0; rel1.relative: 1.0 1.0; - min: 6 6; + min: 7 7; align: 1.0 1.0; fixed: 1 1; } @@ -1597,7 +1597,7 @@ group { description { state: "default" 0.0; rel1.relative: 1.0 1.0; - min: 6 6; + min: 7 7; align: 1.0 1.0; fixed: 1 1; } -- 2.7.4 From d0e1e45cb31ed7ab9d3210d1a364b5d227682e2a Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Fri, 11 Sep 2015 19:12:34 +0900 Subject: [PATCH 03/16] gallery: add video view mode Change-Id: I4d0e0ebab1fb13a6efb68bdc0498ee88b981fb7c Signed-off-by: Jehun Lim --- include/data/mediadata.h | 1 + src/data/mediadata.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++ src/grid/grid_gallery.c | 31 +++++++++++++++---- src/layout/gallery.c | 4 +++ 4 files changed, 109 insertions(+), 5 deletions(-) diff --git a/include/data/mediadata.h b/include/data/mediadata.h index 60b5899..f6ce7c7 100644 --- a/include/data/mediadata.h +++ b/include/data/mediadata.h @@ -47,6 +47,7 @@ enum list_type { E_LIST_DATE = 0, E_LIST_NAME, E_LIST_GENRE, + E_LIST_TYPE, E_LIST_MAX }; diff --git a/src/data/mediadata.c b/src/data/mediadata.c index d57cbed..fa190b2 100644 --- a/src/data/mediadata.c +++ b/src/data/mediadata.c @@ -21,6 +21,9 @@ #include "data/mediadata.h" +#define STR_IMAGE_NAME "Photo" +#define STR_VIDEO_NAME "Video" + typedef int (*media_compare)(struct group_info *gi, app_media_info *info); typedef void *(*media_compare_data_get)(app_media_info *info); typedef char *(*group_name_get)(app_media_info *info); @@ -28,6 +31,7 @@ typedef char *(*group_name_get)(app_media_info *info); static int _compare_cb_date(const void *, const void *); static int _compare_cb_name(const void *, const void *); static int _compare_cb_genre(const void *, const void *); +static int _compare_cb_type(const void *, const void *); static int _compare_title(struct group_info *, app_media_info *); static char *_get_title(app_media_info *); @@ -38,6 +42,9 @@ static void *_get_data_time(app_media_info *info); static int _compare_genre(struct group_info *, app_media_info *); static char *_get_genre(app_media_info *); static void *_get_data_genre(app_media_info *); +static int _compare_type(struct group_info *, app_media_info *); +static char *_get_type(app_media_info *); +static void *_get_data_type(app_media_info *); enum _filter_type { E_FILTER_FOLDER = 0, @@ -100,6 +107,12 @@ static struct _list_info g_list_info[E_LIST_MAX] = { .name_get = _get_genre, .data_get = _get_data_genre, }, + [E_LIST_TYPE] = { + .sort_cmp_cb = _compare_cb_type, + .media_cmp = _compare_type, + .name_get = _get_type, + .data_get = _get_data_type, + }, }; static bool _create_filter(struct _data *data, filter_h *filter, int type) @@ -254,6 +267,51 @@ static char *_get_genre(app_media_info *info) return strdup(genre); } +static int _compare_type(struct group_info *gi, app_media_info *info) +{ + int *type; + + if (!gi || !gi->data) + return -1; + + type = gi->data; + + if (*type == info->media_type) + return 0; + + return 1; +} + +static void *_get_data_type(app_media_info *info) +{ + int *type; + + type = calloc(1, sizeof(*type)); + if (!type) + return NULL; + + *type = info->media_type; + + return type; +} + +static char *_get_type(app_media_info *info) +{ + const char *type; + + if (info->media_type == MEDIA_CONTENT_TYPE_IMAGE) + type = STR_IMAGE_NAME; + else if (info->media_type == MEDIA_CONTENT_TYPE_VIDEO) + type = STR_VIDEO_NAME; + else + type = NULL; + + if (!type) + return NULL; + + return strdup(type); +} + static int _compare_cb_date(const void *data1, const void *data2) { app_media *am1, *am2; @@ -319,6 +377,26 @@ static int _compare_cb_genre(const void *data1, const void *data2) return strcmp(genre1, genre2); } +static int _compare_cb_type(const void *data1, const void *data2) +{ + app_media *am1, *am2; + app_media_info *info1, *info2; + + am1 = (app_media *)data1; + am2 = (app_media *)data2; + + info1 = app_media_get_info(am1); + info2 = app_media_get_info(am2); + + if (!info1 || !info2) + return -1; + + if (info1->media_type < info2->media_type) + return 1; + + return -1; +} + static Eina_List *_sort_list(Eina_List *list, int sort) { Eina_List *sorted_list; diff --git a/src/grid/grid_gallery.c b/src/grid/grid_gallery.c index e33555e..61fef94 100644 --- a/src/grid/grid_gallery.c +++ b/src/grid/grid_gallery.c @@ -110,7 +110,7 @@ static Evas_Object *_grid_content_get(void *data, return eo; } -static Eina_List *_get_item_list(struct mediadata *md) +static Eina_List *_get_event_list(struct mediadata *md) { if (!md) { _ERR("invalid argument"); @@ -120,7 +120,17 @@ static Eina_List *_get_item_list(struct mediadata *md) return mediadata_get_list(md, E_LIST_DATE); } -static void _free_item_list(Eina_List *list) +static Eina_List *_get_type_list(struct mediadata *md) +{ + if (!md) { + _ERR("invalid argument"); + return NULL; + } + + return mediadata_get_list(md, E_LIST_TYPE); +} + +static void _free_media_list(Eina_List *list) { mediadata_free_list(list); } @@ -197,8 +207,19 @@ static struct grid_data _gdata[] = { .item_num = GALLERY_EVENT_ITEM_NUM, .grid_padding = GALLERY_EVENT_GRID_PADDING, .gclass = &_gclass[E_GALLERY_EVENT], - .get_item_list = _get_item_list, - .free_item_list = _free_item_list, + .get_item_list = _get_event_list, + .free_item_list = _free_media_list, + .key_down_cb = _key_down_cb, + .selected_cb = _selected_cb + }, + [E_GALLERY_VIDEO] = { + .item_x = GALLERY_EVENT_ITEM_X, + .item_y = GALLERY_EVENT_ITEM_Y, + .item_num = GALLERY_EVENT_ITEM_NUM, + .grid_padding = GALLERY_EVENT_GRID_PADDING, + .gclass = &_gclass[E_GALLERY_EVENT], + .get_item_list = _get_type_list, + .free_item_list = _free_media_list, .key_down_cb = _key_down_cb, .selected_cb = _selected_cb }, @@ -212,5 +233,5 @@ struct grid_data *get_gallery_grid_data(int type) return NULL; } - return &_gdata[E_GALLERY_EVENT]; + return &_gdata[type]; } diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 0a738d5..4e2b7b5 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -349,6 +349,10 @@ static void _update(void *layout_data, int update_type, void *data) vdata = data; mode = vdata->index; + /* Place and folder view mode will be implemented later. */ + if (mode == E_GALLERY_PLACE || mode == E_GALLERY_FOLDER) + return; + if (mode == priv->view_mode) return; -- 2.7.4 From cd93594a7b043b19dd0409d9b0ff79661244db9f Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Fri, 11 Sep 2015 20:10:55 +0900 Subject: [PATCH 04/16] listmgr: add focus handling for UP key on view button Change-Id: I71c2bffbce9b747b8baa71047d06b6bd9236128f Signed-off-by: Jehun Lim --- src/util/listmgr.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/src/util/listmgr.c b/src/util/listmgr.c index 9d2ac9d..30b23d1 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -57,6 +57,8 @@ struct listmgr { Eina_Bool focus_state; }; +Elm_Object_Item *_get_nearest_grid_item(struct listmgr *); + static void _index_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *ei) { Evas_Object *grid; @@ -86,6 +88,7 @@ static void _view_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *ei) { Evas_Object *play_info; Evas_Event_Key_Down *ev; + Elm_Object_Item *it; struct listmgr *lmgr; if (!data || !ei) @@ -104,8 +107,13 @@ static void _view_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *ei) play_info = elm_object_part_content_get(lmgr->focused, PART_ITEM_CONTENT); elm_object_focus_set(play_info, EINA_TRUE); - } else - elm_object_item_focus_set(lmgr->focused_it, EINA_TRUE); + } else { + it = lmgr->focused_it; + if (!it) + it = _get_nearest_grid_item(lmgr); + + elm_object_item_focus_set(it, EINA_TRUE); + } } } @@ -508,6 +516,39 @@ Elm_Object_Item *_get_grid_item(Evas_Object *grid, const char *id) return NULL; } +Elm_Object_Item *_get_nearest_grid_item(struct listmgr *lmgr) +{ + Evas_Object *ly, *grid; + Elm_Object_Item *it; + struct grid_data *gdata; + int cnt; + + ly = _get_box_first_item(lmgr->box); + if (!ly) { + _ERR("failed to get box first item"); + return NULL; + } + + grid = elm_object_part_content_get(ly, PART_ITEM_CONTENT); + if (!grid) { + _ERR("failed to get grid object"); + return NULL; + } + + gdata = lmgr->data->gdata; + + /* find last item in first column */ + cnt = elm_gengrid_items_count(grid); + if (cnt > gdata->item_num) + cnt = gdata->item_num; + + it = elm_gengrid_first_item_get(grid); + while (--cnt) + it = elm_gengrid_item_next_get(it); + + return it; +} + void listmgr_set_focus_state(struct listmgr *lmgr, Eina_Bool state) { if (!lmgr) { @@ -662,6 +703,8 @@ void listmgr_clear_content_list(struct listmgr *lmgr) } eina_list_free(list); + + lmgr->focused_it = NULL; } bool listmgr_update_content_list(struct listmgr *lmgr, Eina_List *list, @@ -714,6 +757,8 @@ bool listmgr_update_content_list(struct listmgr *lmgr, Eina_List *list, elm_object_focus_allow_set(lmgr->scr, EINA_TRUE); + elm_scroller_region_show(lmgr->scr, 0, 0, 0, 0); + return true; } -- 2.7.4 From 9b250fabf4960e8cc9e12259f206f5d8cf4c3828 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Mon, 14 Sep 2015 20:49:13 +0900 Subject: [PATCH 05/16] viewer: adds support slide show Change-Id: Ia9d03f1051f2c90f865f46e5f7199604254889eb Signed-off-by: Minkyu Kang --- include/view/viewer.h | 3 + res/edc/images/btn_view_contr_slideshow_foc.png | Bin 0 -> 1417 bytes res/edc/images/btn_view_contr_slideshow_nor.png | Bin 0 -> 1461 bytes res/edc/view/viewer.edc | 40 +++++++++ res/edc/widgets/button.edc | 42 ++++++++- src/util/controller.c | 1 + src/view/viewer.c | 114 ++++++++++++++++++++++-- 7 files changed, 193 insertions(+), 7 deletions(-) create mode 100644 res/edc/images/btn_view_contr_slideshow_foc.png create mode 100644 res/edc/images/btn_view_contr_slideshow_nor.png diff --git a/include/view/viewer.h b/include/view/viewer.h index 559402b..11744a2 100644 --- a/include/view/viewer.h +++ b/include/view/viewer.h @@ -59,6 +59,7 @@ #define SRC_BTN_GALLERY_NEXT "next_gallery" #define SRC_BTN_ROTATE "rotate" #define SRC_BTN_ZOOM "zoom" +#define SRC_BTN_SLIDE "slide" /* images */ #define IMAGE_VIEWER_FAVORITE "ic_title_favorite.png" @@ -82,5 +83,7 @@ #define IMAGE_VIEWER_ROTATE_NORMAL "btn_view_contr_rotate_nor.png" #define IMAGE_VIEWER_ZOOM_FOCUS "btn_view_contr_zoom_foc.png" #define IMAGE_VIEWER_ZOOM_NORMAL "btn_view_contr_zoom_nor.png" +#define IMAGE_VIEWER_SLIDE_FOCUS "btn_view_contr_slideshow_foc.png" +#define IMAGE_VIEWER_SLIDE_NORMAL "btn_view_contr_slideshow_nor.png" #endif /* __AIR_MEDIAHUB_VIEW_VIEWER_H__ */ diff --git a/res/edc/images/btn_view_contr_slideshow_foc.png b/res/edc/images/btn_view_contr_slideshow_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..413aefbe44a7a210f882c1f27bb7b4b61bf4d981 GIT binary patch literal 1417 zcmbVMTWs4@7B?D`@{W049y0*^Y=HP=k@1$@1W_RB_^yveay;A2E=$- zAB7;SN+}qFl01Fl8tlQa`^J=b!b(J*;gY&aNH&JZsTst^u%6yrMoLaV3yi{)qWSUL zUoPQ5k^T4(9dSl7K{&4T&lqrUCK^x9Oe9$u?|l;V{-;1fL* zWbT@d{V|Kbny!8PaZ!UCmN8p$@cP zcUm7Ub`B5J(1|h7(b$+LS1_#Ri?G1Qb8EMLx%hOj=ArL5%=E~6*KR%hb4vs7Ow`S< zwSRN?z+(OB;nNcxo|isL2t8jlGKoanuXoqaJ+k;o%kn~M{jJL{tk567xUcO(U-N~& zx%U3q_Wpcrw>?084Ak$o&(`g-ca>pH2onQ5;+E*e-tj|3W?x%Zk-hTZY+X|ug5A9S zYF(3Y*L$qdUIBitYzB`n{B$Jx+v?GUcP}zWZ{U7>>FViw;h4mJa4W`2C2aQ;!E_+kG1p~Bl6-NkS7r&6nr71#2wrTs704sX-HcWvM4 z7;Y{6eRBGpt+7itFW-25@rQ-N6CZSL_MLfU{*RuMbtBBu_Eu~0U|L&4Oh literal 0 HcmV?d00001 diff --git a/res/edc/images/btn_view_contr_slideshow_nor.png b/res/edc/images/btn_view_contr_slideshow_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ec7d21cc8302d84db0bc98d4d756eecb674c70 GIT binary patch literal 1461 zcmbVMeQeZZ7_a*ZEH0TJ84)2Vor=@#+TLAn*Ro^luD$KVJIC#SK?2fUd$+o4d$!%~ zHpPSyqf?jM0!)(2$YPcdCT@#Uh+YVee;6!L5fi+@BnJH8Ll;CQnz{LQyBmfq`@`mK z-?vYn-}8H(-}}7ntn=0sof;+w<4?Mr!T=@r>p3vC_y02Q6PXM=o}oA!m>ui9LRiJ z3akw?ioo+Odb0yrNUFh82Rjv2fC-bOEP&xSY_pkgD`B(YrLY;p%_s(jtqiwPgpD$n z!|4kFY$_k5e2gp21>PJ;ldeZ76pcosrl`fFs38<5Nz#a6HkSd9GObP4xmcO36=xza zf)-H4h%PEJY((T5l@{HBfJ_%kkRl$>VqjTI3k4)YV_XEqO&BUkMqTsXn(h!5WeF?o!pU;7Ium0lY&k*GI766mmL+kVC1`WCg{E18wP36ZBkdWi zTh??=4hR`u5%8w50JaR4a;gHSE2>{n!kG@JYf^MYYf>Vxv)%?jyG@jNC90Je+p|zD zBdB7lz`ImMg6H+6#3lGy3qjZjtQsdk1_X|i)pi?WC0R4$WN5pEK+;(L|7eDSWKg3y z{?jZO6X-x=x!C&PW%2L`GB`0RI2yn7-B=Gn5B=z7Xn$OIqigeaIO!g^ZTpvpQ_#axG~~cCGo74_wD^v9S_=b9|isy``(|T^y?@2Gya^hAy4Q`YUgq2o$N0N=iO{z(L%0^z>?ZQKgyOuu9NNZqWL8LZyj@h`@e{~Q1S literal 0 HcmV?d00001 diff --git a/res/edc/view/viewer.edc b/res/edc/view/viewer.edc index 29dd7a6..79f47b8 100644 --- a/res/edc/view/viewer.edc +++ b/res/edc/view/viewer.edc @@ -425,6 +425,46 @@ group { } } part { + name: "control_btn7"; + type: SWALLOW; + clip_to: "bottomarea"; + scale: 1; + description { + state: "default" 0.0; + min: 114 143; + rel1 { + to: "control_btn8"; + relative: 0.0 0.5; + } + rel2 { + to: "control_btn8"; + relative: 0.0 0.5; + } + fixed: 1 1; + align: 1.0 0.5; + } + } + part { + name: "control_btn8"; + type: SWALLOW; + clip_to: "bottomarea"; + scale: 1; + description { + state: "default" 0.0; + min: 114 143; + rel1 { + to: "bottomarea"; + relative: 1.0 0.0; + } + rel2 { + to: "bottomarea"; + relative: 1.0 1.0; + } + fixed: 1 1; + align: 1.0 0.5; + } + } + part { name: "padding_time"; type: SPACER; scale: 1; diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index c77653f..3cade19 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -497,7 +497,7 @@ group { name: SIG_SET_UNFOCUS; signal: SIG_SET_UNFOCUS; source: ""; - action: STATE_SET "selected" 0.0; + action: STATE_SET "default" 0.0; target: "bg"; target: "color"; } @@ -1045,6 +1045,46 @@ group { } group { + name: "elm/button/base/viewer_btn_slide"; + inherit: "elm/button/base/viewer_btn_rotate"; + images { + image: IMAGE_VIEWER_SLIDE_NORMAL COMP; + image: IMAGE_VIEWER_SLIDE_FOCUS COMP; + } + parts { + part { + name: "bg"; + scale: 1; + description { + state: "default" 0.0; + image { + normal: IMAGE_VIEWER_SLIDE_NORMAL; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + image { + normal: IMAGE_VIEWER_SLIDE_FOCUS; + } + } + description { + state: "clicked" 0.0; + image { + normal: IMAGE_VIEWER_SLIDE_FOCUS; + } + } + } + } + programs { + program { + name: "emit,signal"; + action: SIGNAL_EMIT SIG_BTN_CALLBACK SRC_BTN_SLIDE; + } + } +} + +group { name: "elm/button/base/music_btn_prev"; inherit: "elm/button/base/viewer_btn_prev"; images { diff --git a/src/util/controller.c b/src/util/controller.c index 942c201..a6d51d0 100644 --- a/src/util/controller.c +++ b/src/util/controller.c @@ -274,6 +274,7 @@ static void _hide(void *handle) if (!ctl->obj) continue; + elm_object_signal_emit(ctl->obj, SIG_SET_UNFOCUS, ""); elm_object_focus_set(ctl->obj, false); evas_object_hide(ctl->obj); diff --git a/src/view/viewer.c b/src/view/viewer.c index 5e007ab..3c460bd 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -40,6 +40,7 @@ #define POSITION_MARGIN 500 #define VIEWER_TIMEOUT 3.0 #define VIEWER_SEPARATOR "/ " +#define SLIDE_SHOW_INTERVAL 3.0 #define VIDEO_COPYRIGHT "Unknown" #define BTN_LOC_NONE -1 @@ -48,6 +49,7 @@ #define BTN_LOC_NEXT 4 #define BTN_LOC_ROTATE 5 #define BTN_LOC_ZOOM 6 +#define BTN_LOC_SLIDE 8 enum { VIEWER_MOVIE, @@ -67,6 +69,11 @@ struct _playlist { int cur; }; +struct _slideshow { + Ecore_Timer *timer; + bool enable; +}; + struct _priv { Evas_Object *win; Evas_Object *base; @@ -78,6 +85,7 @@ struct _priv { struct timeout_handler *timeout; struct playermgr *player; struct progressbar *progress; + struct _slideshow slideshow; bool bar_show; }; @@ -119,6 +127,10 @@ static struct _btn_info btn_photo[] = { .name = SRC_BTN_ZOOM, .loc = BTN_LOC_ZOOM, }, + { + .name = SRC_BTN_SLIDE, + .loc = BTN_LOC_SLIDE, + }, }; static struct _btn_info btn_video[] = { @@ -134,6 +146,10 @@ static struct _btn_info btn_video[] = { .name = SRC_BTN_GALLERY_NEXT, .loc = BTN_LOC_NEXT, }, + { + .name = SRC_BTN_SLIDE, + .loc = BTN_LOC_SLIDE, + }, }; struct _viewer_info { @@ -150,6 +166,10 @@ static void _callback_movie(void *data, const char *ev); static void _callback_photo(void *data, const char *ev); static void _callback_video(void *data, const char *ev); +static void _slideshow_set(struct _priv *priv); +static void _slideshow_enable(struct _priv *priv); +static void _slideshow_disable(struct _priv *priv); + static struct _viewer_info viewer_info[] = { { .btns = btn_movie, @@ -159,13 +179,13 @@ static struct _viewer_info viewer_info[] = { }, { .btns = btn_photo, - .btn_count = 4, + .btn_count = 5, .focus_loc = BTN_LOC_NEXT, .callback = _callback_photo, }, { .btns = btn_video, - .btn_count = 3, + .btn_count = 4, .focus_loc = BTN_LOC_NEXT, .callback = _callback_video, }, @@ -279,8 +299,14 @@ static void _draw_contents(struct _priv *priv, int id, app_media_info *mi) _player_play(priv); return; } else if (id == VIEWER_VIDEO) { - _draw_thumbnail(priv, mi); + if (priv->slideshow.enable) + _player_play(priv); + else + _draw_thumbnail(priv, mi); return; + } else if (id == VIEWER_PHOTO) { + if (priv->slideshow.enable) + _slideshow_set(priv); } if (!mi->file_path) @@ -535,7 +561,8 @@ static bool _viewer_show(struct _priv *priv) ctl = priv->viewer.ctl[id]; priv->viewer.cur = id; - ctl->ops->show(ctl->handle); + if (!priv->slideshow.enable) + ctl->ops->show(ctl->handle); loc = priv->viewer.foc; if (loc == BTN_LOC_NONE) { @@ -684,6 +711,49 @@ static void _hide_bar(struct _priv *priv) ctl->ops->disable(ctl->handle); } +static Eina_Bool _slideshow_next(void *data) +{ + struct _priv *priv; + + if (!data) + return ECORE_CALLBACK_CANCEL; + + priv = data; + + priv->slideshow.timer = NULL; + + if (!priv->slideshow.enable) + return ECORE_CALLBACK_CANCEL; + + _viewer_next(priv); + + return ECORE_CALLBACK_CANCEL; +} + +static void _slideshow_set(struct _priv *priv) +{ + if (priv->slideshow.timer) + return; + + priv->slideshow.timer = ecore_timer_add(SLIDE_SHOW_INTERVAL, + _slideshow_next, priv); +} + +static void _slideshow_enable(struct _priv *priv) +{ + priv->slideshow.enable = true; +} + +static void _slideshow_disable(struct _priv *priv) +{ + priv->slideshow.enable = false; + + if (priv->slideshow.timer) { + ecore_timer_del(priv->slideshow.timer); + priv->slideshow.timer = NULL; + } +} + static void _pop_view(struct _priv *priv) { struct view_update_data vdata; @@ -864,8 +934,11 @@ static void _player_complete_cb(void *data) _pop_view(priv); } else if (priv->viewer.cur == VIEWER_VIDEO) { _player_stop(priv); - _viewer_show(priv); - _show_bar(data); + + if (priv->slideshow.enable) + _viewer_next(priv); + else + _viewer_show(priv); } } @@ -910,6 +983,10 @@ static void _callback_photo(void *data, const char *ev) _viewer_show(priv); } else if (!strcmp(ev, SRC_BTN_ZOOM)) { _set_image_zoom(priv); + } else if (!strcmp(ev, SRC_BTN_SLIDE)) { + _slideshow_enable(priv); + _hide_bar(priv); + _viewer_show(priv); } } @@ -930,6 +1007,10 @@ static void _callback_video(void *data, const char *ev) _viewer_next(priv); } else if (!strcmp(ev, SRC_BTN_PLAY)) { _player_play_pause(priv); + } else if (!strcmp(ev, SRC_BTN_SLIDE)) { + _slideshow_enable(priv); + _hide_bar(priv); + _viewer_show(priv); } } @@ -957,6 +1038,20 @@ static Eina_Bool _event_cb(void *data, int type, void *ei) ev = ei; + if (priv->slideshow.enable) { + if (!strcmp(ev->keyname, KEY_BACK) || + !strcmp(ev->keyname, KEY_BACK_REMOTE)) { + if (priv->viewer.cur == VIEWER_VIDEO) + _player_stop(priv); + + _slideshow_disable(priv); + _viewer_show(priv); + _show_bar(priv); + } + + return ECORE_CALLBACK_DONE; + } + if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_BACK_REMOTE)) { if (priv->bar_show) { @@ -996,6 +1091,9 @@ static Eina_Bool _event_cb(void *data, int type, void *ei) _viewer_prev(priv); } } + } else { + if (priv->slideshow.enable) + return ECORE_CALLBACK_DONE; } _show_bar(data); @@ -1078,6 +1176,8 @@ static Evas_Object *_create(Evas_Object *win, void *data) priv->playlist.cur = 0; priv->viewer.foc = BTN_LOC_NONE; + _slideshow_disable(priv); + player = playermgr_create(win); if (!player) { _ERR("failed to create player"); @@ -1156,6 +1256,7 @@ static void _hide(void *view_data) priv = view_data; + _slideshow_disable(priv); _viewer_hide(priv); timeout_handler_enable(priv->timeout, false); @@ -1187,6 +1288,7 @@ static void _update(void *view_data, int update_type, void *data) priv->playlist.list = vdata->list; priv->playlist.cur = vdata->index; priv->viewer.foc = BTN_LOC_NONE; + priv->slideshow.enable = false; break; default: break; -- 2.7.4 From b26cf1eb1033cd6282f453d468223eace7ed4db6 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Mon, 14 Sep 2015 21:15:24 +0900 Subject: [PATCH 06/16] util: move _check_movie_type function to util.c Change-Id: Idbfa28da016c2d5fd58fe02d88bdf7a9e070dedd Signed-off-by: Minkyu Kang --- include/util/util.h | 1 + src/util/util.c | 11 +++++++++++ src/view/action_menu.c | 9 +-------- src/view/base.c | 11 ++--------- src/view/viewer.c | 12 +----------- 5 files changed, 16 insertions(+), 28 deletions(-) diff --git a/include/util/util.h b/include/util/util.h index a9ece63..0c88343 100644 --- a/include/util/util.h +++ b/include/util/util.h @@ -20,6 +20,7 @@ #include #include +bool util_check_movie_type(const char *str); void util_set_alpha_color(Evas_Object *obj, int alpha); Evas_Object *util_add_button(Evas_Object *base, const char *style, const char *text); diff --git a/src/util/util.c b/src/util/util.c index adac378..ce91360 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -22,6 +22,17 @@ #include "define.h" #include "util/util.h" +#define VIDEO_COPYRIGHT "Unknown" + +/* + * NOTE: Workaround + * we assumed that if video content have the copyright then it's a movie. + */ +bool util_check_movie_type(const char *str) +{ + return strcmp(str, VIDEO_COPYRIGHT); +} + void util_set_alpha_color(Evas_Object *obj, int alpha) { int r, g, b, a; diff --git a/src/view/action_menu.c b/src/view/action_menu.c index 6925459..5453001 100644 --- a/src/view/action_menu.c +++ b/src/view/action_menu.c @@ -29,8 +29,6 @@ #define TEXT_LIVETV "Live TV" #define TEXT_FAVORITE "Favorite" -#define VIDEO_COPYRIGHT "Unknown" - #define NUM_MENU_BTN 4 #define MAX_BTN_COL 4 @@ -498,11 +496,6 @@ Elm_Gengrid_Item_Class *_get_grid_item_class(int type) return ic; } -static bool _check_movie_type(app_media_info *info) -{ - return strcmp(info->video->copyright, VIDEO_COPYRIGHT); -} - static int _get_content_type(app_media_info *info) { int type; @@ -513,7 +506,7 @@ static int _get_content_type(app_media_info *info) type = E_CONTENT_GALLERY; break; case MEDIA_CONTENT_TYPE_VIDEO: - if (_check_movie_type(info)) + if (util_check_movie_type(info->video->copyright)) type = E_CONTENT_MOVIE; else type = E_CONTENT_GALLERY; diff --git a/src/view/base.c b/src/view/base.c index 0a0ecf7..9456277 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -36,8 +36,6 @@ #define TEXT_FAVORITE_ADDED "Added to your favorite." #define TEXT_FAVORITE_REMOVED "Removed from your favorite." -#define VIDEO_COPYRIGHT "Unknown" - #define BOX_PADDING_SIZE 80 #define TIME_TOAST_FAVORITE 5.0 @@ -300,11 +298,6 @@ static input_handler handler = { .focused = _focused_cb }; -static bool _check_movie_type(app_media_info *info) -{ - return strcmp(info->video->copyright, VIDEO_COPYRIGHT); -} - static app_media *_get_app_media(const char *id) { media_info_h media; @@ -336,7 +329,7 @@ static int _get_content_type(app_media_info *info) type = CONTENTS_GALLERY; break; case MEDIA_CONTENT_TYPE_VIDEO: - if (_check_movie_type(info)) + if (util_check_movie_type(info->video->copyright)) type = CONTENTS_MOVIE; else type = CONTENTS_GALLERY; @@ -490,7 +483,7 @@ static int _get_layout_type(app_media_info *info) type = E_LAYOUT_GALLERY; break; case MEDIA_CONTENT_TYPE_VIDEO: - if (_check_movie_type(info)) + if (util_check_movie_type(info->video->copyright)) type = E_LAYOUT_MOVIE; else type = E_LAYOUT_GALLERY; diff --git a/src/view/viewer.c b/src/view/viewer.c index 3c460bd..6719ace 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -41,7 +41,6 @@ #define VIEWER_TIMEOUT 3.0 #define VIEWER_SEPARATOR "/ " #define SLIDE_SHOW_INTERVAL 3.0 -#define VIDEO_COPYRIGHT "Unknown" #define BTN_LOC_NONE -1 #define BTN_LOC_PREV 0 @@ -191,15 +190,6 @@ static struct _viewer_info viewer_info[] = { }, }; -/* - * NOTE: Workaround - * we assumed that if video content have the copyright then it's a movie. - */ -static inline bool _check_movie_type(app_media_info *mi) -{ - return strcmp(mi->video->copyright, VIDEO_COPYRIGHT); -} - static void _set_bg_color(struct _priv *priv, int r, int g, int b, int a) { Evas_Object *bg; @@ -548,7 +538,7 @@ static bool _viewer_show(struct _priv *priv) id = VIEWER_PHOTO; break; case MEDIA_CONTENT_TYPE_VIDEO: - if (_check_movie_type(mi)) + if (util_check_movie_type(mi->video->copyright)) id = VIEWER_MOVIE; else id = VIEWER_VIDEO; -- 2.7.4 From 536c030af4afa89ef920929f73c9b213a0fef7e5 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 15 Sep 2015 11:21:08 +0900 Subject: [PATCH 07/16] action_menu: fix edc error Change-Id: Id1a0cca114b95882df10bd49c71520661251307f Signed-off-by: Minkyu Kang --- res/edc/view/action_menu.edc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/edc/view/action_menu.edc b/res/edc/view/action_menu.edc index 770132e..7ece860 100644 --- a/res/edc/view/action_menu.edc +++ b/res/edc/view/action_menu.edc @@ -253,6 +253,7 @@ group { to: "padding_favorite_area_right_bottom"; relative: 0.0 0.0; } + fixed: 1 1; } } part { @@ -282,6 +283,7 @@ group { to: "padding_bg_no_content_right_bottom"; relative: 0.0 0.0; } + fixed: 1 1; } } } -- 2.7.4 From 8fa106c433d1e37915e698cd507dfe00296ef0ff Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 16 Sep 2015 09:22:53 +0900 Subject: [PATCH 08/16] viewer/mplayer: delete base object if failed to create view Change-Id: Iad278b986a1207f15e7925af9e68d70670291868 Signed-off-by: Minkyu Kang --- src/view/mplayer.c | 3 +++ src/view/viewer.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/view/mplayer.c b/src/view/mplayer.c index ed4972f..33f0ee5 100644 --- a/src/view/mplayer.c +++ b/src/view/mplayer.c @@ -968,6 +968,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) player = playermgr_create(NULL); if (!player) { _ERR("failed to create player"); + evas_object_del(base); goto err; } @@ -975,6 +976,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) if (!r) { _ERR("failed to set callback"); playermgr_destroy(player); + evas_object_del(base); goto err; } @@ -984,6 +986,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) if (!r) { _ERR("failed to init UI"); playermgr_destroy(player); + evas_object_del(base); goto err; } diff --git a/src/view/viewer.c b/src/view/viewer.c index 6719ace..a237507 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -1171,12 +1171,14 @@ static Evas_Object *_create(Evas_Object *win, void *data) player = playermgr_create(win); if (!player) { _ERR("failed to create player"); + evas_object_del(base); goto err; } r = playermgr_set_completed_cb(player, _player_complete_cb, priv); if (!r) { _ERR("failed to set callback"); + evas_object_del(base); playermgr_destroy(player); goto err; } @@ -1186,6 +1188,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) r = _ui_init(priv); if (!r) { _ERR("failed to init UI"); + evas_object_del(base); playermgr_destroy(player); goto err; } -- 2.7.4 From 97f869270dc1a6b11e47cf26d89b6eae252c2494 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 16 Sep 2015 14:25:23 +0900 Subject: [PATCH 09/16] modify key values as key_define Change-Id: I28f5330086f00d53870628159b3f845d7d2432a7 Signed-off-by: Minkyu Kang --- src/grid/grid_gallery.c | 2 +- src/grid/grid_movie.c | 2 +- src/grid/grid_music.c | 2 +- src/util/ctxpopup.c | 2 +- src/util/listmgr.c | 8 ++++---- src/util/timeout_handler.c | 8 +------- src/view/action_menu.c | 2 +- src/view/base.c | 5 ++--- src/view/mplayer.c | 2 +- src/view/viewer.c | 4 ++-- src/view/zoom.c | 2 +- 11 files changed, 16 insertions(+), 23 deletions(-) diff --git a/src/grid/grid_gallery.c b/src/grid/grid_gallery.c index 61fef94..b036caf 100644 --- a/src/grid/grid_gallery.c +++ b/src/grid/grid_gallery.c @@ -150,7 +150,7 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, md = data; if (!strcmp(ev->keyname, KEY_MENU) || - !strcmp(ev->keyname, KEY_MENU_REMOTE)) { + !strcmp(ev->keyname, KEY_CONTEXT_MENU)) { am = elm_object_item_data_get(it); if (!am) { _ERR("failed to get app media"); diff --git a/src/grid/grid_movie.c b/src/grid/grid_movie.c index c262626..5c80bbb 100644 --- a/src/grid/grid_movie.c +++ b/src/grid/grid_movie.c @@ -229,7 +229,7 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, md = data; if (!strcmp(ev->keyname, KEY_MENU) || - !strcmp(ev->keyname, KEY_MENU_REMOTE)) { + !strcmp(ev->keyname, KEY_CONTEXT_MENU)) { am = elm_object_item_data_get(it); if (!am) { _ERR("failed to get app media"); diff --git a/src/grid/grid_music.c b/src/grid/grid_music.c index 12526a9..c16e566 100644 --- a/src/grid/grid_music.c +++ b/src/grid/grid_music.c @@ -127,7 +127,7 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, md = data; if (!strcmp(ev->keyname, KEY_MENU) || - !strcmp(ev->keyname, KEY_MENU_REMOTE)) { + !strcmp(ev->keyname, KEY_CONTEXT_MENU)) { am = elm_object_item_data_get(it); if (!am) { _ERR("failed to get app media"); diff --git a/src/util/ctxpopup.c b/src/util/ctxpopup.c index 04f5047..34ded20 100644 --- a/src/util/ctxpopup.c +++ b/src/util/ctxpopup.c @@ -44,7 +44,7 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, m = data; if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE)) + !strcmp(ev->keyname, KEY_ESC)) ctxpopup_destroy(m); } diff --git a/src/util/listmgr.c b/src/util/listmgr.c index 30b23d1..e471327 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -73,7 +73,7 @@ static void _index_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *ei) ev = ei; if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE)) { + !strcmp(ev->keyname, KEY_ESC)) { elm_object_focus_next(obj, ELM_FOCUS_UP); } else if (!strcmp(ev->keyname, KEY_DOWN)) { grid = elm_object_part_content_get(lmgr->focused, @@ -101,7 +101,7 @@ static void _view_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *ei) return; if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE) || + !strcmp(ev->keyname, KEY_ESC) || !strcmp(ev->keyname, KEY_UP)) { if (lmgr->focused == lmgr->play_info) { play_info = elm_object_part_content_get(lmgr->focused, @@ -131,13 +131,13 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, switch (id) { case LISTMGR_INDEX: if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE)) + !strcmp(ev->keyname, KEY_ESC)) elm_object_focus_next(obj, ELM_FOCUS_UP); break; case LISTMGR_PLAY_INFO: case LISTMGR_GRID: if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE)) + !strcmp(ev->keyname, KEY_ESC)) elm_object_focus_next(obj, ELM_FOCUS_UP); else { gdata = lmgr->data->gdata; diff --git a/src/util/timeout_handler.c b/src/util/timeout_handler.c index 08811bb..411666b 100644 --- a/src/util/timeout_handler.c +++ b/src/util/timeout_handler.c @@ -87,17 +87,11 @@ static Eina_Bool _event_occured(void *data, int type, void *event) ev = event; if (!strcmp(ev->keyname, KEY_VOLUMEUP) || - !strcmp(ev->keyname, KEY_VOLUMEUP_REMOTE) || !strcmp(ev->keyname, KEY_VOLUMEDOWN) || - !strcmp(ev->keyname, KEY_VOLUMEDOWN_REMOTE) || !strcmp(ev->keyname, KEY_MUTE) || - !strcmp(ev->keyname, KEY_MUTE_REMOTE) || !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)) return ECORE_CALLBACK_PASS_ON; - } } r = handle->event_cb(handle->event_data, type, event); diff --git a/src/view/action_menu.c b/src/view/action_menu.c index 5453001..e6d0ff8 100644 --- a/src/view/action_menu.c +++ b/src/view/action_menu.c @@ -266,7 +266,7 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, priv = data; if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE)) + !strcmp(ev->keyname, KEY_ESC)) _hide_view(priv, true); } diff --git a/src/view/base.c b/src/view/base.c index 9456277..e0f9c9c 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -205,11 +205,10 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, switch (id) { case BASE_MENU_BTN: - if (!strcmp(ev->keyname, KEY_ENTER) || - !strcmp(ev->keyname, KEY_ENTER_REMOTE)) + if (!strcmp(ev->keyname, KEY_ENTER)) elm_object_focus_next(obj, ELM_FOCUS_DOWN); else if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE)) + !strcmp(ev->keyname, KEY_ESC)) ui_app_exit(); break; diff --git a/src/view/mplayer.c b/src/view/mplayer.c index 33f0ee5..f207e9c 100644 --- a/src/view/mplayer.c +++ b/src/view/mplayer.c @@ -595,7 +595,7 @@ static void _key_down(int id, void *data, Evas *e, Evas_Object *obj, priv = data; if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE)) { + !strcmp(ev->keyname, KEY_ESC)) { _pop_view(priv); } else if (!strcmp(ev->keyname, KEY_PLAY)) { _player_play(priv); diff --git a/src/view/viewer.c b/src/view/viewer.c index a237507..ff7bc71 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -1030,7 +1030,7 @@ static Eina_Bool _event_cb(void *data, int type, void *ei) if (priv->slideshow.enable) { if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE)) { + !strcmp(ev->keyname, KEY_ESC)) { if (priv->viewer.cur == VIEWER_VIDEO) _player_stop(priv); @@ -1043,7 +1043,7 @@ static Eina_Bool _event_cb(void *data, int type, void *ei) } if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE)) { + !strcmp(ev->keyname, KEY_ESC)) { if (priv->bar_show) { _pop_view(priv); return ECORE_CALLBACK_DONE; diff --git a/src/view/zoom.c b/src/view/zoom.c index e3bd2c5..446891d 100644 --- a/src/view/zoom.c +++ b/src/view/zoom.c @@ -339,7 +339,7 @@ static void _key_up(int id, void *data, Evas *e, Evas_Object *obj, ctl = priv->ctl; if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE)) + !strcmp(ev->keyname, KEY_ESC)) viewmgr_pop_view(); else if (!strcmp(ev->keyname, KEY_UP)) ctl->ops->signal(ctl->handle, DIR_UP, SIG_SET_UNFOCUS); -- 2.7.4 From 83bb3618a1a39b293c24ef6635383420bab24cab Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 17 Sep 2015 08:37:44 +0900 Subject: [PATCH 10/16] version update: m1 Change-Id: If409e9f3d6c75569bbf43eb791a949b2e76304de Signed-off-by: Minkyu Kang --- packaging/org.tizen.mediahub.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/org.tizen.mediahub.spec b/packaging/org.tizen.mediahub.spec index 2d83d85..902e8d8 100644 --- a/packaging/org.tizen.mediahub.spec +++ b/packaging/org.tizen.mediahub.spec @@ -1,6 +1,6 @@ Name: org.tizen.mediahub Summary: Media Hub application -Version: 0.1 +Version: 0.2 Release: 1 Group: Applications/Core Applications License: Apache-2.0 -- 2.7.4 From 0af99a6362c4884be52d933c86208106e19439c8 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Tue, 15 Sep 2015 23:11:01 +0900 Subject: [PATCH 11/16] mediadata: add datamgr to manage several data types Change-Id: I82351fc4074e0835fa50c8b85dd24511f7280d2a Signed-off-by: Jehun Lim --- CMakeLists.txt | 1 + include/data/datamgr.h | 59 ++++++++++++ include/data/mediadata.h | 57 +++--------- include/grid/grid.h | 5 +- include/util/listmgr.h | 1 - src/data/datamgr.c | 89 ++++++++++++++++++ src/data/mediadata.c | 229 ++++++++++++++++++++++++----------------------- src/grid/grid_gallery.c | 35 ++++---- src/grid/grid_movie.c | 50 ++++++----- src/grid/grid_music.c | 29 +++--- src/layout/gallery.c | 123 ++++++++++++++++--------- src/layout/movie.c | 135 +++++++++++++++++++--------- src/layout/music.c | 136 +++++++++++++++++++--------- src/util/listmgr.c | 8 +- 14 files changed, 623 insertions(+), 334 deletions(-) create mode 100644 include/data/datamgr.h create mode 100644 src/data/datamgr.c diff --git a/CMakeLists.txt b/CMakeLists.txt index d0eb0e7..fff0708 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -72,6 +72,7 @@ src/util/util.c src/util/playermgr.c src/util/ctxpopup.c src/util/progressbar.c +src/data/datamgr.c src/data/mediadata.c src/grid/grid_movie.c src/grid/grid_gallery.c diff --git a/include/data/datamgr.h b/include/data/datamgr.h new file mode 100644 index 0000000..cd017f2 --- /dev/null +++ b/include/data/datamgr.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _AIR_MEDIAHUB_DATAMGR_H__ +#define _AIR_MEDIAHUB_DATAMGR_H__ + +#include "data/mediadata.h" + +enum data_type { + E_DATA_MEDIA = 0, + E_DATA_MAX + /* Album and folder will be added later */ +}; + +enum source_type { + E_SOURCE_INTERNAL = 0, + E_SOURCE_EXTERNAL, + E_SOURCE_ALL, + E_SOURCE_MAX +}; + +struct data_ops { + void *(*create)(const char *media_type, int source_type); + void (*destroy)(void *handle); + Eina_List *(*get_list)(void *handle); + int (*get_count)(void *handle, int type); + Eina_List *(*get_group)(void *handle, int type); + void (*free_group)(Eina_List *list); +}; + +struct datamgr { + void *handle; + struct data_ops *ops; +}; + +struct group_info { + char *name; + Eina_List *list; + void *data; +}; + +struct datamgr *datamgr_create(int data_type, const char *media_type, + int source_type); +void datamgr_destroy(struct datamgr *dmgr); + +#endif /* _AIR_MEDIAHUB_DATAMGR_H__ */ diff --git a/include/data/mediadata.h b/include/data/mediadata.h index f6ce7c7..bc75495 100644 --- a/include/data/mediadata.h +++ b/include/data/mediadata.h @@ -17,54 +17,25 @@ #ifndef _AIR_MEDIAHUB_MEDIADATA_H__ #define _AIR_MEDIAHUB_MEDIADATA_H__ -#include +struct data_ops; -struct mediadata; - -enum media_type { - E_MEDIA_PHOTO = 0, - E_MEDIA_VIDEO, - E_MEDIA_SOUND, - E_MEDIA_MUSIC, - E_MEDIA_OTHER, +enum media_group_type { + E_MEDIA_DATE = 0, + E_MEDIA_NAME, + E_MEDIA_GENRE, + E_MEDIA_TYPE, E_MEDIA_MAX }; -enum source_type { - E_SOURCE_INTERNAL = 0, - E_SOURCE_EXTERNAL, - E_SOURCE_ALL, - E_SOURCE_MAX -}; - -enum sort_type { - E_SORT_DATE = 0, - E_SORT_NAME, - E_SORT_MAX -}; - -enum list_type { - E_LIST_DATE = 0, - E_LIST_NAME, - E_LIST_GENRE, - E_LIST_TYPE, - E_LIST_MAX +enum media_file_type { + E_FILE_PHOTO = 0, + E_FILE_VIDEO, + E_FILE_SOUND, + E_FILE_MUSIC, + E_FILE_OTHER, + E_FILE_MAX }; -struct group_info { - char *name; - Eina_List *list; - void *data; -}; - -struct mediadata *mediadata_create(const char *media_type, - int source_type, int sort_type); -void mediadata_destroy(struct mediadata *md); - -Eina_List *mediadata_get_medialist(struct mediadata *md); -int mediadata_get_media_count(struct mediadata *md, int media_type); - -Eina_List *mediadata_get_list(struct mediadata *md, int list_type); -void mediadata_free_list(Eina_List *list); +struct data_ops *mediadata_get_ops(void); #endif /* _AIR_MEDIAHUB_MEDIADATA_H__ */ diff --git a/include/grid/grid.h b/include/grid/grid.h index f7232dd..a03a873 100644 --- a/include/grid/grid.h +++ b/include/grid/grid.h @@ -48,8 +48,9 @@ struct grid_data { int item_num; int grid_padding; struct grid_class *gclass; - Eina_List *(*get_item_list)(struct mediadata *md); - void (*free_item_list)(Eina_List *list); + void *data; + Eina_List *(*get_item_list)(struct datamgr *dmgr); + void (*free_item_list)(struct datamgr *dmgr, Eina_List *list); void (*key_down_cb)(void *data, Elm_Object_Item *it, Evas_Event_Key_Down *ev); void (*selected_cb)(void *data, Elm_Object_Item *it); diff --git a/include/util/listmgr.h b/include/util/listmgr.h index 2540200..bd7d3cc 100644 --- a/include/util/listmgr.h +++ b/include/util/listmgr.h @@ -34,7 +34,6 @@ struct listmgr_data { struct play_info_data *pdata; struct grid_data *gdata; - void *grid_cb_data; }; struct listmgr *listmgr_create(Evas_Object *base, void *data); diff --git a/src/data/datamgr.c b/src/data/datamgr.c new file mode 100644 index 0000000..ac8a31d --- /dev/null +++ b/src/data/datamgr.c @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include + +#include "data/datamgr.h" + +struct _type_info { + struct data_ops *(*func_get_ops)(void); +}; + +static struct _type_info g_type_info[E_DATA_MAX] = { + [E_DATA_MEDIA] = { + .func_get_ops = mediadata_get_ops + } +}; + +struct datamgr *datamgr_create(int data_type, const char *media_type, + int source_type) +{ + struct datamgr *dmgr; + struct data_ops *ops; + void *handle; + + if (!media_type || data_type < 0 || data_type >= E_DATA_MAX || + source_type < 0 || source_type >= E_SOURCE_MAX) { + _ERR("invalid argument"); + return NULL; + } + + dmgr = calloc(1, sizeof(*dmgr)); + if (!dmgr) { + _ERR("failed to allocate datamgr"); + return NULL; + } + + ops = g_type_info[data_type].func_get_ops(); + if (!ops) { + _ERR("failed to get data operations"); + free(dmgr); + return NULL; + } + + if (!ops->create || !ops->destroy || !ops->get_list || + !ops->get_count || !ops->get_group || !ops->free_group) { + _ERR("invalid data operations"); + free(dmgr); + return NULL; + } + + handle = ops->create(media_type, source_type); + if (!handle) { + _ERR("failed to create data handle"); + free(dmgr); + return NULL; + } + + dmgr->ops = ops; + dmgr->handle = handle; + + return dmgr; +} + +void datamgr_destroy(struct datamgr *dmgr) +{ + if (!dmgr) { + _ERR("failed to get datamgr"); + return; + } + + dmgr->ops->destroy(dmgr->handle); + free(dmgr); +} diff --git a/src/data/mediadata.c b/src/data/mediadata.c index fa190b2..ca9609f 100644 --- a/src/data/mediadata.c +++ b/src/data/mediadata.c @@ -19,7 +19,7 @@ #include #include -#include "data/mediadata.h" +#include "data/datamgr.h" #define STR_IMAGE_NAME "Photo" #define STR_VIDEO_NAME "Video" @@ -46,27 +46,12 @@ static int _compare_type(struct group_info *, app_media_info *); static char *_get_type(app_media_info *); static void *_get_data_type(app_media_info *); -enum _filter_type { - E_FILTER_FOLDER = 0, - E_FILTER_MEDIA -}; - struct mediadata { Eina_List *media_list; + int media_count[E_FILE_MAX]; - int media_count[E_MEDIA_MAX]; -}; - -struct _data { const char *media_type; int source_type; - int sort_type; - Eina_List *media_list; -}; - -struct _sort_info { - int order_type; - const char *order_keyword; }; struct _list_info { @@ -77,37 +62,26 @@ struct _list_info { group_name_get name_get; }; -static struct _sort_info g_sort_info[E_SORT_MAX] = { - [E_SORT_DATE] = { - .order_type = MEDIA_CONTENT_ORDER_DESC, - .order_keyword = MEDIA_MODIFIED_TIME, - }, - [E_SORT_NAME] = { - .order_type = MEDIA_CONTENT_ORDER_ASC, - .order_keyword = MEDIA_TITLE, - } -}; - -static struct _list_info g_list_info[E_LIST_MAX] = { - [E_LIST_DATE] = { +static struct _list_info g_group_info[E_MEDIA_MAX] = { + [E_MEDIA_DATE] = { .sort_cmp_cb = _compare_cb_date, .media_cmp = _compare_time, .name_get = _get_time, .data_get = _get_data_time, }, - [E_LIST_NAME] = { + [E_MEDIA_NAME] = { .sort_cmp_cb = _compare_cb_name, .media_cmp = _compare_title, .name_get = _get_title, .data_get = _get_data_title, }, - [E_LIST_GENRE] = { + [E_MEDIA_GENRE] = { .sort_cmp_cb = _compare_cb_genre, .media_cmp = _compare_genre, .name_get = _get_genre, .data_get = _get_data_genre, }, - [E_LIST_TYPE] = { + [E_MEDIA_TYPE] = { .sort_cmp_cb = _compare_cb_type, .media_cmp = _compare_type, .name_get = _get_type, @@ -115,7 +89,7 @@ static struct _list_info g_list_info[E_LIST_MAX] = { }, }; -static bool _create_filter(struct _data *data, filter_h *filter, int type) +static bool _create_filter(struct mediadata *md, filter_h *filter) { filter_h tmp_filter; int ret; @@ -127,24 +101,20 @@ static bool _create_filter(struct _data *data, filter_h *filter, int type) return false; } - snprintf(buf, sizeof(buf), "%s", data->media_type); + snprintf(buf, sizeof(buf), "%s", md->media_type); - if (type == E_FILTER_FOLDER && data->source_type != E_SOURCE_ALL) { + if (md->source_type != E_SOURCE_ALL) { char s[64]; snprintf(s, sizeof(s), " AND MEDIA_STORAGE_TYPE=%d", - data->source_type); + md->source_type); + strcat(buf, s); } media_filter_set_condition(tmp_filter, buf, MEDIA_CONTENT_COLLATE_DEFAULT); - media_filter_set_order(tmp_filter, - g_sort_info[data->sort_type].order_type, - g_sort_info[data->sort_type].order_keyword, - MEDIA_CONTENT_COLLATE_NOCASE); - *filter = tmp_filter; return true; @@ -401,20 +371,20 @@ static Eina_List *_sort_list(Eina_List *list, int sort) { Eina_List *sorted_list; - sorted_list = eina_list_sort(list, 0, g_list_info[sort].sort_cmp_cb); + sorted_list = eina_list_sort(list, 0, g_group_info[sort].sort_cmp_cb); return sorted_list; } -static bool _get_each_media_info(media_info_h media_h, void *dt) +static bool _get_each_media_info(media_info_h media_h, void *data) { + Eina_List **list; app_media *am; - struct _data *data; - if (!dt) + if (!data) return false; - data = dt; + list = data; am = app_media_create(media_h); if (!am) { @@ -422,53 +392,57 @@ static bool _get_each_media_info(media_info_h media_h, void *dt) return false; } - data->media_list = eina_list_append(data->media_list, am); + *list = eina_list_append(*list, am); return true; } -static bool _get_medialist(struct _data *data) +static bool _get_medialist(struct mediadata *md) { + Eina_List *list; filter_h filter; int ret; - if (!_create_filter(data, &filter, E_FILTER_MEDIA)) { + if (!_create_filter(md, &filter)) { _ERR("failed to create filter"); return false; } + list = NULL; ret = media_info_foreach_media_from_db(filter, - _get_each_media_info, data); + _get_each_media_info, &list); if (ret != MEDIA_CONTENT_ERROR_NONE) { - _ERR("failed to get folder info"); + _ERR("failed to get media info"); media_filter_destroy(filter); return false; } + md->media_list = list; + media_filter_destroy(filter); return true; } -struct mediadata *mediadata_create(const char *media_type, - int source_type, int sort_type) +static void *_create(const char *media_type, int source_type) { struct mediadata *md; - struct _data data; int ret; - if (!media_type || source_type < 0 || source_type >= E_SOURCE_MAX - || sort_type < 0 || sort_type >= E_SORT_MAX) { + if (!media_type || source_type < 0 || source_type >= E_SOURCE_MAX) { _ERR("invalid argument"); return NULL; } md = calloc(1, sizeof(*md)); if (!md) { - _ERR("failed to create mediadata"); + _ERR("failed to allocate md"); return NULL; } + md->media_type = media_type; + md->source_type = source_type; + ret = media_content_connect(); if (ret != MEDIA_CONTENT_ERROR_NONE) { _ERR("failed to connect to media content"); @@ -476,13 +450,8 @@ struct mediadata *mediadata_create(const char *media_type, return NULL; } - data.media_type = media_type; - data.source_type = source_type; - data.sort_type = sort_type; - data.media_list = NULL; - - if (!_get_medialist(&data)) { - _ERR("failed to get folderlist"); + if (!_get_medialist(md)) { + _ERR("failed to get medialist"); free(md); media_content_disconnect(); return NULL; @@ -490,51 +459,100 @@ struct mediadata *mediadata_create(const char *media_type, media_content_disconnect(); - md->media_list = eina_list_clone(data.media_list); - - eina_list_free(data.media_list); - - return md; + return (void *)md; } -void mediadata_destroy(struct mediadata *md) +static void _destroy(void *handle) { - if (!md) { - _ERR("failed to get mediadata"); + app_media *am; + struct mediadata *md; + + if (!handle) { + _ERR("failed to get mediadata handle"); return; } - eina_list_free(md->media_list); + md = handle; + + EINA_LIST_FREE(md->media_list, am) + app_media_destroy(am); + + free(md); } -Eina_List *mediadata_get_medialist(struct mediadata *md) +static Eina_List *_get_list(void *handle) { - if (!md) { - _ERR("failed to get mediadata"); + struct mediadata *md; + + if (!handle) { + _ERR("failed to get mediadata handle"); return NULL; } + md = handle; + return md->media_list; } -Eina_List *mediadata_get_list(struct mediadata *md, int list_type) +static int _get_count(void *handle, int type) +{ + struct mediadata *md; + + if (!handle) { + _ERR("failed to get mediadata handle"); + return -1; + } + + if (type < 0 || type >= E_MEDIA_MAX) { + _ERR("invalid argument"); + return -1; + } + + md = handle; + + return md->media_count[type]; +} + +static void _free_group_list(Eina_List *list) +{ + Eina_List *l; + struct group_info *gi; + + EINA_LIST_FOREACH(list, l, gi) { + free(gi->name); + free(gi->data); + eina_list_free(gi->list); + + free(gi); + } +} + +static void _free_group(Eina_List *list) +{ + _free_group_list(list); +} + +static Eina_List *_get_group(void *handle, int type) { Eina_List *list, *l; + struct mediadata *md; struct group_info *gi; app_media *am; app_media_info *info; - if (!md) { - _ERR("failed to get mediadata"); + if (!handle) { + _ERR("failed to get mediadata handle"); return NULL; } - if (list_type < 0 || list_type >= E_LIST_MAX) { + if (type < 0 || type >= E_MEDIA_MAX) { _ERR("invalid argument"); return NULL; } - md->media_list = _sort_list(md->media_list, list_type); + md = handle; + + md->media_list = _sort_list(md->media_list, type); gi = NULL; list = NULL; @@ -542,20 +560,20 @@ Eina_List *mediadata_get_list(struct mediadata *md, int list_type) info = app_media_get_info(am); if (!info) { _ERR("failed to get media info"); - mediadata_free_list(list); + _free_group_list(list); return NULL; } - if (g_list_info[list_type].media_cmp(gi, info)) { + if (g_group_info[type].media_cmp(gi, info)) { gi = calloc(1, sizeof(*gi)); if (!gi) { _ERR("failed to create group info"); - mediadata_free_list(list); + _free_group_list(list); return NULL; } - gi->name = g_list_info[list_type].name_get(info); - gi->data = g_list_info[list_type].data_get(info); + gi->name = g_group_info[type].name_get(info); + gi->data = g_group_info[type].data_get(info); list = eina_list_append(list, gi); } @@ -568,31 +586,16 @@ Eina_List *mediadata_get_list(struct mediadata *md, int list_type) return list; } -int mediadata_get_media_count(struct mediadata *md, int media_type) -{ - if (!md) { - _ERR("failed to get mediadata"); - return -1; - } - - if (media_type < 0 || media_type >= E_MEDIA_MAX) { - _ERR("invalid argument"); - return -1; - } - - return md->media_count[media_type]; -} +static struct data_ops _ops = { + .create = _create, + .destroy = _destroy, + .get_list = _get_list, + .get_count = _get_count, + .get_group = _get_group, + .free_group = _free_group, +}; -void mediadata_free_list(Eina_List *list) +struct data_ops *mediadata_get_ops(void) { - Eina_List *l; - struct group_info *gi; - - EINA_LIST_FOREACH(list, l, gi) { - free(gi->name); - free(gi->data); - eina_list_free(gi->list); - - free(gi); - } -} + return &_ops; +}; diff --git a/src/grid/grid_gallery.c b/src/grid/grid_gallery.c index b036caf..7da809d 100644 --- a/src/grid/grid_gallery.c +++ b/src/grid/grid_gallery.c @@ -25,7 +25,7 @@ #include "define.h" #include "view.h" -#include "data/mediadata.h" +#include "data/datamgr.h" #include "grid/grid.h" #include "util/util.h" @@ -110,36 +110,41 @@ static Evas_Object *_grid_content_get(void *data, return eo; } -static Eina_List *_get_event_list(struct mediadata *md) +static Eina_List *_get_event_list(struct datamgr *dmgr) { - if (!md) { + if (!dmgr) { _ERR("invalid argument"); return NULL; } - return mediadata_get_list(md, E_LIST_DATE); + return dmgr->ops->get_group(dmgr->handle, E_MEDIA_DATE); } -static Eina_List *_get_type_list(struct mediadata *md) +static Eina_List *_get_type_list(struct datamgr *dmgr) { - if (!md) { + if (!dmgr) { _ERR("invalid argument"); return NULL; } - return mediadata_get_list(md, E_LIST_TYPE); + return dmgr->ops->get_group(dmgr->handle, E_MEDIA_TYPE); } -static void _free_media_list(Eina_List *list) +static void _free_media_list(struct datamgr *dmgr, Eina_List *list) { - mediadata_free_list(list); + if (!dmgr) { + _ERR("invalid argument"); + return; + } + + dmgr->ops->free_group(list); } static void _key_down_cb(void *data, Elm_Object_Item *it, Evas_Event_Key_Down *ev) { struct view_update_data vdata; - struct mediadata *md; + struct datamgr *dmgr; app_media *am; if (!data || !ev) { @@ -147,7 +152,7 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, return; } - md = data; + dmgr = data; if (!strcmp(ev->keyname, KEY_MENU) || !strcmp(ev->keyname, KEY_CONTEXT_MENU)) { @@ -157,7 +162,7 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, return; } - vdata.list = mediadata_get_medialist(md); + vdata.list = dmgr->ops->get_list(dmgr->handle); vdata.index = util_get_media_index(vdata.list, am); viewmgr_update_view(VIEW_ACTION_MENU, UPDATE_CONTENT, &vdata); @@ -168,7 +173,7 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, static void _selected_cb(void *data, Elm_Object_Item *it) { struct view_update_data vdata; - struct mediadata *md; + struct datamgr *dmgr; app_media *am; if (!data || !it) { @@ -176,7 +181,7 @@ static void _selected_cb(void *data, Elm_Object_Item *it) return; } - md = data; + dmgr = data; am = elm_object_item_data_get(it); if (!am) { @@ -184,7 +189,7 @@ static void _selected_cb(void *data, Elm_Object_Item *it) return; } - vdata.list = mediadata_get_medialist(md); + vdata.list = dmgr->ops->get_list(dmgr->handle); vdata.index = util_get_media_index(vdata.list, am); viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); diff --git a/src/grid/grid_movie.c b/src/grid/grid_movie.c index 5c80bbb..d40ce52 100644 --- a/src/grid/grid_movie.c +++ b/src/grid/grid_movie.c @@ -25,7 +25,7 @@ #include "define.h" #include "view.h" -#include "data/mediadata.h" +#include "data/datamgr.h" #include "grid/grid.h" #include "util/util.h" @@ -153,22 +153,22 @@ static Evas_Object *_group_content_get(void *data, Evas_Object *obj, return eo; } -static Eina_List *_get_name_list(struct mediadata *md) +static Eina_List *_get_name_list(struct datamgr *dmgr) { - if (!md) { + if (!dmgr) { _ERR("invalid argument"); return NULL; } - return mediadata_get_list(md, E_LIST_NAME); + return dmgr->ops->get_group(dmgr->handle, E_MEDIA_NAME); } -static Eina_List *_get_genre_list(struct mediadata *md) +static Eina_List *_get_genre_list(struct datamgr *dmgr) { Eina_List *list; struct group_info *gi; - if (!md) { + if (!dmgr) { _ERR("invalid argument"); return NULL; } @@ -180,7 +180,7 @@ static Eina_List *_get_genre_list(struct mediadata *md) } gi->name = STR_GENRE_NAME; - gi->list = mediadata_get_list(md, E_LIST_GENRE); + gi->list = dmgr->ops->get_group(dmgr->handle, E_MEDIA_GENRE); list = NULL; list = eina_list_append(list, gi); @@ -188,28 +188,38 @@ static Eina_List *_get_genre_list(struct mediadata *md) return list; } -static Eina_List *_get_date_list(struct mediadata *md) +static Eina_List *_get_date_list(struct datamgr *dmgr) { - if (!md) { + if (!dmgr) { _ERR("invalid argument"); return NULL; } - return mediadata_get_list(md, E_LIST_DATE); + return dmgr->ops->get_group(dmgr->handle, E_MEDIA_DATE); } -static void _free_media_list(Eina_List *list) +static void _free_media_list(struct datamgr *dmgr, Eina_List *list) { - mediadata_free_list(list); + if (!dmgr) { + _ERR("invalid argument"); + return; + } + + dmgr->ops->free_group(list); } -static void _free_group_list(Eina_List *list) +static void _free_group_list(struct datamgr *dmgr, Eina_List *list) { Eina_List *l; struct group_info *gi; + if (!dmgr) { + _ERR("invalid argument"); + return; + } + EINA_LIST_FOREACH(list, l, gi) { - mediadata_free_list(gi->list); + dmgr->ops->free_group(gi->list); free(gi); } } @@ -218,7 +228,7 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, Evas_Event_Key_Down *ev) { struct view_update_data vdata; - struct mediadata *md; + struct datamgr *dmgr; app_media *am; if (!data || !ev) { @@ -226,7 +236,7 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, return; } - md = data; + dmgr = data; if (!strcmp(ev->keyname, KEY_MENU) || !strcmp(ev->keyname, KEY_CONTEXT_MENU)) { @@ -236,7 +246,7 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, return; } - vdata.list = mediadata_get_medialist(md); + vdata.list = dmgr->ops->get_list(dmgr->handle); vdata.index = util_get_media_index(vdata.list, am); viewmgr_update_view(VIEW_ACTION_MENU, UPDATE_CONTENT, &vdata); @@ -247,7 +257,7 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, static void _selected_cb(void *data, Elm_Object_Item *it) { struct view_update_data vdata; - struct mediadata *md; + struct datamgr *dmgr; app_media *am; if (!data || !it) { @@ -255,7 +265,7 @@ static void _selected_cb(void *data, Elm_Object_Item *it) return; } - md = data; + dmgr = data; am = elm_object_item_data_get(it); if (!am) { @@ -263,7 +273,7 @@ static void _selected_cb(void *data, Elm_Object_Item *it) return; } - vdata.list = mediadata_get_medialist(md); + vdata.list = dmgr->ops->get_list(dmgr->handle); vdata.index = util_get_media_index(vdata.list, am); viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); diff --git a/src/grid/grid_music.c b/src/grid/grid_music.c index c16e566..7ef538f 100644 --- a/src/grid/grid_music.c +++ b/src/grid/grid_music.c @@ -25,7 +25,7 @@ #include "define.h" #include "view.h" -#include "data/mediadata.h" +#include "data/datamgr.h" #include "grid/grid.h" #include "util/util.h" @@ -97,26 +97,31 @@ static Evas_Object *_grid_content_get(void *data, return eo; } -static Eina_List *_get_item_list(struct mediadata *md) +static Eina_List *_get_item_list(struct datamgr *dmgr) { - if (!md) { + if (!dmgr) { _ERR("invalid argument"); return NULL; } - return mediadata_get_list(md, E_LIST_NAME); + return dmgr->ops->get_group(dmgr->handle, E_MEDIA_NAME); } -static void _free_item_list(Eina_List *list) +static void _free_item_list(struct datamgr *dmgr, Eina_List *list) { - mediadata_free_list(list); + if (!dmgr) { + _ERR("invalid argument"); + return; + } + + dmgr->ops->free_group(list); } static void _key_down_cb(void *data, Elm_Object_Item *it, Evas_Event_Key_Down *ev) { struct view_update_data vdata; - struct mediadata *md; + struct datamgr *dmgr; app_media *am; if (!data || !ev) { @@ -124,7 +129,7 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, return; } - md = data; + dmgr = data; if (!strcmp(ev->keyname, KEY_MENU) || !strcmp(ev->keyname, KEY_CONTEXT_MENU)) { @@ -134,7 +139,7 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, return; } - vdata.list = mediadata_get_medialist(md); + vdata.list = dmgr->ops->get_list(dmgr->handle); vdata.index = util_get_media_index(vdata.list, am); viewmgr_update_view(VIEW_ACTION_MENU, UPDATE_CONTENT, &vdata); @@ -145,7 +150,7 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, static void _selected_cb(void *data, Elm_Object_Item *it) { struct view_update_data vdata; - struct mediadata *md; + struct datamgr *dmgr; app_media *am; if (!data || !it) { @@ -153,7 +158,7 @@ static void _selected_cb(void *data, Elm_Object_Item *it) return; } - md = data; + dmgr = data; am = elm_object_item_data_get(it); if (!am) { @@ -161,7 +166,7 @@ static void _selected_cb(void *data, Elm_Object_Item *it) return; } - vdata.list = mediadata_get_medialist(md); + vdata.list = dmgr->ops->get_list(dmgr->handle); vdata.index = util_get_media_index(vdata.list, am); viewmgr_update_view(VIEW_MPLAYER, UPDATE_CONTENT, &vdata); diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 4e2b7b5..be9c27b 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -26,7 +26,7 @@ #include "define.h" #include "layout.h" #include "view.h" -#include "data/mediadata.h" +#include "data/datamgr.h" #include "grid/grid.h" #include "util/listmgr.h" #include "util/util.h" @@ -53,7 +53,7 @@ struct _priv { struct listmgr *listmgr; struct listmgr_data *ldata; - struct mediadata *md; + struct datamgr *dmgr[E_DATA_MAX]; Eina_List *media_list; @@ -65,6 +65,7 @@ static void _recent_item_selected(struct _priv *priv, app_media *am) { app_media_info *info; struct view_update_data vdata; + struct datamgr *dmgr; info = app_media_get_info(am); if (!info) { @@ -72,7 +73,11 @@ static void _recent_item_selected(struct _priv *priv, app_media *am) return; } - vdata.list = mediadata_get_medialist(priv->md); + dmgr = priv->dmgr[E_DATA_MEDIA]; + if (!dmgr) + return; + + vdata.list = dmgr->ops->get_list(dmgr->handle); vdata.index = util_get_media_index_from_id(vdata.list, info->media_id); viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); @@ -92,18 +97,21 @@ static struct listmgr_data *_create_listmgr_data(struct _priv *priv) data->menu_btn = priv->menu_btn; data->view_btn = priv->view_btn; - data->grid_cb_data = priv->md; - return data; } static void _update_content_info(struct _priv *priv) { + struct datamgr *dmgr; int photo, video; char buf[128]; - photo = mediadata_get_media_count(priv->md, E_MEDIA_PHOTO); - video = mediadata_get_media_count(priv->md, E_MEDIA_VIDEO); + dmgr = priv->dmgr[E_DATA_MEDIA]; + if (!dmgr) + return; + + photo = dmgr->ops->get_count(dmgr->handle, E_FILE_PHOTO); + video = dmgr->ops->get_count(dmgr->handle, E_FILE_VIDEO); if (photo < 0 || video < 0) { _ERR("failed to get media count"); @@ -118,7 +126,8 @@ static void _update_content_info(struct _priv *priv) static void _clear_content_list(struct _priv *priv) { if (priv->media_list) { - priv->gdata->free_item_list(priv->media_list); + priv->gdata->free_item_list(priv->dmgr[E_DATA_MEDIA], + priv->media_list); priv->media_list = NULL; } @@ -136,13 +145,15 @@ static void _update_content_list(struct _priv *priv) priv->gdata = get_gallery_grid_data(priv->view_mode); - list = priv->gdata->get_item_list(priv->md); + list = priv->gdata->get_item_list(priv->dmgr[E_DATA_MEDIA]); if (!list) { elm_object_part_text_set(priv->layout, PART_NOCONTENT, TEXT_NOCONTENT); return; } + priv->gdata->data = priv->dmgr[E_DATA_MEDIA]; + if (!listmgr_update_content_list(priv->listmgr, list, priv->gdata)) _ERR("failed to update list area"); @@ -151,12 +162,64 @@ static void _update_content_list(struct _priv *priv) _update_content_info(priv); } -static bool _create(layoutmgr *lmgr, void *data) +static void _destroy_datamgr(struct _priv *priv) +{ + int i; + + for (i = 0; i < E_DATA_MAX; i++) + datamgr_destroy(priv->dmgr[i]); +} + +static void _destroy_utils(struct _priv *priv) +{ + _destroy_datamgr(priv); + + listmgr_destroy(priv->listmgr); + free(priv->ldata); +} + +static bool _create_utils(struct _priv *priv) { - struct layout_data *ld; struct listmgr *listmgr; struct listmgr_data *ldata; - struct mediadata *md; + struct datamgr *dmgr; + int i; + + for (i = 0; i < E_DATA_MAX; i++) { + dmgr = datamgr_create(i, LIST_MEDIA_COND, E_SOURCE_ALL); + if (!dmgr) { + _ERR("failed to create datamgr"); + _destroy_datamgr(priv); + return false; + } + + priv->dmgr[i] = dmgr; + } + + ldata = _create_listmgr_data(priv); + if (!ldata) { + _ERR("failed to create listmgr data"); + _destroy_datamgr(priv); + return false; + } + + listmgr = listmgr_create(priv->layout, (void *)ldata); + if (!listmgr) { + _ERR("failed to create listmgr"); + _destroy_datamgr(priv); + free(ldata); + return false; + } + + priv->ldata = ldata; + priv->listmgr = listmgr; + + return true; +} + +static bool _create(layoutmgr *lmgr, void *data) +{ + struct layout_data *ld; struct _priv *priv; Evas_Object *base, *layout; @@ -195,49 +258,29 @@ static bool _create(layoutmgr *lmgr, void *data) goto err2; } - md = mediadata_create(LIST_MEDIA_COND, E_SOURCE_ALL, E_SORT_DATE); - if (!md) { - _ERR("failed to create mediadata"); - goto err2; - } - priv->base = base; priv->layout = layout; priv->menu_btn = ld->top; priv->view_btn = ld->bottom; priv->lmgr = lmgr; - priv->md = md; priv->gdata = get_gallery_grid_data(E_GALLERY_EVENT); - ldata = _create_listmgr_data(priv); - if (!ldata) { - _ERR("failed to create listmgr data"); - goto err3; - } - - listmgr = listmgr_create(layout, (void *)ldata); - if (!listmgr) { - _ERR("failed to create listmgr"); - free(ldata); - goto err3; + if (!_create_utils(priv)) { + _ERR("failed to create utils"); + goto err2; } - priv->ldata = ldata; - priv->listmgr = listmgr; - layoutmgr_set_layout_data(lmgr, LAYOUT_GALLERY, priv); - if (!listmgr_draw_list_area(listmgr)) { + if (!listmgr_draw_list_area(priv->listmgr)) { _ERR("failed to draw list area"); - free(ldata); - listmgr_destroy(listmgr); goto err3; } return true; err3: - mediadata_destroy(md); + _destroy_utils(priv); err2: evas_object_del(layout); err: @@ -256,11 +299,9 @@ static void _destroy(void *layout_data) priv = layout_data; - priv->gdata->free_item_list(priv->media_list); - mediadata_destroy(priv->md); + priv->gdata->free_item_list(priv->dmgr[E_DATA_MEDIA], priv->media_list); - listmgr_destroy(priv->listmgr); - free(priv->ldata); + _destroy_utils(priv); evas_object_del(priv->layout); diff --git a/src/layout/movie.c b/src/layout/movie.c index 9477c4c..811f4a4 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -27,7 +27,7 @@ #include "define.h" #include "layout.h" #include "view.h" -#include "data/mediadata.h" +#include "data/datamgr.h" #include "grid/grid.h" #include "util/listmgr.h" #include "util/progressbar.h" @@ -57,7 +57,7 @@ struct _priv { struct listmgr *listmgr; struct listmgr_data *ldata; - struct mediadata *md; + struct datamgr *dmgr[E_DATA_MAX]; struct progressbar *prog; @@ -241,6 +241,7 @@ static void _recent_item_selected(struct _priv *priv, app_media *am) { app_media_info *info; struct view_update_data vdata; + struct datamgr *dmgr; info = app_media_get_info(am); if (!info) { @@ -248,7 +249,11 @@ static void _recent_item_selected(struct _priv *priv, app_media *am) return; } - vdata.list = mediadata_get_medialist(priv->md); + dmgr = priv->dmgr[E_DATA_MEDIA]; + if (!dmgr) + return; + + vdata.list = dmgr->ops->get_list(dmgr->handle); vdata.index = util_get_media_index_from_id(vdata.list, info->media_id); viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); @@ -259,13 +264,18 @@ static void _recent_selected_cb(void *data, Evas_Object *obj) { struct _priv *priv; struct view_update_data vdata; + struct datamgr *dmgr; if (!data || !obj) return; priv = data; - vdata.list = mediadata_get_medialist(priv->md); + dmgr = priv->dmgr[E_DATA_MEDIA]; + if (!dmgr) + return; + + vdata.list = dmgr->ops->get_list(dmgr->handle); vdata.index = util_get_media_index(vdata.list, priv->recent_info); viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); @@ -294,7 +304,6 @@ static struct listmgr_data *_create_listmgr_data(struct _priv *priv) pdata->cb_data = priv; data->pdata = pdata; - data->grid_cb_data = priv->md; return data; @@ -307,10 +316,15 @@ err: static void _update_content_info(struct _priv *priv) { + struct datamgr *dmgr; int count; char buf[128]; - count = mediadata_get_media_count(priv->md, E_MEDIA_VIDEO); + dmgr = priv->dmgr[E_DATA_MEDIA]; + if (!dmgr) + return; + + count = dmgr->ops->get_count(dmgr->handle, E_FILE_VIDEO); if (count < 0) { _ERR("failed to get media count"); return; @@ -324,7 +338,8 @@ static void _update_content_info(struct _priv *priv) static void _clear_content_list(struct _priv *priv) { if (priv->media_list) { - priv->gdata->free_item_list(priv->media_list); + priv->gdata->free_item_list(priv->dmgr[E_DATA_MEDIA], + priv->media_list); priv->media_list = NULL; } @@ -342,13 +357,15 @@ static void _update_content_list(struct _priv *priv) priv->gdata = get_movie_grid_data(priv->view_mode); - list = priv->gdata->get_item_list(priv->md); + list = priv->gdata->get_item_list(priv->dmgr[E_DATA_MEDIA]); if (!list) { elm_object_part_text_set(priv->layout, PART_NOCONTENT, TEXT_NOCONTENT); return; } + priv->gdata->data = priv->dmgr[E_DATA_MEDIA]; + if (!listmgr_update_content_list(priv->listmgr, list, priv->gdata)) { _ERR("failed to update list area"); return; @@ -388,8 +405,13 @@ static void _update_recent_item(struct _priv *priv, const char *id) Eina_List *list; app_media *am; app_media_info *info; + struct datamgr *dmgr; + + dmgr = priv->dmgr[E_DATA_MEDIA]; + if (!dmgr) + return; - list = mediadata_get_medialist(priv->md); + list = dmgr->ops->get_list(dmgr->handle); if (id) am = util_find_media_info(list, id); @@ -413,12 +435,65 @@ static void _update_recent_item(struct _priv *priv, const char *id) _ERR("failed to update recently watched item"); } -static bool _create(layoutmgr *lmgr, void *data) +static void _destroy_datamgr(struct _priv *priv) +{ + int i; + + for (i = 0; i < E_DATA_MAX; i++) + datamgr_destroy(priv->dmgr[i]); +} + +static void _destroy_utils(struct _priv *priv) +{ + _destroy_datamgr(priv); + + listmgr_destroy(priv->listmgr); + free(priv->ldata->pdata); + free(priv->ldata); +} + +static bool _create_utils(struct _priv *priv) { - struct layout_data *ld; struct listmgr *listmgr; struct listmgr_data *ldata; - struct mediadata *md; + struct datamgr *dmgr; + int i; + + for (i = 0; i < E_DATA_MAX; i++) { + dmgr = datamgr_create(i, LIST_MEDIA_COND, E_SOURCE_ALL); + if (!dmgr) { + _ERR("failed to create datamgr"); + _destroy_datamgr(priv); + return false; + } + + priv->dmgr[i] = dmgr; + } + + ldata = _create_listmgr_data(priv); + if (!ldata) { + _ERR("failed to create listmgr data"); + _destroy_datamgr(priv); + return false; + } + + listmgr = listmgr_create(priv->layout, (void *)ldata); + if (!listmgr) { + _ERR("failed to create listmgr"); + _destroy_datamgr(priv); + free(ldata); + return false; + } + + priv->ldata = ldata; + priv->listmgr = listmgr; + + return true; +} + +static bool _create(layoutmgr *lmgr, void *data) +{ + struct layout_data *ld; struct _priv *priv; Evas_Object *base, *layout; @@ -457,50 +532,29 @@ static bool _create(layoutmgr *lmgr, void *data) goto err2; } - md = mediadata_create(LIST_MEDIA_COND, E_SOURCE_ALL, E_SORT_NAME); - if (!md) { - _ERR("failed to create mediadata"); - goto err2; - } - priv->base = base; priv->layout = layout; priv->menu_btn = ld->top; priv->view_btn = ld->bottom; priv->lmgr = lmgr; - priv->md = md; priv->gdata = get_movie_grid_data(E_MOVIE_NAME); - ldata = _create_listmgr_data(priv); - if (!ldata) { - _ERR("failed to create listmgr data"); - goto err3; - } - - listmgr = listmgr_create(layout, (void *)ldata); - if (!listmgr) { - _ERR("failed to create listmgr"); - free(ldata->pdata); - free(ldata); - goto err3; + if (!_create_utils(priv)) { + _ERR("failed to create utils"); + goto err2; } - priv->ldata = ldata; - priv->listmgr = listmgr; - layoutmgr_set_layout_data(lmgr, LAYOUT_MOVIE, priv); if (!listmgr_draw_list_area(priv->listmgr)) { _ERR("failed to draw list area"); - free(ldata); - listmgr_destroy(listmgr); goto err3; } return true; err3: - mediadata_destroy(md); + _destroy_utils(priv); err2: evas_object_del(layout); err: @@ -521,12 +575,9 @@ static void _destroy(void *layout_data) progressbar_destroy(priv->prog); - priv->gdata->free_item_list(priv->media_list); - mediadata_destroy(priv->md); + priv->gdata->free_item_list(priv->dmgr[E_DATA_MEDIA], priv->media_list); - listmgr_destroy(priv->listmgr); - free(priv->ldata->pdata); - free(priv->ldata); + _destroy_utils(priv); evas_object_del(priv->layout); diff --git a/src/layout/music.c b/src/layout/music.c index 273cf13..ad68f86 100644 --- a/src/layout/music.c +++ b/src/layout/music.c @@ -27,7 +27,7 @@ #include "define.h" #include "layout.h" #include "view.h" -#include "data/mediadata.h" +#include "data/datamgr.h" #include "grid/grid.h" #include "util/listmgr.h" #include "util/util.h" @@ -55,7 +55,7 @@ struct _priv { struct listmgr *listmgr; struct listmgr_data *ldata; - struct mediadata *md; + struct datamgr *dmgr[E_DATA_MAX]; Eina_List *media_list; @@ -185,6 +185,7 @@ static void _recent_item_selected(struct _priv *priv, app_media *am) { app_media_info *info; struct view_update_data vdata; + struct datamgr *dmgr; info = app_media_get_info(am); if (!info) { @@ -192,7 +193,11 @@ static void _recent_item_selected(struct _priv *priv, app_media *am) return; } - vdata.list = mediadata_get_medialist(priv->md); + dmgr = priv->dmgr[E_DATA_MEDIA]; + if (!dmgr) + return; + + vdata.list = dmgr->ops->get_list(dmgr->handle); vdata.index = util_get_media_index_from_id(vdata.list, info->media_id); viewmgr_update_view(VIEW_MPLAYER, UPDATE_CONTENT, &vdata); @@ -202,6 +207,7 @@ static void _recent_item_selected(struct _priv *priv, app_media *am) static void _playing_selected_cb(void *data, Evas_Object *obj) { struct view_update_data vdata; + struct datamgr *dmgr; struct _priv *priv; if (!data || !obj) @@ -209,7 +215,11 @@ static void _playing_selected_cb(void *data, Evas_Object *obj) priv = data; - vdata.list = mediadata_get_medialist(priv->md); + dmgr = priv->dmgr[E_DATA_MEDIA]; + if (!dmgr) + return; + + vdata.list = dmgr->ops->get_list(dmgr->handle); vdata.index = util_get_media_index(vdata.list, priv->playing_info); viewmgr_update_view(VIEW_MPLAYER, UPDATE_CONTENT, &vdata); @@ -238,7 +248,6 @@ static struct listmgr_data *_create_listmgr_data(struct _priv *priv) pdata->cb_data = priv; data->pdata = pdata; - data->grid_cb_data = priv->md; return data; @@ -251,10 +260,15 @@ err: static void _update_content_info(struct _priv *priv) { + struct datamgr *dmgr; int count; char buf[128]; - count = mediadata_get_media_count(priv->md, E_MEDIA_MUSIC); + dmgr = priv->dmgr[E_DATA_MEDIA]; + if (!dmgr) + return; + + count = dmgr->ops->get_count(dmgr->handle, E_FILE_MUSIC); if (count < 0) { _ERR("failed to get media count"); return; @@ -268,7 +282,8 @@ static void _update_content_info(struct _priv *priv) static void _clear_content_list(struct _priv *priv) { if (priv->media_list) { - priv->gdata->free_item_list(priv->media_list); + priv->gdata->free_item_list(priv->dmgr[E_DATA_MEDIA], + priv->media_list); priv->media_list = NULL; } @@ -286,13 +301,15 @@ static void _update_content_list(struct _priv *priv) priv->gdata = get_music_grid_data(priv->view_mode); - list = priv->gdata->get_item_list(priv->md); + list = priv->gdata->get_item_list(priv->dmgr[E_DATA_MEDIA]); if (!list) { elm_object_part_text_set(priv->layout, PART_NOCONTENT, TEXT_NOCONTENT); return; } + priv->gdata->data = priv->dmgr[E_DATA_MEDIA]; + if (!listmgr_update_content_list(priv->listmgr, list, priv->gdata)) _ERR("failed to update list area"); @@ -330,8 +347,14 @@ static void _update_playing_item(struct _priv *priv, const char *id) Eina_List *list; app_media *am; app_media_info *info; + struct datamgr *dmgr; + + dmgr = priv->dmgr[E_DATA_MEDIA]; + if (!dmgr) + return; + + list = dmgr->ops->get_list(dmgr->handle); - list = mediadata_get_medialist(priv->md); if (id) am = util_find_media_info(list, id); else @@ -354,12 +377,65 @@ static void _update_playing_item(struct _priv *priv, const char *id) _ERR("failed to update now playing item"); } -static bool _create(layoutmgr *lmgr, void *data) +static void _destroy_datamgr(struct _priv *priv) +{ + int i; + + for (i = 0; i < E_DATA_MAX; i++) + datamgr_destroy(priv->dmgr[i]); +} + +static void _destroy_utils(struct _priv *priv) +{ + _destroy_datamgr(priv); + + listmgr_destroy(priv->listmgr); + free(priv->ldata->pdata); + free(priv->ldata); +} + +static bool _create_utils(struct _priv *priv) { - struct layout_data *ld; struct listmgr *listmgr; struct listmgr_data *ldata; - struct mediadata *md; + struct datamgr *dmgr; + int i; + + for (i = 0; i < E_DATA_MAX; i++) { + dmgr = datamgr_create(i, LIST_MEDIA_COND, E_SOURCE_ALL); + if (!dmgr) { + _ERR("failed to create datamgr"); + _destroy_datamgr(priv); + return false; + } + + priv->dmgr[i] = dmgr; + } + + ldata = _create_listmgr_data(priv); + if (!ldata) { + _ERR("failed to create listmgr data"); + _destroy_datamgr(priv); + return false; + } + + listmgr = listmgr_create(priv->layout, (void *)ldata); + if (!listmgr) { + _ERR("failed to create listmgr"); + _destroy_datamgr(priv); + free(ldata); + return false; + } + + priv->ldata = ldata; + priv->listmgr = listmgr; + + return true; +} + +static bool _create(layoutmgr *lmgr, void *data) +{ + struct layout_data *ld; struct _priv *priv; Evas_Object *base, *layout; @@ -398,49 +474,29 @@ static bool _create(layoutmgr *lmgr, void *data) goto err2; } - md = mediadata_create(LIST_MEDIA_COND, E_SOURCE_ALL, E_SORT_NAME); - if (!md) { - _ERR("failed to create mediadata"); - goto err2; - } - priv->base = base; priv->layout = layout; priv->menu_btn = ld->top; priv->view_btn = ld->bottom; priv->lmgr = lmgr; - priv->md = md; priv->gdata = get_music_grid_data(E_MUSIC_SONG); - ldata = _create_listmgr_data(priv); - if (!ldata) { - _ERR("failed to create listmgr data"); - goto err3; - } - - listmgr = listmgr_create(layout, (void *)ldata); - if (!listmgr) { - _ERR("failed to create listmgr"); - free(ldata); - goto err3; + if (!_create_utils(priv)) { + _ERR("failed to create utils"); + goto err2; } - priv->ldata = ldata; - priv->listmgr = listmgr; - layoutmgr_set_layout_data(lmgr, LAYOUT_MUSIC, priv); - if (!listmgr_draw_list_area(listmgr)) { + if (!listmgr_draw_list_area(priv->listmgr)) { _ERR("failed to draw list area"); - free(ldata); - listmgr_destroy(listmgr); goto err3; } return true; err3: - mediadata_destroy(md); + _destroy_utils(priv); err2: evas_object_del(layout); err: @@ -459,11 +515,9 @@ static void _destroy(void *layout_data) priv = layout_data; - priv->gdata->free_item_list(priv->media_list); - mediadata_destroy(priv->md); + priv->gdata->free_item_list(priv->dmgr[E_DATA_MEDIA], priv->media_list); - listmgr_destroy(priv->listmgr); - free(priv->ldata); + _destroy_utils(priv); evas_object_del(priv->layout); diff --git a/src/util/listmgr.c b/src/util/listmgr.c index e471327..0f80bb8 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -22,7 +22,7 @@ #include #include "define.h" -#include "data/mediadata.h" +#include "data/datamgr.h" #include "grid/grid.h" #include "util/listmgr.h" #include "util/util.h" @@ -142,8 +142,8 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, else { gdata = lmgr->data->gdata; if (gdata->key_down_cb) - gdata->key_down_cb(lmgr->data->grid_cb_data, - lmgr->focused_it, ev); + gdata->key_down_cb(gdata->data, + lmgr->focused_it, ev); } break; @@ -261,7 +261,7 @@ static void _grid_selected(void *data) gdata = lmgr->data->gdata; if (gdata->selected_cb) - gdata->selected_cb(lmgr->data->grid_cb_data, lmgr->selected_it); + gdata->selected_cb(gdata->data, lmgr->selected_it); } static void _grid_selected_cb(int id, void *data, Evas_Object *obj, -- 2.7.4 From 98d7d99e5eab1c61bb38ec26df41ae4816785a8b Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 17 Sep 2015 15:22:57 +0900 Subject: [PATCH 12/16] action_menu: fix typo Change-Id: Ic27097cd932d324a8b0d4e58e52bfcb7900727dd Signed-off-by: Minkyu Kang --- src/view/action_menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/view/action_menu.c b/src/view/action_menu.c index e6d0ff8..c4f21cd 100644 --- a/src/view/action_menu.c +++ b/src/view/action_menu.c @@ -260,7 +260,7 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, { struct _priv *priv; - if (!ev | !data) + if (!ev || !data) return; priv = data; -- 2.7.4 From 7f759d58f846900767de7f07f3a2032c2bb8dd5d Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 17 Sep 2015 16:40:54 +0900 Subject: [PATCH 13/16] util: remove unused function Change-Id: I1e394f8009203aa18e7504a274aa770c41207e83 Signed-off-by: Minkyu Kang --- include/util/util.h | 1 - src/util/util.c | 14 -------------- 2 files changed, 15 deletions(-) diff --git a/include/util/util.h b/include/util/util.h index 0c88343..1ade043 100644 --- a/include/util/util.h +++ b/include/util/util.h @@ -21,7 +21,6 @@ #include bool util_check_movie_type(const char *str); -void util_set_alpha_color(Evas_Object *obj, int alpha); Evas_Object *util_add_button(Evas_Object *base, const char *style, const char *text); Evas_Object *util_add_box(Evas_Object *base, Eina_Bool horizontal); diff --git a/src/util/util.c b/src/util/util.c index ce91360..3e9c86d 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -33,20 +33,6 @@ bool util_check_movie_type(const char *str) return strcmp(str, VIDEO_COPYRIGHT); } -void util_set_alpha_color(Evas_Object *obj, int alpha) -{ - int r, g, b, a; - - evas_object_color_get(obj, &r, &g, &b, &a); - - /* evas should use premultiplied alpha */ - r = r * alpha / 255; - g = g * alpha / 255; - b = b * alpha / 255; - - evas_object_color_set(obj, r, g, b, alpha); -} - Evas_Object *util_add_button(Evas_Object *base, const char *style, const char *text) { -- 2.7.4 From fd58c1c3e5a976a0d862b8ebd243d3505d33d19a Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 17 Sep 2015 16:44:09 +0900 Subject: [PATCH 14/16] ctxpopup: delete objects when failed to create Change-Id: I826110d2c8dd3f3f725b094c27b024009d104cf7 Signed-off-by: Minkyu Kang --- src/util/ctxpopup.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/util/ctxpopup.c b/src/util/ctxpopup.c index 34ded20..c70f808 100644 --- a/src/util/ctxpopup.c +++ b/src/util/ctxpopup.c @@ -148,6 +148,8 @@ struct ctxpopup *ctxpopup_create(Evas_Object *base, const char *ctxpopup_style, box = util_add_box(ctxpopup, EINA_FALSE); if (!box) { _ERR("failed to add box"); + evas_object_del(ctxpopup); + free(m); return false; } @@ -158,6 +160,7 @@ struct ctxpopup *ctxpopup_create(Evas_Object *base, const char *ctxpopup_style, if (!btn) { _ERR("failed to add button"); evas_object_del(ctxpopup); + free(m); return false; } -- 2.7.4 From 094b7a75ddfd27cb0f352a290f7b79dbb6dd9d40 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Thu, 17 Sep 2015 19:48:28 +0900 Subject: [PATCH 15/16] datamgr: add albumdata Change-Id: If2785168188eac4d29a898f30a76188b0a95ce48 Signed-off-by: Jehun Lim --- CMakeLists.txt | 1 + include/data/albumdata.h | 37 ++++ include/data/datamgr.h | 4 +- src/data/albumdata.c | 476 +++++++++++++++++++++++++++++++++++++++++++++++ src/data/datamgr.c | 5 +- 5 files changed, 521 insertions(+), 2 deletions(-) create mode 100644 include/data/albumdata.h create mode 100644 src/data/albumdata.c diff --git a/CMakeLists.txt b/CMakeLists.txt index fff0708..e775fec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,6 +73,7 @@ src/util/playermgr.c src/util/ctxpopup.c src/util/progressbar.c src/data/datamgr.c +src/data/albumdata.c src/data/mediadata.c src/grid/grid_movie.c src/grid/grid_gallery.c diff --git a/include/data/albumdata.h b/include/data/albumdata.h new file mode 100644 index 0000000..6bc7ed2 --- /dev/null +++ b/include/data/albumdata.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _AIR_MEDIAHUB_ALBUMDATA_H__ +#define _AIR_MEDIAHUB_ALBUMDATA_H__ + +struct data_ops; + +enum album_group_type { + E_ALBUM_NAME = 0, + E_ALBUM_ARTIST, + E_ALBUM_MAX +}; + +struct album_info { + int id; + char *name; + char *artist; + char *album_art; +}; + +struct data_ops *albumdata_get_ops(void); + +#endif /* _AIR_MEDIAHUB_ALBUMDATA_H__ */ diff --git a/include/data/datamgr.h b/include/data/datamgr.h index cd017f2..fb87dd5 100644 --- a/include/data/datamgr.h +++ b/include/data/datamgr.h @@ -18,11 +18,13 @@ #define _AIR_MEDIAHUB_DATAMGR_H__ #include "data/mediadata.h" +#include "data/albumdata.h" enum data_type { E_DATA_MEDIA = 0, + E_DATA_ALBUM, E_DATA_MAX - /* Album and folder will be added later */ + /* Folder will be added later */ }; enum source_type { diff --git a/src/data/albumdata.c b/src/data/albumdata.c new file mode 100644 index 0000000..f38622d --- /dev/null +++ b/src/data/albumdata.c @@ -0,0 +1,476 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include "data/datamgr.h" + +struct albumdata; + +typedef bool (*get_album_list)(struct albumdata *ad); +typedef int (*media_compare)(struct group_info *gi, struct album_info *ai); +typedef void *(*media_compare_data_get)(struct album_info *ai); +typedef char *(*group_name_get)(struct album_info *ai); + +static bool _get_name_list(struct albumdata *ad); +static int _compare_name(struct group_info *, struct album_info *); +static void *_get_data_name(struct album_info *); +static char *_get_name(struct album_info *); + +static bool _get_artist_list(struct albumdata *ad); +static int _compare_artist(struct group_info *, struct album_info *); +static void *_get_data_artist(struct album_info *); +static char *_get_artist(struct album_info *); + + +struct albumdata { + Eina_List *album_list; + + const char *media_type; + int source_type; +}; + +struct _group_info { + const char *sort_keyword; + get_album_list get_list; + media_compare media_cmp; + media_compare_data_get data_get; + group_name_get name_get; +}; + +static struct _group_info g_group_info[E_ALBUM_MAX] = { + [E_ALBUM_NAME] = { + .sort_keyword = MEDIA_ALBUM, + .get_list = _get_name_list, + .media_cmp = _compare_name, + .data_get = _get_data_name, + .name_get = _get_name, + }, + [E_ALBUM_ARTIST] = { + .sort_keyword = MEDIA_ALBUM_ARTIST, + .get_list = _get_artist_list, + .media_cmp = _compare_artist, + .data_get = _get_data_artist, + .name_get = _get_artist + }, +}; + +static bool _create_filter(struct albumdata *ad, filter_h *filter, + const char *cond, int group_type) +{ + filter_h tmp_filter; + int ret; + char buf[1024]; + + ret = media_filter_create(&tmp_filter); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to create media filter"); + return false; + } + + snprintf(buf, sizeof(buf), "%s", ad->media_type); + + if (ad->source_type != E_SOURCE_ALL) { + char s1[64]; + + snprintf(s1, sizeof(s1), " AND MEDIA_STORAGE_TYPE=%d", + ad->source_type); + + strcat(buf, s1); + } + + if (cond) { + char s2[64]; + + snprintf(s2, sizeof(s2), " AND %s", cond); + + strcat(buf, s2); + } + + media_filter_set_condition(tmp_filter, buf, + MEDIA_CONTENT_COLLATE_DEFAULT); + + media_filter_set_order(tmp_filter, MEDIA_CONTENT_ORDER_ASC, + g_group_info[group_type].sort_keyword, + MEDIA_CONTENT_COLLATE_DEFAULT); + + *filter = tmp_filter; + + return true; +} + +static int _compare_name(struct group_info *gi, struct album_info *ai) +{ + if (!gi || !gi->data || !ai->name) + return -1; + + return strncasecmp(gi->data, ai->name, 1); +} + +static void *_get_data_name(struct album_info *ai) +{ + if (!ai->name) + return NULL; + + return strdup(ai->name); +} + +static char *_get_name(struct album_info *ai) +{ + if (!ai->name) + return NULL; + + return strndup(ai->name, 1); +} + +static int _compare_artist(struct group_info *gi, struct album_info *ai) +{ + if (!gi || !gi->data || !ai->artist) + return -1; + + return strncasecmp(gi->data, ai->artist, 1); +} + +static void *_get_data_artist(struct album_info *ai) +{ + if (!ai->artist) + return NULL; + + return strdup(ai->artist); +} + +static char *_get_artist(struct album_info *ai) +{ + if (!ai->artist) + return NULL; + + return strndup(ai->artist, 1); +} + +static void _destroy_album_list(Eina_List *list) +{ + struct album_info *ai; + + EINA_LIST_FREE(list, ai) { + free(ai->name); + free(ai->artist); + free(ai->album_art); + + free(ai); + } +} + +static bool _get_each_album_info(media_album_h album, void *data) +{ + Eina_List **list; + struct album_info *ai; + + if (!data) + return false; + + list = data; + + ai = calloc(1, sizeof(*ai)); + if (!ai) { + _ERR("failed to allocate memory"); + return false; + } + + if (media_album_get_album_id(album, &(ai->id)) + != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to fetch album id"); + free(ai); + return false; + } + + if (media_album_get_name(album, &(ai->name)) + != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to fetch album name"); + free(ai); + return false; + } + + if (media_album_get_artist(album, &(ai->artist)) + != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to fetch album artist"); + free(ai); + return false; + } + + if (media_album_get_album_art(album, &(ai->album_art)) + != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to fetch album art"); + free(ai); + return false; + } + + *list = eina_list_append(*list, ai); + + return true; +} + +static bool _get_each_group_info(const char *group_name, void *data) +{ + filter_h filter; + struct albumdata *ad; + int ret; + char buf[1024]; + + if (!data || !group_name) + return false; + + ad = data; + + snprintf(buf, sizeof(buf), "MEDIA_ALBUM_ARTIST=\"%s\"", group_name); + + if (!_create_filter(ad, &filter, buf, E_ALBUM_ARTIST)) { + _ERR("failed to create filter"); + return false; + } + + /* only one album info for the artist */ + media_filter_set_offset(filter, 0, 1); + + ret = media_album_foreach_album_from_db(filter, + _get_each_album_info, &ad->album_list); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to get album info"); + media_filter_destroy(filter); + return false; + } + + media_filter_destroy(filter); + + return true; +} + +static bool _get_name_list(struct albumdata *ad) +{ + filter_h filter; + int ret; + + ret = media_content_connect(); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to connect to media content"); + return false; + } + + if (!_create_filter(ad, &filter, NULL, E_ALBUM_NAME)) { + _ERR("failed to create filter"); + media_content_disconnect(); + return false; + } + + ret = media_album_foreach_album_from_db(filter, + _get_each_album_info, &ad->album_list); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to get album info"); + _destroy_album_list(ad->album_list); + media_filter_destroy(filter); + media_content_disconnect(); + return false; + } + + media_filter_destroy(filter); + media_content_disconnect(); + + return true; +} + +static bool _get_artist_list(struct albumdata *ad) +{ + filter_h filter; + int ret; + + ret = media_content_connect(); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to connect to media content"); + return false; + } + + if (!_create_filter(ad, &filter, NULL, E_ALBUM_ARTIST)) { + _ERR("failed to create filter"); + media_content_disconnect(); + return false; + } + + ret = media_group_foreach_group_from_db(filter, + MEDIA_CONTENT_GROUP_ALBUM_ARTIST, + _get_each_group_info, ad); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to get group info"); + _destroy_album_list(ad->album_list); + media_filter_destroy(filter); + media_content_disconnect(); + return false; + } + + media_filter_destroy(filter); + media_content_disconnect(); + + return true; +} + +static void *_create(const char *media_type, int source_type) +{ + struct albumdata *ad; + + if (!media_type || source_type < 0 || source_type >= E_SOURCE_MAX) { + _ERR("invalid argument"); + return NULL; + } + + ad = calloc(1, sizeof(*ad)); + if (!ad) { + _ERR("failed to allocate ad"); + return NULL; + } + + ad->media_type = media_type; + ad->source_type = source_type; + + return (void *)ad; +} + +static void _destroy(void *handle) +{ + struct albumdata *ad; + + if (!handle) { + _ERR("failed to get albumdata handle"); + return; + } + + ad = handle; + + _destroy_album_list(ad->album_list); + + free(ad); +} + +static Eina_List *_get_list(void *handle) +{ + struct albumdata *ad; + + if (!handle) { + _ERR("failed to get albumdata handle"); + return NULL; + } + + ad = handle; + + return ad->album_list; +} + +static int _get_count(void *handle, int type) +{ + struct albumdata *ad; + + if (!handle) { + _ERR("failed to get albumdata handle"); + return -1; + } + + return eina_list_count(ad->album_list); +} + +static void _free_group_list(Eina_List *list) +{ + Eina_List *l; + struct group_info *gi; + + EINA_LIST_FOREACH(list, l, gi) { + free(gi->name); + free(gi->data); + eina_list_free(gi->list); + + free(gi); + } +} + +static void _free_group(Eina_List *list) +{ + _free_group_list(list); +} + +static Eina_List *_get_group(void *handle, int type) +{ + Eina_List *list, *l; + struct albumdata *ad; + struct group_info *gi; + struct album_info *ai; + + if (!handle) { + _ERR("failed to get albumdata handle"); + return NULL; + } + + if (type < 0 || type >= E_ALBUM_MAX) { + _ERR("invalid argument"); + return NULL; + } + + ad = handle; + + if (ad->album_list) { + _destroy_album_list(ad->album_list); + ad->album_list = NULL; + } + + if (!g_group_info[type].get_list(ad)) { + _ERR("failed to get album list"); + return NULL; + } + + gi = NULL; + list = NULL; + EINA_LIST_FOREACH(ad->album_list, l, ai) { + if (g_group_info[type].media_cmp(gi, ai)) { + gi = calloc(1, sizeof(*gi)); + if (!gi) { + _ERR("failed to create group info"); + _free_group_list(list); + return NULL; + } + + gi->name = g_group_info[type].name_get(ai); + gi->data = g_group_info[type].data_get(ai); + + list = eina_list_append(list, gi); + } + + gi->list = eina_list_append(gi->list, ai); + } + + return list; +} + +static struct data_ops _ops = { + .create = _create, + .destroy = _destroy, + .get_list = _get_list, + .get_count = _get_count, + .get_group = _get_group, + .free_group = _free_group, +}; + +struct data_ops *albumdata_get_ops(void) +{ + return &_ops; +}; + diff --git a/src/data/datamgr.c b/src/data/datamgr.c index ac8a31d..2de137f 100644 --- a/src/data/datamgr.c +++ b/src/data/datamgr.c @@ -28,7 +28,10 @@ struct _type_info { static struct _type_info g_type_info[E_DATA_MAX] = { [E_DATA_MEDIA] = { .func_get_ops = mediadata_get_ops - } + }, + [E_DATA_ALBUM] = { + .func_get_ops = albumdata_get_ops + }, }; struct datamgr *datamgr_create(int data_type, const char *media_type, -- 2.7.4 From 396a961a66d500e29f34d45c02f8ed44df8acf07 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Thu, 17 Sep 2015 19:50:39 +0900 Subject: [PATCH 16/16] music: add album and artist view mode Change-Id: Iacf502689f966ea9f64de1c13dac9b5dabbd6d72 Signed-off-by: Jehun Lim --- include/grid/grid.h | 14 +++++ res/edc/widgets/gengrid.edc | 132 +++++++++++++++++++++++++++++++++----------- src/grid/grid_music.c | 122 +++++++++++++++++++++++++++++++++++++--- src/layout/music.c | 49 ++++++++++++++-- 4 files changed, 271 insertions(+), 46 deletions(-) diff --git a/include/grid/grid.h b/include/grid/grid.h index a03a873..e1fb94e 100644 --- a/include/grid/grid.h +++ b/include/grid/grid.h @@ -89,4 +89,18 @@ struct grid_data *get_music_grid_data(int type); #define MOVIE_GENRE_ITEM_NUM GALLERY_EVENT_ITEM_NUM #define MOVIE_GENRE_GRID_PADDING GALLERY_EVENT_GRID_PADDING +#define STYLE_MUSIC_ALBUM "album_item" +#define MUSIC_ALBUM_ITEM_PADDING 26 +#define MUSIC_ALBUM_ITEM_X (212 + MUSIC_ALBUM_ITEM_PADDING) +#define MUSIC_ALBUM_ITEM_Y (294 + MUSIC_ALBUM_ITEM_PADDING) +#define MUSIC_ALBUM_ITEM_NUM 2 +#define MUSIC_ALBUM_GRID_PADDING (62 - MUSIC_ALBUM_ITEM_PADDING) + +#define STYLE_MUSIC_ARTIST "album_item" +#define MUSIC_ARTIST_ITEM_PADDING MUSIC_ALBUM_ITEM_PADDING +#define MUSIC_ARTIST_ITEM_X MUSIC_ALBUM_ITEM_X +#define MUSIC_ARTIST_ITEM_Y MUSIC_ALBUM_ITEM_Y +#define MUSIC_ARTIST_ITEM_NUM MUSIC_ALBUM_ITEM_NUM +#define MUSIC_ARTIST_GRID_PADDING MUSIC_ALBUM_GRID_PADDING + #endif /* __AIR_MEDIAHUB_GRID_H__ */ diff --git a/res/edc/widgets/gengrid.edc b/res/edc/widgets/gengrid.edc index fb6f153..2b9e6fd 100644 --- a/res/edc/widgets/gengrid.edc +++ b/res/edc/widgets/gengrid.edc @@ -15,14 +15,11 @@ */ group { - name: "elm/gengrid/item/movie_item/default"; + name: "elm/gengrid/item/album_item/default"; data.item: "selectraise" "on"; data.item: "texts" "elm.text.title"; - data.item: "contents" "elm.swallow.thumbnail elm.swallow.favorite elm.swallow.textbg"; + data.item: "contents" "elm.swallow.thumbnail elm.swallow.textbg"; data.item: "focus_highlight" "on"; - images { - image: IMAGE_PREVIEW_PLAY COMP; - } parts { part { name: "elm.padding.bottom_right"; @@ -111,34 +108,6 @@ group { } } part { - name: "default_image"; - type: IMAGE; - scale: 1; - description { - state: "default" 0.0; - rel1 { - to: "defaultbg"; - relative: 0.5 0.5; - } - rel2 { - to: "defaultbg"; - relative: 0.5 0.5; - } - image.normal: IMAGE_PREVIEW_PLAY; - min: 80 80; - fixed: 1 1; - map { - perspective_on: 1; - perspective: "map"; - } - } - description { - state: "selected" 0.0; - inherit: "default" 0.0; - map.on: 1; - } - } - part { name: "padding_favorite"; type: SPACER; scale: 1; @@ -433,6 +402,103 @@ group { name: "focus,in,anim"; action: STATE_SET "selected" 0.0; target: "defaultbg"; + target: PART_ELM_SWALLOW_THUMBNAIL; + target: PART_ELM_SWALLOW_FAVORITE; + target: "part_focus1"; + target: "part_focus2"; + target: "part_focus3"; + target: "defaultbg_text"; + transition: TRANSITION_FOCUS; + } + program { + name: "go_passive"; + signal: "elm,state,unfocused"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: PART_ELM_TEXT_TITLE; + after: "focus,out,anim"; + } + program { + name: "focus,out,anim"; + action: STATE_SET "selected_0" 0.0; + target: "part_focus1"; + target: "part_focus2"; + target: "part_focus3"; + target: "defaultbg_text"; + transition: TRANSITION_FOCUS; + after: "focus,out,anim,2"; + } + program { + name: "focus,out,anim,2"; + action: STATE_SET "default" 0.0; + target: PART_ELM_SWALLOW_THUMBNAIL; + target: PART_ELM_SWALLOW_FAVORITE; + target: "defaultbg"; + target: "part_focus1"; + target: "part_focus2"; + target: "part_focus3"; + target: "defaultbg_text"; + } + } +} + +group { + name: "elm/gengrid/item/movie_item/default"; + inherit: "elm/gengrid/item/album_item/default"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text.title"; + data.item: "contents" "elm.swallow.thumbnail elm.swallow.favorite elm.swallow.textbg"; + data.item: "focus_highlight" "on"; + images { + image: IMAGE_PREVIEW_PLAY COMP; + } + parts { + part { + name: "default_image"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "defaultbg"; + relative: 0.5 0.5; + } + rel2 { + to: "defaultbg"; + relative: 0.5 0.5; + } + image.normal: IMAGE_PREVIEW_PLAY; + min: 80 80; + fixed: 1 1; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + } + } + } + programs { + program { + name: "go_active"; + signal: "elm,state,focused"; + source: "elm"; + action: STATE_SET "selected_0" 0.0; + target: "part_focus1"; + target: "part_focus2"; + target: "part_focus3"; + target: "defaultbg_text"; + target: PART_ELM_TEXT_TITLE; + after: "focus,in,anim"; + } + program { + name: "focus,in,anim"; + action: STATE_SET "selected" 0.0; + target: "defaultbg"; target: "default_image"; target: PART_ELM_SWALLOW_THUMBNAIL; target: PART_ELM_SWALLOW_FAVORITE; diff --git a/src/grid/grid_music.c b/src/grid/grid_music.c index 7ef538f..dcdc70e 100644 --- a/src/grid/grid_music.c +++ b/src/grid/grid_music.c @@ -29,7 +29,7 @@ #include "grid/grid.h" #include "util/util.h" -static char *_grid_text_get(void *data, Evas_Object *obj, const char *part) +static char *_media_text_get(void *data, Evas_Object *obj, const char *part) { app_media *am; app_media_info *info; @@ -55,7 +55,7 @@ static char *_grid_text_get(void *data, Evas_Object *obj, const char *part) return NULL; } -static Evas_Object *_grid_content_get(void *data, +static Evas_Object *_media_content_get(void *data, Evas_Object *obj, const char *part) { Evas_Object *eo; @@ -97,7 +97,67 @@ static Evas_Object *_grid_content_get(void *data, return eo; } -static Eina_List *_get_item_list(struct datamgr *dmgr) +static char *_album_text_get(void *data, Evas_Object *obj, const char *part) +{ + struct album_info *ai; + + if (!data) + return NULL; + + ai = data; + + return strdup(ai->name); +} + +static char *_artist_text_get(void *data, Evas_Object *obj, const char *part) +{ + struct album_info *ai; + + if (!data) + return NULL; + + ai = data; + + return strdup(ai->artist); +} + +static Evas_Object *_album_content_get(void *data, Evas_Object *obj, + const char *part) +{ + Evas_Object *eo; + struct album_info *ai; + struct color_data bg; + + if (!data) + return NULL; + + ai = data; + + eo = NULL; + if (!strcmp(part, PART_ELM_SWALLOW_THUMBNAIL)) { + eo = util_add_image(obj, ai->album_art); + if (!eo) { + _ERR("failed to create image object"); + return NULL; + } + } else if (!strcmp(part, PART_ELM_SWALLOW_TEXTBG)) { + eo = evas_object_rectangle_add(obj); + if (!eo) { + _ERR("failed to create rectangle object"); + return NULL; + } + + app_contents_get_color(ai->name, NULL, &bg); + evas_object_color_set(eo, bg.r, bg.g, bg.b, bg.a); + } + + if (eo) + evas_object_show(eo); + + return eo; +} + +static Eina_List *_get_song_list(struct datamgr *dmgr) { if (!dmgr) { _ERR("invalid argument"); @@ -107,6 +167,26 @@ static Eina_List *_get_item_list(struct datamgr *dmgr) return dmgr->ops->get_group(dmgr->handle, E_MEDIA_NAME); } +static Eina_List *_get_album_list(struct datamgr *dmgr) +{ + if (!dmgr) { + _ERR("invalid argument"); + return NULL; + } + + return dmgr->ops->get_group(dmgr->handle, E_ALBUM_NAME); +} + +static Eina_List *_get_artist_list(struct datamgr *dmgr) +{ + if (!dmgr) { + _ERR("invalid argument"); + return NULL; + } + + return dmgr->ops->get_group(dmgr->handle, E_ALBUM_ARTIST); +} + static void _free_item_list(struct datamgr *dmgr, Eina_List *list) { if (!dmgr) { @@ -176,8 +256,18 @@ static void _selected_cb(void *data, Elm_Object_Item *it) static struct grid_class _gclass[] = { [E_MUSIC_SONG] = { .item_style = STYLE_MUSIC_SONG, - .text_get = _grid_text_get, - .content_get = _grid_content_get + .text_get = _media_text_get, + .content_get = _media_content_get + }, + [E_MUSIC_ALBUM] = { + .item_style = STYLE_MUSIC_ALBUM, + .text_get = _album_text_get, + .content_get = _album_content_get + }, + [E_MUSIC_ARTIST] = { + .item_style = STYLE_MUSIC_ARTIST, + .text_get = _artist_text_get, + .content_get = _album_content_get }, /* Other view mode class will be added later */ }; @@ -189,11 +279,29 @@ static struct grid_data _gdata[] = { .item_num = MUSIC_SONG_ITEM_NUM, .grid_padding = MUSIC_SONG_GRID_PADDING, .gclass = &_gclass[E_MUSIC_SONG], - .get_item_list = _get_item_list, + .get_item_list = _get_song_list, .free_item_list = _free_item_list, .key_down_cb = _key_down_cb, .selected_cb = _selected_cb }, + [E_MUSIC_ALBUM] = { + .item_x = MUSIC_ALBUM_ITEM_X, + .item_y = MUSIC_ALBUM_ITEM_Y, + .item_num = MUSIC_ALBUM_ITEM_NUM, + .grid_padding = MUSIC_ALBUM_GRID_PADDING, + .gclass = &_gclass[E_MUSIC_ALBUM], + .get_item_list = _get_album_list, + .free_item_list = _free_item_list, + }, + [E_MUSIC_ARTIST] = { + .item_x = MUSIC_ARTIST_ITEM_X, + .item_y = MUSIC_ARTIST_ITEM_Y, + .item_num = MUSIC_ARTIST_ITEM_NUM, + .grid_padding = MUSIC_ARTIST_GRID_PADDING, + .gclass = &_gclass[E_MUSIC_ARTIST], + .get_item_list = _get_artist_list, + .free_item_list = _free_item_list, + }, /* Other view mode data will be added later */ }; @@ -204,5 +312,5 @@ struct grid_data *get_music_grid_data(int type) return NULL; } - return &_gdata[E_MUSIC_SONG]; + return &_gdata[type]; } diff --git a/src/layout/music.c b/src/layout/music.c index ad68f86..8c23511 100644 --- a/src/layout/music.c +++ b/src/layout/music.c @@ -258,13 +258,33 @@ err: return NULL; } +static struct datamgr *_get_datamgr(struct _priv *priv) +{ + struct datamgr *dmgr; + + switch (priv->view_mode) { + case E_MUSIC_SONG: + dmgr = priv->dmgr[E_DATA_MEDIA]; + break; + case E_MUSIC_ALBUM: + case E_MUSIC_ARTIST: + dmgr = priv->dmgr[E_DATA_ALBUM]; + break; + default: + dmgr = NULL; + break; + } + + return dmgr; +} + static void _update_content_info(struct _priv *priv) { struct datamgr *dmgr; int count; char buf[128]; - dmgr = priv->dmgr[E_DATA_MEDIA]; + dmgr = _get_datamgr(priv); if (!dmgr) return; @@ -281,9 +301,14 @@ static void _update_content_info(struct _priv *priv) static void _clear_content_list(struct _priv *priv) { + struct datamgr *dmgr; + if (priv->media_list) { - priv->gdata->free_item_list(priv->dmgr[E_DATA_MEDIA], - priv->media_list); + dmgr = _get_datamgr(priv); + if (!dmgr) + return; + + priv->gdata->free_item_list(dmgr, priv->media_list); priv->media_list = NULL; } @@ -293,6 +318,7 @@ static void _clear_content_list(struct _priv *priv) static void _update_content_list(struct _priv *priv) { Eina_List *list; + struct datamgr *dmgr; if (priv->media_list) { _update_content_info(priv); @@ -301,14 +327,18 @@ static void _update_content_list(struct _priv *priv) priv->gdata = get_music_grid_data(priv->view_mode); - list = priv->gdata->get_item_list(priv->dmgr[E_DATA_MEDIA]); + dmgr = _get_datamgr(priv); + if (!dmgr) + return; + + list = priv->gdata->get_item_list(dmgr); if (!list) { elm_object_part_text_set(priv->layout, PART_NOCONTENT, TEXT_NOCONTENT); return; } - priv->gdata->data = priv->dmgr[E_DATA_MEDIA]; + priv->gdata->data = dmgr; if (!listmgr_update_content_list(priv->listmgr, list, priv->gdata)) _ERR("failed to update list area"); @@ -507,6 +537,7 @@ err: static void _destroy(void *layout_data) { struct _priv *priv; + struct datamgr *dmgr; if (!layout_data) { _ERR("failed to get layout data"); @@ -515,7 +546,9 @@ static void _destroy(void *layout_data) priv = layout_data; - priv->gdata->free_item_list(priv->dmgr[E_DATA_MEDIA], priv->media_list); + dmgr = _get_datamgr(priv); + + priv->gdata->free_item_list(dmgr, priv->media_list); _destroy_utils(priv); @@ -611,6 +644,10 @@ static void _update(void *layout_data, int update_type, void *data) vdata = data; mode = vdata->index; + /* Genre and folder view mode will be implemented later. */ + if (mode == E_MUSIC_GENRE || mode == E_MUSIC_FOLDER) + return; + if (mode == priv->view_mode) return; -- 2.7.4