From 33400fcb832c50ed90dae9894b6eb0cf5f25e557 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Mon, 27 Jul 2015 19:28:17 +0900 Subject: [PATCH 01/16] viewer: don't animate the focus event when view is changed Change-Id: Iad50906879d27bea1fa1e17a3493c08bafbbb37f Signed-off-by: Minkyu Kang --- include/util/controller.h | 1 + include/view/viewer.h | 2 ++ res/edc/widgets/button.edc | 16 ++++++++++++++++ src/util/controller.c | 15 +++++++++++++++ src/view/viewer.c | 10 ++++++++++ 5 files changed, 44 insertions(+) diff --git a/include/util/controller.h b/include/util/controller.h index babe7b5..2e01220 100644 --- a/include/util/controller.h +++ b/include/util/controller.h @@ -31,6 +31,7 @@ struct controller_ops { void (*focus)(void *handle, int loc, bool foc); void (*signal)(void *handle, int loc, const char *signal); Evas_Object *(*get_object)(void *handle, int loc); + int (*get_count)(void *handle); }; struct controller { diff --git a/include/view/viewer.h b/include/view/viewer.h index 7b1dbb5..47307dc 100644 --- a/include/view/viewer.h +++ b/include/view/viewer.h @@ -46,6 +46,8 @@ #define SIG_SHOWED_BAR "showed,bar" #define SIG_VIEWER_SHOW_FAV "show,favorite" #define SIG_VIEWER_HIDE_FAV "hide,favorite" +#define SIG_SET_FOCUS "set,focus" +#define SIG_SET_UNFOCUS "set,unfocus" /* source */ #define SRC_BTN_PREV "prev" diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index 114f813..babddba 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -476,6 +476,22 @@ group { target: "color"; transition: TRANSITION_FOCUS; } + program { + name: SIG_SET_FOCUS; + signal: SIG_SET_FOCUS; + source: ""; + action: STATE_SET "selected" 0.0; + target: "bg"; + target: "color"; + } + program { + name: SIG_SET_UNFOCUS; + signal: SIG_SET_UNFOCUS; + source: ""; + action: STATE_SET "selected" 0.0; + target: "bg"; + target: "color"; + } } } diff --git a/src/util/controller.c b/src/util/controller.c index 0e1c03c..7abc684 100644 --- a/src/util/controller.c +++ b/src/util/controller.c @@ -287,6 +287,20 @@ static Evas_Object *_get_object(void *handle, int loc) return ctl->obj; } +static int _get_count(void *handle) +{ + struct _priv *p; + + if (!handle) { + _ERR("invalid parameter"); + return 0; + } + + p = handle; + + return eina_list_count(p->list); +} + static struct controller_ops _operations = { .add_control = _add_control, .add_callback = _add_callback, @@ -297,6 +311,7 @@ static struct controller_ops _operations = { .show = _show, .hide = _hide, .get_object = _get_object, + .get_count = _get_count, }; struct controller *controller_create(Evas_Object *base) diff --git a/src/view/viewer.c b/src/view/viewer.c index 2674c58..f913e09 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -491,6 +491,7 @@ static bool _viewer_show(struct _priv *priv) } break; } + ctl->ops->signal(ctl->handle, loc, SIG_SET_FOCUS); ctl->ops->focus(ctl->handle, loc, true); _draw_title_bar(priv, id, mi); @@ -553,6 +554,10 @@ static bool _viewer_prev(struct _priv *priv) { int total; bool r; + struct controller *ctl; + + ctl = priv->viewer.ctl[priv->viewer.cur]; + ctl->ops->signal(ctl->handle, 0, SIG_SET_UNFOCUS); _viewer_hide(priv); @@ -574,6 +579,11 @@ static bool _viewer_next(struct _priv *priv) { int total; bool r; + struct controller *ctl; + + ctl = priv->viewer.ctl[priv->viewer.cur]; + ctl->ops->signal(ctl->handle, ctl->ops->get_count(ctl->handle) - 1, + SIG_SET_UNFOCUS); _viewer_hide(priv); -- 2.7.4 From df9473d705ac4c859e3b5f3a71534aa55ed13a04 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Mon, 27 Jul 2015 20:42:37 +0900 Subject: [PATCH 02/16] listmgr: check max width of grid Change-Id: Ic8b52f12d40dab1869f2c2c80c1c338cd23d3e84 Signed-off-by: Jehun Lim --- src/util/listmgr.c | 23 +++++++++++++++-------- src/util/util.c | 3 +++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/util/listmgr.c b/src/util/listmgr.c index eb8b820..5ae2f61 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -26,6 +26,8 @@ #include "util/listmgr.h" #include "util/util.h" +#define MAX_GRID_WIDTH 1858 + #define SCROLLER_STEP_SIZE(x) ((x) + 10) enum _object_type { @@ -263,15 +265,19 @@ static Evas_Object *_get_box_first_item(Evas_Object *box) return (Evas_Object *)eina_list_nth(list, 0); } -static int _get_grid_size(int count, int num_item) +static int _get_grid_width(int count, int num_item, int item_x) { - int size; + int num_col, width; - size = count / num_item; + num_col = count / num_item; if (count % num_item > 0) - size++; + num_col++; + + width = num_col * item_x; + if (width > MAX_GRID_WIDTH) + width = MAX_GRID_WIDTH; - return size; + return width; } static bool _draw_play_info(struct listmgr *lmgr) @@ -318,7 +324,7 @@ static Evas_Object *_draw_list_item(struct listmgr *lmgr, struct group_info *gi) { Evas_Object *ly, *btn, *grid; struct listmgr_data *data; - int size; + int width; char buf[128]; data = lmgr->data; @@ -361,9 +367,10 @@ static Evas_Object *_draw_list_item(struct listmgr *lmgr, struct group_info *gi) return NULL; } - size = _get_grid_size(eina_list_count(gi->list), data->grid_num_item); + width = _get_grid_width(eina_list_count(gi->list), data->grid_num_item, + data->grid_item_x); - evas_object_size_hint_min_set(grid, size * data->grid_item_x, + evas_object_size_hint_min_set(grid, width, data->grid_num_item * data->grid_item_y); elm_object_focus_next_object_set(grid, btn, ELM_FOCUS_UP); diff --git a/src/util/util.c b/src/util/util.c index 28f6f0d..c325b4d 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -69,6 +69,9 @@ Evas_Object *util_add_gengrid(Evas_Object *base, elm_config_scale_get() * item_size_x, elm_config_scale_get() * item_size_y); + elm_scroller_policy_set(grid, ELM_SCROLLER_POLICY_OFF, + ELM_SCROLLER_POLICY_OFF); + return grid; } -- 2.7.4 From 7b48a0b1f88222530d9a746cf2c87566cffbe1dd Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 28 Jul 2015 17:54:46 +0900 Subject: [PATCH 03/16] support pause/resume the application Change-Id: I4ff3613332fd5c5494529f4194487ef5a96a04a8 Signed-off-by: Minkyu Kang --- include/view.h | 3 ++- src/layout/gallery.c | 4 ++++ src/layout/movie.c | 4 ++++ src/layout/music.c | 4 ++++ src/main.c | 4 ++-- src/util/progressbar.c | 3 +++ src/view/base.c | 30 ++++++++++++++++++++++++++++++ src/view/mplayer.c | 21 ++++++++++++++++++--- src/view/viewer.c | 31 +++++++++++++++++++++++++------ 9 files changed, 92 insertions(+), 12 deletions(-) diff --git a/include/view.h b/include/view.h index c6e85a1..ad62dd6 100644 --- a/include/view.h +++ b/include/view.h @@ -37,7 +37,8 @@ enum update_type { UPDATE_CONTENT = 0, UPDATE_FOCUS, UPDATE_PLAY_INFO, - UPDATE_PLAYER + UPDATE_PLAYER, + UPDATE_RESUME, }; #endif /* __AIR_MEDIAHUB_VIEW_H__ */ diff --git a/src/layout/gallery.c b/src/layout/gallery.c index edd7268..d1855a2 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -429,6 +429,10 @@ static void _update(void *layout_data, int update_type, void *data) listmgr_focus_content_list(priv->listmgr, vdata->index, update); break; + case UPDATE_RESUME: + listmgr_focus_content_list(priv->listmgr, + priv->cur_index, false); + break; default: break; } diff --git a/src/layout/movie.c b/src/layout/movie.c index 71a04b9..49c30fd 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -605,6 +605,10 @@ static void _update(void *layout_data, int update_type, void *data) listmgr_focus_play_info(priv->listmgr); _update_recent_item(priv, vdata->index); break; + case UPDATE_RESUME: + listmgr_focus_content_list(priv->listmgr, + priv->cur_index, false); + break; default: break; } diff --git a/src/layout/music.c b/src/layout/music.c index 98c7571..49db424 100644 --- a/src/layout/music.c +++ b/src/layout/music.c @@ -571,6 +571,10 @@ static void _update(void *layout_data, int update_type, void *data) case UPDATE_FOCUS: listmgr_focus_play_info(priv->listmgr); break; + case UPDATE_RESUME: + listmgr_focus_content_list(priv->listmgr, + priv->cur_index, false); + break; default: break; } diff --git a/src/main.c b/src/main.c index 7140ece..fd898d2 100644 --- a/src/main.c +++ b/src/main.c @@ -131,12 +131,12 @@ static void _app_control(app_control_h app_control, void *data) static void _pause(void *data) { - + viewmgr_pause(); } static void _resume(void *data) { - + viewmgr_resume(); } int main(int argc, char **argv) diff --git a/src/util/progressbar.c b/src/util/progressbar.c index 3623016..ec1512c 100644 --- a/src/util/progressbar.c +++ b/src/util/progressbar.c @@ -129,6 +129,9 @@ void progressbar_stop(struct progressbar *m) ecore_timer_del(m->timer); m->timer = NULL; + + elm_slider_value_set(m->slider, 0); + _update_progress_info(m, 0); } void progressbar_pause(struct progressbar *m) diff --git a/src/view/base.c b/src/view/base.c index 9e50dd9..cdd62b8 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -39,6 +39,7 @@ struct _priv { layoutmgr *lmgr; int current_layout; + bool showed; }; struct _menu_item { @@ -239,6 +240,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) priv->win = win; priv->base = base; + priv->showed = false; if (!_draw_items(priv)) { _ERR("failed to draw items"); @@ -272,6 +274,7 @@ static void _show(void *view_data) priv = view_data; evas_object_show(priv->base); + priv->showed = true; } static void _hide(void *view_data) @@ -286,6 +289,7 @@ static void _hide(void *view_data) priv = view_data; evas_object_hide(priv->base); + priv->showed = false; } static void _update(void *view_data, int update_type, void *data) @@ -311,6 +315,30 @@ static void _update(void *view_data, int update_type, void *data) update_type, vdata); } +static void _pause(void *view_data) +{ + viewmgr_update_view(VIEW_MPLAYER, UPDATE_PLAYER, NULL); +} + +static void _resume(void *view_data) +{ + struct _priv *priv; + + if (!view_data) { + _ERR("failed to get view data"); + return; + } + + priv = view_data; + + if (!priv->showed) + return; + + layoutmgr_update_layout(priv->lmgr, + g_menu_item[priv->current_layout].layout_id, + UPDATE_RESUME, NULL); +} + static void _destroy(void *view_data) { struct _priv *priv; @@ -343,6 +371,8 @@ static view_class _vclass = { .show = _show, .hide = _hide, .update = _update, + .pause = _pause, + .resume = _resume, .destroy = _destroy, }; diff --git a/src/view/mplayer.c b/src/view/mplayer.c index a981523..24f129d 100644 --- a/src/view/mplayer.c +++ b/src/view/mplayer.c @@ -536,10 +536,10 @@ static void _list_selected(int id, void *data, priv = data; index = elm_genlist_item_index_get(it) - 1; - if (priv->playlist.cur != index) { + if (priv->playlist.cur != index) _mplayer_set_current(priv, index); - _player_play(priv); - } + + _player_play(priv); } static void _list_realized(int id, void *data, @@ -837,6 +837,20 @@ static void _update(void *view_data, int update_type, void *data) } } +static void _pause(void *view_data) +{ + struct _priv *priv; + + if (!view_data) { + _ERR("failed to get view data"); + return; + } + + priv = view_data; + + _player_stop(priv); +} + static void _destroy(void *view_data) { struct _priv *priv; @@ -879,6 +893,7 @@ static view_class _vclass = { .show = _show, .hide = _hide, .update = _update, + .pause = _pause, .destroy = _destroy, }; diff --git a/src/view/viewer.c b/src/view/viewer.c index f913e09..351b82b 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -972,17 +972,35 @@ static void _update(void *view_data, int update_type, void *data) return; } - if (!data) { - _ERR("invalid parameter"); + priv = view_data; + vdata = data; + + switch (update_type) { + case UPDATE_CONTENT: + if (!vdata) + break; + + priv->playlist.list = vdata->list; + priv->playlist.cur = vdata->index; + priv->playlist.dir = DIR_NONE; + break; + default: + break; + } +} + +static void _pause(void *view_data) +{ + struct _priv *priv; + + if (!view_data) { + _ERR("failed to get view data"); return; } priv = view_data; - vdata = data; - priv->playlist.list = vdata->list; - priv->playlist.cur = vdata->index; - priv->playlist.dir = DIR_NONE; + _pop_view(priv); } static void _destroy(void *view_data) @@ -1013,6 +1031,7 @@ static view_class _vclass = { .show = _show, .hide = _hide, .update = _update, + .pause = _pause, .destroy = _destroy, }; -- 2.7.4 From a3e51c1ad65199153745fcfe9f929b2fce7254f5 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 29 Jul 2015 20:57:36 +0900 Subject: [PATCH 04/16] add application icon Change-Id: Ibb7da31e6ae598c91987e9c191047f451c003fe5 Signed-off-by: Minkyu Kang --- CMakeLists.txt | 8 ++++++++ org.tizen.mediahub.png | Bin 0 -> 4379 bytes org.tizen.mediahub.xml.in | 3 ++- packaging/org.tizen.mediahub.spec | 4 ++++ 4 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 org.tizen.mediahub.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 9245e39..e6c18cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,6 +46,12 @@ ENDIF(NOT DEFINED IMAGEDIR) IF(NOT DEFINED PACKAGEDIR) SET(PACKAGEDIR "/usr/share/packages") ENDIF(NOT DEFINED PACKAGEDIR) +IF(NOT DEFINED DESKTOP_ICONDIR) + SET(DESKTOP_ICONDIR "/usr/share/icons") +ENDIF(NOT DEFINED DESKTOP_ICONDIR) +IF(NOT DEFINED DESKTOP_ICON) + SET(DESKTOP_ICON ${PACKAGE_NAME}.png) +ENDIF(NOT DEFINED DESKTOP_ICON) SET(SRCS src/main.c @@ -90,4 +96,6 @@ CONFIGURE_FILE(${PACKAGE_NAME}.xml.in ${PACKAGE_NAME}.xml) INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR}) INSTALL(FILES ${PACKAGE_NAME}.xml DESTINATION ${PACKAGEDIR}) INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/res/images DESTINATION ${RESDIR}) +INSTALL(FILES ${CMAKE_SOURCE_DIR}/${DESKTOP_ICON} DESTINATION ${DESKTOP_ICONDIR}) +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/res/images DESTINATION ${RESDIR}) ADD_SUBDIRECTORY(res/edc) diff --git a/org.tizen.mediahub.png b/org.tizen.mediahub.png new file mode 100644 index 0000000000000000000000000000000000000000..39f839dcf03db6cc9c8f2b96cfb6064a15f8dbd4 GIT binary patch literal 4379 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 V`&>P-#v1?t002ovPDHLkV1g{uBvb$Z literal 0 HcmV?d00001 diff --git a/org.tizen.mediahub.xml.in b/org.tizen.mediahub.xml.in index 1c659b4..eb61bd4 100644 --- a/org.tizen.mediahub.xml.in +++ b/org.tizen.mediahub.xml.in @@ -3,7 +3,8 @@ Jehun Lim Media Hub - + + org.tizen.mediahub.png diff --git a/packaging/org.tizen.mediahub.spec b/packaging/org.tizen.mediahub.spec index 969283d..ddeabd9 100644 --- a/packaging/org.tizen.mediahub.spec +++ b/packaging/org.tizen.mediahub.spec @@ -18,6 +18,7 @@ BuildRequires: pkgconfig(app-utils) %define _resdir %{_appdir}/res %define _localedir %{_resdir}/locale %define _pkgdir %{_datadir}/packages +%define _desktop_icondir /usr/share/icons %description Media Hub Application @@ -33,6 +34,8 @@ cmake \ -DBINDIR=%{_bindir} \ -DLOCALEDIR=%{_localedir} \ -DPACKAGEDIR=%{_pkgdir} \ + -DDESKTOP_ICONDIR=%{_desktop_icondir} \ + -DDESKTOP_ICON=%{name}.png \ -DVERSION=%{version} make %{?jobs:-j%jobs} @@ -49,4 +52,5 @@ rm -rf %{buildroot} %{_bindir}/* %{_resdir}/* %{_pkgdir}/%{name}.xml +%{_desktop_icondir}/%{name}.png %defattr(-,app,app,-) -- 2.7.4 From d8e62031073b2a3a2c9b3aedb15ec2cfdc2709fb Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 30 Jul 2015 13:31:47 +0900 Subject: [PATCH 05/16] enable/disable inputmgr Change-Id: I924e28080016b89a592fb05c1d6c396598277258 Signed-off-by: Minkyu Kang --- src/main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main.c b/src/main.c index fd898d2..0903192 100644 --- a/src/main.c +++ b/src/main.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "define.h" #include "view.h" @@ -131,11 +132,13 @@ static void _app_control(app_control_h app_control, void *data) static void _pause(void *data) { + inputmgr_enable(EINA_FALSE); viewmgr_pause(); } static void _resume(void *data) { + inputmgr_enable(EINA_TRUE); viewmgr_resume(); } -- 2.7.4 From 69f49ca6cc0974614d6a48fb85ccdc34496c7097 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 30 Jul 2015 14:26:55 +0900 Subject: [PATCH 06/16] fix to use evas_object_color_set This patch will fix this error. ERR<4041>:evas_main lib/evas/canvas/evas_object_main.c:1418 _evas_object_efl_gfx_base_color_set() Evas only handles pre multiplied colors! Change-Id: I97259f51e587dbabb97e9292cf9bf007b1cd887e Signed-off-by: Minkyu Kang --- include/util/util.h | 1 + src/layout/gallery.c | 5 +---- src/layout/movie.c | 5 +---- src/util/util.c | 14 ++++++++++++++ 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/include/util/util.h b/include/util/util.h index 3ee45ae..01977ef 100644 --- a/include/util/util.h +++ b/include/util/util.h @@ -20,6 +20,7 @@ #include #include +void util_set_alpha_color(Evas_Object *obj, int alpha); Evas_Object *util_add_box(Evas_Object *base); Evas_Object *util_add_gengrid(Evas_Object *base, int item_size_x, int item_size_y); diff --git a/src/layout/gallery.c b/src/layout/gallery.c index d1855a2..41ec2c4 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -128,8 +128,6 @@ static Evas_Object *_grid_content_get(void *data, evas_object_show(image); } } else if (!strcmp(part, PART_ELM_SWALLOW_FAVORITE)) { - int r, g, b, a; - if (!info->favorite) return NULL; @@ -139,8 +137,7 @@ static Evas_Object *_grid_content_get(void *data, return NULL; } - evas_object_color_get(image, &r, &g, &b, &a); - evas_object_color_set(image, r, g, b, IMAGE_FAVORITE_ALPHA); + util_set_alpha_color(image, IMAGE_FAVORITE_ALPHA); evas_object_show(image); } diff --git a/src/layout/movie.c b/src/layout/movie.c index 49c30fd..bfab4cf 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -114,8 +114,6 @@ static Evas_Object *_grid_content_get(void *data, evas_object_show(image); } else if (!strcmp(part, PART_ELM_SWALLOW_FAVORITE)) { - int r, g, b, a; - if (!info->favorite) return NULL; @@ -125,8 +123,7 @@ static Evas_Object *_grid_content_get(void *data, return NULL; } - evas_object_color_get(image, &r, &g, &b, &a); - evas_object_color_set(image, r, g, b, IMAGE_FAVORITE_ALPHA); + util_set_alpha_color(image, IMAGE_FAVORITE_ALPHA); evas_object_show(image); } diff --git a/src/util/util.c b/src/util/util.c index c325b4d..a7c1d8e 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -20,6 +20,20 @@ #include "util/util.h" +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_box(Evas_Object *base) { Evas_Object *box; -- 2.7.4 From 1ff9216f47d7a42301ce6d6d9efea0550f3251e6 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 30 Jul 2015 18:37:30 +0900 Subject: [PATCH 07/16] playermgr: make event loop for getting player callback Since callback of player is called from another thread, we can't use efl object that is made from main thread. (EFL can't guarantee thread safe) The main thread check the events list(for callback) periodically, and call real callback when get the events. Change-Id: Ia24754c78ad5dd751e174e6c69273ec35aaea652 Signed-off-by: Minkyu Kang --- include/util/progressbar.h | 1 - src/util/playermgr.c | 78 +++++++++++++++++++++++++++++++++++++++++++++- src/util/progressbar.c | 24 -------------- src/view/mplayer.c | 8 ++++- src/view/viewer.c | 8 ++++- 5 files changed, 91 insertions(+), 28 deletions(-) diff --git a/include/util/progressbar.h b/include/util/progressbar.h index b788a3c..884761e 100644 --- a/include/util/progressbar.h +++ b/include/util/progressbar.h @@ -22,7 +22,6 @@ struct progressbar; struct progressbar_ops { int (*get_value)(void *data); int (*set_value)(void *data); - void (*complete_cb)(void *data); }; enum progressbar_time_format { diff --git a/src/util/playermgr.c b/src/util/playermgr.c index 4cd046a..320ceb7 100644 --- a/src/util/playermgr.c +++ b/src/util/playermgr.c @@ -21,12 +21,72 @@ #include "define.h" +#define EVENT_INTERVAL 0.1 + +struct _player_cb { + void (*func)(void *data); + void *data; +}; + struct playermgr { Evas_Object *win; + Ecore_Timer *event_loop; + Eina_List *cb_list; player_h player; char *path; + struct _player_cb complete_cb; }; +static Eina_Bool _event_cb(void *data) +{ + struct playermgr *m; + struct _player_cb *cb; + Eina_List *l; + + if (!data) + return ECORE_CALLBACK_CANCEL; + + m = data; + + if (!eina_list_count(m->cb_list)) + return ECORE_CALLBACK_RENEW; + + EINA_LIST_FOREACH(m->cb_list, l, cb) { + if (cb && cb->func) + cb->func(cb->data); + } + + m->cb_list = eina_list_free(m->cb_list); + + return ECORE_CALLBACK_RENEW; +} + +static void _event_loop_stop(struct playermgr *m) +{ + ecore_timer_del(m->event_loop); + m->event_loop = NULL; +} + +static void _event_loop_start(struct playermgr *m) +{ + if (m->event_loop) + ecore_timer_reset(m->event_loop); + else + m->event_loop = ecore_timer_add(EVENT_INTERVAL, _event_cb, m); +} + +static void _player_complete_cb(void *data) +{ + struct playermgr *m; + + if (!data) + return; + + m = data; + + m->cb_list = eina_list_append(m->cb_list, &m->complete_cb); +} + static void _set_path(struct playermgr *m, const char *path) { free(m->path); @@ -137,9 +197,12 @@ bool playermgr_pause(struct playermgr *m) r = player_pause(m->player); if (r != PLAYER_ERROR_NONE) { _ERR("player: pause error (%d)", r); + _event_loop_stop(m); return false; } + _event_loop_stop(m); + return true; } @@ -163,6 +226,8 @@ bool playermgr_resume(struct playermgr *m) return false; } + _event_loop_start(m); + return true; } @@ -178,6 +243,7 @@ void playermgr_stop(struct playermgr *m) player_unprepare(m->player); _set_path(m, NULL); + _event_loop_stop(m); } bool playermgr_play(struct playermgr *m, const char *path, int ms) @@ -235,6 +301,8 @@ bool playermgr_play(struct playermgr *m, const char *path, int ms) } } + _event_loop_start(m); + return true; } @@ -243,12 +311,15 @@ bool playermgr_set_completed_cb(struct playermgr *m, { int r; - r = player_set_completed_cb(m->player, cb, data); + r = player_set_completed_cb(m->player, _player_complete_cb, m); if (r != PLAYER_ERROR_NONE) { _ERR("player: set callback error (%d)", r); return false; } + m->complete_cb.func = cb; + m->complete_cb.data = data; + return true; } @@ -272,6 +343,7 @@ struct playermgr *playermgr_create(Evas_Object *win) m->win = win; m->path = NULL; + m->event_loop = NULL; return m; } @@ -283,6 +355,10 @@ void playermgr_destroy(struct playermgr *m) return; } + _event_loop_stop(m); + + eina_list_free(m->cb_list); + if (m->player) { playermgr_stop(m); player_destroy(m->player); diff --git a/src/util/progressbar.c b/src/util/progressbar.c index ec1512c..ec38fda 100644 --- a/src/util/progressbar.c +++ b/src/util/progressbar.c @@ -26,8 +26,6 @@ #define SLIDER_STEP 0.03 #define PROGRESSBAR_INTERVAL 0.1 -#define COMPLETE_INTERVAL 1.0 -#define COMPLETE_BUFFER 500 struct progressbar { Evas_Object *base; @@ -67,21 +65,6 @@ static void _update_time_info(struct progressbar *m, int position, int duration) _update_progress_info(m, position); } -static Eina_Bool _complete_cb(void *data) -{ - struct progressbar *m; - - if (!data) - return ECORE_CALLBACK_CANCEL; - - m = data; - - if (m->ops->complete_cb) - m->ops->complete_cb(m->ops_data); - - return ECORE_CALLBACK_CANCEL; -} - static Eina_Bool _timer_cb(void *data) { struct progressbar *m; @@ -97,13 +80,6 @@ static Eina_Bool _timer_cb(void *data) elm_slider_value_set(m->slider, position); _update_progress_info(m, position); - if (position + COMPLETE_BUFFER > m->duration) { - ecore_timer_add(COMPLETE_INTERVAL, _complete_cb, m); - m->timer = NULL; - - return ECORE_CALLBACK_CANCEL; - } - return ECORE_CALLBACK_RENEW; } diff --git a/src/view/mplayer.c b/src/view/mplayer.c index 24f129d..3f3f9d5 100644 --- a/src/view/mplayer.c +++ b/src/view/mplayer.c @@ -416,7 +416,6 @@ static void _player_complete_cb(void *data) static struct progressbar_ops _progressbar_ops = { .get_value = _player_get_position, - .complete_cb = _player_complete_cb, }; static void _callback_music(void *data, const char *ev) @@ -751,6 +750,13 @@ static Evas_Object *_create(Evas_Object *win, void *data) return NULL; } + r = playermgr_set_completed_cb(player, _player_complete_cb, priv); + if (!r) { + _ERR("failed to set callback"); + playermgr_destroy(player); + return NULL; + } + priv->player = player; r = _ui_init(priv); diff --git a/src/view/viewer.c b/src/view/viewer.c index 351b82b..1d658fa 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -768,7 +768,6 @@ static void _player_complete_cb(void *data) static struct progressbar_ops _progressbar_ops = { .get_value = _player_get_position, - .complete_cb = _player_complete_cb, }; static void _callback_movie(void *data, const char *ev) @@ -908,6 +907,13 @@ static Evas_Object *_create(Evas_Object *win, void *data) return NULL; } + r = playermgr_set_completed_cb(player, _player_complete_cb, priv); + if (!r) { + _ERR("failed to set callback"); + playermgr_destroy(player); + return NULL; + } + priv->player = player; r = _ui_init(priv); -- 2.7.4 From 9cdfc35c2ed5f41c31fc613d7eef8b8e55af5b76 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 30 Jul 2015 22:48:49 +0900 Subject: [PATCH 08/16] base: remove showed variable viewmgr do not call resume when hided, this value is unnecessary. Change-Id: If85e4a35c9728d744667afb7eb845c654b80ea46 Signed-off-by: Minkyu Kang --- src/view/base.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/view/base.c b/src/view/base.c index cdd62b8..b5204ed 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -39,7 +39,6 @@ struct _priv { layoutmgr *lmgr; int current_layout; - bool showed; }; struct _menu_item { @@ -240,7 +239,6 @@ static Evas_Object *_create(Evas_Object *win, void *data) priv->win = win; priv->base = base; - priv->showed = false; if (!_draw_items(priv)) { _ERR("failed to draw items"); @@ -274,7 +272,6 @@ static void _show(void *view_data) priv = view_data; evas_object_show(priv->base); - priv->showed = true; } static void _hide(void *view_data) @@ -289,7 +286,6 @@ static void _hide(void *view_data) priv = view_data; evas_object_hide(priv->base); - priv->showed = false; } static void _update(void *view_data, int update_type, void *data) @@ -331,9 +327,6 @@ static void _resume(void *view_data) priv = view_data; - if (!priv->showed) - return; - layoutmgr_update_layout(priv->lmgr, g_menu_item[priv->current_layout].layout_id, UPDATE_RESUME, NULL); -- 2.7.4 From 9d69f6ec515cce84d2134e22d2481d442d4ce574 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Fri, 31 Jul 2015 10:25:22 +0900 Subject: [PATCH 09/16] mplayer: use viewmgr_get_view_state function Change-Id: I13792b8e703ac0a347ea01bda161c0b7b53cfda8 Signed-off-by: Minkyu Kang --- src/view/mplayer.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/view/mplayer.c b/src/view/mplayer.c index 3f3f9d5..5090190 100644 --- a/src/view/mplayer.c +++ b/src/view/mplayer.c @@ -59,8 +59,6 @@ struct _priv { struct playermgr *player; struct progressbar *progress; struct controller *ctl; - - bool bar_show; }; struct _btn_info { @@ -199,7 +197,7 @@ static void _mplayer_show(struct _priv *priv) return; } - if (!priv->bar_show) { + if (viewmgr_get_view_state(VIEW_MPLAYER) != VIEW_STATE_VISIBLE) { _update_info(priv, mi); return; } @@ -698,7 +696,6 @@ static bool _ui_init(struct _priv *priv) inputmgr_add_callback(obj, 0, &_list_handler, priv); priv->list = obj; - priv->bar_show = false; return true; @@ -784,7 +781,6 @@ static void _show(void *view_data) media_content_connect(); - priv->bar_show = true; _mplayer_show(priv); _list_set_focus(priv); @@ -805,7 +801,6 @@ static void _hide(void *view_data) priv = view_data; _mplayer_hide(priv); - priv->bar_show = false; media_content_disconnect(); -- 2.7.4 From 9f19dd585a2d70cfae35e553bd3f066701e4ed5c Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Sun, 2 Aug 2015 16:23:13 +0900 Subject: [PATCH 10/16] remove transition effect for click Change-Id: I2cc3e1fedd90ec440b0bc956cc24ad8f056ea8c0 Signed-off-by: Minkyu Kang --- include/define.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/define.h b/include/define.h index 077b1c6..78fab27 100644 --- a/include/define.h +++ b/include/define.h @@ -76,7 +76,7 @@ /* transition */ #define TRANSITION_FOCUS DECELERATE 0.20 -#define TRANSITION_CLICK DECELERATE 0.20 +#define TRANSITION_CLICK DECELERATE 0 #define TRANSITION_SHOW_BAR LINEAR 0.20 #define TRANSITION_SHOW_ICON LINEAR 0.35 -- 2.7.4 From 891e97f51ffa39fdbd9cb2071c1234334e79cdbf Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Sun, 2 Aug 2015 17:36:41 +0900 Subject: [PATCH 11/16] medialist: don't make folder list Change-Id: I749134a76f62687d64ae14310d9cfaa694c84a9f Signed-off-by: Minkyu Kang --- src/data/mediadata.c | 91 +++------------------------------------------------- 1 file changed, 5 insertions(+), 86 deletions(-) diff --git a/src/data/mediadata.c b/src/data/mediadata.c index cd2cb4e..bfea7c7 100644 --- a/src/data/mediadata.c +++ b/src/data/mediadata.c @@ -41,7 +41,6 @@ enum _filter_type { }; struct mediadata { - Eina_List *folder_list; Eina_List *media_list; int media_count[E_MEDIA_MAX]; @@ -51,8 +50,6 @@ struct _data { const char *media_type; int source_type; int sort_type; - Eina_List *item_list; - Eina_List *folder_list; Eina_List *media_list; }; @@ -246,19 +243,6 @@ static Eina_List *_sort_list(Eina_List *list, int sort) return sorted_list; } -static void _destroy_folderlist(Eina_List *list) -{ - struct group_info *gi; - app_media *am; - - EINA_LIST_FREE(list, gi) { - free(gi->name); - EINA_LIST_FREE(gi->list, am) - app_media_destroy(am); - free(gi); - } -} - static bool _get_each_media_info(media_info_h media_h, void *dt) { app_media *am; @@ -275,84 +259,23 @@ static bool _get_each_media_info(media_info_h media_h, void *dt) return false; } - data->item_list = eina_list_append(data->item_list, am); + data->media_list = eina_list_append(data->media_list, am); return true; } -static bool _get_each_folder_info(media_folder_h folder, void *dt) +static bool _get_medialist(struct _data *data) { filter_h filter; - struct _data *data; - struct group_info *gi; int ret; - char *uuid; - - if (!dt) - return false; - - data = dt; - - gi = calloc(1, sizeof(*gi)); - if (!gi) { - _ERR("failed to create folderdata"); - return false; - } - - if (media_folder_get_name(folder, &(gi->name)) - != MEDIA_CONTENT_ERROR_NONE) { - _ERR("Media folder id Fetch error"); - goto err; - } - - if (media_folder_get_folder_id(folder, &uuid) - != MEDIA_CONTENT_ERROR_NONE) { - _ERR("failed to fetch media folder id"); - goto err; - } if (!_create_filter(data, &filter, E_FILTER_MEDIA)) { _ERR("failed to create filter"); - goto err; - } - - ret = media_folder_foreach_media_from_db(uuid, filter, - _get_each_media_info, data); - if (ret != MEDIA_CONTENT_ERROR_NONE) { - _ERR("failed to get media info"); - goto err; - } - - gi->list = eina_list_clone(data->item_list); - data->media_list = eina_list_merge(data->media_list, data->item_list); - data->item_list = NULL; - - data->folder_list = eina_list_append(data->folder_list, gi); - - media_filter_destroy(filter); - free(uuid); - - return true; - -err: - media_filter_destroy(filter); - free(uuid); - _destroy_folderlist(data->folder_list); - return false; -} - -static bool _get_folderlist(struct _data *data) -{ - filter_h filter; - int ret; - - if (!_create_filter(data, &filter, E_FILTER_FOLDER)) { - _ERR("failed to create filter"); return false; } - ret = media_folder_foreach_folder_from_db(filter, - _get_each_folder_info, data); + ret = media_info_foreach_media_from_db(filter, + _get_each_media_info, data); if (ret != MEDIA_CONTENT_ERROR_NONE) { _ERR("failed to get folder info"); media_filter_destroy(filter); @@ -393,11 +316,9 @@ struct mediadata *mediadata_create(const char *media_type, data.media_type = media_type; data.source_type = source_type; data.sort_type = sort_type; - data.item_list = NULL; - data.folder_list = NULL; data.media_list = NULL; - if (!_get_folderlist(&data)) { + if (!_get_medialist(&data)) { _ERR("failed to get folderlist"); free(md); media_content_disconnect(); @@ -406,7 +327,6 @@ struct mediadata *mediadata_create(const char *media_type, media_content_disconnect(); - md->folder_list = data.folder_list; md->media_list = _sort_list(data.media_list, data.sort_type); return md; @@ -419,7 +339,6 @@ void mediadata_destroy(struct mediadata *md) return; } - _destroy_folderlist(md->folder_list); eina_list_free(md->media_list); } -- 2.7.4 From 1bd3506a57bcb9e37329406f36f8e0553d5248f0 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 4 Aug 2015 17:12:09 +0900 Subject: [PATCH 12/16] mplyaer: add favorite icon at list Change-Id: Ie6d5a2e6f330e2d27a3241225f66596e8ad4544b Signed-off-by: Minkyu Kang --- include/define.h | 1 + include/view/mplayer.h | 1 + res/edc/widgets/genlist.edc | 114 +++++++++++++++++++++++++++------- res/images/ic_music_list_favorite.png | Bin 0 -> 1818 bytes src/view/mplayer.c | 40 +++++++++++- 5 files changed, 130 insertions(+), 26 deletions(-) create mode 100644 res/images/ic_music_list_favorite.png diff --git a/include/define.h b/include/define.h index 78fab27..4359270 100644 --- a/include/define.h +++ b/include/define.h @@ -56,6 +56,7 @@ /* part */ #define PART_ELM_TEXT_TITLE "elm.text.title" +#define PART_ELM_TEXT_TITLE2 "elm.text.title2" #define PART_ELM_TEXT_ARTIST "elm.text.artist" #define PART_ELM_TEXT_ALBUM "elm.text.album" #define PART_ELM_TEXT_PLAYTIME "elm.text.playtime" diff --git a/include/view/mplayer.h b/include/view/mplayer.h index 94d9897..eab576b 100644 --- a/include/view/mplayer.h +++ b/include/view/mplayer.h @@ -46,6 +46,7 @@ /* images */ #define IMAGE_MUSIC_THUMBNAIL IMAGEDIR"/ic_thumbnail_song_player.png" +#define IMAGE_MUSIC_LIST_FAVORITE IMAGEDIR"/ic_music_list_favorite.png" #define IMAGE_MUSIC_PREV_FOCUS "btn_music_contr_previous_foc.png" #define IMAGE_MUSIC_PREV_NORMAL "btn_music_contr_previous_nor.png" diff --git a/res/edc/widgets/genlist.edc b/res/edc/widgets/genlist.edc index 7309809..8ac6183 100644 --- a/res/edc/widgets/genlist.edc +++ b/res/edc/widgets/genlist.edc @@ -18,8 +18,8 @@ group { name: "elm/genlist/item/music_list/default"; data.item: "selectraise" "on"; data.item: "focusraise" "on"; - data.item: "texts" "elm.text.title elm.text.artist elm.text.playtime"; - data.item: "contents" "elm.swallow.icon"; + data.item: "texts" "elm.text.title elm.text.title2 elm.text.artist elm.text.playtime"; + data.item: "contents" "elm.swallow.favorite"; data.item: "focus_highlight" "on"; images { image: IMAGE_MUSIC_LIST_PLAY COMP; @@ -32,7 +32,8 @@ group { scale: 1; description { state: "default" 0.0; - min: 0 140; + min: 960 140; + align: 0.0 0.0; color: COLOR_LIST_BG; } description { @@ -179,21 +180,6 @@ group { fixed: 1 1; align: 0.0 0.0; } - description { - state: "default" 0.1; - inherit: "default" 0.0; - min: 130 140; - rel1 { - to: "right_padding"; - relative: 1.0 0.0; - } - rel2 { - to: "right_padding"; - relative: 1.0 0.0; - } - align: 0.0 0.0; - fixed: 1 1; - } } part { name: PART_ELM_TEXT_PLAYTIME; @@ -226,8 +212,8 @@ group { } } part { - name: PART_ELM_TEXT_TITLE; - type: TEXT; + name: "title_area"; + type: RECT; scale: 1; description { state: "default" 0.0; @@ -240,6 +226,26 @@ group { to: PART_ELM_TEXT_PLAYTIME; relative: 0.0 0.0; } + fixed: 0 1; + align: 0.0 0.0; + visible: 0; + } + } + part { + name: PART_ELM_TEXT_TITLE; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 0 68; + rel1 { + to: "title_area"; + relative: 0.0 0.0; + } + rel2 { + to: "title_area"; + relative: 1.0 0.0; + } text { font: FONT_LIGHT; size: 36; @@ -256,6 +262,28 @@ group { } } part { + name: PART_ELM_TEXT_TITLE2; + inherit: PART_ELM_TEXT_TITLE; + description { + state: "default" 0.0; + max: 740 68; + rel2 { + to: "title_area"; + relative: 0.0 0.0; + } + text { + min: 1 0; + ellipsis: -1; + } + visible: 0; + } + description { + state: "default" 0.1; + inherit: "default" 0.0; + max: 668 0; + } + } + part { name: PART_ELM_TEXT_ARTIST; type: TEXT; scale: 1; @@ -263,11 +291,11 @@ group { state: "default" 0.0; min: 0 44; rel1 { - to: PART_ELM_TEXT_TITLE; + to: "title_area"; relative: 0.0 1.0; } rel2 { - to: PART_ELM_TEXT_TITLE; + to: "title_area"; relative: 1.0 1.0; } text { @@ -285,6 +313,44 @@ group { color: COLOR_TEXT_FOCUS; } } + part { + name: "padding_favorite"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 10 28; + rel1 { + to: PART_ELM_TEXT_TITLE2; + relative: 1.0 0.0; + } + rel2 { + to: PART_ELM_TEXT_TITLE2; + relative: 1.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + } + } + part { + name: PART_ELM_SWALLOW_FAVORITE; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 36 36; + rel1 { + to: "padding_favorite"; + relative: 1.0 1.0; + } + rel2 { + to: "padding_favorite"; + relative: 1.0 1.0; + } + fixed: 1 1; + align: 0.0 0.0; + } + } } script { public focus_status = 0; @@ -337,7 +403,7 @@ group { action: STATE_SET "default" 0.1; target: "image_padding"; target: "image_bg"; - target: "time_padding"; + target: PART_ELM_TEXT_TITLE2; transition: TRANSITION_SHOW_ICON; after: "select,image"; } @@ -365,7 +431,7 @@ group { action: STATE_SET "default" 0.0; target: "image_padding"; target: "image_bg"; - target: "time_padding"; + target: PART_ELM_TEXT_TITLE2; transition: TRANSITION_SHOW_ICON; } } diff --git a/res/images/ic_music_list_favorite.png b/res/images/ic_music_list_favorite.png new file mode 100644 index 0000000000000000000000000000000000000000..2df7931e207075b7eb483ca185714e079220f47f GIT binary patch literal 1818 zcmbVNX;2eq7!Cv&P~=h=L`$~|1VnReNR}jWDiIG3@upUaphDHL)ows+e>nc=&hB@<&-321C9yGcCQa~} zKq8SQ$)dz@#O!bV936=99?5Jbrm46j0guPhaU-HfNdgs?h5|ATvK);=5mj#XB{Ymg zBB!er33!5h9#4sBXoyvYX42>gG>H@zY0@FeOcV#w(B*1vI5>E!5d_q#aBwkO&XDUw zXofl}Pmjju#VC|{nM$q-jEn%nOgw@>gW?Ea(qw53JX1J0%F83x)?+#djEdly;oz82 z3G!G#gy~U$O$(ta84v`(Fb!g{VHlbPFc}b&&LCcx3bA->n8yqS-ajCrO|MGl#fhcw zbrHL8FayVRJUZQIG}4SAG)%vo4sp3$D+iNFB_ybZTrG~6s9J;HID;59DD`R`uEw;0 zl@Uq9a`14Fuyo7?jZQBAK&&;q4-^qHx(U(IAsU0O(OCT&l{VmU=)Y!sRNA1()uHq_ z)PUval|(+${l>vW>^`l?Do9wvo3B?BNkOv2m@-F$YH^u393*aNDz%Cy4rPegA#5gt zBj!k05X50I1X78F%@RlvU^+k)4+BAq)mjy1G|aH3 zXUtnMs#mW>RZ=~s0Y>A?Q-4IiP!tl%5J*@Y4l%MJNWkCLoc9i^0{c!H9VYx_atg)*`NxVJf1BH7l zZa;keT}NtMVQW_ne@&Uzml?mhwCs;N#U9$Nfw5|r2Psby=Jgz9f5Tri(KW-pmbH{G zuC*n%c-9XGRnR&cr=i_mu2ra>dg*-BjxA+#X?1-Ie&kogU%&il``qKZ&LS$TvZ3k zpKR*oN}g346R&nvxD?t)!==T5eH&dpG^Ft|^-T#dPgOXkpz>Srn&~%s8eX;ueURyC*IbVrnEyqqo5PWT%X^E84%M1d>l-sqZfk0%%_&{+eT3=) zpBq#;0JQ{3g<$*SWC=C=cla+F-Dk76a(eU19Lpiw{Y9S6HC2hP`YBEUJ$!RS-QIft z3y(di<;A<*ciC*P3GPNV+Fv|H;dlDvq;7>Y5%(u%*#*d8*^%fTX{+8=vUB3!>t1-? zU-C5Z(TZvXC9w3mhm?jVwPm;G&ip9_aJlm?M7BLkSTJu!Nuh9kV0k28U@$s#Zu(j` zKlqHNqIkfvXKU}B;fSNpUjODiWdGQ#srJ3{V?_ZGZXWr)R=<4ivXYD4LrEUOr2wrM6UqBR4x2w)7jW`Ci|)9wy_%nRQt4f#dB3 zJ6Y$vg4^%R$+B=acob}TWes1~7pnnvZRXUPntitle); } else if (!strcmp(part, PART_ELM_TEXT_ARTIST)) { snprintf(buf, sizeof(buf), "%s / %s", @@ -521,6 +522,41 @@ static char *_list_text_get(void *data, Evas_Object *obj, const char *part) return strdup(buf); } +static Evas_Object *_list_content_get(void *data, + Evas_Object *obj, const char *part) +{ + struct _list_data *ld; + app_media_info *mi; + Evas_Object *image; + + if (!data) + return NULL; + + ld = data; + + mi = app_media_get_info(ld->am); + if (!mi) { + _ERR("failed to get media info"); + return NULL; + } + + image = NULL; + if (!strcmp(part, PART_ELM_SWALLOW_FAVORITE)) { + if (!mi->favorite) + return NULL; + + image = util_add_image(obj, IMAGE_MUSIC_LIST_FAVORITE); + if (!image) { + _ERR("failed to create image object"); + return NULL; + } + + evas_object_show(image); + } + + return image; +} + static void _list_selected(int id, void *data, Evas_Object *obj, Elm_Object_Item *it) { @@ -617,7 +653,7 @@ static void _add_playlist_item(struct _priv *priv) ic->item_style = STYLE_MPLAYER_LIST; ic->func.text_get = _list_text_get; - ic->func.content_get = NULL; + ic->func.content_get = _list_content_get; ic->func.state_get = NULL; ic->func.del = _list_item_del; -- 2.7.4 From 17fb47587ad676770b2f95fe0c5ea495cf0e4099 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Tue, 4 Aug 2015 15:49:43 +0900 Subject: [PATCH 13/16] launch as viewer or player view when showing favorite item Change-Id: I6bdcd7aba4c4b36e2c1dd28798d1591c45ed5181 Signed-off-by: Jehun Lim --- CMakeLists.txt | 1 + include/view.h | 1 + packaging/org.tizen.mediahub.spec | 1 + src/main.c | 27 ++++- src/view/base.c | 210 +++++++++++++++++++++++++++++++++++++- 5 files changed, 235 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e6c18cf..b377c56 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,7 @@ PROJECT("mediahub" C) INCLUDE(FindPkgConfig) pkg_check_modules(PKGS REQUIRED + glib-2.0 elementary capi-appfw-application capi-media-player diff --git a/include/view.h b/include/view.h index ad62dd6..cd7992b 100644 --- a/include/view.h +++ b/include/view.h @@ -38,6 +38,7 @@ enum update_type { UPDATE_FOCUS, UPDATE_PLAY_INFO, UPDATE_PLAYER, + UPDATE_FAVORITE, UPDATE_RESUME, }; diff --git a/packaging/org.tizen.mediahub.spec b/packaging/org.tizen.mediahub.spec index ddeabd9..0470594 100644 --- a/packaging/org.tizen.mediahub.spec +++ b/packaging/org.tizen.mediahub.spec @@ -8,6 +8,7 @@ Source0: %{name}-%{version}.tar.gz Source1: %{name}.manifest BuildRequires: cmake +BuildRequires: pkgconfig(glib-2.0) BuildRequires: pkgconfig(elementary) BuildRequires: pkgconfig(capi-appfw-application) BuildRequires: pkgconfig(capi-media-player) diff --git a/src/main.c b/src/main.c index 0903192..f72b14c 100644 --- a/src/main.c +++ b/src/main.c @@ -25,6 +25,11 @@ #define MEDIAHUB_WIN_TITLE "Media Hub" +#define PARAM_MEDIA_ID "media_id" +#define PARAM_SENDER_ID "sender_id" + +#define SENDER_FAVORITE "Favorite" + SET_TAG(PACKAGE) struct _appdata { @@ -116,6 +121,9 @@ static void _terminate(void *data) static void _app_control(app_control_h app_control, void *data) { struct _appdata *ad; + char *media_id; + char *sender_id; + int r; if (!data) { _ERR("failed to get data"); @@ -127,7 +135,24 @@ static void _app_control(app_control_h app_control, void *data) if (ad->win) elm_win_activate(ad->win); - viewmgr_push_view(VIEW_BASE); + r = app_control_get_extra_data(app_control, PARAM_MEDIA_ID, &media_id); + if (r != APP_CONTROL_ERROR_NONE) + media_id = NULL; + + r = app_control_get_extra_data(app_control, + PARAM_SENDER_ID, &sender_id); + if (r != APP_CONTROL_ERROR_NONE) + sender_id = NULL; + + if (media_id && sender_id) { + if (!strcmp(sender_id, SENDER_FAVORITE)) + viewmgr_update_view(VIEW_BASE, + UPDATE_FAVORITE, media_id); + } else + viewmgr_push_view(VIEW_BASE); + + free(media_id); + free(sender_id); } static void _pause(void *data) diff --git a/src/view/base.c b/src/view/base.c index b5204ed..1e20e26 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -14,9 +14,13 @@ * limitations under the License. */ +#include #include #include +#include #include +#include +#include #include #include #include @@ -27,6 +31,8 @@ #define TITLE_TEXT "Media Hub" +#define VIDEO_COPYRIGHT "Unknown" + #define MENU_BTN_SIZE 3 #define BOX_PADDING_SIZE 80 @@ -38,6 +44,8 @@ struct _priv { layoutmgr *lmgr; + Eina_List *favorite_list; + int current_layout; }; @@ -130,6 +138,186 @@ 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; + app_media *am; + int r; + + r = media_info_get_media_from_db(id, &media); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to get media handle"); + return NULL; + } + + am = app_media_create(media); + if (!am) { + _ERR("failed to create app media"); + return NULL; + } + + return am; +} + +static int _get_content_type(app_media_info *info) +{ + int type; + + type = -1; + switch (info->media_type) { + case MEDIA_CONTENT_TYPE_IMAGE: + type = CONTENTS_GALLERY; + break; + case MEDIA_CONTENT_TYPE_VIDEO: + if (_check_movie_type(info)) + type = CONTENTS_MOVIE; + else + type = CONTENTS_GALLERY; + break; + case MEDIA_CONTENT_TYPE_MUSIC: + type = CONTENTS_MUSIC; + break; + default: + break; + } + + return type; +} + +static void _favorite_list_foreach(gpointer data, gpointer user_data) +{ + media_info_h media; + app_media *am; + Eina_List **l; + int r; + char *id; + + if (!data || !user_data) { + _ERR("invalid argument"); + return; + } + + id = (char *)data; + l = (Eina_List **)user_data; + + r = media_info_get_media_from_db(id, &media); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to get media handle"); + return; + } + + am = app_media_create(media); + if (!am) { + _ERR("failed to create app media"); + media_info_destroy(media); + return; + } + + *l = eina_list_append(*l, am); +} + +static void _free_favorite_list(Eina_List *list) +{ + app_media *am; + + EINA_LIST_FREE(list, am) + app_media_destroy(am); +} + +static Eina_List *_get_favorite_list(int type) +{ + GList *id_list; + Eina_List *list; + + id_list = NULL; + if (app_contents_get_favorite_list(type, &id_list) + != APP_CONTENTS_ERROR_NONE) { + _ERR("failed to get favorite list"); + return NULL; + } + + list = NULL; + g_list_foreach(id_list, _favorite_list_foreach, &list); + + app_contents_free_favorite_list(id_list); + + return list; +} + +static int _get_media_index(Eina_List *list, const char *id) +{ + Eina_List *l; + app_media *am; + app_media_info *info; + int index; + + index = 0; + EINA_LIST_FOREACH(list, l, am) { + info = app_media_get_info(am); + if (!info) + continue; + + if (!strcmp(id, info->media_id)) + return index; + + index++; + } + + return -1; +} + +static void _update_favorite_view(struct _priv *priv, const char *id) +{ + app_media *am; + app_media_info *info; + struct view_update_data vdata; + int type; + int r; + + r = media_content_connect(); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to connect to media content"); + return; + } + + am = _get_app_media(id); + if (!am) { + _ERR("failed to get app media"); + return; + } + + info = app_media_get_info(am); + if (!info) { + _ERR("failed to get app media info"); + app_media_destroy(am); + return; + } + + type = _get_content_type(info); + + vdata.list = _get_favorite_list(type); + vdata.index = _get_media_index(vdata.list, info->media_id); + + if (type == CONTENTS_MOVIE || type == CONTENTS_GALLERY) { + viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); + viewmgr_push_view(VIEW_VIEWER); + } else if (type == CONTENTS_MUSIC) { + viewmgr_update_view(VIEW_MPLAYER, UPDATE_CONTENT, &vdata); + viewmgr_push_view(VIEW_MPLAYER); + } + + priv->favorite_list = vdata.list; + + app_media_destroy(am); + + media_content_disconnect(); +} + static bool _draw_title(struct _priv *priv) { if (!priv) @@ -304,11 +492,22 @@ static void _update(void *view_data, int update_type, void *data) } priv = view_data; - vdata = data; - layoutmgr_update_layout(priv->lmgr, - g_menu_item[priv->current_layout].layout_id, - update_type, vdata); + switch (update_type) { + case UPDATE_FOCUS: + case UPDATE_PLAY_INFO: + vdata = data; + + layoutmgr_update_layout(priv->lmgr, + g_menu_item[priv->current_layout].layout_id, + update_type, vdata); + break; + case UPDATE_FAVORITE: + _update_favorite_view(priv, data); + break; + default: + break; + } } static void _pause(void *view_data) @@ -353,6 +552,9 @@ static void _destroy(void *view_data) layoutmgr_destroy(priv->lmgr); + if (priv->favorite_list) + _free_favorite_list(priv->favorite_list); + evas_object_del(priv->base); free(priv); -- 2.7.4 From 693abfedb265d4baedc66415c86d289eec8a80dd Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 4 Aug 2015 18:44:24 +0900 Subject: [PATCH 14/16] workaround: don't set position due to player issue Change-Id: I8274f948319aa6591fc93a4a546bf0e3147b9a8e Signed-off-by: Minkyu Kang --- src/util/playermgr.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/util/playermgr.c b/src/util/playermgr.c index 320ceb7..252fc7d 100644 --- a/src/util/playermgr.c +++ b/src/util/playermgr.c @@ -150,6 +150,9 @@ bool playermgr_set_position(struct playermgr *m, int ms, { int r; + /* FIMXE */ + return true; + if (!m) { _ERR("invalid parameter"); return false; @@ -239,7 +242,6 @@ void playermgr_stop(struct playermgr *m) } player_pause(m->player); - player_stop(m->player); player_unprepare(m->player); _set_path(m, NULL); @@ -293,13 +295,8 @@ bool playermgr_play(struct playermgr *m, const char *path, int ms) return false; } - if (ms) { - r = player_set_play_position(m->player, ms, false, NULL, NULL); - if (r != PLAYER_ERROR_NONE) { - _ERR("player: set_position error (%d)", r); - return false; - } - } + if (ms) + playermgr_set_position(m, ms, NULL, NULL); _event_loop_start(m); -- 2.7.4 From 05c3792e9e06b32fd2c5cbae56d07ba9a564b44e Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Tue, 4 Aug 2015 16:36:39 +0900 Subject: [PATCH 15/16] base: remove setting alpha value of favorite icon Change-Id: I8ef86626090818ff44543619bc0964c7b40573d6 Signed-off-by: Jehun Lim --- res/edc/widgets/button.edc | 2 -- src/layout/gallery.c | 4 ---- src/layout/movie.c | 4 ---- 3 files changed, 10 deletions(-) diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index babddba..b896e15 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -1384,7 +1384,6 @@ group { } min: 42 42; align: 1.0 0.0; - color: 255 255 255 150; fixed: 1 1; visible: 0; map { @@ -2085,7 +2084,6 @@ group { } min: 42 42; align: 1.0 0.0; - color: 255 255 255 150; fixed: 1 1; visible: 0; map { diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 41ec2c4..20f5994 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -44,8 +44,6 @@ #define BOX_PADDING (62 - GRID_PADDING) -#define IMAGE_FAVORITE_ALPHA 150 - struct _priv { Evas_Object *base; Evas_Object *layout; @@ -137,8 +135,6 @@ static Evas_Object *_grid_content_get(void *data, return NULL; } - util_set_alpha_color(image, IMAGE_FAVORITE_ALPHA); - evas_object_show(image); } diff --git a/src/layout/movie.c b/src/layout/movie.c index bfab4cf..c5c3767 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -41,8 +41,6 @@ #define BOX_PADDING (62 - GRID_PADDING) -#define IMAGE_FAVORITE_ALPHA 150 - struct _priv { Evas_Object *base; Evas_Object *layout; @@ -123,8 +121,6 @@ static Evas_Object *_grid_content_get(void *data, return NULL; } - util_set_alpha_color(image, IMAGE_FAVORITE_ALPHA); - evas_object_show(image); } -- 2.7.4 From 48f4b46a6f52f0f8170dbe61a688db89b744cd0c Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 4 Aug 2015 21:53:33 +0900 Subject: [PATCH 16/16] Sets the alpha window's visual state to opaque state Change-Id: Ib0bb5fc8ad79266499776f7f59dbc8fde94b44ca Signed-off-by: Minkyu Kang --- CMakeLists.txt | 1 + packaging/org.tizen.mediahub.spec | 1 + src/main.c | 4 +++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b377c56..11a6b8a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,7 @@ pkg_check_modules(PKGS REQUIRED elementary capi-appfw-application capi-media-player + capi-ui-efl-util app-utils) IF(NOT DEFINED PACKAGE_NAME) diff --git a/packaging/org.tizen.mediahub.spec b/packaging/org.tizen.mediahub.spec index 0470594..2d83d85 100644 --- a/packaging/org.tizen.mediahub.spec +++ b/packaging/org.tizen.mediahub.spec @@ -12,6 +12,7 @@ BuildRequires: pkgconfig(glib-2.0) BuildRequires: pkgconfig(elementary) BuildRequires: pkgconfig(capi-appfw-application) BuildRequires: pkgconfig(capi-media-player) +BuildRequires: pkgconfig(capi-ui-efl-util) BuildRequires: pkgconfig(app-utils) %define _appdir /usr/apps/%{name} diff --git a/src/main.c b/src/main.c index f72b14c..8a4ecc8 100644 --- a/src/main.c +++ b/src/main.c @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -23,7 +24,7 @@ #include "define.h" #include "view.h" -#define MEDIAHUB_WIN_TITLE "Media Hub" +#define MEDIAHUB_WIN_TITLE PACKAGE #define PARAM_MEDIA_ID "media_id" #define PARAM_SENDER_ID "sender_id" @@ -50,6 +51,7 @@ static Evas_Object *_add_win(const char *name) elm_win_alpha_set(win, EINA_TRUE); elm_win_screen_size_get(win, NULL, NULL, &w, &h); evas_object_resize(win, w, h); + efl_util_set_window_opaque_state(win, 1); evas_object_show(win); -- 2.7.4