From 5073a7fb781897035e12f32bb9c1f7f59db41a5b Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 7 Oct 2015 11:30:59 +0900 Subject: [PATCH 01/16] base: add animation when view mode button is clicked Change-Id: I66a7d3ec2ff267829fa86503b9de201cb33e102a Signed-off-by: Jehun Lim --- res/edc/widgets/button.edc | 13 +++++++++++++ src/view/base.c | 3 +++ 2 files changed, 16 insertions(+) diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index e32c9c8..d7b2ceb 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -4331,9 +4331,22 @@ group { source: SIG_SOURCE_SRC; script { set_int(cur_state, STATE_SELECTED); + run_program(PROGRAM:"selected,anim"); } } program { + name: "selected,anim"; + action: STATE_SET "selected" 0.0; + target: "bg"; + target: "border_top"; + target: "border_left"; + target: "border_right"; + target: "border_bottom"; + target: "elm.text"; + target: "part_arrow"; + transition: TRANSITION_FOCUS; + } + program { name: "disabled"; signal: SIG_ELM_DISABLED; source: SIG_SOURCE_ELM; diff --git a/src/view/base.c b/src/view/base.c index fab2f2e..630925e 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -253,6 +253,9 @@ static void _view_btn_clicked(struct _priv *priv) struct ctxpopup *cpopup; int x, y, w, h; + elm_object_signal_emit(priv->view_btn, SIG_BTN_SELECTED, + SIG_SOURCE_SRC); + cpopup = ctxpopup_create(priv->base, STYLE_CTXPOPUP_VIEW_MODE, STYLE_BTN_VIEW_OPTION, g_menu_item[priv->current_layout].text_view_mode, -- 2.7.4 From 15a5274a14dc202390005da96024ee8361f576f0 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 7 Oct 2015 14:11:31 +0900 Subject: [PATCH 02/16] listmgr: add key down callback for playing info item Change-Id: I6a213f4d030a9645352b7f75618c96990cc6536f Signed-off-by: Jehun Lim --- include/util/listmgr.h | 2 ++ src/layout/movie.c | 30 ++++++++++++++++++++++++++++++ src/layout/music.c | 30 ++++++++++++++++++++++++++++++ src/util/listmgr.c | 16 +++++++++++++++- 4 files changed, 77 insertions(+), 1 deletion(-) diff --git a/include/util/listmgr.h b/include/util/listmgr.h index bd7d3cc..d3dfa99 100644 --- a/include/util/listmgr.h +++ b/include/util/listmgr.h @@ -23,6 +23,8 @@ struct play_info_data { bool (*draw)(void *data, Evas_Object *base); bool (*update)(void *data, Evas_Object *base); + void (*key_down_cb)(void *data, Evas_Object *obj, + Evas_Event_Key_Down *ev); void (*selected_cb)(void *data, Evas_Object *obj); void *cb_data; }; diff --git a/src/layout/movie.c b/src/layout/movie.c index 6e44997..79416cd 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -259,6 +259,35 @@ static void _recent_item_selected(struct _priv *priv, app_media *am) viewmgr_push_view(VIEW_VIEWER); } +static void _recent_key_down_cb(void *data, Evas_Object *obj, + Evas_Event_Key_Down *ev) +{ + struct view_update_data vdata; + struct datamgr *dmgr; + struct _priv *priv; + + if (!data || !ev) + return; + + priv = data; + + dmgr = priv->dmgr[E_DATA_MEDIA]; + if (!dmgr) + return; + + if (!strcmp(ev->keyname, KEY_MENU) || + !strcmp(ev->keyname, KEY_CONTEXT_MENU)) { + vdata.list = dmgr->ops->get_list(dmgr->handle, + E_LIST_MEDIA, NULL); + vdata.index = util_get_media_index(vdata.list, + priv->recent_info); + vdata.id = VIEW_BASE; + + viewmgr_update_view(VIEW_ACTION_MENU, UPDATE_CONTENT, &vdata); + viewmgr_show_view(VIEW_ACTION_MENU); + } +} + static void _recent_selected_cb(void *data, Evas_Object *obj) { struct _priv *priv; @@ -300,6 +329,7 @@ static struct listmgr_data *_create_listmgr_data(struct _priv *priv) pdata->draw = _draw_recent; pdata->update = _update_recent; + pdata->key_down_cb = _recent_key_down_cb; pdata->selected_cb = _recent_selected_cb; pdata->cb_data = priv; diff --git a/src/layout/music.c b/src/layout/music.c index d4ae86a..98249a9 100644 --- a/src/layout/music.c +++ b/src/layout/music.c @@ -203,6 +203,35 @@ static void _recent_item_selected(struct _priv *priv, app_media *am) viewmgr_push_view(VIEW_MPLAYER); } +static void _playing_key_down_cb(void *data, Evas_Object *obj, + Evas_Event_Key_Down *ev) +{ + struct view_update_data vdata; + struct datamgr *dmgr; + struct _priv *priv; + + if (!data || !ev) + return; + + priv = data; + + dmgr = priv->dmgr[E_DATA_MEDIA]; + if (!dmgr) + return; + + if (!strcmp(ev->keyname, KEY_MENU) || + !strcmp(ev->keyname, KEY_CONTEXT_MENU)) { + vdata.list = dmgr->ops->get_list(dmgr->handle, + E_LIST_MEDIA, NULL); + vdata.index = util_get_media_index(vdata.list, + priv->playing_info); + vdata.id = VIEW_BASE; + + viewmgr_update_view(VIEW_ACTION_MENU, UPDATE_CONTENT, &vdata); + viewmgr_show_view(VIEW_ACTION_MENU); + } +} + static void _playing_selected_cb(void *data, Evas_Object *obj) { struct view_update_data vdata; @@ -244,6 +273,7 @@ static struct listmgr_data *_create_listmgr_data(struct _priv *priv) pdata->draw = _draw_playing_info; pdata->update = _update_playing_info; + pdata->key_down_cb = _playing_key_down_cb; pdata->selected_cb = _playing_selected_cb; pdata->cb_data = priv; diff --git a/src/util/listmgr.c b/src/util/listmgr.c index 83d20d7..ee0d5ec 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -120,6 +120,7 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { struct listmgr *lmgr; + struct play_info_data *pdata; struct grid_data *gdata; if (!data || !obj || !ev) @@ -134,6 +135,16 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, elm_object_focus_next(obj, ELM_FOCUS_UP); break; case LISTMGR_PLAY_INFO: + if (!strcmp(ev->keyname, KEY_BACK) || + !strcmp(ev->keyname, KEY_ESC)) + elm_object_focus_next(obj, ELM_FOCUS_UP); + else { + pdata = lmgr->data->pdata; + if (pdata->key_down_cb) + pdata->key_down_cb(pdata->cb_data, obj, ev); + } + + break; case LISTMGR_GRID: if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_ESC)) @@ -656,6 +667,9 @@ bool listmgr_update_content_item(struct listmgr *lmgr) box_item = elm_box_children_get(lmgr->box); + if (lmgr->show_play_info) + box_item = eina_list_next(box_item); + EINA_LIST_FOREACH(box_item, l, ly) { grid = elm_object_part_content_get(ly, PART_ITEM_CONTENT); if (!grid) { @@ -747,7 +761,7 @@ static void _set_grid_focus(struct listmgr *lmgr) list = elm_box_children_get(lmgr->box); - if (lmgr->play_info) + if (lmgr->show_play_info) list = eina_list_next(list); item_num = lmgr->data->gdata->item_num; -- 2.7.4 From a04980842e531b2f8481d0e35e85c989cb858b3a Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 7 Oct 2015 14:37:10 +0900 Subject: [PATCH 03/16] music: do not update playlist when playing item is selected Change-Id: Ib3ccf74ce96d14777c5129161f59726ee0aff8f7 Signed-off-by: Jehun Lim --- src/layout/music.c | 18 ------------------ src/view/mplayer.c | 10 ++++------ 2 files changed, 4 insertions(+), 24 deletions(-) diff --git a/src/layout/music.c b/src/layout/music.c index 98249a9..a42491d 100644 --- a/src/layout/music.c +++ b/src/layout/music.c @@ -234,24 +234,6 @@ static void _playing_key_down_cb(void *data, Evas_Object *obj, static void _playing_selected_cb(void *data, Evas_Object *obj) { - struct view_update_data vdata; - struct datamgr *dmgr; - struct _priv *priv; - - if (!data || !obj) - return; - - priv = data; - - dmgr = priv->dmgr[E_DATA_MEDIA]; - if (!dmgr) - return; - - vdata.list = dmgr->ops->get_list(dmgr->handle, E_LIST_MEDIA, NULL); - vdata.index = util_get_media_index(vdata.list, priv->playing_info); - vdata.id = VIEW_BASE; - - viewmgr_update_view(VIEW_MPLAYER, UPDATE_CONTENT, &vdata); viewmgr_push_view(VIEW_MPLAYER); } diff --git a/src/view/mplayer.c b/src/view/mplayer.c index c8a7bd6..ddcc196 100644 --- a/src/view/mplayer.c +++ b/src/view/mplayer.c @@ -615,12 +615,10 @@ static void _pop_view(struct _priv *priv) return; } - if (!strcmp(priv->prev_view, VIEW_BASE)) { - vdata.index = _playlist_get_index(priv->playlist.list_org, - priv->playlist.list, priv->playlist.cur); - vdata.id = _playlist_get_current_media_id(priv); - viewmgr_update_view(VIEW_BASE, UPDATE_FOCUS, &vdata); - } + vdata.index = _playlist_get_index(priv->playlist.list_org, + priv->playlist.list, priv->playlist.cur); + vdata.id = _playlist_get_current_media_id(priv); + viewmgr_update_view(VIEW_BASE, UPDATE_FOCUS, &vdata); viewmgr_pop_view(); } -- 2.7.4 From b9c7e87066bd1b13ca9deadbc82b502c2c14d075 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 7 Oct 2015 16:30:46 +0900 Subject: [PATCH 04/16] viewer/mplayer: update history before updating play info Change-Id: I4faf86e22ea0ca4fb632f2b6514a08fc9fb25fb3 Signed-off-by: Jehun Lim --- src/view/mplayer.c | 6 +++--- src/view/viewer.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/view/mplayer.c b/src/view/mplayer.c index ddcc196..a98aa26 100644 --- a/src/view/mplayer.c +++ b/src/view/mplayer.c @@ -262,15 +262,15 @@ static void _update_info(struct _priv *priv, app_media_info *mi) /* update progressbar */ progressbar_reset(priv->progress, 0, mi->audio->duration); + /* update history */ + util_add_to_recent(priv->playlist.list, priv->playlist.cur); + /* update play info */ vdata.index = _playlist_get_index(priv->playlist.list_org, priv->playlist.list, priv->playlist.cur); vdata.id = _playlist_get_current_media_id(priv); viewmgr_update_view(VIEW_BASE, UPDATE_PLAY_INFO, &vdata); viewmgr_update_view(VIEW_DETAIL, UPDATE_PLAY_INFO, &vdata); - - /* update history */ - util_add_to_recent(priv->playlist.list, priv->playlist.cur); } static void _update_player(struct _priv *priv) diff --git a/src/view/viewer.c b/src/view/viewer.c index ac4f956..0a9c597 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -520,6 +520,9 @@ static void _update_info(struct _priv *priv, app_media_info *mi) { struct view_update_data vdata; + /* update history */ + util_add_to_recent(priv->playlist.list, priv->playlist.cur); + /* update play info for movie */ if (util_check_movie_type(mi->video->copyright)) { vdata.index = priv->playlist.cur; @@ -528,9 +531,6 @@ static void _update_info(struct _priv *priv, app_media_info *mi) viewmgr_update_view(VIEW_BASE, UPDATE_PLAY_INFO, &vdata); viewmgr_update_view(VIEW_DETAIL, UPDATE_PLAY_INFO, &vdata); } - - /* update history */ - util_add_to_recent(priv->playlist.list, priv->playlist.cur); } static void _update_to_player(struct _priv *priv) -- 2.7.4 From b3fe7f9facf2aee7803020f9c67e03605d6e8e43 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 7 Oct 2015 16:49:58 +0900 Subject: [PATCH 05/16] movie: update recently watched item for UPDATE_PLAY_INFO type Change-Id: I262a3c80285e39cfb58e179de23a65da8e1484ca Signed-off-by: Jehun Lim --- src/layout/movie.c | 6 ++++-- src/view/detail.c | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/layout/movie.c b/src/layout/movie.c index 79416cd..4d963b5 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -660,7 +660,7 @@ static void _update(void *layout_data, int update_type, void *data) listmgr_update_content_item(priv->listmgr); _update_recent_item(priv, NULL); break; - case UPDATE_FOCUS: + case UPDATE_PLAY_INFO: if (!data) { _ERR("invalid argument"); return; @@ -668,9 +668,11 @@ static void _update(void *layout_data, int update_type, void *data) vdata = data; - listmgr_focus_play_info(priv->listmgr); _update_recent_item(priv, vdata->id); break; + case UPDATE_FOCUS: + listmgr_focus_play_info(priv->listmgr); + break; case UPDATE_BACK: listmgr_focus_content_list(priv->listmgr, NULL); break; diff --git a/src/view/detail.c b/src/view/detail.c index d55d2ca..784d0cf 100644 --- a/src/view/detail.c +++ b/src/view/detail.c @@ -725,7 +725,7 @@ static void _set_no_play_info(struct _priv *priv) int type; char buf[64] = {0}; - type = priv->vinfo->app_contents_type; + type = view_info[priv->view_type].app_contents_type; if (type == CONTENTS_MOVIE) snprintf(buf, sizeof(buf), STR_NO_PLAY_MOVIE); -- 2.7.4 From d536efa3201fd06a2085ecc380f2412c450851ef Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 7 Oct 2015 18:39:22 +0900 Subject: [PATCH 06/16] detail: modify content info Change-Id: I902ab2e874bc5ceb595d1b66fa855be0c59eaea3 Signed-off-by: Jehun Lim --- include/data/albumdata.h | 1 + src/data/albumdata.c | 50 +++++++++++++++++++++++++++-------------- src/view/detail.c | 58 +++++++++++++++++++++++++++++++----------------- 3 files changed, 72 insertions(+), 37 deletions(-) diff --git a/include/data/albumdata.h b/include/data/albumdata.h index 6c39494..525e6d9 100644 --- a/include/data/albumdata.h +++ b/include/data/albumdata.h @@ -35,6 +35,7 @@ struct album_info { char *name; char *artist; char *album_art; + int media_count; }; struct data_ops *albumdata_get_ops(void); diff --git a/src/data/albumdata.c b/src/data/albumdata.c index 6f62715..a0497c5 100644 --- a/src/data/albumdata.c +++ b/src/data/albumdata.c @@ -198,13 +198,13 @@ static void _destroy_album_list(Eina_List *list) static bool _get_each_media_info(media_info_h media_h, void *data) { - Eina_List **list; app_media *am; + struct albumdata *ad; if (!data) return false; - list = data; + ad = data; am = app_media_create(media_h); if (!am) { @@ -212,20 +212,21 @@ static bool _get_each_media_info(media_info_h media_h, void *data) return false; } - *list = eina_list_append(*list, am); + ad->media_list = eina_list_append(ad->media_list, am); return true; } static bool _get_each_album_info(media_album_h album, void *data) { - Eina_List **list; + filter_h filter; + struct albumdata *ad; struct album_info *ai; if (!data) return false; - list = data; + ad = data; ai = calloc(1, sizeof(*ai)); if (!ai) { @@ -233,37 +234,52 @@ static bool _get_each_album_info(media_album_h album, void *data) return false; } + if (!_create_filter(ad, &filter, NULL, E_FILTER_ALBUM)) { + _ERR("failed to create filter"); + free(ai); + 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; + goto err; } if (media_album_get_name(album, &(ai->name)) != MEDIA_CONTENT_ERROR_NONE) { _ERR("failed to fetch album name"); - free(ai); - return false; + goto err; } if (media_album_get_artist(album, &(ai->artist)) != MEDIA_CONTENT_ERROR_NONE) { _ERR("failed to fetch album artist"); - free(ai); - return false; + goto err; } if (media_album_get_album_art(album, &(ai->album_art)) != MEDIA_CONTENT_ERROR_NONE) { _ERR("failed to fetch album art"); - free(ai); - return false; + goto err; } - *list = eina_list_append(*list, ai); + if (media_album_get_media_count_from_db(ai->id, filter, + &(ai->media_count)) != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to get album media count"); + goto err; + } + + ad->album_list = eina_list_append(ad->album_list, ai); + + media_filter_destroy(filter); return true; + +err: + media_filter_destroy(filter); + free(ai); + return false; } static bool _get_each_group_info(const char *group_name, void *data) @@ -289,7 +305,7 @@ static bool _get_each_group_info(const char *group_name, void *data) media_filter_set_offset(filter, 0, 1); ret = media_album_foreach_album_from_db(filter, - _get_each_album_info, &ad->album_list); + _get_each_album_info, ad); if (ret != MEDIA_CONTENT_ERROR_NONE) { _ERR("failed to get album info"); media_filter_destroy(filter); @@ -319,7 +335,7 @@ static bool _get_media_list(struct albumdata *ad, int album_id) } ret = media_album_foreach_media_from_db(album_id, filter, - _get_each_media_info, &ad->media_list); + _get_each_media_info, ad); if (ret != MEDIA_CONTENT_ERROR_NONE) { _ERR("failed to get media info"); _destroy_media_list(ad->media_list); @@ -352,7 +368,7 @@ static bool _get_name_list(struct albumdata *ad, const char *cond) } ret = media_album_foreach_album_from_db(filter, - _get_each_album_info, &ad->album_list); + _get_each_album_info, ad); if (ret != MEDIA_CONTENT_ERROR_NONE) { _ERR("failed to get album info"); _destroy_album_list(ad->album_list); diff --git a/src/view/detail.c b/src/view/detail.c index 784d0cf..a182fb0 100644 --- a/src/view/detail.c +++ b/src/view/detail.c @@ -43,8 +43,9 @@ static Evas_Object *_album_content_get(void *data, Evas_Object *obj, static void _get_movie_info(struct _priv *priv, const char *title); static void _get_gallery_info(struct _priv *priv, const char *title); -static void _get_song_info(struct _priv *priv, const char *title); static void _get_album_info(struct _priv *priv, const char *title); +static void _get_artist_info(struct _priv *priv, const char *title); +static void _get_genre_info(struct _priv *priv, const char *title); static void _album_selected(void *data); @@ -100,7 +101,7 @@ static struct _view_info view_info[E_DETAIL_MAX] = { .grid_item_y = MUSIC_SONG_ITEM_Y, .get_grid_text = _grid_text_get, .get_grid_content = _grid_content_get, - .get_content_info = _get_song_info, + .get_content_info = _get_album_info, .detail_update = EINA_FALSE, .app_contents_type = CONTENTS_MUSIC, }, @@ -110,7 +111,7 @@ static struct _view_info view_info[E_DETAIL_MAX] = { .grid_item_y = MUSIC_ALBUM_ITEM_Y, .get_grid_text = _album_text_get, .get_grid_content = _album_content_get, - .get_content_info = _get_album_info, + .get_content_info = _get_artist_info, .selected = _album_selected, .detail_update = EINA_TRUE, .app_contents_type = CONTENTS_MUSIC, @@ -121,7 +122,7 @@ static struct _view_info view_info[E_DETAIL_MAX] = { .grid_item_y = MUSIC_SONG_ITEM_Y, .get_grid_text = _grid_text_get, .get_grid_content = _grid_content_get, - .get_content_info = _get_song_info, + .get_content_info = _get_genre_info, .detail_update = EINA_FALSE, .app_contents_type = CONTENTS_MUSIC, }, @@ -674,7 +675,7 @@ static void _get_gallery_info(struct _priv *priv, const char *title) elm_object_part_text_set(priv->base, PART_DETAIL_CONTENT_INFO, buf); } -static void _get_song_info(struct _priv *priv, const char *title) +static void _get_album_info(struct _priv *priv, const char *title) { app_media *am; app_media_info *mi; @@ -682,31 +683,29 @@ static void _get_song_info(struct _priv *priv, const char *title) elm_object_part_text_set(priv->base, PART_DETAIL_TITLE, title); - if (priv->view_type == E_DETAIL_MUSIC_ALBUM) { - am = eina_list_nth(priv->media_list, 0); - mi = app_media_get_info(am); + am = eina_list_nth(priv->media_list, 0); + mi = app_media_get_info(am); - if (mi && mi->thumbnail_path) { - elm_image_file_set(priv->thumbnail, - mi->thumbnail_path, NULL); - elm_image_aspect_fixed_set(priv->thumbnail, EINA_FALSE); + if (mi && mi->thumbnail_path) { + elm_image_file_set(priv->thumbnail, + mi->thumbnail_path, NULL); + elm_image_aspect_fixed_set(priv->thumbnail, EINA_FALSE); - elm_object_signal_emit(priv->base, SIG_SHOW_THUMBNAIL, - SIG_SOURCE_SRC); - } - } else { - elm_object_signal_emit(priv->base, SIG_HIDE_THUMBNAIL, + elm_object_signal_emit(priv->base, SIG_SHOW_THUMBNAIL, SIG_SOURCE_SRC); } - snprintf(buf, sizeof(buf), "%d songs", + snprintf(buf, sizeof(buf), "%s | %d songs", mi->audio->artist, eina_list_count(priv->media_list)); elm_object_part_text_set(priv->base, PART_DETAIL_CONTENT_INFO, buf); } -static void _get_album_info(struct _priv *priv, const char *title) +static void _get_artist_info(struct _priv *priv, const char *title) { + Eina_List *l; + struct album_info *ai; + int cnt; char buf[64]; elm_object_part_text_set(priv->base, PART_DETAIL_TITLE, title); @@ -714,7 +713,26 @@ static void _get_album_info(struct _priv *priv, const char *title) elm_object_signal_emit(priv->base, SIG_HIDE_THUMBNAIL, SIG_SOURCE_SRC); - snprintf(buf, sizeof(buf), "%d albums", + cnt = 0; + EINA_LIST_FOREACH(priv->media_list, l, ai) + cnt += ai->media_count; + + snprintf(buf, sizeof(buf), "%d albums, %d songs", + eina_list_count(priv->media_list), cnt); + + elm_object_part_text_set(priv->base, PART_DETAIL_CONTENT_INFO, buf); +} + +static void _get_genre_info(struct _priv *priv, const char *title) +{ + char buf[64]; + + elm_object_part_text_set(priv->base, PART_DETAIL_TITLE, title); + + elm_object_signal_emit(priv->base, SIG_HIDE_THUMBNAIL, + SIG_SOURCE_SRC); + + snprintf(buf, sizeof(buf), "%d songs", eina_list_count(priv->media_list)); elm_object_part_text_set(priv->base, PART_DETAIL_CONTENT_INFO, buf); -- 2.7.4 From ac4505403a3846d1064348f8f75643e26e73afe0 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Thu, 8 Oct 2015 13:12:10 +0900 Subject: [PATCH 07/16] detail: add focused icon for current play status Change-Id: I6c5c558c54036d1c9061d3ffcf699c1bf6d110c6 Signed-off-by: Jehun Lim --- include/view/detail.h | 7 +- res/edc/images/btn_view_contr_slideshow_foc.png | Bin 1417 -> 507 bytes res/edc/images/btn_view_contr_slideshow_nor.png | Bin 1461 -> 487 bytes res/edc/images/ic_mini_player_pause.png | Bin 1877 -> 985 bytes res/edc/images/ic_zoom_indicator_down_foc.png | Bin 2807 -> 2089 bytes res/edc/images/ic_zoom_indicator_down_nor.png | Bin 2728 -> 1431 bytes res/edc/images/ic_zoom_indicator_left_foc.png | Bin 2786 -> 2031 bytes res/edc/images/ic_zoom_indicator_left_nor.png | Bin 2764 -> 1426 bytes res/edc/images/ic_zoom_indicator_right_foc.png | Bin 2777 -> 2020 bytes res/edc/images/ic_zoom_indicator_right_nor.png | Bin 2759 -> 1420 bytes res/edc/images/ic_zoom_indicator_up_foc.png | Bin 2803 -> 2080 bytes res/edc/images/ic_zoom_indicator_up_nor.png | Bin 2667 -> 1419 bytes res/edc/widgets/button.edc | 102 +++++++++++++++++++----- 13 files changed, 88 insertions(+), 21 deletions(-) diff --git a/include/view/detail.h b/include/view/detail.h index 89d0853..5ce4850 100644 --- a/include/view/detail.h +++ b/include/view/detail.h @@ -29,6 +29,7 @@ #define PART_DETAIL_CONTENT_INFO "part.detail_content_info" #define PART_DETAIL_THUMBNAIL_AREA "part.detail_thumbnail_area" #define PART_DETAIL_PLAY_INFO "part.detail_play_info" +#define PART_PLAY_INFO_STATUS "part.play_info_status" /* signal */ #define SIG_SHOW_THUMBNAIL "show,thumbnail" @@ -38,8 +39,10 @@ #define SIG_SET_STATUS_STOP "set,stop" /* images */ -#define IMAGE_MINI_PLAYER_PLAY "ic_mini_player_play_nor.png" -#define IMAGE_MINI_PLAYER_PAUSE "ic_mini_player_pause.png" +#define IMAGE_MINI_PLAYER_PLAY_NOR "ic_mini_player_play_nor.png" +#define IMAGE_MINI_PLAYER_PLAY_FOC "ic_mini_player_play_foc.png" +#define IMAGE_MINI_PLAYER_PAUSE_NOR "ic_mini_player_pause.png" +#define IMAGE_MINI_PLAYER_PAUSE_FOC "ic_mini_player_pause_foc.png" /* style */ #define STYLE_BTN_PLAY_INFO "detail_btn_play_info" diff --git a/res/edc/images/btn_view_contr_slideshow_foc.png b/res/edc/images/btn_view_contr_slideshow_foc.png index 413aefbe44a7a210f882c1f27bb7b4b61bf4d981..51f43a0173d4740b851ee77025f8177c4e6b306e 100644 GIT binary patch literal 507 zcmeAS@N?(olHy`uVBq!ia0vp^ML;}(g9S*|MSQPkU|>At>EaktaqI0JT|eeTk=BRC zEY0cc76uy_gv=ToCT?JFa-5Km$jG6>$;TSK!bvf}RglHQM_A{j>y-)1E>HP3+xqF5 z-`7lM{`~c%Y}w?0p^E>*Zq+d;I5x3lN_tFp*u`>5b%I`F3Fi`Tg;=JSLIj0Y_r9(C z_`WuLsT|kjm=#B#1$_Daf9?zwkLjo6CVQ8-{gs_OXZ6qYi#POFSs8jlO}0ECUHc*? zd#&c;C%Q^%_w0K*I<8yHsC>Q4_H60tnNMD5WjOP{%CxSZaP#<+dGkuve!b(mdXad~ z!jsq6J?`cyS*Ts>e{)x!|9=im&sy14^P6+ttEPCXM|y8HKPmq9_1d!RW>3D7RdWrK znoYk?ONn*9`^snjOz$*h`O-DdpO{Xbw{CIrr&#w}XVudb-+x`|o%?Ft&hLfGrWTj| z{e6us{rVG!T~q#BSw_3s>%BOl;{{Q8^v=Q704ZJJJIR9-Lp8H7qvG U@Oq{H3>c{lp00i_>zopr0IjIsxBvhE 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 diff --git a/res/edc/images/btn_view_contr_slideshow_nor.png b/res/edc/images/btn_view_contr_slideshow_nor.png index e9ec7d21cc8302d84db0bc98d4d756eecb674c70..4f47d89ac63e78217c061d650cab1bb8c7bb39e8 100644 GIT binary patch literal 487 zcmeAS@N?(olHy`uVBq!ia0vp^ML;}(g9S*|MSQPkU|?M5>EaktaqI1!_1?^dGVLF~ zryNZ)xRtX`V-43oZno~TS{;tf384lNy-jDA{BJtBWPw5iOS4;dLik~kfH0^H8vZHQlp4zKxo|Kl|IB|SUy4v=oX5j@t_kW$!obzPi6E$yT|IL%S z58c)&*-=(^W5?;Fw9~@giv6Fay!Cl%;Jnk=Z|33BM2Ri^e^$A!6g%of;+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 diff --git a/res/edc/images/ic_mini_player_pause.png b/res/edc/images/ic_mini_player_pause.png index 327c5ac227eddaefb2651537097ddfbf22a59ea0..8dd0115ca2ccab4994cc4f1f83fbd19be3f5a1fa 100644 GIT binary patch delta 964 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 Hu0mjfmx=4f literal 2807 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 diff --git a/res/edc/images/ic_zoom_indicator_down_nor.png b/res/edc/images/ic_zoom_indicator_down_nor.png index 1ec7c1a80d11c72e90d59cfa1a80266960d0ad66..a97c0dc7df33ac4861fcb385e76e6b79fdda7c75 100644 GIT binary patch delta 1424 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 QT>5wPbn|7LrA24{2lAhgh5!Hn diff --git a/res/edc/images/ic_zoom_indicator_left_foc.png b/res/edc/images/ic_zoom_indicator_left_foc.png index d224bb1106fde1b80ad4e7e76f3f189d3f3e47c6..dd5290152d7922557ddbde770a912e7c93a19b6c 100644 GIT binary patch delta 2018 zcmV<82Oaq074Hv_BYy|BNklP1{9Eoj|xVNfC4IFq7sycsWCtsd1c$} z_~YEd?sRr{_Aztsmi?0bvF+~cIbSAs?%c;2%eHNb_)iIdHGl7n?l?Lu_WUvcLb?OF zP$4Z1bzp80rsf(#$bZzD}lR!5x_{G zmxu2}fJ@Y?jXNEm`3v|8s0Y3T{??hKF42`h4KM|`4S$-jUcfZKb z-9`@p76V6tT7Tg7fMT%JZ`G>bUaVpXjG#o{0;~sqM9#3XAd_@ZregRJ*q~zb9lu3i z4Xglm0rw(jmMK`kJu0>pDpud{OLPhFB=9Rxjah=7SSrR}Rm{FzxBL*@2iOk03Y7b0 z#|O$)%-fM}WnRg*=!cO$>|p=B_{Lyhx5_1NLC%lRdBW+V>-PsvLXEJE7y^4MU7^FKh0~rL& z@bW<~qPqhx>CVVtUPK(F#Ea-x$nmbIgVPmpl#+C!Z${?!ilnB7G&42nM8AO9gZ8Fi zA+C~=O7uWrtnLg7h%uxXl1L?b4#l%M6D-7;D}TvER|1oCM_zzTBFP9}GSLsAcS%5@ zQbv-_Lo(6Tx+C_&rJXH4d;B7LR2bF5O>z69o9L^6p}M0@M|ml%pBCZnz9BxWiRca| zo}tKk!UWtzkHPSZU^oPI)e(mD3~{;{=B#hl9a20NF1Zh3QklbkJ&?&k%9tKEsF}{D8 z+VQ0TEc~v8`CD6bhm?%&h|6<0Mc=49!ek8T8KSN_LO2BL_Q#mD&Zu_TjRcoY(KqOh z&W#=w79T$np}Z7+ZfK=uWt5n4&2l>uTz@)6_t71llZs9j8y}0%y^F<>CY!N~qnwQD zj>;1WE}f#i>>mk?NEp^kjWD2lh^Dh5`AAd2?2Alr=@fmr?îLb!#!pPnsqA_@2 zS(Kj}%x^E^Na$2JMR(I3T^rAgD50iG<~?V9(oFqgOPDv@gi1xOv~%btdb92*Q?c;7 z7GC{Y2AN(SRmy`m7}>{e=g>{`CZqL-?>ZQ7hypG`)MZ>UxHtxbrL?2I9QlyDmg(cos=y7anVvcoiK(DjS~CotZ(LLY#Qoa*)Yr%x}O< z-Psw$OvH&NG9C6>iWIxP(5XdScqW_i#W_gP?F*GpNwMcU8QF-AA=Scm=+0OJJCH5N z8E*y4cEr31+4#9vcYo#qvRCEYl+BlOnVL9(Jkn#EZUX_ZP34;P(=KwI18PKeiLTXc z!bjGs92;{vNIoXp&LVXxI%036R^@g!*8}BiRx`%=GLjwPrskB&Wj0w{_}s|%^zkyJ zve?dGz2uc$Du-qHJg6V@^uHmS&Y!}u7~62psF;V6!5yDh{C`>y(Skf`qaRR**^>vh zim{)H*_SO~ey=<^gw$smjNDO~#zqy}L-@QlJg6l;-y;RCtAHiwZBou6;}liMBb>eu z;zxsCOSKnyAXpFN(Hq+drdhGoZ_Ps1T|7#_ceT2fV;%?IRh-|C$^ZZW07*qoM6N<$f=!I( AuK)l5 literal 2786 zcmbVOdpwi-A0H}3lA@5DwVd4AW@A^D%`VPz-`pZGyD)6iHjIwk(oLLla1v>5kxKES zs8C7=jg|dY6=X;AeV&$`5;`ZTq23= zQ0@~i4McbDdNNf>P z$c+?p1$^KVBO_Q4CB}i2mVR}C7wO{iH!)xIEl|pkK_!exC=6l+is5V2eV?x6y)Koly7 z1QO{;pqUSs&l1Fl%$L&h)msu<$c<*RC_(`b_$9tr?my^9JD_b~NQwgr3AZLAU@!t2 zMIw+XM4~l}q+C0IzF}GaPt2f7W1vgL@ju0~yrrzbrRm?LuU!1yJZ!$QV}#1qaM@Dw z2LPbHfl4BHN}f)fjg9d1(!KvsY~Y_$lPcA7w@Tcm(YgVDCoyQX?eX1G&#TS$c-1v3 z8;c(4TOB5W!nE|6q?~GBwcR>tn#Ze1crYjow4RjOt)G3^A@3EuV7lQkEo^MI<1ME% zFE;S4ikh{o-X1bmIlV8?O5en-(^Ad;!;|hf6C+w={Ix$sXO4g}5PrEItB+JobF@$P z;`)aA%Z&s2Rid>P;0qcz&n#LltX*)7F1~oetJ3VB>3fgKYJQ{bZ9+*)$ZE(7X#R{EUYQY-VJsVNZfu2ceoCjW z-8EksJU<2A;MA35dtZh0C$)9? zCUu51J%edoh-x+qlS9e27Q2PNYZRB`wM|95hd!dIz#IMZF*GAos8Z^2~$LPV=SJZj+7h<&w@tf-kJ#p9t z#fuh{$Fz}`0ly$X-q6RaAx>pcJ-uI+QPsK>Lk>;n<+m%#w#w5bs@ z${vxXr}vf19{C*gce<0cv5Q&GXQF(tBaBpXsS0-Pz|Ys#m-VUOysclBzURot_m6Ul z%CvhP7tqrU?-~v0C=Rli$tE5SU`RnW_fyQXulpYC9H=5UvHJFe6 z(=EN`#{`^t?|MsliVfw&)WCw~BE{{+k%}D_gIlHdcTDCBSpA#C3A{(6ta-(=pAWWA zj~Cllq}cGB62nw0^>4kqt~%sMFZnDkYS8>-gSJnvcqDD_aH{5=o)J61HyZ`YS?)tuS zzj#;Dy`>LpU7q_Lin@~=Flr}$oxQ0=YXoB{cTaty@V{~?XmWjkeQAXvl(jlLywbwg za_~(lrtQ!jS#gTzT-Afg#QVgwiV*!LS-o3ox7?lKi8>ay9$yiyt~|&kIwDdi1(Zh0 zFh!g7!r5!ya01e=qBZ$sxTIJeK64fjFFb#2G^gB;H28Q}@G%m}wRPl-Qak3Nvksdk z-WzVoc`=N|!Z!+b&eo+~rfKXyU*Kg~?Qx*E+&O4=ce#CyYCJ6tSTM2XlErovE!^v# zuz}in%te%Vg<%;xTViCZyUy$r(oim^vy8u+xDcPzF`hBZQWs~JtamGX9PYIfzlFY* zRWS1E73C~2FXVLJ%Jdf7{0K=8bD-#Aa|tX*S{T^(z^)POx5L@&iF8~3I`0V>Qa?g- zOzo5m`aE{5TKDj$ZF}rywmQjMsc7(ouZ9C9S95ao_fP_{E`wRI_A#AoS}N-~^&|RB z=^7brWcN?o%>naAvk=b*AVmRc&E>1zj!iiQw=R^N@JP>KR`q#1j$-uM`nH(oRQHe< zHn)U%ZA>T5z%tvc%IhuIdvvIG$4nHQk-F&ooza88-yI*J<(zIi78Q3Q=Zzf0SsWB6 z1YW*pwDNS13tJ;+?0TZ zi=UEszurr+xsrCEO&$$jICy;M&Q9Oi569z=%Jjz5j>$X>=NeRR`v)u5-8iUckrAwT z(3mS5>)wx!o>}zoEon+q&;J~J&Q#93PYb|qCh1SS6k^f|P~ diff --git a/res/edc/images/ic_zoom_indicator_left_nor.png b/res/edc/images/ic_zoom_indicator_left_nor.png index bdc35fe9fe93e18b3d5ec84833b12b8f78a9d114..728744261c5c5f054c7b3ff722730bc775e945eb 100644 GIT binary patch delta 1419 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 C3$>d7 diff --git a/res/edc/images/ic_zoom_indicator_right_foc.png b/res/edc/images/ic_zoom_indicator_right_foc.png index 2509aa1295d00e3c3ed740fa9a89ef1ab0c3dce6..6d2894c4df0462ceaf6298338882f14fb3503639 100644 GIT binary patch delta 2007 zcmV;|2PpX2732?)BYy|0Nkl1VW zAO2IiJDuH~z091`vR|?f+wRW(|Ch;`Gw1S;W!p9d{HGUyHGlt%?l^iZ_TpjyLb?Mv zU+ASf02i(TDu7|Y5cU2N;9{T{=nF)F|9~do6wnO(4*UxI0_;`qjll%bmjibLV}P;1 zAP?V(02irO2X{I?a}4+rs0Y3P{??hKF41K`4KNkB6@QwrLBMqNvVre_4}sOd$)FPs zx{V$VEC-GQwST~E0mWdc->Ox=yw=)SW>$Vgf0KBvOfyEgC0i_n7KXCz<^yxOO*i^Sax{1C57^OSf4%XI07&j!u=IIeiigZWg ziBZUU!UWtzPr#sy;M~ovw6sFyzz}uS5yIv#G`4W*t+|DLkM2n0+4*NX)7M6^ZJ2y* zn17chbc@rvi$gcjx9N`3$+`nE7Hn??VBQ_Qc=8q#RvV|Ji$kaAay$%>=wR_zZ7lh| z4S?FoMNGanFUu|bqCevD98S^K>y9uLvp2P}>0pd-261E*&kcFmZX5znX3O_qEtEBSL9!BV{MJ zbc*(}e?&WfHQP*F9;NxL&G7yqHar?3VqTM-;L<7jGTqU62IZWh`|6G^8y0MDW%b?|mIceEL>OCcM7J+towzfisP5>p!M0)M#wbl^ zY$9QiZ5mF|r*sFD4VDELfYQz}j`%x7!$@%H6#cXA=+aSA1e>PG zs9oc!&M^-INpR^D{gdwKQqeIEU2%DcmR7ibg^c1EN`gzL=p#59ag*qnS%2vmm)`lO z5#2a98WET0aJyG+&>f{4^GA2i6?V+D7)%$3Zlbs8j?zihurQ0p%k1~7-*nC$8cY|5 zZlbp$HHeI$a$ty6Q)R4q)4>?eZf(^aQaWs4i}R0eqK_kmo{Zr2NkxW;R9hksT_+3{;TlirWgV*JSrz(;O>v~1gUE16k_oY{pHrI~RC zS-W_y+*`VmnJ1At6$LV59Z72HrJ9O(9fK~4-2fYSBiTPwiQb3wKni$cD^gF&m2{J9 z3n`q{Ua*1ZQhgwu=sid+&jP7g1N@lk174k8ll^foDHk#UL&RE z^5~5Qf@xN4^;@%%br;hJ_^wvhp5A|fx7F(kZQm&^*(eyf2#%Q@16ku0gfVTl7B{~{g3KSEFKd?J2|Re p8*~SfPprao!Gpnw-Rb88{{tY(u<4%#?_vM|002ovPDHLkV1m2O***XO literal 2777 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 HTKazgHFuh~ diff --git a/res/edc/images/ic_zoom_indicator_up_foc.png b/res/edc/images/ic_zoom_indicator_up_foc.png index ee95deec26860d1ab8b6ed7b74b14a160562542e..c0a67a5a0f8c9ee9f282bfe46038e54db83eed45 100644 GIT binary patch delta 2068 zcmV+v2A zrwbv~0a$P`PzGEEOpwc?fwO@k;7mXVP5>RiaiA0U75Euw0lt^Zp1}*EOMn}I>wxQl zi)?HY2F{Ydla!m*IRbnE>;xKt-&H25O7tk;ZlDsF0gg0b7Xb_8&j9uS?*dzZV{Rwx zb{ky^Yy#SV)qlV&mtxT5u~y4tZ<4XNhFhYq2DSqS5NBACn@O4|k}(_r8f0va-V$s^lQABYF*|bIazgZYU^nm*aE4QM z9N-KY^KL}9GN{REyIL1_9pUfp^AR) zv9qEb(PMyTRA=O2o<=xIi5<}|lI2}do--2RC?$i5z6$Yf&nGo^Gsv5o!9=gb+Yjx% zf`)LFlvJW80~M+>7((1kiboQuL_dswHm8GzaDQe=GSQ=eJ5@(M1i6zWPxz9Fu0rjQ zfT2neNjeY7M9)_p@eroc>W@~U&j)6zj&=w$6EU7J0V~lr<6i``LBpcAW+nP2)sf}_ z0~}h3o~1gLbUw7ih=ah{*3Fb3iBf6NhIp*q53R80=@*`f#& zM}KR4wkX2Uy0MI#k!|tZeMVFn?gtlpqZYA`FkHj(7kGF3qCPQym?^g(EbY zY9h>;5I~Q?{U7K&^?5HR=bjn{JoR}m_kWM(`bIfwxH=AQrY>Lv+ZBRN!Y*$v|nI1|18Dj%PXFX~%8-FS$ z2HCYZLdkHAqa6mb*6B1Jj;GwF@o=1L-q1O6%%Ehr#;(N?DkgfO(N1_MXBK^?s;FwF zhuBsfW>^@S+u}@nJxa?Taa-HA{1IpR+9=I!afXFqTXmS4>B@T~3FE}gqII{U(KL9W zqJXux7Z41<_Jc8IuaDAxJiTH7?SID&X0MO3{a}n>0M_1Kz>5_H1U%Agn?)aY^WcRc zc)u#ligI!Gt=ZGZ+*+Nk4F9{kbeLPKvt~~p0FRW1c&{og1PlN>Q)qO{}`07k2-#wZ-0xsavTee^j|Qa z(T7z;l&2)PG>iUGb#!?|f`3c1=pR%^mq#SHG>iTPQzPz^5$y<<|6}z8X1D4n^MC;k ztwevKI?6m?fI}2(<0 z%96oe89#x4R@=b|EbfJX*f$&ToDL=)m; z%@f#o5NCH-&pJd6PoG5gVzY*cUC}W_Wy3DjnR$pVgcDmYJkuGdb_jS-b#@-&L4*@q zq&p(;ZA7u_)1B1_7k{?NWa#C?h@#u4D<6?!&UZ305gkKR3;RZO#tQfbF$Fp8fhd^{ zChkN`{M@fPa~Ih!bMDM!<7`H4A47c7<4e^BT;NNYYsO!@$aZ*q2V$1!R@EjPWUI`v zBb%M%Vje;dqE1CV_C{9A+@i+$^^ zmz=U!=1`lCd&h1W^GwpX8SoZro0J~JbBZ#=C!D@>#wb?cb_8 yvHo~Lw3$}<`%rZtxkU573+@h{skxBv{0H>byEOc(ZVmMS0000MY{>GP*73G62K=lK>1R;QgA!38bEI}|ELgz6;*`90$D<<+T+Xe(u z3gLMB0e-G71g3xoXROG;qj^F(8U(T-MGF~BE*pRZvqL$2B6OzyHWb2P5uv^qS4&r+ z13Qf47%O6X#kzSjW4TOg7L;TQv56+g33zOP0g2{C@Wq5^BJ>L{K|WvEMnEB7L;x-k z`j=6Dt~((P0udX6fm>NHEs;nF77ItBF<30}dkD%Bi9%S)Z>$9pO~7CYC>-SL1(j

NLi@yd+9x_BULx@1aEfGB4ieF!(#egUK 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 ROJ4v0002ovPDHLkV1kj9$7=up literal 2667 zcmbVOX;>5I7LF*ml&#=`6eT2u3n(O$KsHGwWRYE#s6nq61DTKj$zU=eVNnnjtcnCh z3Wz0Y-3kbZpa?>xDqsPl0V^V)f`SqRskBuDJ6P$xKl=2?oo8mg?Y!@MzH`p^%zPab zxXxse^&%7sW#Z$_3PIY3|cIp zV>Y=5-~-~Aph)bUC<8+i1G$ljF_BaOX6;vK4;2j|kbp2Bt&+q_xJWk$}}`0v;gX@W@Sa0o-WrBpQK? z{&ZmwHJLz23t@3SX(1yzMg+rgG#pN;RJtmOu8=GW2T-Zh84d!$1+j3ECrDww%0(*2 z&N8q-d8AAn2a6#odWMl70V!ZQ2J!UIElA=50{$YF%0C4P2^mhskHZ13c$`Esv#*cV zaySJ1uN!}BE$1f0fw&M*4k=`jNIrzvSuhg2e-@fCM7*J`mx+<2@MBp}q(TBpVILM9 zgRHm;!~&WZi{wV2xHG6!Hihj502DHj#9|Q{WG^y-!X^W=9Dj#p0C=VslT0RXC~N>= zyHlA2CWlJEvk7hlDucq9#rjC)Fkc!8&gzO0-A`E3KVoT28OVnr85e?LXDc8`1i_G8 z1jV75p(M29Cb3iiDdkQx>G^ZFEKnwn2L&7%Btd_SFHQV6`V=pU8$jZCkx2w1+Z_NH z6f%p!<}jH=fQ5{`FrTo3|0iZR#2MU7ar{rQ%uXQ{IMe;B^pU||hX<4*Cq{-Gja$ii zPAHVoF&`F#t9qzEzTV$vgH2PP!RessbLAr&%U!}8=Z8?x9ahf!(tR^EueB;vqTRE` z>uN`b!ZFqlmU&j!ciY(%H4u;w7$K) z)s+Y-`^ayF@$pf;byN7dx7WJJ4N+m?;ZY$*-f5)t?KwBL9gLV)5^6y`TIdz{eE9Xi zR9*dKbBthFSIalW1NP&XgkAc_!;Q^px`z=Jd0`oI2Vj|XxP#I8M=34DfweW?w8hd| z4Kgc<2MT?vpO{I10Bo~I508$0*i&wl`5c`UORngW9U0Ar#)S?go?BWB2TrAJHCw5M z)Pu|wZV$VU)a9Fpi2^VD5>Nlm6C3Ms{mxUXrPi`vDkqm_MemuPsn(l}pD;H`usxE| z@?oFxJIdR|Sqf&@zP2(obil~kut_19Jm zTyDmtzb)P0(7d~@7@~;Yyy|`On>~hcB}EpzzKo!*RZ@=JVVMhVH4HDG?or&VO>|8@ zZD&(&c#`P>S6R)mzIzi`T0^_NT<C(^9j6t=TZ*?uKu3WfC^uB}ZnE#Gz7qu8awCT;QL!Y1IwL7A<8&`_G-)7w^ z*_G<5Hr`O|i5ucN^g_uem4c9o)b^u#w^f@~i5}%w`bi7GK|ObO`{Co3J;(D_yJ(2^ z#Gc#S&uF`ndE@s=f9$2bAkb60KVaQq$Ew!m=6zVrgrT7!o8n|Ne?IQ{;9v@!P9M2pF|4vJ zid++mvl{x+Ui%u;QGVsh?}oI{wbk7t)R>r-;^zTSMG*V9g z)p7w`XCczv*)Jb#U$NZE>h~MbRcB7orP0wZ&lMMcF;VT(+cbEohfv+L^Fg?|cDt`8 zKr&o#?AUr(q1ch5R*${EckiB;LZOK9^ZRMkck;3P;f2g<<+io@EZIENiqgf3LUQrO zo}M224I4Jt25mhljEWl7?R_PWHeK5JDxAm5^AGmE)+SuT=@XZpJv-NsJMe<>6EKU+1Pg+?KiN#|3 zjvhU_V^~&mzs=~H<;(B0tGojOddO62LhsxJ7=|f0+~{X?wVgg=D%kYCpRaFVR#sL~ z({}$2xE~%iW##@BjL&t1>DhE$pk?%o<1Art7bbjjo-Xmw5BsX6;_H<5}Gk z6B9+qr+515vL?@2gDI}lOVx3)%^~M!p`in|$y<$=*%xWV!RKG_)X8aQ3>R)jX(>J5 z*q=(R(wDtR722OotvYamtTjVA6G3Stj#)?Q&PI|Y-RFf43;j$DSH67Z`=6_dJKe|X zJ+V#dEdq|j(q>k%7TBHQXAJCWb5Hr={G80kN&e$+&I4zjata@wFl@*k z{8G2Ipg)#Z?iu;-8(`PhU7ggLR<46>2Z3i)Lo4&H-*UClZ2;Fva~AtLIcAj~YRSo6 z@y7Ur*M;`U&wGKI?-l=|YwkMmn>+g#?0L`gtF>_yt=Fr*R_d^9)9K@i2`7OCPeE{B zSh9{#TEWner-^y~9g+p2tTEQAi}duw3uZ89r@-LMw|%bPWg9<>t&@9PG*2Y#9l3k3 zaODk@c4f;#D6b-vVwW-alYgsI;Z9*va@4(pJ}v5HrcOV#7Umf9t#6h3TX#OO01N1+ z#>wmsx1`=Zf-qId@Al8Jua5+}$gk*P Date: Thu, 8 Oct 2015 13:42:02 +0900 Subject: [PATCH 08/16] movie: add input callback functions for date view item Change-Id: I54b4f4368b16c5da725ceb5c79443dda737d1a35 Signed-off-by: Jehun Lim --- src/grid/grid_movie.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/grid/grid_movie.c b/src/grid/grid_movie.c index 6f5c9d3..f8bc519 100644 --- a/src/grid/grid_movie.c +++ b/src/grid/grid_movie.c @@ -383,7 +383,9 @@ static struct grid_data _gdata[] = { .gclass = &_gclass[E_MOVIE_DATE], .get_item_list = _get_date_list, .free_item_list = _free_media_list, - .get_item_info = _get_media_info + .get_item_info = _get_media_info, + .key_down_cb = _key_down_cb, + .selected_cb = _media_selected_cb }, /* Other view mode data will be added later */ }; -- 2.7.4 From 5af9c6090a6eb3ea231a0607d8f26bc707fedc08 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Mon, 12 Oct 2015 17:32:26 +0900 Subject: [PATCH 09/16] add missed image file : ic_mini_player_pause_foc.png Change-Id: Iad810802f8110a3a516bb69a14c53565bd198d13 Signed-off-by: Jehun Lim --- res/edc/images/ic_mini_player_pause_foc.png | Bin 0 -> 654 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 res/edc/images/ic_mini_player_pause_foc.png diff --git a/res/edc/images/ic_mini_player_pause_foc.png b/res/edc/images/ic_mini_player_pause_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..21a4bcc897ecf7ff8d6e0c06a847902a644fb15c GIT binary patch literal 654 zcmV;90&)F`P)_7{~D+Qq(GPgLr8Tdg-6U(2E}QCdT$9&@;t%AiNc0+Nz!>92O@#zV zQ~M6s>fZSFu-G(Z2WEFEXJR3vfYg1#iCfEe~U$F<)Gqc*!rk-j^ z3z8gtRb5qm(w6`l!+V?pHM;nDA;3F;7uq>h!Rk<#jc=)D9Y=bT9QRhSz@AIGh=g5AdS-_`lGKibwInUsVGEKvk+6=Wq#gDLTR-MV zN<~^TCF#2z_D#}CBy2^}jU9F^X*CkID(SNwR+Y3B3EPrX^Bw66D$8`~L<(0OQ@9#^ zAT9<8#AANN#Hj=2P*^$W%hO8>?kw}FUwe)_VB0iq`rA98IV=zSt$PX2Tk{OlfS1Z$ z21?~F!lrV;lhjuDBvptE=YUIPX!>2o1 Date: Mon, 12 Oct 2015 17:23:43 +0900 Subject: [PATCH 10/16] folderdata: add to get folder media list Change-Id: I9c0a1553cd2105d2d69ee4f184fbb8d7e80f0724 Signed-off-by: Jehun Lim --- include/data/folderdata.h | 6 +- src/data/folderdata.c | 353 +++++++++++++++++++++++++++++++++++++++------- 2 files changed, 306 insertions(+), 53 deletions(-) diff --git a/include/data/folderdata.h b/include/data/folderdata.h index af1af0a..79a6894 100644 --- a/include/data/folderdata.h +++ b/include/data/folderdata.h @@ -20,10 +20,14 @@ struct data_ops; enum folder_group_type { - E_GROUP_FOLDER_NAME, + E_GROUP_FOLDER_MEDIA_NAME, E_GROUP_FOLDER_MAX }; +enum folder_list_type { + E_LIST_FOLDER = 0, +}; + struct folder_info { char *id; char *name; diff --git a/src/data/folderdata.c b/src/data/folderdata.c index 6a9ee00..d9ef0e4 100644 --- a/src/data/folderdata.c +++ b/src/data/folderdata.c @@ -17,9 +17,23 @@ #include #include #include +#include #include "data/datamgr.h" +struct folderdata; + +typedef bool (*get_media_list)(struct folderdata *fd, void *data); +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); + +static bool _get_media_name_list(struct folderdata *fd, void *data); +static int _compare_cb_name(const void *, const void *); +static int _compare_title(struct group_info *, app_media_info *); +static char *_get_title(app_media_info *); +static void *_get_data_title(app_media_info *info); + enum _filter_type { E_FILTER_FOLDER = 0, E_FILTER_MEDIA @@ -27,6 +41,7 @@ enum _filter_type { struct folderdata { Eina_List *folder_list; + Eina_List *media_list; char *parent_id; @@ -34,6 +49,25 @@ struct folderdata { int source_type; }; +struct _list_info { + get_media_list get_list; + + Eina_Compare_Cb sort_cmp_cb; + media_compare media_cmp; + media_compare_data_get data_get; + group_name_get name_get; +}; + +static struct _list_info g_group_info[E_GROUP_FOLDER_MAX] = { + [E_GROUP_FOLDER_MEDIA_NAME] = { + .get_list = _get_media_name_list, + .sort_cmp_cb = _compare_cb_name, + .media_cmp = _compare_title, + .name_get = _get_title, + .data_get = _get_data_title, + }, +}; + static bool _create_filter(struct folderdata *fd, filter_h *filter, const char *cond, int filter_type) { @@ -47,43 +81,91 @@ static bool _create_filter(struct folderdata *fd, filter_h *filter, return false; } - snprintf(buf, sizeof(buf), "%s", fd->media_type); + if (filter_type == E_FILTER_FOLDER) { + if (cond) + snprintf(buf, sizeof(buf), "%s", cond); - if (fd->source_type != E_SOURCE_ALL) { - char s1[256]; + media_filter_set_order(tmp_filter, MEDIA_CONTENT_ORDER_ASC, + FOLDER_NAME, MEDIA_CONTENT_COLLATE_DEFAULT); + } else { + snprintf(buf, sizeof(buf), "%s", fd->media_type); - snprintf(s1, sizeof(s1), " AND MEDIA_STORAGE_TYPE=%d", - fd->source_type); + if (fd->source_type != E_SOURCE_ALL) { + char s1[256]; - strcat(buf, s1); - } + snprintf(s1, sizeof(s1), " AND MEDIA_STORAGE_TYPE=%d", + fd->source_type); - if (cond) { - char s2[256]; + strcat(buf, s1); + } - snprintf(s2, sizeof(s2), " AND %s", cond); + if (cond) { + char s2[256]; - strcat(buf, s2); - } + snprintf(s2, sizeof(s2), " AND %s", cond); - media_filter_set_condition(tmp_filter, buf, - MEDIA_CONTENT_COLLATE_DEFAULT); + strcat(buf, s2); + } - if (filter_type == E_FILTER_FOLDER) { media_filter_set_order(tmp_filter, MEDIA_CONTENT_ORDER_ASC, - FOLDER_NAME, MEDIA_CONTENT_COLLATE_DEFAULT); + MEDIA_TITLE, + MEDIA_CONTENT_COLLATE_DEFAULT); } + media_filter_set_condition(tmp_filter, buf, + MEDIA_CONTENT_COLLATE_DEFAULT); + *filter = tmp_filter; return true; } -static void _destroy_folder_list(struct folderdata *fd) +static int _compare_cb_name(const void *data1, const void *data2) +{ + app_media *am1, *am2; + app_media_info *mi1, *mi2; + + am1 = (app_media *)data1; + am2 = (app_media *)data2; + + mi1 = app_media_get_info(am1); + mi2 = app_media_get_info(am2); + + if (!mi1 || !mi2 || !mi1->title || !mi2->title) + return -1; + + return strcasecmp(mi1->title, mi2->title); +} + +static int _compare_title(struct group_info *gi, app_media_info *mi) +{ + if (!gi || !gi->data || !mi->title) + return -1; + + return strncasecmp(gi->data, mi->title, 1); +} + +static void *_get_data_title(app_media_info *mi) +{ + if (!mi->title) + return NULL; + + return strdup(mi->title); +} + +static char *_get_title(app_media_info *mi) +{ + if (!mi->title) + return NULL; + + return strndup(mi->title, 1); +} + +static void _destroy_folder_list(Eina_List *list) { struct folder_info *fi; - EINA_LIST_FREE(fd->folder_list, fi) { + EINA_LIST_FREE(list, fi) { free(fi->id); free(fi->name); free(fi->path); @@ -91,8 +173,14 @@ static void _destroy_folder_list(struct folderdata *fd) free(fi); } +} + +static void _destroy_media_list(Eina_List *list) +{ + app_media *am; - fd->folder_list = NULL; + EINA_LIST_FREE(list, am) + app_media_destroy(am); } static bool _get_folder_id(media_folder_h folder, void *data) @@ -179,6 +267,27 @@ static bool _get_each_folder_info(media_folder_h folder, void *data) return true; } +static bool _get_each_media_info(media_info_h media_h, void *data) +{ + struct folderdata *fd; + app_media *am; + + if (!data) + return false; + + fd = data; + + am = app_media_create(media_h); + if (!am) { + _ERR("failed to create app media"); + return false; + } + + fd->media_list = eina_list_append(fd->media_list, am); + + return true; +} + static bool _find_folder_id(struct folderdata *fd, const char *path) { filter_h filter; @@ -205,16 +314,12 @@ static bool _find_folder_id(struct folderdata *fd, const char *path) return true; } -static bool _get_sub_folder_list(struct folderdata *fd) +static bool _get_sub_folder_list(struct folderdata *fd, const char *cond) { filter_h filter; int ret; - char buf[1024]; - - snprintf(buf, sizeof(buf), "FOLDER_PARENT_FOLDER_ID=\"%s\"", - fd->parent_id); - if (!_create_filter(fd, &filter, buf, E_FILTER_FOLDER)) { + if (!_create_filter(fd, &filter, cond, E_FILTER_FOLDER)) { _ERR("failed to create filter"); return false; } @@ -223,7 +328,7 @@ static bool _get_sub_folder_list(struct folderdata *fd) _get_each_folder_info, fd); if (ret != MEDIA_CONTENT_ERROR_NONE) { _ERR("failed to get folder info"); - _destroy_folder_list(fd); + _destroy_folder_list(fd->folder_list); media_filter_destroy(filter); return false; } @@ -233,6 +338,104 @@ static bool _get_sub_folder_list(struct folderdata *fd) return true; } +static bool _get_folder_list(struct folderdata *fd, char **path) +{ + int ret; + int i; + char buf[1024] = {0,}; + + ret = media_content_connect(); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to connect to media content"); + return false; + } + + i = 0; + while (path[i++]) { + char s[128]; + + if (!_find_folder_id(fd, path[i])) { + _ERR("failed to find folder id"); + media_content_disconnect(); + return false; + } + + if (strlen(buf)) { + snprintf(s, sizeof(s), + " OR FOLDER_PARENT_FOLDER_ID=\"%s\"", + fd->parent_id); + } else { + snprintf(s, sizeof(s), "FOLDER_PARENT_FOLDER_ID=\"%s\"", + fd->parent_id); + } + + strcat(buf, s); + } + + if (!_get_sub_folder_list(fd, buf)) { + _ERR("failed to get child folder list"); + media_content_disconnect(); + return false; + } + + media_content_disconnect(); + + return true; +} + +static bool _get_media_name_list(struct folderdata *fd, void *data) +{ + filter_h filter; + int ret; + int i; + char **path; + + path = data; + + if (fd->media_list) { + _destroy_media_list(fd->media_list); + fd->media_list = NULL; + } + + ret = media_content_connect(); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to connect to media content"); + return false; + } + + if (!_create_filter(fd, &filter, NULL, E_FILTER_MEDIA)) { + _ERR("failed to create filter"); + media_content_disconnect(); + return false; + } + + i = 0; + while (path[i++]) { + if (!_find_folder_id(fd, path[i])) { + _ERR("failed to find folder id"); + media_filter_destroy(filter); + media_content_disconnect(); + return false; + } + + ret = media_folder_foreach_media_from_db(fd->parent_id, filter, + _get_each_media_info, fd); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to get media info"); + _destroy_media_list(fd->media_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 folderdata *fd; @@ -265,7 +468,8 @@ static void _destroy(void *handle) fd = handle; - _destroy_folder_list(fd); + _destroy_folder_list(fd->folder_list); + _destroy_media_list(fd->media_list); free(fd->parent_id); free(fd); @@ -274,6 +478,7 @@ static void _destroy(void *handle) static Eina_List *_get_list(void *handle, int type, void *data) { struct folderdata *fd; + char **path; if (!handle) { _ERR("failed to get folderdata handle"); @@ -282,7 +487,17 @@ static Eina_List *_get_list(void *handle, int type, void *data) fd = handle; - return fd->folder_list; + switch (type) { + case E_LIST_FOLDER: + path = data; + _get_folder_list(fd, path); + + return fd->folder_list; + default: + break; + } + + return NULL; } static int _get_count(void *handle, int type) @@ -299,15 +514,40 @@ static int _get_count(void *handle, int type) return eina_list_count(fd->folder_list); } +static void _free_group_list(Eina_List *list) +{ + struct group_info *gi; + + EINA_LIST_FREE(list, gi) { + free(gi->name); + free(gi->data); + _destroy_media_list(gi->list); + + free(gi); + } +} + static void _free_group(Eina_List *list) { - eina_list_free(list); + _free_group_list(list); +} + +static Eina_List *_sort_list(Eina_List *list, int sort) +{ + Eina_List *sorted_list; + + sorted_list = eina_list_sort(list, 0, g_group_info[sort].sort_cmp_cb); + + return sorted_list; } static Eina_List *_get_group(void *handle, int type, void *data) { + Eina_List *list, *l; struct folderdata *fd; - int ret; + struct group_info *gi; + app_media *am; + app_media_info *mi; if (!handle) { _ERR("failed to get folderdata handle"); @@ -321,32 +561,41 @@ static Eina_List *_get_group(void *handle, int type, void *data) fd = handle; - if (fd->folder_list) { - _destroy_folder_list(fd); - free(fd->parent_id); - } - - ret = media_content_connect(); - if (ret != MEDIA_CONTENT_ERROR_NONE) { - _ERR("failed to connect to media content"); - return false; - } - - if (!_find_folder_id(fd, data)) { - _ERR("failed to find folder id"); - media_content_disconnect(); - return false; + if (!g_group_info[type].get_list(fd, data)) { + _ERR("failed to get list"); + return NULL; } - if (!_get_sub_folder_list(fd)) { - _ERR("failed to get child folder list"); - media_content_disconnect(); - return false; + fd->media_list = _sort_list(fd->media_list, type); + + gi = NULL; + list = NULL; + EINA_LIST_FOREACH(fd->media_list, l, am) { + mi = app_media_get_info(am); + if (!mi) { + _ERR("failed to get media info"); + _free_group_list(list); + return NULL; + } + + if (g_group_info[type].media_cmp(gi, mi)) { + 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(mi); + gi->data = g_group_info[type].data_get(mi); + + list = eina_list_append(list, gi); + } + + gi->list = eina_list_append(gi->list, am); } - media_content_disconnect(); - - return eina_list_clone(fd->folder_list); + return list; } static struct data_ops _ops = { -- 2.7.4 From ebc3ce7eb24ee52c91061993f2240571a85b9e61 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 13 Oct 2015 14:14:43 +0900 Subject: [PATCH 11/16] mplayer: free the genlist item class (prevent: 474473) Change-Id: I679d7b132cadf66c48f74b265c429385746d533f Signed-off-by: Minkyu Kang --- src/view/mplayer.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/view/mplayer.c b/src/view/mplayer.c index a98aa26..57da668 100644 --- a/src/view/mplayer.c +++ b/src/view/mplayer.c @@ -868,6 +868,8 @@ static void _add_playlist_item(struct _priv *priv) priv->item_list = eina_list_append(priv->item_list, ld); } + + elm_genlist_item_class_free(ic); } static void _callback_music(void *data, const char *ev) -- 2.7.4 From 468a8080f61cea6b632d2f2ee5ddc7cdefd646f1 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 13 Oct 2015 14:21:38 +0900 Subject: [PATCH 12/16] viewer/mplayer: return null if cannot get current media prevent: 483654, 484718 Change-Id: I87ced5578c49f996bfcfbc2cad316a6eba30f2b8 Signed-off-by: Minkyu Kang --- src/view/mplayer.c | 2 ++ src/view/viewer.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/view/mplayer.c b/src/view/mplayer.c index 57da668..754da9f 100644 --- a/src/view/mplayer.c +++ b/src/view/mplayer.c @@ -192,6 +192,8 @@ static const char *_playlist_get_current_media_id(struct _priv *priv) app_media_info *mi; mi = _playlist_get_current_media_info(priv); + if (!mi) + return NULL; return mi->media_id; } diff --git a/src/view/viewer.c b/src/view/viewer.c index 0a9c597..457e4a1 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -414,6 +414,8 @@ static const char *_get_current_media_id(struct _priv *priv) app_media_info *mi; mi = _get_current_media_info(priv); + if (!mi) + return NULL; return mi->media_id; } -- 2.7.4 From 80f7a7d15c4a0e4dcfa7b948c8b97eed77268df0 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 13 Oct 2015 14:45:20 +0900 Subject: [PATCH 13/16] use strncat instead of strcat (prevent: 456955) Change-Id: Ieef0ed3f49bd566ca399a480a90f40f3d3c49e54 Signed-off-by: Minkyu Kang --- src/data/albumdata.c | 6 ++---- src/data/folderdata.c | 8 +++----- src/data/mediadata.c | 3 +-- src/view/detail.c | 2 +- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/data/albumdata.c b/src/data/albumdata.c index a0497c5..9b2ff52 100644 --- a/src/data/albumdata.c +++ b/src/data/albumdata.c @@ -98,16 +98,14 @@ static bool _create_filter(struct albumdata *ad, filter_h *filter, snprintf(s1, sizeof(s1), " AND MEDIA_STORAGE_TYPE=%d", ad->source_type); - - strcat(buf, s1); + strncat(buf, s1, strlen(s1)); } if (cond) { char s2[64]; snprintf(s2, sizeof(s2), " AND %s", cond); - - strcat(buf, s2); + strncat(buf, s2, strlen(s2)); } media_filter_set_condition(tmp_filter, buf, diff --git a/src/data/folderdata.c b/src/data/folderdata.c index d9ef0e4..201d7d7 100644 --- a/src/data/folderdata.c +++ b/src/data/folderdata.c @@ -95,16 +95,14 @@ static bool _create_filter(struct folderdata *fd, filter_h *filter, snprintf(s1, sizeof(s1), " AND MEDIA_STORAGE_TYPE=%d", fd->source_type); - - strcat(buf, s1); + strncat(buf, s1, strlen(s1)); } if (cond) { char s2[256]; snprintf(s2, sizeof(s2), " AND %s", cond); - - strcat(buf, s2); + strncat(buf, s2, strlen(s2)); } media_filter_set_order(tmp_filter, MEDIA_CONTENT_ORDER_ASC, @@ -369,7 +367,7 @@ static bool _get_folder_list(struct folderdata *fd, char **path) fd->parent_id); } - strcat(buf, s); + strncat(buf, s, strlen(s)); } if (!_get_sub_folder_list(fd, buf)) { diff --git a/src/data/mediadata.c b/src/data/mediadata.c index c55572c..eb0ae3a 100644 --- a/src/data/mediadata.c +++ b/src/data/mediadata.c @@ -120,8 +120,7 @@ static bool _create_filter(struct mediadata *md, filter_h *filter) snprintf(s, sizeof(s), " AND MEDIA_STORAGE_TYPE=%d", md->source_type); - - strcat(buf, s); + strncat(buf, s, strlen(s)); } media_filter_set_condition(tmp_filter, buf, diff --git a/src/view/detail.c b/src/view/detail.c index a182fb0..629f210 100644 --- a/src/view/detail.c +++ b/src/view/detail.c @@ -627,7 +627,7 @@ static void _get_place_title(const char *title, char *str, int size) if (country) { snprintf(s, sizeof(s), ", %s", country); - strcat(str, s); + strncat(str, s, strlen(s)); } } -- 2.7.4 From 2e74661d4a5b7508c037028670dd32c412a6f478 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Tue, 13 Oct 2015 15:23:45 +0900 Subject: [PATCH 14/16] base: add null check for grid data (prevent: 483459, 484089) Change-Id: Idffc56544db3984e02b716598585cd0bf661c7cf Signed-off-by: Jehun Lim --- src/layout/gallery.c | 5 +++++ src/layout/movie.c | 5 +++++ src/layout/music.c | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 1f62e6b..288cb46 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -139,6 +139,11 @@ static void _update_content_list(struct _priv *priv) } priv->gdata = get_gallery_grid_data(priv->view_mode); + if (!priv->gdata) { + elm_object_part_text_set(priv->layout, + PART_NOCONTENT, TEXT_NOCONTENT); + return; + } list = priv->gdata->get_item_list(priv->dmgr[E_DATA_MEDIA]); if (!list) { diff --git a/src/layout/movie.c b/src/layout/movie.c index 4d963b5..3771060 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -379,6 +379,11 @@ static void _update_content_list(struct _priv *priv) } priv->gdata = get_movie_grid_data(priv->view_mode); + if (!priv->gdata) { + elm_object_part_text_set(priv->layout, + PART_NOCONTENT, TEXT_NOCONTENT); + return; + } list = priv->gdata->get_item_list(priv->dmgr[E_DATA_MEDIA]); if (!list) { diff --git a/src/layout/music.c b/src/layout/music.c index a42491d..30a8826 100644 --- a/src/layout/music.c +++ b/src/layout/music.c @@ -332,6 +332,11 @@ static void _update_content_list(struct _priv *priv) } priv->gdata = get_music_grid_data(priv->view_mode); + if (!priv->gdata) { + elm_object_part_text_set(priv->layout, + PART_NOCONTENT, TEXT_NOCONTENT); + return; + } dmgr = _get_datamgr(priv); if (!dmgr) -- 2.7.4 From eacd1b81ce08ba5da0ff14b99bfbef42fec4fd56 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Tue, 13 Oct 2015 15:34:50 +0900 Subject: [PATCH 15/16] folderdata: modify the value of error check (prevent: 486649, 486650) Change-Id: Ic26e8ace418004cfe7a718497f5da4ae385805dc Signed-off-by: Jehun Lim --- src/data/folderdata.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/folderdata.c b/src/data/folderdata.c index 201d7d7..339af9a 100644 --- a/src/data/folderdata.c +++ b/src/data/folderdata.c @@ -552,7 +552,7 @@ static Eina_List *_get_group(void *handle, int type, void *data) return NULL; } - if (type < 0 || type > E_GROUP_FOLDER_MAX || !data) { + if (type < 0 || type >= E_GROUP_FOLDER_MAX || !data) { _ERR("invalid argument"); return NULL; } -- 2.7.4 From d5cf5880034ca7f53d90b617e3765bb5ab28d33b Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Tue, 13 Oct 2015 15:49:12 +0900 Subject: [PATCH 16/16] grid_gallery: add variable null check (prevent: 486270) Change-Id: I4c86b3ebe6da7f4d497fa5a04593b18a591b4f6b Signed-off-by: Jehun Lim --- src/grid/grid_gallery.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/grid/grid_gallery.c b/src/grid/grid_gallery.c index a421756..eb39a7b 100644 --- a/src/grid/grid_gallery.c +++ b/src/grid/grid_gallery.c @@ -134,9 +134,12 @@ static char *_place_text_get(void *data, Evas_Object *obj, const char *part) city = strtok_r(buf, "/", &tmp); country = strtok_r(tmp, "", &tmp); - if (!strcmp(part, PART_ELM_TEXT_CITY)) + if (!strcmp(part, PART_ELM_TEXT_CITY)) { + if (!city) + return NULL; + return strdup(city); - else if (!strcmp(part, PART_ELM_TEXT_COUNTRY)) { + } else if (!strcmp(part, PART_ELM_TEXT_COUNTRY)) { if (!country) return NULL; -- 2.7.4