From 61f71e5e27e939d31362ffd6f36c036f36e3fee1 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 23 Sep 2015 19:33:22 +0900 Subject: [PATCH 01/16] viewer: modify font Change-Id: I536072773dc5e562b211c7b22873a2f5962e8e3e Signed-off-by: Minkyu Kang --- res/edc/view/viewer.edc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/edc/view/viewer.edc b/res/edc/view/viewer.edc index 79f47b8..b0f1ab4 100644 --- a/res/edc/view/viewer.edc +++ b/res/edc/view/viewer.edc @@ -147,7 +147,7 @@ group { to: "padding_title"; } text { - font: FONT_REGULAR; + font: FONT_LIGHT; size: 46; align: 0.0 0.5; } @@ -173,7 +173,7 @@ group { relative: 0.5 0.5; } text { - font: FONT_REGULAR; + font: FONT_LIGHT; size: 46; align: 0.5 0.5; } -- 2.7.4 From 1a94010d6b284b65495559af15abb31e4a0caee7 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Thu, 24 Sep 2015 10:58:35 +0900 Subject: [PATCH 02/16] albumdata: add function to get media list in the album Change-Id: I77198f34b3f9a493855961b6e9ac555218c954b0 Signed-off-by: Jehun Lim --- include/data/albumdata.h | 10 ++-- include/data/datamgr.h | 4 +- include/data/folderdata.h | 4 +- include/data/mediadata.h | 14 ++++-- src/data/albumdata.c | 124 +++++++++++++++++++++++++++++++++++++++++----- src/data/folderdata.c | 4 +- src/data/mediadata.c | 16 +++--- src/grid/grid_gallery.c | 4 +- src/grid/grid_movie.c | 7 +-- src/grid/grid_music.c | 9 ++-- src/layout/gallery.c | 5 +- src/layout/movie.c | 9 ++-- src/layout/music.c | 9 ++-- 13 files changed, 165 insertions(+), 54 deletions(-) diff --git a/include/data/albumdata.h b/include/data/albumdata.h index 6bc7ed2..0d566bc 100644 --- a/include/data/albumdata.h +++ b/include/data/albumdata.h @@ -20,9 +20,13 @@ struct data_ops; enum album_group_type { - E_ALBUM_NAME = 0, - E_ALBUM_ARTIST, - E_ALBUM_MAX + E_GROUP_ALBUM_NAME = 0, + E_GROUP_ALBUM_ARTIST, + E_GROUP_ALBUM_MAX +}; + +enum album_list_type { + E_LIST_ALBUM_MEDIA = 0, }; struct album_info { diff --git a/include/data/datamgr.h b/include/data/datamgr.h index 734b225..f0222b3 100644 --- a/include/data/datamgr.h +++ b/include/data/datamgr.h @@ -38,10 +38,10 @@ enum source_type { struct data_ops { void *(*create)(const char *media_type, int source_type); void (*destroy)(void *handle); - Eina_List *(*get_list)(void *handle); - int (*get_count)(void *handle, int type); + Eina_List *(*get_list)(void *handle, int type, void *data); Eina_List *(*get_group)(void *handle, int type, void *data); void (*free_group)(Eina_List *list); + int (*get_count)(void *handle, int type); }; struct datamgr { diff --git a/include/data/folderdata.h b/include/data/folderdata.h index 965e630..af1af0a 100644 --- a/include/data/folderdata.h +++ b/include/data/folderdata.h @@ -20,8 +20,8 @@ struct data_ops; enum folder_group_type { - E_FOLDER_NAME, - E_FOLDER_MAX + E_GROUP_FOLDER_NAME, + E_GROUP_FOLDER_MAX }; struct folder_info { diff --git a/include/data/mediadata.h b/include/data/mediadata.h index bc75495..709bb67 100644 --- a/include/data/mediadata.h +++ b/include/data/mediadata.h @@ -20,11 +20,15 @@ struct data_ops; enum media_group_type { - E_MEDIA_DATE = 0, - E_MEDIA_NAME, - E_MEDIA_GENRE, - E_MEDIA_TYPE, - E_MEDIA_MAX + E_GROUP_MEDIA_DATE = 0, + E_GROUP_MEDIA_NAME, + E_GROUP_MEDIA_GENRE, + E_GROUP_MEDIA_TYPE, + E_GROUP_MEDIA_MAX +}; + +enum media_list_type { + E_LIST_MEDIA = 0, }; enum media_file_type { diff --git a/src/data/albumdata.c b/src/data/albumdata.c index 8a20235..1cd6b95 100644 --- a/src/data/albumdata.c +++ b/src/data/albumdata.c @@ -17,6 +17,7 @@ #include #include #include +#include #include "data/datamgr.h" @@ -37,9 +38,16 @@ static int _compare_artist(struct group_info *, struct album_info *); static void *_get_data_artist(struct album_info *); static char *_get_artist(struct album_info *); +enum _filter_type { + E_FILTER_ALBUM = 0, + E_FILTER_MEDIA +}; struct albumdata { Eina_List *album_list; + Eina_List *media_list; + + int group_type; const char *media_type; int source_type; @@ -53,15 +61,15 @@ struct _group_info { group_name_get name_get; }; -static struct _group_info g_group_info[E_ALBUM_MAX] = { - [E_ALBUM_NAME] = { +static struct _group_info g_group_info[E_GROUP_ALBUM_MAX] = { + [E_GROUP_ALBUM_NAME] = { .sort_keyword = MEDIA_ALBUM, .get_list = _get_name_list, .media_cmp = _compare_name, .data_get = _get_data_name, .name_get = _get_name, }, - [E_ALBUM_ARTIST] = { + [E_GROUP_ALBUM_ARTIST] = { .sort_keyword = MEDIA_ALBUM_ARTIST, .get_list = _get_artist_list, .media_cmp = _compare_artist, @@ -71,7 +79,7 @@ static struct _group_info g_group_info[E_ALBUM_MAX] = { }; static bool _create_filter(struct albumdata *ad, filter_h *filter, - const char *cond, int group_type) + const char *cond, int filter_type) { filter_h tmp_filter; int ret; @@ -105,9 +113,14 @@ static bool _create_filter(struct albumdata *ad, filter_h *filter, media_filter_set_condition(tmp_filter, buf, MEDIA_CONTENT_COLLATE_DEFAULT); - media_filter_set_order(tmp_filter, MEDIA_CONTENT_ORDER_ASC, - g_group_info[group_type].sort_keyword, - MEDIA_CONTENT_COLLATE_DEFAULT); + if (filter_type == E_FILTER_ALBUM) { + media_filter_set_order(tmp_filter, MEDIA_CONTENT_ORDER_ASC, + g_group_info[ad->group_type].sort_keyword, + MEDIA_CONTENT_COLLATE_DEFAULT); + } else if (filter_type == E_FILTER_MEDIA) { + media_filter_set_order(tmp_filter, MEDIA_CONTENT_ORDER_ASC, + MEDIA_TITLE, MEDIA_CONTENT_COLLATE_DEFAULT); + } *filter = tmp_filter; @@ -162,6 +175,14 @@ static char *_get_artist(struct album_info *ai) return strndup(ai->artist, 1); } +static void _destroy_media_list(Eina_List *list) +{ + app_media *am; + + EINA_LIST_FREE(list, am) + app_media_destroy(am); +} + static void _destroy_album_list(Eina_List *list) { struct album_info *ai; @@ -175,6 +196,27 @@ 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; + + if (!data) + return false; + + list = data; + + am = app_media_create(media_h); + if (!am) { + _ERR("failed to create app media"); + return false; + } + + *list = eina_list_append(*list, am); + + return true; +} + static bool _get_each_album_info(media_album_h album, void *data) { Eina_List **list; @@ -238,7 +280,7 @@ static bool _get_each_group_info(const char *group_name, void *data) snprintf(buf, sizeof(buf), "MEDIA_ALBUM_ARTIST=\"%s\"", group_name); - if (!_create_filter(ad, &filter, buf, E_ALBUM_ARTIST)) { + if (!_create_filter(ad, &filter, buf, E_FILTER_ALBUM)) { _ERR("failed to create filter"); return false; } @@ -259,6 +301,39 @@ static bool _get_each_group_info(const char *group_name, void *data) return true; } +static bool _get_media_list(struct albumdata *ad, int album_id) +{ + filter_h filter; + int ret; + + ret = media_content_connect(); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to connect to media content"); + return false; + } + + if (!_create_filter(ad, &filter, NULL, E_FILTER_MEDIA)) { + _ERR("failed to create filter"); + media_content_disconnect(); + return false; + } + + ret = media_album_foreach_media_from_db(album_id, filter, + _get_each_media_info, &ad->media_list); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to get media info"); + _destroy_media_list(ad->media_list); + media_filter_destroy(filter); + media_content_disconnect(); + return false; + } + + media_filter_destroy(filter); + media_content_disconnect(); + + return true; +} + static bool _get_name_list(struct albumdata *ad) { filter_h filter; @@ -270,7 +345,7 @@ static bool _get_name_list(struct albumdata *ad) return false; } - if (!_create_filter(ad, &filter, NULL, E_ALBUM_NAME)) { + if (!_create_filter(ad, &filter, NULL, E_FILTER_ALBUM)) { _ERR("failed to create filter"); media_content_disconnect(); return false; @@ -303,7 +378,7 @@ static bool _get_artist_list(struct albumdata *ad) return false; } - if (!_create_filter(ad, &filter, NULL, E_ALBUM_ARTIST)) { + if (!_create_filter(ad, &filter, NULL, E_FILTER_ALBUM)) { _ERR("failed to create filter"); media_content_disconnect(); return false; @@ -359,22 +434,43 @@ static void _destroy(void *handle) ad = handle; _destroy_album_list(ad->album_list); + _destroy_media_list(ad->media_list); free(ad); } -static Eina_List *_get_list(void *handle) +static Eina_List *_get_list(void *handle, int type, void *data) { struct albumdata *ad; + int *album_id; if (!handle) { _ERR("failed to get albumdata handle"); return NULL; } + if (!data) { + _ERR("invalid argument"); + return NULL; + } + ad = handle; - return ad->album_list; + switch (type) { + case E_LIST_ALBUM_MEDIA: + if (ad->media_list) { + _destroy_media_list(ad->media_list); + ad->media_list = NULL; + } + + album_id = data; + _get_media_list(ad, *album_id); + return ad->media_list; + default: + break; + } + + return NULL; } static int _get_count(void *handle, int type) @@ -421,13 +517,15 @@ static Eina_List *_get_group(void *handle, int type, void *data) return NULL; } - if (type < 0 || type >= E_ALBUM_MAX) { + if (type < 0 || type >= E_GROUP_ALBUM_MAX) { _ERR("invalid argument"); return NULL; } ad = handle; + ad->group_type = type; + if (ad->album_list) { _destroy_album_list(ad->album_list); ad->album_list = NULL; diff --git a/src/data/folderdata.c b/src/data/folderdata.c index fce33d3..6a9ee00 100644 --- a/src/data/folderdata.c +++ b/src/data/folderdata.c @@ -271,7 +271,7 @@ static void _destroy(void *handle) free(fd); } -static Eina_List *_get_list(void *handle) +static Eina_List *_get_list(void *handle, int type, void *data) { struct folderdata *fd; @@ -314,7 +314,7 @@ static Eina_List *_get_group(void *handle, int type, void *data) return NULL; } - if (type < 0 || type > E_FOLDER_MAX || !data) { + if (type < 0 || type > E_GROUP_FOLDER_MAX || !data) { _ERR("invalid argument"); return NULL; } diff --git a/src/data/mediadata.c b/src/data/mediadata.c index f15c691..0be0959 100644 --- a/src/data/mediadata.c +++ b/src/data/mediadata.c @@ -62,26 +62,26 @@ struct _list_info { group_name_get name_get; }; -static struct _list_info g_group_info[E_MEDIA_MAX] = { - [E_MEDIA_DATE] = { +static struct _list_info g_group_info[E_GROUP_MEDIA_MAX] = { + [E_GROUP_MEDIA_DATE] = { .sort_cmp_cb = _compare_cb_date, .media_cmp = _compare_time, .name_get = _get_time, .data_get = _get_data_time, }, - [E_MEDIA_NAME] = { + [E_GROUP_MEDIA_NAME] = { .sort_cmp_cb = _compare_cb_name, .media_cmp = _compare_title, .name_get = _get_title, .data_get = _get_data_title, }, - [E_MEDIA_GENRE] = { + [E_GROUP_MEDIA_GENRE] = { .sort_cmp_cb = _compare_cb_genre, .media_cmp = _compare_genre, .name_get = _get_genre, .data_get = _get_data_genre, }, - [E_MEDIA_TYPE] = { + [E_GROUP_MEDIA_TYPE] = { .sort_cmp_cb = _compare_cb_type, .media_cmp = _compare_type, .name_get = _get_type, @@ -480,7 +480,7 @@ static void _destroy(void *handle) free(md); } -static Eina_List *_get_list(void *handle) +static Eina_List *_get_list(void *handle, int type, void *data) { struct mediadata *md; @@ -503,7 +503,7 @@ static int _get_count(void *handle, int type) return -1; } - if (type < 0 || type >= E_MEDIA_MAX) { + if (type < 0 || type >= E_FILE_MAX) { _ERR("invalid argument"); return -1; } @@ -544,7 +544,7 @@ static Eina_List *_get_group(void *handle, int type, void *data) return NULL; } - if (type < 0 || type >= E_MEDIA_MAX) { + if (type < 0 || type >= E_GROUP_MEDIA_MAX) { _ERR("invalid argument"); return NULL; } diff --git a/src/grid/grid_gallery.c b/src/grid/grid_gallery.c index 378850f..384ec96 100644 --- a/src/grid/grid_gallery.c +++ b/src/grid/grid_gallery.c @@ -117,7 +117,7 @@ static Eina_List *_get_event_list(struct datamgr *dmgr) return NULL; } - return dmgr->ops->get_group(dmgr->handle, E_MEDIA_DATE, NULL); + return dmgr->ops->get_group(dmgr->handle, E_GROUP_MEDIA_DATE, NULL); } static Eina_List *_get_type_list(struct datamgr *dmgr) @@ -127,7 +127,7 @@ static Eina_List *_get_type_list(struct datamgr *dmgr) return NULL; } - return dmgr->ops->get_group(dmgr->handle, E_MEDIA_TYPE, NULL); + return dmgr->ops->get_group(dmgr->handle, E_GROUP_MEDIA_TYPE, NULL); } static void _free_media_list(struct datamgr *dmgr, Eina_List *list) diff --git a/src/grid/grid_movie.c b/src/grid/grid_movie.c index 6fb7708..b4e09b9 100644 --- a/src/grid/grid_movie.c +++ b/src/grid/grid_movie.c @@ -160,7 +160,7 @@ static Eina_List *_get_name_list(struct datamgr *dmgr) return NULL; } - return dmgr->ops->get_group(dmgr->handle, E_MEDIA_NAME, NULL); + return dmgr->ops->get_group(dmgr->handle, E_GROUP_MEDIA_NAME, NULL); } static Eina_List *_get_genre_list(struct datamgr *dmgr) @@ -180,7 +180,8 @@ static Eina_List *_get_genre_list(struct datamgr *dmgr) } gi->name = STR_GENRE_NAME; - gi->list = dmgr->ops->get_group(dmgr->handle, E_MEDIA_GENRE, NULL); + gi->list = dmgr->ops->get_group(dmgr->handle, + E_GROUP_MEDIA_GENRE, NULL); list = NULL; list = eina_list_append(list, gi); @@ -195,7 +196,7 @@ static Eina_List *_get_date_list(struct datamgr *dmgr) return NULL; } - return dmgr->ops->get_group(dmgr->handle, E_MEDIA_DATE, NULL); + return dmgr->ops->get_group(dmgr->handle, E_GROUP_MEDIA_DATE, NULL); } static void _free_media_list(struct datamgr *dmgr, Eina_List *list) diff --git a/src/grid/grid_music.c b/src/grid/grid_music.c index 7469bef..d25710f 100644 --- a/src/grid/grid_music.c +++ b/src/grid/grid_music.c @@ -217,7 +217,7 @@ static Eina_List *_get_song_list(struct datamgr *dmgr) return NULL; } - return dmgr->ops->get_group(dmgr->handle, E_MEDIA_NAME, NULL); + return dmgr->ops->get_group(dmgr->handle, E_GROUP_MEDIA_NAME, NULL); } static Eina_List *_get_album_list(struct datamgr *dmgr) @@ -227,7 +227,7 @@ static Eina_List *_get_album_list(struct datamgr *dmgr) return NULL; } - return dmgr->ops->get_group(dmgr->handle, E_ALBUM_NAME, NULL); + return dmgr->ops->get_group(dmgr->handle, E_GROUP_ALBUM_NAME, NULL); } static Eina_List *_get_artist_list(struct datamgr *dmgr) @@ -237,7 +237,7 @@ static Eina_List *_get_artist_list(struct datamgr *dmgr) return NULL; } - return dmgr->ops->get_group(dmgr->handle, E_ALBUM_ARTIST, NULL); + return dmgr->ops->get_group(dmgr->handle, E_GROUP_ALBUM_ARTIST, NULL); } static Eina_List *_get_genre_list(struct datamgr *dmgr) @@ -257,7 +257,8 @@ static Eina_List *_get_genre_list(struct datamgr *dmgr) } gi->name = STR_GENRE_NAME; - gi->list = dmgr->ops->get_group(dmgr->handle, E_MEDIA_GENRE, NULL); + gi->list = dmgr->ops->get_group(dmgr->handle, + E_GROUP_MEDIA_GENRE, NULL); list = NULL; list = eina_list_append(list, gi); diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 2d90802..be63e3b 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -77,7 +77,7 @@ static void _recent_item_selected(struct _priv *priv, app_media *am) if (!dmgr) return; - vdata.list = dmgr->ops->get_list(dmgr->handle); + vdata.list = dmgr->ops->get_list(dmgr->handle, E_LIST_MEDIA, NULL); vdata.index = util_get_media_index_from_id(vdata.list, info->media_id); viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); @@ -155,7 +155,8 @@ static void _update_content_list(struct _priv *priv) return; } - priv->gdata->data = dmgr->ops->get_list(dmgr->handle); + priv->gdata->data = dmgr->ops->get_list(dmgr->handle, + E_LIST_MEDIA, NULL); if (!listmgr_update_content_list(priv->listmgr, list, priv->gdata)) _ERR("failed to update list area"); diff --git a/src/layout/movie.c b/src/layout/movie.c index a3b7597..8fbe6d0 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -253,7 +253,7 @@ static void _recent_item_selected(struct _priv *priv, app_media *am) if (!dmgr) return; - vdata.list = dmgr->ops->get_list(dmgr->handle); + vdata.list = dmgr->ops->get_list(dmgr->handle, E_LIST_MEDIA, NULL); vdata.index = util_get_media_index_from_id(vdata.list, info->media_id); viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); @@ -275,7 +275,7 @@ static void _recent_selected_cb(void *data, Evas_Object *obj) if (!dmgr) return; - vdata.list = dmgr->ops->get_list(dmgr->handle); + vdata.list = dmgr->ops->get_list(dmgr->handle, E_LIST_MEDIA, NULL); vdata.index = util_get_media_index(vdata.list, priv->recent_info); viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); @@ -367,7 +367,8 @@ static void _update_content_list(struct _priv *priv) return; } - priv->gdata->data = dmgr->ops->get_list(dmgr->handle); + priv->gdata->data = dmgr->ops->get_list(dmgr->handle, + E_LIST_MEDIA, NULL); if (!listmgr_update_content_list(priv->listmgr, list, priv->gdata)) { _ERR("failed to update list area"); @@ -414,7 +415,7 @@ static void _update_recent_item(struct _priv *priv, const char *id) if (!dmgr) return; - list = dmgr->ops->get_list(dmgr->handle); + list = dmgr->ops->get_list(dmgr->handle, E_LIST_MEDIA, NULL); if (id) am = util_find_media_info(list, id); diff --git a/src/layout/music.c b/src/layout/music.c index d64c317..738f795 100644 --- a/src/layout/music.c +++ b/src/layout/music.c @@ -197,7 +197,7 @@ static void _recent_item_selected(struct _priv *priv, app_media *am) if (!dmgr) return; - vdata.list = dmgr->ops->get_list(dmgr->handle); + vdata.list = dmgr->ops->get_list(dmgr->handle, E_LIST_MEDIA, NULL); vdata.index = util_get_media_index_from_id(vdata.list, info->media_id); viewmgr_update_view(VIEW_MPLAYER, UPDATE_CONTENT, &vdata); @@ -219,7 +219,7 @@ static void _playing_selected_cb(void *data, Evas_Object *obj) if (!dmgr) return; - vdata.list = dmgr->ops->get_list(dmgr->handle); + vdata.list = dmgr->ops->get_list(dmgr->handle, E_LIST_MEDIA, NULL); vdata.index = util_get_media_index(vdata.list, priv->playing_info); viewmgr_update_view(VIEW_MPLAYER, UPDATE_CONTENT, &vdata); @@ -339,7 +339,8 @@ static void _update_content_list(struct _priv *priv) return; } - priv->gdata->data = dmgr->ops->get_list(dmgr->handle); + priv->gdata->data = dmgr->ops->get_list(dmgr->handle, + E_LIST_MEDIA, NULL); if (!listmgr_update_content_list(priv->listmgr, list, priv->gdata)) _ERR("failed to update list area"); @@ -384,7 +385,7 @@ static void _update_playing_item(struct _priv *priv, const char *id) if (!dmgr) return; - list = dmgr->ops->get_list(dmgr->handle); + list = dmgr->ops->get_list(dmgr->handle, E_LIST_MEDIA, NULL); if (id) am = util_find_media_info(list, id); -- 2.7.4 From 07777eae2cda3d9fdb5feaaa7cd18c6961b218a4 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 23 Sep 2015 11:06:27 +0900 Subject: [PATCH 03/16] add location manager for setting location tag to images Change-Id: I4729dd89321abd90bb349d34a68b87f4ff67b77d Signed-off-by: Minkyu Kang --- CMakeLists.txt | 3 + include/util/locmgr.h | 28 +++ org.tizen.mediahub.xml.in | 2 + packaging/org.tizen.mediahub.spec | 2 + src/layout/gallery.c | 46 ++++ src/util/locmgr.c | 457 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 538 insertions(+) create mode 100644 include/util/locmgr.h create mode 100644 src/util/locmgr.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 2bacbfd..8d9e4da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,6 +23,8 @@ pkg_check_modules(PKGS REQUIRED capi-appfw-application capi-media-player capi-ui-efl-util + capi-maps-service + vconf app-utils) IF(NOT DEFINED PACKAGE_NAME) @@ -73,6 +75,7 @@ src/util/util.c src/util/playermgr.c src/util/ctxpopup.c src/util/progressbar.c +src/util/locmgr.c src/data/datamgr.c src/data/albumdata.c src/data/folderdata.c diff --git a/include/util/locmgr.h b/include/util/locmgr.h new file mode 100644 index 0000000..8b409e4 --- /dev/null +++ b/include/util/locmgr.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#ifndef __AIR_MEDIAHUB_LOCMGR_H__ +#define __AIR_MEDIAHUB_LOCMGR_H__ + +struct locmgr; + +struct locmgr *locmgr_create(void); +void locmgr_destroy(struct locmgr *m); + +bool locmgr_set_location(struct locmgr *m, app_media *am); +bool locmgr_set_locations(struct locmgr *m, Eina_List *list); + +#endif diff --git a/org.tizen.mediahub.xml.in b/org.tizen.mediahub.xml.in index a9118bf..c7f48bc 100644 --- a/org.tizen.mediahub.xml.in +++ b/org.tizen.mediahub.xml.in @@ -11,5 +11,7 @@ http://tizen.org/privilege/content.write http://tizen.org/privilege/mediastorage http://tizen.org/privilege/appmanager.launch + http://tizen.org/privilege/mapservice + http://tizen.org/privilege/internet diff --git a/packaging/org.tizen.mediahub.spec b/packaging/org.tizen.mediahub.spec index 902e8d8..978ad20 100644 --- a/packaging/org.tizen.mediahub.spec +++ b/packaging/org.tizen.mediahub.spec @@ -13,6 +13,8 @@ BuildRequires: pkgconfig(elementary) BuildRequires: pkgconfig(capi-appfw-application) BuildRequires: pkgconfig(capi-media-player) BuildRequires: pkgconfig(capi-ui-efl-util) +BuildRequires: pkgconfig(capi-maps-service) +BuildRequires: pkgconfig(vconf) BuildRequires: pkgconfig(app-utils) %define _appdir /usr/apps/%{name} diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 2d90802..f383829 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -30,6 +30,7 @@ #include "grid/grid.h" #include "util/listmgr.h" #include "util/util.h" +#include "util/locmgr.h" #define LIST_MEDIA_COND "media_type=0 OR (media_type=1 AND copyright=\"Unknown\")" @@ -42,6 +43,8 @@ #define BOX_PADDING (62 - GRID_PADDING) +#define JOB_INTERVAL 1.0 + struct _priv { Evas_Object *base; Evas_Object *layout; @@ -59,6 +62,8 @@ struct _priv { int view_mode; struct grid_data *gdata; + + struct locmgr *locmgr; }; static void _recent_item_selected(struct _priv *priv, app_media *am) @@ -175,12 +180,50 @@ static void _destroy_datamgr(struct _priv *priv) static void _destroy_utils(struct _priv *priv) { + locmgr_destroy(priv->locmgr); _destroy_datamgr(priv); listmgr_destroy(priv->listmgr); free(priv->ldata); } +static Eina_Bool _create_location(void *data) +{ + struct _priv *priv; + struct locmgr *locmgr; + struct datamgr *dmgr; + + if (!data) { + _ERR("invalid argument"); + return ECORE_CALLBACK_CANCEL; + } + + priv = data; + + if (!priv->dmgr) { + _ERR("failed to get datamgr"); + return ECORE_CALLBACK_CANCEL; + } + + dmgr = priv->dmgr[E_DATA_MEDIA]; + if (!dmgr) { + _ERR("failed to get datamgr"); + return ECORE_CALLBACK_CANCEL; + } + + locmgr = locmgr_create(); + if (!locmgr) { + _ERR("failed to create locmgr"); + return ECORE_CALLBACK_CANCEL; + } + + priv->locmgr = locmgr; + + locmgr_set_locations(locmgr, dmgr->ops->get_list(dmgr->handle)); + + return ECORE_CALLBACK_CANCEL; +} + static bool _create_utils(struct _priv *priv) { struct listmgr *listmgr; @@ -280,6 +323,9 @@ static bool _create(layoutmgr *lmgr, void *data) goto err3; } + /* add job for set location tag */ + ecore_timer_add(JOB_INTERVAL, _create_location, priv); + return true; err3: diff --git a/src/util/locmgr.c b/src/util/locmgr.c new file mode 100644 index 0000000..0f6bead --- /dev/null +++ b/src/util/locmgr.c @@ -0,0 +1,457 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include + +#define MAP_LANG "en-US" +#define MAP_MAX_RES 1 +#define MAP_MAX_REQ 100 + +#define LOC_TAG_DEFAULT "Unknown" +#define LOC_INVALID -200 + +#define KEY_LOC_PLUGIN "db/app/mediahub/loc_plugin" +#define KEY_LOC_ID "db/app/mediahub/loc_id" +#define KEY_LOC_CODE "db/app/mediahub/loc_code" + +struct locmgr { + maps_service_h maps; + maps_preference_h preference; + bool supported; + int queue; + Eina_List *list; + char *plugin; + char *key; +}; + +struct _cb_data { + struct locmgr *m; + app_media *am; +}; + +static void _add_queue(struct locmgr *m); + +static void _set_location_tag(app_media *am, const char *str) +{ + media_info_h media; + int r; + + if (!str) + return; + + media = app_media_get_media_handle(am); + if (!media) { + _ERR("failed to getting media handle"); + return; + } + + r = media_info_set_location_tag(media, str); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to set location tag"); + return; + } + + r = media_info_update_to_db(media); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to update db"); + return; + } + + app_media_update(am); +} + +static void _reverse_geocode_cb(maps_error_e result, int request_id, + int index, int total, maps_address_h address, void *data) +{ + struct _cb_data *cdata; + struct locmgr *m; + app_media *am; + char *country; + char *city; + char str[1024]; + int r; + + if (!data) { + _ERR("invalid parameter"); + return; + } + + cdata = data; + + m = cdata->m; + m->queue--; + + if (!m->queue) + _add_queue(m); + + am = cdata->am; + if (!am) { + _ERR("failed to get app media"); + goto out; + } + + if (result != MAPS_ERROR_NONE) { + _ERR("failed to get reverse geocode (%d)", result); + goto out; + } + + if (!address) { + _ERR("failed to get address"); + goto out; + } + + r = maps_address_get_country(address, &country); + if (r != MAPS_ERROR_NONE || !country) { + _ERR("failed to get country (%d)", r); + maps_address_destroy(address); + goto out; + } + + r = maps_address_get_city(address, &city); + if (r != MAPS_ERROR_NONE || !city) { + _ERR("failed to get city (%d)", r); + maps_address_destroy(address); + free(country); + goto out; + } + + snprintf(str, sizeof(str), "%s/%s", city, country); + _set_location_tag(am, str); + + maps_address_destroy(address); + + free(country); + free(city); + +out: + free(cdata); +} + +static void _reverse_geocode_req(struct locmgr *m, app_media *am) +{ + app_media_info *mi; + struct _cb_data *cdata; + int r; + int id; + + if (!m || !am) { + _ERR("invalid argument"); + return; + } + + mi = app_media_get_info(am); + if (!mi) { + _ERR("failed to get media info"); + return; + } + + if (mi->location_tag) + return; + + if ((mi->latitude == LOC_INVALID && mi->longitude == LOC_INVALID) || + (mi->latitude == 0 && mi->longitude == 0)) { + _set_location_tag(am, LOC_TAG_DEFAULT); + return; + } + + cdata = calloc(1, sizeof(*cdata)); + if (!cdata) { + _ERR("failed to allocate"); + return; + } + + cdata->m = m; + cdata->am = am; + + r = maps_service_reverse_geocode(m->maps, mi->latitude, mi->longitude, + m->preference, _reverse_geocode_cb, cdata, &id); + if (r != MAPS_ERROR_NONE) { + _ERR("failed to get geocode"); + return; + } + + m->queue++; +} + +static void _add_queue(struct locmgr *m) +{ + app_media *am; + Eina_List *l; + + EINA_LIST_FOREACH(m->list, l, am) { + if (m->queue >= MAP_MAX_REQ) + break; + + _reverse_geocode_req(m, am); + m->list = eina_list_remove_list(m->list, l); + } +} + +bool locmgr_set_location(struct locmgr *m, app_media *am) +{ + if (!m || !am) { + _ERR("invalid argument"); + return false; + } + + if (m->queue) { + /* service is busy, add to the list */ + m->list = eina_list_append(m->list, am); + return true; + } + + _reverse_geocode_req(m, am); + + return true; +} + +bool locmgr_set_locations(struct locmgr *m, Eina_List *list) +{ + Eina_List *l; + + if (!m || !list) { + _ERR("invalid argument"); + return false; + } + + l = eina_list_clone(list); + + if (m->queue) { + /* service is busy, add to the list */ + m->list = eina_list_merge(m->list, l); + return true; + } + + m->list = l; + + _add_queue(m); + + return true; +} + +static bool _maps_provider_cb(char *provider, void *data) +{ + struct locmgr *m; + + if (!data) + return false; + + m = data; + + if (!strcmp(provider, m->plugin)) + m->supported = true; + + return true; +} + +static int _set_preference(maps_preference_h *preference) +{ + int r; + + r = maps_preference_create(preference); + if (r != MAPS_ERROR_NONE) { + _ERR("failed to create preference"); + return r; + } + + r = maps_preference_set_language(*preference, MAP_LANG); + if (r != MAPS_ERROR_NONE) { + _ERR("failed to set language"); + maps_preference_destroy(*preference); + return r; + } + + r = maps_preference_set_max_results(*preference, MAP_MAX_RES); + if (r != MAPS_ERROR_NONE) { + _ERR("failed to set max result"); + maps_preference_destroy(*preference); + return r; + } + + return MAPS_ERROR_NONE; +} + +static bool _set_plugin(struct locmgr *m) +{ + char str[1024]; + char *id; + char *code; + + /* + * NOTE: + * map service need to set one of map providers + * and provider demand a security key for using it. + * + * mediahub was tested with "HERE" plugin. + * You can get app_id and app_code for "HERE" plugin at below website + * https://developer.here.com + * + * please set those 3 vconf values. + * plugin: db/app/mediahub/loc_plugin + * app_id: db/app/mediahub/loc_id + * app_code: db/app/mediahub/loc_code + */ + + m->plugin = vconf_get_str(KEY_LOC_PLUGIN); + if (!m->plugin) { + _ERR("Please set plugin to %s", KEY_LOC_PLUGIN); + return false; + } + + id = vconf_get_str(KEY_LOC_ID); + if (!id) { + _ERR("Please set app_id to %s", KEY_LOC_ID); + goto err_id; + } + + code = vconf_get_str(KEY_LOC_CODE); + if (!id) { + _ERR("Please set app_code to %s", KEY_LOC_CODE); + goto err_code; + } + + snprintf(str, sizeof(str), "%s/%s", id, code); + m->key = strdup(str); + + return true; + +err_code: + free(id); +err_id: + free(m->plugin); + return false; +} + +struct locmgr *locmgr_create(void) +{ + struct locmgr *m; + maps_service_h maps; + maps_preference_h preference; + int r; + bool s; + + m = calloc(1, sizeof(*m)); + if (!m) { + _ERR("failed to allocate"); + return false; + } + + s = _set_plugin(m); + if (!s) { + _ERR("can't get location information"); + goto err; + } + + r = maps_service_foreach_provider(_maps_provider_cb, m); + if (r != MAPS_ERROR_NONE) { + _ERR("failed to create maps service"); + goto err_plugin; + } + + if (!m->supported) { + _ERR("%s does not support", m->plugin); + goto err_plugin; + } + + r = maps_service_create(m->plugin, &maps); + if (r != MAPS_ERROR_NONE) { + _ERR("failed to create maps service"); + goto err_plugin; + } + + r = maps_service_set_provider_key(maps, m->key); + if (r != MAPS_ERROR_NONE) { + _ERR("failed to set provider key"); + goto err_maps; + } + + r = maps_service_provider_is_service_supported(maps, + MAPS_SERVICE_REVERSE_GEOCODE, &s); + if (r != MAPS_ERROR_NONE || !s) { + _ERR("not support reverse geocode"); + goto err_maps; + } + + r = _set_preference(&preference); + if (r != MAPS_ERROR_NONE) { + _ERR("failed to create preference"); + goto err_maps; + } + + r = maps_service_set_preference(maps, preference); + if (r != MAPS_ERROR_NONE) { + _ERR("failed to set preference"); + goto err_preference; + } + + media_content_connect(); + + m->maps = maps; + m->preference = preference; + m->queue = 0; + + return m; + +err_preference: + maps_preference_destroy(preference); +err_maps: + maps_service_destroy(maps); +err_plugin: + free(m->plugin); + free(m->key); +err: + free(m); + return NULL; +} + +void locmgr_destroy(struct locmgr *m) +{ + if (!m) { + _ERR("invalid argument"); + return; + } + + media_content_disconnect(); + + if (m->preference) { + maps_preference_destroy(m->preference); + m->preference = NULL; + } + + if (m->maps) { + /* + * FIXME: + * because maps_service_destroy function have a problem, + * disable calling this function temporary + */ + /*maps_service_destroy(m->maps);*/ + m->maps = NULL; + } + + if (m->list) { + eina_list_free(m->list); + m->list = NULL; + } + + free(m->plugin); + free(m->key); + free(m); +} -- 2.7.4 From c515f91444a4451832a70ba590485a238694eff9 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Thu, 24 Sep 2015 14:01:09 +0900 Subject: [PATCH 04/16] detail: add music album detail view Change-Id: I4f8b17264645338b9bb7cf1ec69cd3cdaa4e985e Signed-off-by: Jehun Lim --- include/grid/grid.h | 2 + include/view.h | 1 + res/edc/widgets/gengrid.edc | 223 ++++++++++++++++++++++++++++++++++++++++++++ src/grid/grid_gallery.c | 13 +-- src/grid/grid_movie.c | 13 +-- src/grid/grid_music.c | 46 +++++++-- src/layout/gallery.c | 8 +- src/layout/movie.c | 8 +- src/layout/music.c | 3 +- src/view/detail.c | 23 ++++- 10 files changed, 304 insertions(+), 36 deletions(-) diff --git a/include/grid/grid.h b/include/grid/grid.h index 60e6a92..39b2450 100644 --- a/include/grid/grid.h +++ b/include/grid/grid.h @@ -117,4 +117,6 @@ struct grid_data *get_music_grid_data(int type); #define MUSIC_GENRE_ITEM_NUM MOVIE_GENRE_ITEM_NUM #define MUSIC_GENRE_GRID_PADDING MOVIE_GENRE_GRID_PADDING +#define STYLE_MUSIC_SONG_DETAIL "song_item_detail" + #endif /* __AIR_MEDIAHUB_GRID_H__ */ diff --git a/include/view.h b/include/view.h index c7e4d9f..7422bac 100644 --- a/include/view.h +++ b/include/view.h @@ -59,6 +59,7 @@ enum update_type { enum detail_view_type { E_DETAIL_MOVIE_GENRE = 0, + E_DETAIL_MUSIC_ALBUM, E_DETAIL_MAX }; diff --git a/res/edc/widgets/gengrid.edc b/res/edc/widgets/gengrid.edc index 2b9e6fd..4063fed 100644 --- a/res/edc/widgets/gengrid.edc +++ b/res/edc/widgets/gengrid.edc @@ -1650,6 +1650,229 @@ group { } group { + name: "elm/gengrid/item/song_item_detail/default"; + inherit: "elm/gengrid/item/song_item/default"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text.title elm.text.artist elm.text.playtime"; + data.item: "contents" "elm.swallow.favorite"; + data.item: "focus_highlight" "on"; + parts { + part { + name: "default_image"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "defaultbg"; + relative: 0.5 0.5; + } + rel2 { + to: "defaultbg"; + relative: 0.5 0.5; + } + image.normal: IMAGE_THUMBNAIL_SONG; + min: 0 0; + fixed: 1 1; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + } + } + part { + name: "defaultbg_text"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 1.0 1.0; + } + color: COLOR_ITEM_BG; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: COLOR_ITEM_FOCUS; + map.on: 1; + } + } + part { + name: "part_focus2"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "part_focus1"; + relative: 0.0 1.0; + } + rel2 { + to: "bg"; + relative: 0.0 1.0; + } + min: 0 0; + align: 0.0 0.5; + color: COLOR_ITEM_FOCUS; + fixed: 1 0; + visible: 0; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + visible: 1; + } + description { + state: "selected_0" 0.0; + inherit: "default" 0.0; + visible: 1; + color: COLOR_ITEM_FOCUS_0; + } + } + part { + name: "elm.padding.artist"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_ELM_TEXT_TITLE; + relative: 0.0 1.0; + } + rel2.to: PART_ELM_TEXT_TITLE; + min: 0 12; + align: 0.5 0.0; + fixed: 0 1; + } + } + part { + name: "elm.padding.playtime"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_ELM_TEXT_ARTIST; + relative: 0.0 1.0; + } + rel2.to: PART_ELM_TEXT_ARTIST; + min: 0 4; + align: 0.5 0.0; + fixed: 0 1; + } + } + part { + name: PART_ELM_TEXT_PLAYTIME; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "elm.padding.playtime"; + relative: 0.0 1.0; + } + rel2.to: "elm.padding.playtime"; + text { + font: FONT_LIGHT; + size: 24; + align: 0.0 0.5; + } + min: 0 24; + align: 0.5 0.0; + color: COLOR_TEXT_INFO; + fixed: 0 1; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: COLOR_TEXT_FOCUS; + map.on: 1; + } + description { + state: "selected_0" 0.0; + inherit: "selected"; + } + } + } + programs { + program { + name: "go_active"; + signal: "elm,state,focused"; + source: "elm"; + action: STATE_SET "selected_0" 0.0; + target: "elm.bg.text"; + target: PART_ELM_TEXT_TITLE; + target: PART_ELM_TEXT_ARTIST; + target: PART_ELM_TEXT_PLAYTIME; + after: "focus,in,anim"; + } + program { + name: "focus,in,anim"; + action: STATE_SET "selected" 0.0; + target: PART_ELM_SWALLOW_FAVORITE; + target: "elm.bg.text"; + transition: TRANSITION_FOCUS; + after: "focus,in,anim,2"; + } + program { + name: "focus,in,anim,2"; + action: STATE_SET "selected" 0.0; + target: "defaultbg_text"; + } + program { + name: "go_passive"; + signal: "elm,state,unfocused"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: PART_ELM_TEXT_TITLE; + target: PART_ELM_TEXT_ARTIST; + target: PART_ELM_TEXT_PLAYTIME; + target: "defaultbg_text"; + after: "focus,out,anim"; + } + program { + name: "focus,out,anim"; + action: STATE_SET "selected_0" 0.0; + target: "elm.bg.text"; + transition: TRANSITION_FOCUS; + after: "focus,out,anim,2"; + } + program { + name: "focus,out,anim,2"; + action: STATE_SET "default" 0.0; + target: PART_ELM_SWALLOW_FAVORITE; + target: "elm.bg.text"; + } + } +} + +group { name: "elm/gengrid/item/genre_item/default"; data.item: "selectraise" "on"; data.item: "texts" "elm.text.title elm.text.count"; diff --git a/src/grid/grid_gallery.c b/src/grid/grid_gallery.c index 384ec96..6f20856 100644 --- a/src/grid/grid_gallery.c +++ b/src/grid/grid_gallery.c @@ -143,8 +143,8 @@ static void _free_media_list(struct datamgr *dmgr, Eina_List *list) static void _key_down_cb(void *data, Elm_Object_Item *it, Evas_Event_Key_Down *ev) { - Eina_List *list; struct view_update_data vdata; + struct datamgr *dmgr; app_media *am; if (!data || !ev) { @@ -152,7 +152,7 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, return; } - list = data; + dmgr = data; if (!strcmp(ev->keyname, KEY_MENU) || !strcmp(ev->keyname, KEY_CONTEXT_MENU)) { @@ -162,7 +162,8 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, return; } - vdata.list = list; + vdata.list = dmgr->ops->get_list(dmgr->handle, + E_LIST_MEDIA, NULL); vdata.index = util_get_media_index(vdata.list, am); viewmgr_update_view(VIEW_ACTION_MENU, UPDATE_CONTENT, &vdata); @@ -172,8 +173,8 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, static void _selected_cb(void *data, Elm_Object_Item *it) { - Eina_List *list; struct view_update_data vdata; + struct datamgr *dmgr; app_media *am; if (!data || !it) { @@ -181,7 +182,7 @@ static void _selected_cb(void *data, Elm_Object_Item *it) return; } - list = data; + dmgr = data; am = elm_object_item_data_get(it); if (!am) { @@ -189,7 +190,7 @@ static void _selected_cb(void *data, Elm_Object_Item *it) return; } - vdata.list = list; + vdata.list = dmgr->ops->get_list(dmgr->handle, E_LIST_MEDIA, NULL); vdata.index = util_get_media_index(vdata.list, am); viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); diff --git a/src/grid/grid_movie.c b/src/grid/grid_movie.c index b4e09b9..70c54b5 100644 --- a/src/grid/grid_movie.c +++ b/src/grid/grid_movie.c @@ -227,8 +227,8 @@ static void _free_group_list(struct datamgr *dmgr, Eina_List *list) static void _key_down_cb(void *data, Elm_Object_Item *it, Evas_Event_Key_Down *ev) { - Eina_List *list; struct view_update_data vdata; + struct datamgr *dmgr; app_media *am; if (!data || !ev) { @@ -236,7 +236,7 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, return; } - list = data; + dmgr = data; if (!strcmp(ev->keyname, KEY_MENU) || !strcmp(ev->keyname, KEY_CONTEXT_MENU)) { @@ -246,7 +246,8 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, return; } - vdata.list = list; + vdata.list = dmgr->ops->get_list(dmgr->handle, + E_LIST_MEDIA, NULL); vdata.index = util_get_media_index(vdata.list, am); viewmgr_update_view(VIEW_ACTION_MENU, UPDATE_CONTENT, &vdata); @@ -256,8 +257,8 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, static void _media_selected_cb(void *data, Elm_Object_Item *it) { - Eina_List *list; struct view_update_data vdata; + struct datamgr *dmgr; app_media *am; if (!data || !it) { @@ -265,7 +266,7 @@ static void _media_selected_cb(void *data, Elm_Object_Item *it) return; } - list = data; + dmgr = data; am = elm_object_item_data_get(it); if (!am) { @@ -273,7 +274,7 @@ static void _media_selected_cb(void *data, Elm_Object_Item *it) return; } - vdata.list = list; + vdata.list = dmgr->ops->get_list(dmgr->handle, E_LIST_MEDIA, NULL); vdata.index = util_get_media_index(vdata.list, am); viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); diff --git a/src/grid/grid_music.c b/src/grid/grid_music.c index d25710f..34a9058 100644 --- a/src/grid/grid_music.c +++ b/src/grid/grid_music.c @@ -294,8 +294,8 @@ static void _free_group_list(struct datamgr *dmgr, Eina_List *list) static void _key_down_cb(void *data, Elm_Object_Item *it, Evas_Event_Key_Down *ev) { - Eina_List *list; struct view_update_data vdata; + struct datamgr *dmgr; app_media *am; if (!data || !ev) { @@ -303,7 +303,7 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, return; } - list = data; + dmgr = data; if (!strcmp(ev->keyname, KEY_MENU) || !strcmp(ev->keyname, KEY_CONTEXT_MENU)) { @@ -313,7 +313,8 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, return; } - vdata.list = list; + vdata.list = dmgr->ops->get_list(dmgr->handle, + E_LIST_MEDIA, NULL); vdata.index = util_get_media_index(vdata.list, am); viewmgr_update_view(VIEW_ACTION_MENU, UPDATE_CONTENT, &vdata); @@ -321,10 +322,10 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, } } -static void _selected_cb(void *data, Elm_Object_Item *it) +static void _media_selected_cb(void *data, Elm_Object_Item *it) { - Eina_List *list; struct view_update_data vdata; + struct datamgr *dmgr; app_media *am; if (!data || !it) { @@ -332,7 +333,7 @@ static void _selected_cb(void *data, Elm_Object_Item *it) return; } - list = data; + dmgr = data; am = elm_object_item_data_get(it); if (!am) { @@ -340,13 +341,41 @@ static void _selected_cb(void *data, Elm_Object_Item *it) return; } - vdata.list = list; + vdata.list = dmgr->ops->get_list(dmgr->handle, E_LIST_MEDIA, NULL); vdata.index = util_get_media_index(vdata.list, am); viewmgr_update_view(VIEW_MPLAYER, UPDATE_CONTENT, &vdata); viewmgr_push_view(VIEW_MPLAYER); } +static void _album_selected_cb(void *data, Elm_Object_Item *it) +{ + struct view_update_data vdata; + struct datamgr *dmgr; + struct album_info *ai; + + if (!data || !it) { + _ERR("invalid argument"); + return; + } + + dmgr = data; + + ai = elm_object_item_data_get(it); + if (!ai) { + _ERR("failed to get album info"); + return; + } + + vdata.list = dmgr->ops->get_list(dmgr->handle, + E_LIST_ALBUM_MEDIA, &ai->id); + vdata.index = E_DETAIL_MUSIC_ALBUM; + vdata.id = ai->name; + + viewmgr_update_view(VIEW_DETAIL, UPDATE_CONTENT, &vdata); + viewmgr_push_view(VIEW_DETAIL); +} + static struct grid_class _gclass[] = { [E_MUSIC_SONG] = { .item_style = STYLE_MUSIC_SONG, @@ -381,7 +410,7 @@ static struct grid_data _gdata[] = { .get_item_list = _get_song_list, .free_item_list = _free_item_list, .key_down_cb = _key_down_cb, - .selected_cb = _selected_cb + .selected_cb = _media_selected_cb, }, [E_MUSIC_ALBUM] = { .item_x = MUSIC_ALBUM_ITEM_X, @@ -391,6 +420,7 @@ static struct grid_data _gdata[] = { .gclass = &_gclass[E_MUSIC_ALBUM], .get_item_list = _get_album_list, .free_item_list = _free_item_list, + .selected_cb = _album_selected_cb, }, [E_MUSIC_ARTIST] = { .item_x = MUSIC_ARTIST_ITEM_X, diff --git a/src/layout/gallery.c b/src/layout/gallery.c index be63e3b..dcb2cfe 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -137,7 +137,6 @@ static void _clear_content_list(struct _priv *priv) static void _update_content_list(struct _priv *priv) { Eina_List *list; - struct datamgr *dmgr; if (priv->media_list) { _update_content_info(priv); @@ -146,17 +145,14 @@ static void _update_content_list(struct _priv *priv) priv->gdata = get_gallery_grid_data(priv->view_mode); - dmgr = priv->dmgr[E_DATA_MEDIA]; - - list = priv->gdata->get_item_list(dmgr); + list = priv->gdata->get_item_list(priv->dmgr[E_DATA_MEDIA]); if (!list) { elm_object_part_text_set(priv->layout, PART_NOCONTENT, TEXT_NOCONTENT); return; } - priv->gdata->data = dmgr->ops->get_list(dmgr->handle, - E_LIST_MEDIA, NULL); + priv->gdata->data = priv->dmgr[E_DATA_MEDIA]; if (!listmgr_update_content_list(priv->listmgr, list, priv->gdata)) _ERR("failed to update list area"); diff --git a/src/layout/movie.c b/src/layout/movie.c index 8fbe6d0..e145cd5 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -349,7 +349,6 @@ static void _clear_content_list(struct _priv *priv) static void _update_content_list(struct _priv *priv) { Eina_List *list; - struct datamgr *dmgr; if (priv->media_list) { _update_content_info(priv); @@ -358,17 +357,14 @@ static void _update_content_list(struct _priv *priv) priv->gdata = get_movie_grid_data(priv->view_mode); - dmgr = priv->dmgr[E_DATA_MEDIA]; - - list = priv->gdata->get_item_list(dmgr); + list = priv->gdata->get_item_list(priv->dmgr[E_DATA_MEDIA]); if (!list) { elm_object_part_text_set(priv->layout, PART_NOCONTENT, TEXT_NOCONTENT); return; } - priv->gdata->data = dmgr->ops->get_list(dmgr->handle, - E_LIST_MEDIA, NULL); + priv->gdata->data = priv->dmgr[E_DATA_MEDIA]; if (!listmgr_update_content_list(priv->listmgr, list, priv->gdata)) { _ERR("failed to update list area"); diff --git a/src/layout/music.c b/src/layout/music.c index 738f795..2ab37eb 100644 --- a/src/layout/music.c +++ b/src/layout/music.c @@ -339,8 +339,7 @@ static void _update_content_list(struct _priv *priv) return; } - priv->gdata->data = dmgr->ops->get_list(dmgr->handle, - E_LIST_MEDIA, NULL); + priv->gdata->data = dmgr; if (!listmgr_update_content_list(priv->listmgr, list, priv->gdata)) _ERR("failed to update list area"); diff --git a/src/view/detail.c b/src/view/detail.c index 1df4251..5f20ecd 100644 --- a/src/view/detail.c +++ b/src/view/detail.c @@ -33,6 +33,7 @@ static Evas_Object *_grid_content_get(void *data, Evas_Object *obj, const char *part); static void _get_movie_count(char *str, int size, Eina_List *list); +static void _get_music_count(char *str, int size, Eina_List *list); struct _view_info { const char *grid_style; @@ -54,6 +55,14 @@ static struct _view_info view_info[E_DETAIL_MAX] = { .get_grid_content = _grid_content_get, .get_content_info = _get_movie_count, }, + [E_DETAIL_MUSIC_ALBUM] = { + .grid_style = STYLE_MUSIC_SONG_DETAIL, + .grid_item_x = MUSIC_SONG_ITEM_X, + .grid_item_y = MUSIC_SONG_ITEM_Y, + .get_grid_text = _grid_text_get, + .get_grid_content = _grid_content_get, + .get_content_info = _get_music_count, + }, }; struct _priv { @@ -120,8 +129,13 @@ static void _selected(void *data) vdata.list = priv->media_list; vdata.index = util_get_media_index(vdata.list, am); - viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); - viewmgr_push_view(VIEW_VIEWER); + if (priv->view_type == E_DETAIL_MOVIE_GENRE) { + viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); + viewmgr_push_view(VIEW_VIEWER); + } else if (priv->view_type == E_DETAIL_MUSIC_ALBUM) { + viewmgr_update_view(VIEW_MPLAYER, UPDATE_CONTENT, &vdata); + viewmgr_push_view(VIEW_MPLAYER); + } } static void _selected_cb(int id, void *data, Evas_Object *obj, @@ -266,6 +280,11 @@ static void _get_movie_count(char *str, int size, Eina_List *list) snprintf(str, size, "%d movies", eina_list_count(list)); } +static void _get_music_count(char *str, int size, Eina_List *list) +{ + snprintf(str, size, "%d songs", eina_list_count(list)); +} + static void _update_title_area(struct _priv *priv, const char *title) { char buf[64]; -- 2.7.4 From 76241dd74e1971d7b9f06160d369751079ba9baf Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 24 Sep 2015 17:13:22 +0900 Subject: [PATCH 05/16] fix compile error Change-Id: Ife07735642610b2a83eb81afb9f849bc8ae5c796 Signed-off-by: Minkyu Kang --- src/layout/gallery.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/layout/gallery.c b/src/layout/gallery.c index fc7b85e..44a4808 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -216,7 +216,8 @@ static Eina_Bool _create_location(void *data) priv->locmgr = locmgr; - locmgr_set_locations(locmgr, dmgr->ops->get_list(dmgr->handle)); + locmgr_set_locations(locmgr, + dmgr->ops->get_list(dmgr->handle, E_LIST_MEDIA, NULL)); return ECORE_CALLBACK_CANCEL; } -- 2.7.4 From b5da373f1c974571b30f12ac2102db4ddf1f3d72 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Fri, 25 Sep 2015 11:13:25 +0900 Subject: [PATCH 06/16] detail: add BACK key handling to set focus Change-Id: Idc6b61ba3ed3b6f0fc60beabee4d0f2df141db53 Signed-off-by: Jehun Lim --- include/view.h | 1 + src/layout/movie.c | 3 +++ src/layout/music.c | 3 +++ src/util/listmgr.c | 65 +++++++++++++++++++++++------------------------------- src/view/base.c | 1 + src/view/detail.c | 1 + 6 files changed, 37 insertions(+), 37 deletions(-) diff --git a/include/view.h b/include/view.h index 7422bac..7d52512 100644 --- a/include/view.h +++ b/include/view.h @@ -47,6 +47,7 @@ enum update_type { UPDATE_CONTENT = 0, UPDATE_CONTENT_ITEM, UPDATE_FOCUS, + UPDATE_BACK, UPDATE_PLAY_INFO, UPDATE_PLAYER, UPDATE_FAVORITE, diff --git a/src/layout/movie.c b/src/layout/movie.c index e145cd5..9267939 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -648,6 +648,9 @@ static void _update(void *layout_data, int update_type, void *data) listmgr_focus_play_info(priv->listmgr); _update_recent_item(priv, vdata->id); break; + case UPDATE_BACK: + listmgr_focus_content_list(priv->listmgr, NULL); + break; case UPDATE_RECENT: if (!data) { _ERR("invalid argument"); diff --git a/src/layout/music.c b/src/layout/music.c index 2ab37eb..19a0fce 100644 --- a/src/layout/music.c +++ b/src/layout/music.c @@ -624,6 +624,9 @@ static void _update(void *layout_data, int update_type, void *data) case UPDATE_FOCUS: listmgr_focus_play_info(priv->listmgr); break; + case UPDATE_BACK: + listmgr_focus_content_list(priv->listmgr, NULL); + break; case UPDATE_RECENT: if (!data) { _ERR("invalid argument"); diff --git a/src/util/listmgr.c b/src/util/listmgr.c index 0f80bb8..6d9df60 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -48,7 +48,6 @@ struct listmgr { Evas_Object *focused; Elm_Object_Item *focused_it; - Elm_Object_Item *selected_it; struct gridmgr *gmgr; struct listmgr_data *data; @@ -261,7 +260,7 @@ static void _grid_selected(void *data) gdata = lmgr->data->gdata; if (gdata->selected_cb) - gdata->selected_cb(gdata->data, lmgr->selected_it); + gdata->selected_cb(gdata->data, lmgr->focused_it); } static void _grid_selected_cb(int id, void *data, Evas_Object *obj, @@ -274,8 +273,6 @@ static void _grid_selected_cb(int id, void *data, Evas_Object *obj, lmgr = data; - lmgr->selected_it = it; - ecore_job_add(_grid_selected, lmgr); } @@ -493,24 +490,36 @@ bool _focus_to_content(struct listmgr *lmgr, Evas_Object *base) return true; } -Elm_Object_Item *_get_grid_item(Evas_Object *grid, const char *id) +Elm_Object_Item *_get_grid_item(struct listmgr *lmgr, const char *id) { + Eina_List *item, *l; + Evas_Object *ly, *grid; Elm_Object_Item *it; app_media *am; app_media_info *mi; - for (it = elm_gengrid_first_item_get(grid); it; - it = elm_gengrid_item_next_get(it)) { - am = elm_object_item_data_get(it); - if (!am) - continue; + item = elm_box_children_get(lmgr->box); + + EINA_LIST_FOREACH(item, l, ly) { + grid = elm_object_part_content_get(ly, PART_ITEM_CONTENT); + if (!grid) { + _ERR("failed to get grid object"); + return false; + } + + for (it = elm_gengrid_first_item_get(grid); it; + it = elm_gengrid_item_next_get(it)) { + am = elm_object_item_data_get(it); + if (!am) + continue; - mi = app_media_get_info(am); - if (!mi) - continue; + mi = app_media_get_info(am); + if (!mi) + continue; - if (!strcmp(id, mi->media_id)) - return it; + if (!strcmp(id, mi->media_id)) + return it; + } } return NULL; @@ -576,8 +585,6 @@ bool listmgr_focus_play_info(struct listmgr *lmgr) bool listmgr_focus_content_list(struct listmgr *lmgr, const char *id) { - Eina_List *item, *l; - Evas_Object *ly, *grid; Elm_Object_Item *it; if (!lmgr) { @@ -585,26 +592,10 @@ bool listmgr_focus_content_list(struct listmgr *lmgr, const char *id) return false; } - if (!id) { - _ERR("invalid argument"); - return false; - } - - item = elm_box_children_get(lmgr->box); - - grid = NULL; - it = NULL; - EINA_LIST_FOREACH(item, l, ly) { - grid = elm_object_part_content_get(ly, PART_ITEM_CONTENT); - if (!grid) { - _ERR("failed to get grid object"); - return false; - } - - it = _get_grid_item(grid, id); - if (it) - break; - } + if (id) + it = _get_grid_item(lmgr, id); + else + it = lmgr->focused_it; if (!it) { _ERR("failed to get current grid item"); diff --git a/src/view/base.c b/src/view/base.c index 052e26b..b61387d 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -796,6 +796,7 @@ static void _update(void *view_data, int update_type, void *data) update_type, vdata); break; case UPDATE_CONTENT_ITEM: + case UPDATE_BACK: layoutmgr_update_layout(priv->lmgr, g_menu_item[priv->current_layout].layout_id, update_type, NULL); diff --git a/src/view/detail.c b/src/view/detail.c index 5f20ecd..ce28fdb 100644 --- a/src/view/detail.c +++ b/src/view/detail.c @@ -89,6 +89,7 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_ESC)) { + viewmgr_update_view(VIEW_BASE, UPDATE_BACK, NULL); viewmgr_pop_view(); } } -- 2.7.4 From 966f598f692fa9e2a836d710ee4e56176da0e85b Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 30 Sep 2015 13:00:35 +0900 Subject: [PATCH 07/16] detail: add music artist detail view Change-Id: I8f06e4322845938114305c02cc845245613d43ed Signed-off-by: Jehun Lim --- include/data/albumdata.h | 1 + include/view.h | 1 + src/data/albumdata.c | 36 ++++++++++++++++++------ src/grid/grid_music.c | 29 +++++++++++++++++++ src/view/detail.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 128 insertions(+), 11 deletions(-) diff --git a/include/data/albumdata.h b/include/data/albumdata.h index 0d566bc..6c39494 100644 --- a/include/data/albumdata.h +++ b/include/data/albumdata.h @@ -27,6 +27,7 @@ enum album_group_type { enum album_list_type { E_LIST_ALBUM_MEDIA = 0, + E_LIST_ARTIST_ALBUM, }; struct album_info { diff --git a/include/view.h b/include/view.h index 7d52512..21e0f03 100644 --- a/include/view.h +++ b/include/view.h @@ -61,6 +61,7 @@ enum update_type { enum detail_view_type { E_DETAIL_MOVIE_GENRE = 0, E_DETAIL_MUSIC_ALBUM, + E_DETAIL_MUSIC_ARTIST, E_DETAIL_MAX }; diff --git a/src/data/albumdata.c b/src/data/albumdata.c index 1cd6b95..6f62715 100644 --- a/src/data/albumdata.c +++ b/src/data/albumdata.c @@ -23,17 +23,17 @@ struct albumdata; -typedef bool (*get_album_list)(struct albumdata *ad); +typedef bool (*get_album_list)(struct albumdata *ad, const char *cond); typedef int (*media_compare)(struct group_info *gi, struct album_info *ai); typedef void *(*media_compare_data_get)(struct album_info *ai); typedef char *(*group_name_get)(struct album_info *ai); -static bool _get_name_list(struct albumdata *ad); +static bool _get_name_list(struct albumdata *ad, const char *cond); static int _compare_name(struct group_info *, struct album_info *); static void *_get_data_name(struct album_info *); static char *_get_name(struct album_info *); -static bool _get_artist_list(struct albumdata *ad); +static bool _get_artist_list(struct albumdata *ad, const char *cond); static int _compare_artist(struct group_info *, struct album_info *); static void *_get_data_artist(struct album_info *); static char *_get_artist(struct album_info *); @@ -334,7 +334,7 @@ static bool _get_media_list(struct albumdata *ad, int album_id) return true; } -static bool _get_name_list(struct albumdata *ad) +static bool _get_name_list(struct albumdata *ad, const char *cond) { filter_h filter; int ret; @@ -345,7 +345,7 @@ static bool _get_name_list(struct albumdata *ad) return false; } - if (!_create_filter(ad, &filter, NULL, E_FILTER_ALBUM)) { + if (!_create_filter(ad, &filter, cond, E_FILTER_ALBUM)) { _ERR("failed to create filter"); media_content_disconnect(); return false; @@ -367,7 +367,7 @@ static bool _get_name_list(struct albumdata *ad) return true; } -static bool _get_artist_list(struct albumdata *ad) +static bool _get_artist_list(struct albumdata *ad, const char *cond) { filter_h filter; int ret; @@ -443,6 +443,8 @@ static Eina_List *_get_list(void *handle, int type, void *data) { struct albumdata *ad; int *album_id; + char *artist; + char buf[64]; if (!handle) { _ERR("failed to get albumdata handle"); @@ -465,7 +467,22 @@ static Eina_List *_get_list(void *handle, int type, void *data) album_id = data; _get_media_list(ad, *album_id); + return ad->media_list; + case E_LIST_ARTIST_ALBUM: + if (ad->album_list) { + _destroy_album_list(ad->album_list); + ad->album_list = NULL; + } + + ad->group_type = E_GROUP_ALBUM_NAME; + + artist = data; + + snprintf(buf, sizeof(buf), "MEDIA_ALBUM_ARTIST=\"%s\"", artist); + _get_name_list(ad, buf); + + return ad->album_list; default: break; } @@ -494,7 +511,7 @@ static void _free_group_list(Eina_List *list) EINA_LIST_FREE(list, gi) { free(gi->name); free(gi->data); - eina_list_free(gi->list); + _destroy_album_list(gi->list); free(gi); } @@ -531,7 +548,7 @@ static Eina_List *_get_group(void *handle, int type, void *data) ad->album_list = NULL; } - if (!g_group_info[type].get_list(ad)) { + if (!g_group_info[type].get_list(ad, NULL)) { _ERR("failed to get album list"); return NULL; } @@ -556,6 +573,9 @@ static Eina_List *_get_group(void *handle, int type, void *data) gi->list = eina_list_append(gi->list, ai); } + eina_list_free(ad->album_list); + ad->album_list = NULL; + return list; } diff --git a/src/grid/grid_music.c b/src/grid/grid_music.c index 34a9058..b4e327c 100644 --- a/src/grid/grid_music.c +++ b/src/grid/grid_music.c @@ -376,6 +376,34 @@ static void _album_selected_cb(void *data, Elm_Object_Item *it) viewmgr_push_view(VIEW_DETAIL); } +static void _artist_selected_cb(void *data, Elm_Object_Item *it) +{ + struct view_update_data vdata; + struct datamgr *dmgr; + struct album_info *ai; + + if (!data || !it) { + _ERR("invalid argument"); + return; + } + + dmgr = data; + + ai = elm_object_item_data_get(it); + if (!ai) { + _ERR("failed to get album info"); + return; + } + + vdata.list = dmgr->ops->get_list(dmgr->handle, + E_LIST_ARTIST_ALBUM, ai->artist); + vdata.index = E_DETAIL_MUSIC_ARTIST; + vdata.id = ai->artist; + + viewmgr_update_view(VIEW_DETAIL, UPDATE_CONTENT, &vdata); + viewmgr_push_view(VIEW_DETAIL); +} + static struct grid_class _gclass[] = { [E_MUSIC_SONG] = { .item_style = STYLE_MUSIC_SONG, @@ -430,6 +458,7 @@ static struct grid_data _gdata[] = { .gclass = &_gclass[E_MUSIC_ARTIST], .get_item_list = _get_artist_list, .free_item_list = _free_item_list, + .selected_cb = _artist_selected_cb, }, [E_MUSIC_GENRE] = { .item_x = MUSIC_GENRE_ITEM_X, diff --git a/src/view/detail.c b/src/view/detail.c index ce28fdb..5e0dfcb 100644 --- a/src/view/detail.c +++ b/src/view/detail.c @@ -32,8 +32,13 @@ static char *_grid_text_get(void *data, Evas_Object *obj, const char *part); static Evas_Object *_grid_content_get(void *data, Evas_Object *obj, const char *part); +static char *_album_text_get(void *data, Evas_Object *obj, const char *part); +static Evas_Object *_album_content_get(void *data, Evas_Object *obj, + const char *part); + static void _get_movie_count(char *str, int size, Eina_List *list); -static void _get_music_count(char *str, int size, Eina_List *list); +static void _get_song_count(char *str, int size, Eina_List *list); +static void _get_album_count(char *str, int size, Eina_List *list); struct _view_info { const char *grid_style; @@ -61,7 +66,15 @@ 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_music_count, + .get_content_info = _get_song_count, + }, + [E_DETAIL_MUSIC_ARTIST] = { + .grid_style = STYLE_MUSIC_ALBUM, + .grid_item_x = MUSIC_ALBUM_ITEM_X, + .grid_item_y = MUSIC_ALBUM_ITEM_Y, + .get_grid_text = _album_text_get, + .get_grid_content = _album_content_get, + .get_content_info = _get_album_count, }, }; @@ -259,6 +272,54 @@ static Evas_Object *_grid_content_get(void *data, Evas_Object *obj, return eo; } +static char *_album_text_get(void *data, Evas_Object *obj, const char *part) +{ + struct album_info *ai; + + if (!data) + return NULL; + + ai = data; + + return strdup(ai->name); +} + +static Evas_Object *_album_content_get(void *data, Evas_Object *obj, + const char *part) +{ + Evas_Object *eo; + struct album_info *ai; + struct color_data bg; + + if (!data) + return NULL; + + ai = data; + + eo = NULL; + if (!strcmp(part, PART_ELM_SWALLOW_THUMBNAIL)) { + eo = util_add_image(obj, ai->album_art); + if (!eo) { + _ERR("failed to create image object"); + return NULL; + } + } else if (!strcmp(part, PART_ELM_SWALLOW_TEXTBG)) { + eo = evas_object_rectangle_add(obj); + if (!eo) { + _ERR("failed to create rectangle object"); + return NULL; + } + + app_contents_get_color(ai->name, NULL, &bg); + evas_object_color_set(eo, bg.r, bg.g, bg.b, bg.a); + } + + if (eo) + evas_object_show(eo); + + return eo; +} + static Elm_Gengrid_Item_Class *_get_grid_item_class(struct _view_info *vinfo) { Elm_Gengrid_Item_Class *ic; @@ -281,11 +342,16 @@ static void _get_movie_count(char *str, int size, Eina_List *list) snprintf(str, size, "%d movies", eina_list_count(list)); } -static void _get_music_count(char *str, int size, Eina_List *list) +static void _get_song_count(char *str, int size, Eina_List *list) { snprintf(str, size, "%d songs", eina_list_count(list)); } +static void _get_album_count(char *str, int size, Eina_List *list) +{ + snprintf(str, size, "%d albums", eina_list_count(list)); +} + static void _update_title_area(struct _priv *priv, const char *title) { char buf[64]; -- 2.7.4 From 78e8e210cb8dfc8eeda5a806a99e5287a7f39680 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 30 Sep 2015 15:38:16 +0900 Subject: [PATCH 08/16] detail: add selected callback for artist album item Change-Id: I10ea7b4a92a03300e6bddc5fd62412ee25b42797 Signed-off-by: Jehun Lim --- include/data/datamgr.h | 4 ++ src/layout/gallery.c | 4 +- src/layout/movie.c | 4 +- src/layout/music.c | 4 +- src/view/detail.c | 123 +++++++++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 125 insertions(+), 14 deletions(-) diff --git a/include/data/datamgr.h b/include/data/datamgr.h index f0222b3..158ace4 100644 --- a/include/data/datamgr.h +++ b/include/data/datamgr.h @@ -21,6 +21,10 @@ #include "data/albumdata.h" #include "data/folderdata.h" +#define MOVIE_MEDIA_COND "media_type=1 AND copyright!=\"Unknown\"" +#define GALLERY_MEDIA_COND "media_type=0 OR (media_type=1 AND copyright=\"Unknown\")" +#define MUSIC_MEDIA_COND "media_type=3" + enum data_type { E_DATA_MEDIA = 0, E_DATA_ALBUM, diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 44a4808..f8a5157 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -32,8 +32,6 @@ #include "util/util.h" #include "util/locmgr.h" -#define LIST_MEDIA_COND "media_type=0 OR (media_type=1 AND copyright=\"Unknown\")" - #define TEXT_NOCONTENT "No Photo & Video" #define GRID_PADDING 6 @@ -230,7 +228,7 @@ static bool _create_utils(struct _priv *priv) int i; for (i = 0; i < E_DATA_MAX; i++) { - dmgr = datamgr_create(i, LIST_MEDIA_COND, E_SOURCE_ALL); + dmgr = datamgr_create(i, GALLERY_MEDIA_COND, E_SOURCE_ALL); if (!dmgr) { _ERR("failed to create datamgr"); _destroy_datamgr(priv); diff --git a/src/layout/movie.c b/src/layout/movie.c index 9267939..37023bd 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -33,8 +33,6 @@ #include "util/progressbar.h" #include "util/util.h" -#define LIST_MEDIA_COND "media_type=1 AND copyright!=\"Unknown\"" - #define TEXT_NOCONTENT "No Movies" #define TEXT_RECENTLY_WATCHED "Recently watched" @@ -460,7 +458,7 @@ static bool _create_utils(struct _priv *priv) int i; for (i = 0; i < E_DATA_MAX; i++) { - dmgr = datamgr_create(i, LIST_MEDIA_COND, E_SOURCE_ALL); + dmgr = datamgr_create(i, MOVIE_MEDIA_COND, E_SOURCE_ALL); if (!dmgr) { _ERR("failed to create datamgr"); _destroy_datamgr(priv); diff --git a/src/layout/music.c b/src/layout/music.c index 19a0fce..cf1ac9a 100644 --- a/src/layout/music.c +++ b/src/layout/music.c @@ -32,8 +32,6 @@ #include "util/listmgr.h" #include "util/util.h" -#define LIST_MEDIA_COND "media_type=3" - #define TEXT_NOCONTENT "No Music" #define TEXT_NOW_PLAYING "Now Playing" @@ -433,7 +431,7 @@ static bool _create_utils(struct _priv *priv) int i; for (i = 0; i < E_DATA_MAX; i++) { - dmgr = datamgr_create(i, LIST_MEDIA_COND, E_SOURCE_ALL); + dmgr = datamgr_create(i, MUSIC_MEDIA_COND, E_SOURCE_ALL); if (!dmgr) { _ERR("failed to create datamgr"); _destroy_datamgr(priv); diff --git a/src/view/detail.c b/src/view/detail.c index 5e0dfcb..066521b 100644 --- a/src/view/detail.c +++ b/src/view/detail.c @@ -40,6 +40,13 @@ static void _get_movie_count(char *str, int size, Eina_List *list); static void _get_song_count(char *str, int size, Eina_List *list); static void _get_album_count(char *str, int size, Eina_List *list); +static void _album_selected(void *data); + +struct _list_info { + Eina_List *list; + const char *title; +}; + struct _view_info { const char *grid_style; int grid_item_x; @@ -47,8 +54,10 @@ struct _view_info { char *(*get_grid_text)(void *data, Evas_Object *obj, const char *part); Evas_Object *(*get_grid_content)(void *data, Evas_Object *obj, const char *part); - void (*get_content_info)(char *str, int size, Eina_List *list); + + void (*selected)(void *data); + bool detail_update; }; static struct _view_info view_info[E_DETAIL_MAX] = { @@ -59,6 +68,7 @@ static struct _view_info view_info[E_DETAIL_MAX] = { .get_grid_text = _grid_text_get, .get_grid_content = _grid_content_get, .get_content_info = _get_movie_count, + .detail_update = EINA_FALSE, }, [E_DETAIL_MUSIC_ALBUM] = { .grid_style = STYLE_MUSIC_SONG_DETAIL, @@ -67,6 +77,7 @@ static struct _view_info view_info[E_DETAIL_MAX] = { .get_grid_text = _grid_text_get, .get_grid_content = _grid_content_get, .get_content_info = _get_song_count, + .detail_update = EINA_FALSE, }, [E_DETAIL_MUSIC_ARTIST] = { .grid_style = STYLE_MUSIC_ALBUM, @@ -75,6 +86,8 @@ static struct _view_info view_info[E_DETAIL_MAX] = { .get_grid_text = _album_text_get, .get_grid_content = _album_content_get, .get_content_info = _get_album_count, + .selected = _album_selected, + .detail_update = EINA_TRUE, }, }; @@ -86,24 +99,60 @@ struct _priv { Elm_Object_Item *focused_it; Eina_List *media_list; + Eina_List *view_list; + + struct datamgr *dmgr; int view_type; + int depth; struct _view_info *vinfo; }; +static void _update_view(struct _priv *priv) +{ + struct _list_info *linfo; + struct view_update_data vdata; + + linfo = eina_list_data_get(priv->view_list); + priv->view_list = eina_list_remove(priv->view_list, linfo); + + vdata.list = linfo->list; + vdata.index = E_DETAIL_MUSIC_ARTIST; + vdata.id = linfo->title; + + viewmgr_update_view(VIEW_DETAIL, UPDATE_CONTENT, &vdata); + viewmgr_push_view(VIEW_DETAIL); + + priv->depth--; + + free(linfo); +} + +static void _pop_view(void) +{ + viewmgr_update_view(VIEW_BASE, UPDATE_BACK, NULL); + viewmgr_pop_view(); +} + static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { - if (!ev) { + struct _priv *priv; + + if (!data || !ev) { _ERR("invalid argument"); return; } + priv = data; + if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_ESC)) { - viewmgr_update_view(VIEW_BASE, UPDATE_BACK, NULL); - viewmgr_pop_view(); + if (priv->depth > 0) + _update_view(priv); + else + _pop_view(); } } @@ -121,7 +170,7 @@ static void _focused_cb(int id, void *data, Evas_Object *obj, priv->focused_it = it; } -static void _selected(void *data) +static void _media_selected(void *data) { struct _priv *priv; struct view_update_data vdata; @@ -152,16 +201,67 @@ static void _selected(void *data) } } +static void _album_selected(void *data) +{ + struct _priv *priv; + struct view_update_data vdata; + struct _list_info *linfo; + struct datamgr *dmgr; + struct album_info *ai; + + if (!data) { + _ERR("invalid argument"); + return; + } + + priv = data; + + dmgr = priv->dmgr; + + ai = elm_object_item_data_get(priv->focused_it); + if (!ai) { + _ERR("failed to get album info"); + return; + } + + linfo = calloc(1, sizeof(*linfo)); + if (!linfo) { + _ERR("failed to allocate list info"); + return; + } + + linfo->list = priv->media_list; + linfo->title = ai->artist; + + priv->view_list = eina_list_append(priv->view_list, linfo); + + vdata.list = dmgr->ops->get_list(dmgr->handle, + E_LIST_ALBUM_MEDIA, &ai->id); + vdata.index = E_DETAIL_MUSIC_ALBUM; + vdata.id = ai->name; + + viewmgr_update_view(VIEW_DETAIL, UPDATE_CONTENT, &vdata); + viewmgr_push_view(VIEW_DETAIL); + + priv->depth++; +} + static void _selected_cb(int id, void *data, Evas_Object *obj, Elm_Object_Item *it) { struct _priv *priv; + void (*_selected)(void *data); if (!data || !it) return; priv = data; + if (priv->vinfo->detail_update) + _selected = priv->vinfo->selected; + else + _selected = _media_selected; + ecore_job_add(_selected, priv); } @@ -369,6 +469,7 @@ static bool _update_thumbnail_area(struct _priv *priv) Elm_Object_Item *it; void *data; + elm_object_focus_set(priv->grid, EINA_FALSE); elm_gengrid_clear(priv->grid); elm_gengrid_item_size_set(priv->grid, @@ -417,6 +518,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) { struct _priv *priv; Evas_Object *base; + struct datamgr *dmgr; if (!win) { _ERR("failed to get win object"); @@ -442,11 +544,20 @@ static Evas_Object *_create(Evas_Object *win, void *data) EVAS_HINT_EXPAND); elm_win_resize_object_add(win, base); + dmgr = datamgr_create(E_DATA_ALBUM, MUSIC_MEDIA_COND, E_SOURCE_ALL); + if (!dmgr) { + _ERR("failed to create datamgr"); + free(priv); + return NULL; + } + priv->win = win; priv->base = base; + priv->dmgr = dmgr; if (!_draw_thumbnail_area(priv)) { _ERR("failed to draw items"); + datamgr_destroy(dmgr); free(priv); return NULL; } @@ -548,6 +659,8 @@ static void _destroy(void *view_data) priv = view_data; + datamgr_destroy(priv->dmgr); + evas_object_del(priv->base); free(priv); -- 2.7.4 From 242a22d3de6ce22a806b9d96c5ca73609c236caa Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 30 Sep 2015 17:05:23 +0900 Subject: [PATCH 09/16] listmgr: add focus policy for grid item Change-Id: If9aa57805f553f8d4d8717fcadd181acfdcd6c06 Signed-off-by: Jehun Lim --- src/util/listmgr.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/src/util/listmgr.c b/src/util/listmgr.c index 6d9df60..83d20d7 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -435,6 +435,8 @@ static Evas_Object *_add_list_item_grid(struct listmgr *lmgr, elm_object_focus_next_object_set(grid, lmgr->data->view_btn, ELM_FOCUS_DOWN); + elm_object_focus_region_show_mode_set(grid, ELM_FOCUS_REGION_SHOW_ITEM); + inputmgr_add_callback(grid, LISTMGR_GRID, &_grid_handler, lmgr); return grid; @@ -668,6 +670,101 @@ bool listmgr_update_content_item(struct listmgr *lmgr) return true; } +static void _set_prev_grid_focus(Evas_Object *prev, Evas_Object *cur, + int item_col) +{ + Elm_Object_Item *it, *prev_last_it, *cur_first_it; + int prev_cnt; + int prev_last, cur_first, num_set; + + prev_cnt = elm_gengrid_items_count(prev); + + prev_last = prev_cnt % item_col; + if (!prev_last) + return; + + cur_first = elm_gengrid_items_count(cur); + if (cur_first > item_col) + cur_first = item_col; + + if (prev_last >= cur_first) + return; + + /* items to be set next item as last item of previous grid */ + num_set = cur_first - prev_last; + + prev_last_it = elm_gengrid_last_item_get(prev); + cur_first_it = elm_gengrid_first_item_get(cur); + + it = cur_first_it; + while (prev_last--) + it = elm_gengrid_item_next_get(it); + + while (num_set--) { + elm_object_item_focus_next_item_set(it, prev_last_it, + ELM_FOCUS_LEFT); + it = elm_gengrid_item_next_get(it); + } +} + +static void _set_current_grid_focus(Evas_Object *grid, int item_col) +{ + Elm_Object_Item *it, *last_it; + int cnt; + int num_last, num_set; + + cnt = elm_gengrid_items_count(grid); + + if (cnt <= item_col) + return; + + num_last = cnt % item_col; + if (!num_last) + return; + + /* items to be set next item as last item */ + num_set = item_col - num_last; + + last_it = elm_gengrid_last_item_get(grid); + + it = last_it; + while (num_last--) + it = elm_gengrid_item_prev_get(it); + + while (num_set--) { + elm_object_item_focus_next_item_set(it, last_it, + ELM_FOCUS_RIGHT); + it = elm_gengrid_item_prev_get(it); + } +} + +static void _set_grid_focus(struct listmgr *lmgr) +{ + Eina_List *list, *l; + Evas_Object *ly; + Evas_Object *prev, *cur; + int item_num; + + list = elm_box_children_get(lmgr->box); + + if (lmgr->play_info) + list = eina_list_next(list); + + item_num = lmgr->data->gdata->item_num; + + prev = NULL; + EINA_LIST_FOREACH(list, l, ly) { + cur = elm_object_part_content_get(ly, PART_ITEM_CONTENT); + + if (prev) + _set_prev_grid_focus(prev, cur, item_num); + + _set_current_grid_focus(cur, item_num); + + prev = cur; + } +} + void listmgr_clear_content_list(struct listmgr *lmgr) { Eina_List *list, *l; @@ -744,6 +841,8 @@ bool listmgr_update_content_list(struct listmgr *lmgr, Eina_List *list, grid = elm_object_part_content_get(ly, PART_ITEM_CONTENT); elm_object_focus_next_object_set(grid, grid, ELM_FOCUS_RIGHT); + _set_grid_focus(lmgr); + lmgr->focused = _get_box_first_item(lmgr->box); elm_object_focus_allow_set(lmgr->scr, EINA_TRUE); -- 2.7.4 From 42643ae109ad310f9b356d996be1247aaefaa85d Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 30 Sep 2015 17:42:39 +0900 Subject: [PATCH 10/16] ctxpopup: set focus to selected item Change-Id: I31ebd53fd25532897790765e8287907adaacf226 Signed-off-by: Jehun Lim --- include/util/ctxpopup.h | 2 +- src/util/ctxpopup.c | 14 +++++++++++++- src/view/base.c | 3 ++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/include/util/ctxpopup.h b/include/util/ctxpopup.h index b479373..4b6d0b9 100644 --- a/include/util/ctxpopup.h +++ b/include/util/ctxpopup.h @@ -21,7 +21,7 @@ struct ctxpopup; struct ctxpopup *ctxpopup_create(Evas_Object *base, const char *ctxpopup_style, const char *btn_style, - const char **text, int text_size); + const char **text, int text_size, int cur_index); void ctxpopup_show(struct ctxpopup *m, int x, int y); void ctxpopup_set_callback(struct ctxpopup *m, void (*func)(void *, int), void *data); diff --git a/src/util/ctxpopup.c b/src/util/ctxpopup.c index c70f808..d537bf0 100644 --- a/src/util/ctxpopup.c +++ b/src/util/ctxpopup.c @@ -30,6 +30,8 @@ struct _selected_cb { struct ctxpopup { Evas_Object *popup; + Evas_Object *focused_btn; + struct _selected_cb cb; }; @@ -110,6 +112,9 @@ void ctxpopup_show(struct ctxpopup *m, int x, int y) return; } + if (m->focused_btn) + elm_object_focus_set(m->focused_btn, EINA_TRUE); + evas_object_move(m->popup, x * elm_config_scale_get(), y * elm_config_scale_get()); @@ -117,11 +122,13 @@ void ctxpopup_show(struct ctxpopup *m, int x, int y) } struct ctxpopup *ctxpopup_create(Evas_Object *base, const char *ctxpopup_style, - const char *btn_style, const char **text, int text_size) + const char *btn_style, const char **text, int text_size, + int cur_index) { struct ctxpopup *m; Evas_Object *ctxpopup, *box, *btn; Evas_Object *firstbtn; + Evas_Object *focused_btn; int i; if (!base || !text || text_size <= 0) { @@ -155,6 +162,7 @@ struct ctxpopup *ctxpopup_create(Evas_Object *base, const char *ctxpopup_style, elm_box_padding_set(box, 0, 0); + focused_btn = NULL; for (i = 0; i < text_size; i++) { btn = util_add_button(box, btn_style, text[i]); if (!btn) { @@ -172,6 +180,9 @@ struct ctxpopup *ctxpopup_create(Evas_Object *base, const char *ctxpopup_style, if (i == 0) firstbtn = btn; + + if (i == cur_index) + focused_btn = btn; } elm_object_focus_next_object_set(firstbtn, btn, ELM_FOCUS_UP); @@ -183,6 +194,7 @@ struct ctxpopup *ctxpopup_create(Evas_Object *base, const char *ctxpopup_style, _dismissed_cb, m); m->popup = ctxpopup; + m->focused_btn = focused_btn; return m; } diff --git a/src/view/base.c b/src/view/base.c index b61387d..3f8150e 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -256,7 +256,8 @@ static void _view_btn_clicked(struct _priv *priv) cpopup = ctxpopup_create(priv->base, STYLE_CTXPOPUP_VIEW_MODE, STYLE_BTN_VIEW_OPTION, g_menu_item[priv->current_layout].text_view_mode, - g_menu_item[priv->current_layout].text_size); + g_menu_item[priv->current_layout].text_size, + priv->view_mode[priv->current_layout]); if (!cpopup) { _ERR("failed to create ctxpopup"); return; -- 2.7.4 From 5c13e4f787c5a447d2f69663c658f24bb4bbb915 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Thu, 1 Oct 2015 11:02:46 +0900 Subject: [PATCH 11/16] detail: add music genre detail view Change-Id: Id4933d5153ff8cae9413ffede36a320acaf84695 Signed-off-by: Jehun Lim --- include/view.h | 1 + res/edc/widgets/gengrid.edc | 42 ++++++++++++++++++++++++++++++++++++------ src/grid/grid_music.c | 25 +++++++++++++++++++++++++ src/view/detail.c | 19 +++++++++++++++++-- 4 files changed, 79 insertions(+), 8 deletions(-) diff --git a/include/view.h b/include/view.h index 21e0f03..ef90d13 100644 --- a/include/view.h +++ b/include/view.h @@ -62,6 +62,7 @@ enum detail_view_type { E_DETAIL_MOVIE_GENRE = 0, E_DETAIL_MUSIC_ALBUM, E_DETAIL_MUSIC_ARTIST, + E_DETAIL_MUSIC_GENRE, E_DETAIL_MAX }; diff --git a/res/edc/widgets/gengrid.edc b/res/edc/widgets/gengrid.edc index 4063fed..6bd69a5 100644 --- a/res/edc/widgets/gengrid.edc +++ b/res/edc/widgets/gengrid.edc @@ -2109,25 +2109,55 @@ group { } } part { + name: "padding_title_left"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "bg"; + rel2 { + to: "bg"; + relative: 0.0 1.0; + } + min: 14 0; + align: 0.0 0.5; + fixed: 1 0; + } + } + part { + name: "padding_title_right"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 1.0 0.0; + } + rel2.to: "bg"; + min: 14 0; + align: 1.0 0.5; + fixed: 1 0; + } + } + part { name: PART_ELM_TEXT_TITLE; type: TEXT; scale: 1; description { state: "default" 0.0; rel1 { - to: "bg"; - relative: 0.5 0.5; + to: "padding_title_left"; + relative: 1.0 0.5; } rel2 { - to: "bg"; - relative: 0.5 0.5; + to: "padding_title_right"; + relative: 0.0 0.5; } text { font: FONT_LIGHT; size: 28; - min: 1 0; align: 0.5 0.5; - ellipsis: -1; } min: 0 28; align: 0.5 0.5; diff --git a/src/grid/grid_music.c b/src/grid/grid_music.c index b4e327c..2bf8a38 100644 --- a/src/grid/grid_music.c +++ b/src/grid/grid_music.c @@ -404,6 +404,30 @@ static void _artist_selected_cb(void *data, Elm_Object_Item *it) viewmgr_push_view(VIEW_DETAIL); } +static void _genre_selected_cb(void *data, Elm_Object_Item *it) +{ + struct view_update_data vdata; + struct group_info *gi; + + if (!it) { + _ERR("invalid argument"); + return; + } + + gi = elm_object_item_data_get(it); + if (!gi) { + _ERR("failed to get group info"); + return; + } + + vdata.list = gi->list; + vdata.index = E_DETAIL_MUSIC_GENRE; + vdata.id = gi->name; + + viewmgr_update_view(VIEW_DETAIL, UPDATE_CONTENT, &vdata); + viewmgr_push_view(VIEW_DETAIL); +} + static struct grid_class _gclass[] = { [E_MUSIC_SONG] = { .item_style = STYLE_MUSIC_SONG, @@ -468,6 +492,7 @@ static struct grid_data _gdata[] = { .gclass = &_gclass[E_MUSIC_GENRE], .get_item_list = _get_genre_list, .free_item_list = _free_group_list, + .selected_cb = _genre_selected_cb, }, /* Other view mode data will be added later */ }; diff --git a/src/view/detail.c b/src/view/detail.c index 066521b..7d28b1c 100644 --- a/src/view/detail.c +++ b/src/view/detail.c @@ -89,6 +89,15 @@ static struct _view_info view_info[E_DETAIL_MAX] = { .selected = _album_selected, .detail_update = EINA_TRUE, }, + [E_DETAIL_MUSIC_GENRE] = { + .grid_style = STYLE_MUSIC_SONG_DETAIL, + .grid_item_x = MUSIC_SONG_ITEM_X, + .grid_item_y = MUSIC_SONG_ITEM_Y, + .get_grid_text = _grid_text_get, + .get_grid_content = _grid_content_get, + .get_content_info = _get_song_count, + .detail_update = EINA_FALSE, + }, }; struct _priv { @@ -192,12 +201,18 @@ static void _media_selected(void *data) vdata.list = priv->media_list; vdata.index = util_get_media_index(vdata.list, am); - if (priv->view_type == E_DETAIL_MOVIE_GENRE) { + switch (priv->view_type) { + case E_DETAIL_MOVIE_GENRE: viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); viewmgr_push_view(VIEW_VIEWER); - } else if (priv->view_type == E_DETAIL_MUSIC_ALBUM) { + break; + case E_DETAIL_MUSIC_ALBUM: + case E_DETAIL_MUSIC_GENRE: viewmgr_update_view(VIEW_MPLAYER, UPDATE_CONTENT, &vdata); viewmgr_push_view(VIEW_MPLAYER); + break; + default: + break; } } -- 2.7.4 From e425d0585f2e56bdc9fa78c50227fd9c945bd970 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 1 Oct 2015 13:41:53 +0900 Subject: [PATCH 12/16] action_menu: scrolls the whole area of action menu Change-Id: I4cbd1d0f47c7d9c8d7f80813e3406c1a5dd65e33 Signed-off-by: Minkyu Kang --- include/util/util.h | 1 + include/view/action_menu.h | 16 +++- res/edc/view/action_menu.edc | 192 +++++++++++++++------------------------ res/edc/widgets/button.edc | 66 +++++++++++++- src/util/util.c | 47 ++++++++++ src/view/action_menu.c | 208 +++++++++++++++++++++++++++++-------------- 6 files changed, 341 insertions(+), 189 deletions(-) diff --git a/include/util/util.h b/include/util/util.h index 1ade043..2857f20 100644 --- a/include/util/util.h +++ b/include/util/util.h @@ -21,6 +21,7 @@ #include bool util_check_movie_type(const char *str); +bool util_launch_request(const char *appid, const char *key, const char *value); Evas_Object *util_add_button(Evas_Object *base, const char *style, const char *text); Evas_Object *util_add_box(Evas_Object *base, Eina_Bool horizontal); diff --git a/include/view/action_menu.h b/include/view/action_menu.h index f4730d8..5e29159 100644 --- a/include/view/action_menu.h +++ b/include/view/action_menu.h @@ -22,10 +22,13 @@ /* group */ #define GRP_ACTION_MENU_VIEW "group.action_menu_view" +#define GRP_ACTION_MENU_CONTENT "group.action_menu_content" #define GRP_ACTION_NO_CONTENT "group.action_no_content" /* part */ +#define PART_ACTION_MENU "part.action_menu" #define PART_ACTION_TV_BTN "part.action_tv_btn" +#define PART_ACTION_MORE_BTN "part.action_more_btn" #define PART_ACTION_MENU_AREA "part.action_menu_area" #define PART_ACTION_FAVORITE_TITLE "part.action_favorite_title" #define PART_ACTION_FAVORITE_AREA "part.action_favorite_area" @@ -34,12 +37,9 @@ #define PART_NO_CONTENT_BG "part.no_content_bg" #define PART_NO_CONTENT_TEXT "part.no_content_text" -/* signal */ -#define SIG_SHOW_NO_CONTENT "show,no_content" -#define SIG_HIDE_NO_CONTENT "hide,no_content" - /* style */ #define STYLE_BTN_LIVETV "action_btn_livetv" +#define STYLE_BTN_MORE "action_btn_more" #define STYLE_BTN_FAVORITE "action_btn_favorite" #define STYLE_BTN_DELETE "action_btn_delete" @@ -61,11 +61,19 @@ #define IMAGE_ACTION_DELETE_FOC "/btn_menu_del_foc.png" #define IMAGE_ACTION_DELETE_DIS "/btn_menu_del_dis.png" +/* defines */ #define GRID_ITEM_X_MOVIE 440 #define GRID_ITEM_Y_MOVIE (328 + 32) #define GRID_ITEM_X_GALLERY (210 + 20) #define GRID_ITEM_Y_GALLERY (210 + 20) #define GRID_ITEM_X_MUSIC 440 #define GRID_ITEM_Y_MUSIC (134 + 20) +#define GRID_ITEM_N_MOVIE 1 +#define GRID_ITEM_N_GALLERY 2 +#define GRID_ITEM_N_MUSIC 1 + +#define CATEGORY_MOVIE "Movie" +#define CATEGORY_GALLERY "Gallery" +#define CATEGORY_MUSIC "Music" #endif /* __AIR_MEDIAHUB_VIEW_ACTION_MENU_H__ */ diff --git a/res/edc/view/action_menu.edc b/res/edc/view/action_menu.edc index 7ece860..ec2bc9d 100644 --- a/res/edc/view/action_menu.edc +++ b/res/edc/view/action_menu.edc @@ -42,8 +42,6 @@ group { state: "show" 0.0; inherit: "default" 0.0; align: 1.0 0.5; - color: COLOR_ITEM_BG; - fixed: 1 0; } } part { @@ -64,37 +62,63 @@ group { } } part { - name: "tv_btn_area"; - type: SPACER; + name: PART_ACTION_MENU; + type: SWALLOW; scale: 1; description { state: "default" 0.0; rel1.to: "menu_area"; - rel2 { - to: "menu_area"; - relative: 1.0 0.0; - } - min: 0 118; - align: 0.5 0.0; - fixed: 0 1; + rel2.to: "menu_area"; } } + } + programs { + program { + name: SIG_SHOW_VIEW; + signal: SIG_SHOW_VIEW; + source: SIG_SOURCE_SRC; + action: STATE_SET "show" 0.0; + target: "menu_area"; + transition: TRANSITION_SHOW_MENU; + } + program { + name: SIG_HIDE_VIEW; + signal: SIG_HIDE_VIEW; + source: SIG_SOURCE_SRC; + action: STATE_SET "default" 0.0; + target: "menu_area"; + transition: TRANSITION_HIDE_MENU; + after: SIG_HIDE_DONE; + } + program { + name: SIG_HIDE_DONE; + action: SIGNAL_EMIT SIG_HIDE_DONE SIG_SOURCE_EDC; + } + program { + name: SIG_HIDE_SET; + signal: SIG_HIDE_SET; + source: SIG_SOURCE_SRC; + action: STATE_SET "default" 0.0; + target: "menu_area"; + } + } +} + +group { + name: GRP_ACTION_MENU_CONTENT; + parts { part { name: PART_ACTION_TV_BTN; type: SWALLOW; scale: 1; description { state: "default" 0.0; - rel1 { - to: "tv_btn_area"; - relative: 0.5 0.5; - } rel2 { - to: "tv_btn_area"; - relative: 0.5 0.5; + relative: 1.0 0.0; } - min: 372 64; - fixed: 1 1; + min: 0 118; + align: 0.5 0.0; + fixed: 0 1; } } part { @@ -104,10 +128,12 @@ group { description { state: "default" 0.0; rel1 { - to: "tv_btn_area"; + to: PART_ACTION_TV_BTN; relative: 0.0 1.0; } - rel2.to: "tv_btn_area"; + rel2 { + to: PART_ACTION_TV_BTN; + } min: 0 1; align: 0.5 0.0; color: COLOR_ITEM_DIVIDER; @@ -121,10 +147,12 @@ group { description { state: "default" 0.0; rel1 { - to: "tv_btn_area"; + to: PART_ACTION_TV_BTN; relative: 0.0 1.0; } - rel2.to: "tv_btn_area"; + rel2 { + to: PART_ACTION_TV_BTN; + } min: 0 126; align: 0.5 0.0; fixed: 0 1; @@ -227,19 +255,6 @@ group { } } part { - name: "padding_favorite_area_right_bottom"; - type: SPACER; - scale: 1; - description { - state: "default" 0.0; - rel1.relative: 1.0 1.0; - rel2.relative: 1.0 1.0; - min: 10 0; - align: 1.0 1.0; - fixed: 1 1; - } - } - part { name: PART_ACTION_FAVORITE_AREA; type: SWALLOW; scale: 1; @@ -249,24 +264,6 @@ group { to: "padding_favorite_area_left_top"; relative: 0.0 1.0; } - rel2 { - to: "padding_favorite_area_right_bottom"; - relative: 0.0 0.0; - } - fixed: 1 1; - } - } - part { - name: "padding_bg_no_content_right_bottom"; - type: SPACER; - scale: 1; - description { - state: "default" 0.0; - rel1.relative: 1.0 1.0; - rel2.relative: 1.0 1.0; - min: 30 32; - align: 1.0 1.0; - fixed: 1 1; } } part { @@ -275,66 +272,47 @@ group { scale: 1; description { state: "default" 0.0; + min: 440 616; rel1 { to: "padding_favorite_area_left_top"; relative: 0.0 1.0; } - rel2 { - to: "padding_bg_no_content_right_bottom"; - relative: 0.0 0.0; - } - fixed: 1 1; } } } - programs { - program { - name: SIG_SHOW_VIEW; - signal: SIG_SHOW_VIEW; - source: SIG_SOURCE_SRC; - action: STATE_SET "show" 0.0; - target: "menu_area"; - transition: TRANSITION_SHOW_MENU; - } - program { - name: SIG_HIDE_VIEW; - signal: SIG_HIDE_VIEW; - source: SIG_SOURCE_SRC; - action: STATE_SET "default" 0.0; - target: "menu_area"; - transition: TRANSITION_HIDE_MENU; - after: SIG_HIDE_DONE; - } - program { - name: SIG_HIDE_DONE; - action: SIGNAL_EMIT SIG_HIDE_DONE SIG_SOURCE_EDC; - } - program { - name: SIG_HIDE_SET; - signal: SIG_HIDE_SET; - source: SIG_SOURCE_SRC; - action: STATE_SET "default" 0.0; - target: "menu_area"; - } - } } group { name: GRP_ACTION_NO_CONTENT; parts { part { + name: "padding"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 30 0; + rel1 { + relative: 1.0 0.0; + } + rel2 { + relative: 1.0 1.0; + } + align: 1.0 0.0; + fixed: 1 0; + } + } + part { name: PART_NO_CONTENT_BG; type: RECT; scale: 1; description { state: "default" 0.0; + rel2 { + to: "padding"; + relative: 0.0 1.0; + } color: COLOR_NO_CONTENT_BG; - visible: 0; - } - description { - state: "show" 0.0; - inherit: "default" 0.0; - visible: 1; } } part { @@ -349,31 +327,7 @@ group { align: 0.5 0.5; } color: COLOR_TEXT_INDEX; - visible: 0; } - description { - state: "show" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - } - programs { - program { - name: SIG_SHOW_NO_CONTENT; - signal: SIG_SHOW_NO_CONTENT; - source: SIG_SOURCE_SRC; - action: STATE_SET "show" 0.0; - target: PART_NO_CONTENT_BG; - target: PART_NO_CONTENT_TEXT; - } - program { - name: SIG_HIDE_NO_CONTENT; - signal: SIG_HIDE_NO_CONTENT; - source: SIG_SOURCE_SRC; - action: STATE_SET "default" 0.0; - target: PART_NO_CONTENT_BG; - target: PART_NO_CONTENT_TEXT; } } } diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index 359a06d..a68f5cd 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -3383,12 +3383,33 @@ group { data.item: "focus_highlight" "on"; parts { part { + name: "padding"; + type: SPACER; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 500 120; + } + } + part { name: "bg"; type: RECT; scale: 1; description { state: "default" 0.0; - color: 0 0 0 0; + min: 327 64; + rel1 { + to: "padding"; + relative: 0.5 0.5; + } + rel2 { + to: "padding"; + relative: 0.5 0.5; + } + color: COLOR_ITEM_BG; + align: 0.5 0.5; + fixed: 1 1; } description { state: "focused" 0.0; @@ -3525,6 +3546,49 @@ group { } group { + name: "elm/button/base/action_btn_more"; + inherit: "elm/button/base/action_btn_livetv"; + data.item: "focus_highlight" "on"; + parts { + part { + name: "padding"; + type: SPACER; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 500 116; + } + } + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 184 60; + rel1 { + to: "padding"; + relative: 0.5 0.5; + } + rel2 { + to: "padding"; + relative: 0.5 0.5; + } + color: COLOR_ITEM_BG; + align: 0.5 0.5; + fixed: 1 1; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: COLOR_ITEM_FOCUS; + } + } + } +} + +group { name: "elm/button/base/action_btn_favorite"; data.item: "focus_highlight" "on"; images { diff --git a/src/util/util.c b/src/util/util.c index 3e9c86d..c698a3d 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -16,6 +16,7 @@ #include #include +#include #include #include @@ -33,6 +34,52 @@ bool util_check_movie_type(const char *str) return strcmp(str, VIDEO_COPYRIGHT); } +bool util_launch_request(const char *appid, const char *key, const char *value) +{ + app_control_h app_ctrl; + int r; + + r = app_control_create(&app_ctrl); + if (r != APP_CONTROL_ERROR_NONE) { + _ERR("failed to create app control handle"); + return false; + } + + r = app_control_set_operation(app_ctrl, APP_CONTROL_OPERATION_DEFAULT); + if (r != APP_CONTROL_ERROR_NONE) { + _ERR("failed to set app control operation"); + app_control_destroy(app_ctrl); + return false; + } + + if (key && value) { + r = app_control_add_extra_data(app_ctrl, key, value); + if (r != APP_CONTROL_ERROR_NONE) { + _ERR("failed to add extra data"); + app_control_destroy(app_ctrl); + return false; + } + } + + r = app_control_set_app_id(app_ctrl, appid); + if (r != APP_CONTROL_ERROR_NONE) { + _ERR("failed to set app control app id"); + app_control_destroy(app_ctrl); + return false; + } + + r = app_control_send_launch_request(app_ctrl, NULL, NULL); + if (r != APP_CONTROL_ERROR_NONE) { + _ERR("failed to send app control launch request"); + app_control_destroy(app_ctrl); + return false; + } + + app_control_destroy(app_ctrl); + + return true; +} + Evas_Object *util_add_button(Evas_Object *base, const char *style, const char *text) { diff --git a/src/view/action_menu.c b/src/view/action_menu.c index c4f21cd..0eb90b6 100644 --- a/src/view/action_menu.c +++ b/src/view/action_menu.c @@ -15,7 +15,6 @@ */ #include -#include #include #include #include @@ -28,6 +27,7 @@ #define TEXT_LIVETV "Live TV" #define TEXT_FAVORITE "Favorite" +#define TEXT_MORE "More" #define NUM_MENU_BTN 4 #define MAX_BTN_COL 4 @@ -35,9 +35,12 @@ #define TABLE_PADDING_X 0 #define TABLE_PADDING_Y 0 +#define GRID_PADDING 20 + enum _object_type { ACTION_DISABLED = -1, ACTION_LIVETV_BTN = 0, + ACTION_MORE_BTN, ACTION_FAVORITE_BTN, ACTION_DELETE_BTN, ACTION_FAVORITE_GRID @@ -53,12 +56,16 @@ enum _content_type { struct _priv { Evas_Object *win; Evas_Object *base; + Evas_Object *scr; + Evas_Object *box; + Evas_Object *content; + Evas_Object *nocontent; Evas_Object *tv_btn; + Evas_Object *more_btn; Evas_Object *menu_btn[NUM_MENU_BTN]; Evas_Object *table; - Evas_Object *ly; Evas_Object *grid; Elm_Object_Item *selected_it; @@ -78,10 +85,12 @@ struct _menu_info { struct _content_info { int grid_x; int grid_y; + int grid_n; const char *style; int app_contents_type; + const char *category; const char *no_content; }; @@ -116,22 +125,28 @@ struct _content_info content_info[] = { { .grid_x = GRID_ITEM_X_MOVIE, .grid_y = GRID_ITEM_Y_MOVIE, + .grid_n = GRID_ITEM_N_MOVIE, .style = STYLE_GRID_MOVIE_ITEM_FAVORITE, .app_contents_type = CONTENTS_MOVIE, + .category = CATEGORY_MOVIE, .no_content = "No favorite Movies" }, { .grid_x = GRID_ITEM_X_GALLERY, .grid_y = GRID_ITEM_Y_GALLERY, + .grid_n = GRID_ITEM_N_GALLERY, .style = STYLE_GRID_GALLERY_ITEM_FAVORITE, .app_contents_type = CONTENTS_GALLERY, + .category = CATEGORY_GALLERY, .no_content = "No favorite Contents" }, { .grid_x = GRID_ITEM_X_MUSIC, .grid_y = GRID_ITEM_Y_MUSIC, + .grid_n = GRID_ITEM_N_MUSIC, .style = STYLE_GRID_SONG_ITEM_FAVORITE, .app_contents_type = CONTENTS_MUSIC, + .category = CATEGORY_MUSIC, .no_content = "No favorite Songs" } }; @@ -154,38 +169,24 @@ static void _hide_view(struct _priv *priv, bool anim) static bool _livetv_clicked(struct _priv *priv) { - app_control_h app_ctrl; - int r; - - r = app_control_create(&app_ctrl); - if (r != APP_CONTROL_ERROR_NONE) { - _ERR("failed to create app control handle"); + if (!util_launch_request(APP_ID_LIVETV, NULL, NULL)) { + _ERR("launch failed: %s\n", APP_ID_LIVETV); return false; } - r = app_control_set_operation(app_ctrl, APP_CONTROL_OPERATION_DEFAULT); - if (r != APP_CONTROL_ERROR_NONE) { - _ERR("failed to set app control operation"); - app_control_destroy(app_ctrl); - return false; - } + _hide_view(priv, false); - r = app_control_set_app_id(app_ctrl, APP_ID_LIVETV); - if (r != APP_CONTROL_ERROR_NONE) { - _ERR("failed to set app control app id"); - app_control_destroy(app_ctrl); - return false; - } + return true; +} - r = app_control_send_launch_request(app_ctrl, NULL, NULL); - if (r != APP_CONTROL_ERROR_NONE) { - _ERR("failed to send app control launch request"); - app_control_destroy(app_ctrl); +static bool _more_clicked(struct _priv *priv) +{ + if (!util_launch_request(APP_ID_FAVORITE, PARAM_CATEGORY, + content_info[priv->content_type].category)) { + _ERR("launch failed: %s\n", APP_ID_FAVORITE); return false; } - app_control_destroy(app_ctrl); - _hide_view(priv, false); return true; @@ -280,6 +281,7 @@ static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, switch (id) { case ACTION_LIVETV_BTN: + case ACTION_MORE_BTN: case ACTION_FAVORITE_BTN: case ACTION_DELETE_BTN: if (!elm_object_focus_get(obj)) @@ -313,6 +315,9 @@ static void _clicked_cb(int id, void *data, Evas_Object *obj) case ACTION_LIVETV_BTN: _livetv_clicked(priv); break; + case ACTION_MORE_BTN: + _more_clicked(priv); + break; case ACTION_FAVORITE_BTN: _favorite_clicked(priv, obj); break; @@ -594,18 +599,13 @@ static bool _draw_livetv_btn(struct _priv *priv) { Evas_Object *btn; - btn = elm_button_add(priv->base); - if (!btn) { - _ERR("failed to create button object"); + btn = util_add_button(priv->content, STYLE_BTN_LIVETV, TEXT_LIVETV); + if (!btn) return false; - } - - elm_object_style_set(btn, STYLE_BTN_LIVETV); - elm_object_text_set(btn, TEXT_LIVETV); inputmgr_add_callback(btn, ACTION_LIVETV_BTN, &_handler, priv); - elm_object_part_content_set(priv->base, PART_ACTION_TV_BTN, btn); + elm_object_part_content_set(priv->content, PART_ACTION_TV_BTN, btn); evas_object_show(btn); @@ -617,17 +617,38 @@ static bool _draw_livetv_btn(struct _priv *priv) return true; } +static bool _draw_more_btn(struct _priv *priv) +{ + Evas_Object *btn; + + btn = util_add_button(priv->box, STYLE_BTN_MORE, TEXT_MORE); + if (!btn) + return false; + + inputmgr_add_callback(btn, ACTION_MORE_BTN, &_handler, priv); + + evas_object_show(btn); + elm_box_pack_end(priv->box, btn); + + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_RIGHT); + + priv->more_btn = btn; + + return true; +} + static bool _draw_menu_area(struct _priv *priv) { Evas_Object *table; - table = util_add_table(priv->base, TABLE_PADDING_X, TABLE_PADDING_Y); + table = util_add_table(priv->content, TABLE_PADDING_X, TABLE_PADDING_Y); if (!table) { _ERR("failed to add table"); return false; } - elm_object_part_content_set(priv->base, PART_ACTION_MENU_AREA, table); + elm_object_part_content_set(priv->content, PART_ACTION_MENU_AREA, table); priv->table = table; @@ -638,10 +659,10 @@ static bool _draw_favorite_area(struct _priv *priv) { Evas_Object *ly, *grid; - elm_object_part_text_set(priv->base, PART_ACTION_FAVORITE_TITLE, + elm_object_part_text_set(priv->content, PART_ACTION_FAVORITE_TITLE, TEXT_FAVORITE); - ly = elm_layout_add(priv->base); + ly = elm_layout_add(priv->content); if (!ly) { _ERR("failed to create layout object"); return false; @@ -649,9 +670,7 @@ static bool _draw_favorite_area(struct _priv *priv) elm_layout_file_set(ly, EDJEFILE, GRP_ACTION_NO_CONTENT); - elm_object_part_content_set(priv->base, PART_ACTION_NO_CONTENT_BG, ly); - - grid = util_add_gengrid(priv->base, 0, 0, EINA_FALSE); + grid = util_add_gengrid(priv->content, 0, 0, EINA_FALSE); if (!grid) { _ERR("failed to create gengrid object"); evas_object_del(ly); @@ -660,13 +679,12 @@ static bool _draw_favorite_area(struct _priv *priv) inputmgr_add_callback(grid, ACTION_FAVORITE_GRID, &_handler, priv); + elm_object_focus_region_show_mode_set(grid, ELM_FOCUS_REGION_SHOW_ITEM); + elm_object_focus_next_object_set(grid, grid, ELM_FOCUS_LEFT); elm_object_focus_next_object_set(grid, grid, ELM_FOCUS_RIGHT); - elm_object_part_content_set(priv->base, - PART_ACTION_FAVORITE_AREA, grid); - - priv->ly = ly; + priv->nocontent = ly; priv->grid = grid; return true; @@ -708,15 +726,13 @@ static void _update_menu_area(struct _priv *priv) } for (i = 0; i < NUM_MENU_BTN; i++) { - btn = elm_button_add(priv->base); + btn = util_add_button(priv->content, menu_info[i].style, + menu_info[i].title); if (!btn) { _ERR("failed to create button object"); return; } - elm_object_style_set(btn, menu_info[i].style); - elm_object_text_set(btn, menu_info[i].title); - _set_menu_state(btn, i, mi->media_id); evas_object_show(btn); @@ -745,20 +761,18 @@ static void _update_menu_area(struct _priv *priv) static void _update_no_content_area(struct _priv *priv) { - if (!priv->favorite_list) { - elm_object_signal_emit(priv->ly, SIG_SHOW_NO_CONTENT, - SIG_SOURCE_SRC); - elm_object_part_text_set(priv->ly, PART_NO_CONTENT_TEXT, - content_info[priv->content_type]. - no_content); - - elm_object_focus_allow_set(priv->grid, EINA_FALSE); - } else { - elm_object_signal_emit(priv->ly, SIG_HIDE_NO_CONTENT, - SIG_SOURCE_SRC); + int i; - elm_object_focus_allow_set(priv->grid, EINA_TRUE); + for (i = 0; i < NUM_MENU_BTN; i++) { + elm_object_focus_next_object_set(priv->menu_btn[i], + priv->more_btn, ELM_FOCUS_DOWN); } + + elm_object_part_text_set(priv->nocontent, PART_NO_CONTENT_TEXT, + content_info[priv->content_type].no_content); + + elm_object_part_content_set(priv->content, PART_ACTION_NO_CONTENT_BG, + priv->nocontent); } static void _update_favorite_area(struct _priv *priv) @@ -769,8 +783,11 @@ static void _update_favorite_area(struct _priv *priv) Eina_List *l; app_media *am; int type; + int count; elm_gengrid_clear(priv->grid); + elm_object_part_content_unset(priv->content, PART_ACTION_NO_CONTENT_BG); + elm_object_part_content_unset(priv->content, PART_ACTION_FAVORITE_AREA); type = priv->content_type; @@ -780,6 +797,11 @@ static void _update_favorite_area(struct _priv *priv) priv->favorite_list = _get_favorite_list( content_info[type].app_contents_type); + if (!priv->favorite_list) { + _update_no_content_area(priv); + return; + } + elm_gengrid_item_size_set(priv->grid, elm_config_scale_get() * content_info[type].grid_x, elm_config_scale_get() * content_info[type].grid_y); @@ -788,17 +810,43 @@ static void _update_favorite_area(struct _priv *priv) EINA_LIST_FOREACH(priv->favorite_list, l, am) { it = elm_gengrid_item_append(priv->grid, ic, am, NULL, NULL); - elm_object_item_data_set(it, am); } elm_gengrid_item_class_free(ic); - _update_no_content_area(priv); + count = eina_list_count(priv->favorite_list) / content_info[type].grid_n; + if (eina_list_count(priv->favorite_list) % content_info[type].grid_n) + count++; + + evas_object_size_hint_min_set(priv->grid, 0, elm_config_scale_get() * + content_info[type].grid_y * count); + elm_scroller_step_size_set(priv->scr, 0, + content_info[type].grid_y + GRID_PADDING); + + elm_object_part_content_set(priv->content, + PART_ACTION_FAVORITE_AREA, priv->grid); } static bool _draw_items(struct _priv *priv) { + Evas_Object *base; + + base = elm_layout_add(priv->box); + if (!base) { + _ERR("failed to create base object"); + return false; + } + + elm_layout_file_set(base, EDJEFILE, GRP_ACTION_MENU_CONTENT); + evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + evas_object_show(base); + elm_box_pack_end(priv->box, base); + + priv->content = base; + if (!_draw_livetv_btn(priv)) { _ERR("failed to draw livetv button"); return false; @@ -814,6 +862,11 @@ static bool _draw_items(struct _priv *priv) return false; } + if (!_draw_more_btn(priv)) { + _ERR("failed to draw livetv button"); + return false; + } + return true; } @@ -844,7 +897,7 @@ static bool _update_items(struct _priv *priv, struct view_update_data *vdata) static Evas_Object *_create(Evas_Object *win, void *data) { struct _priv *priv; - Evas_Object *base; + Evas_Object *base, *scr, *box; if (!win) { _ERR("failed to get win object"); @@ -865,13 +918,35 @@ static Evas_Object *_create(Evas_Object *win, void *data) } elm_layout_file_set(base, EDJEFILE, GRP_ACTION_MENU_VIEW); - evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, base); + scr = util_add_scroller(base); + if (!scr) { + _ERR("failed to add scroller"); + evas_object_del(base); + free(priv); + return NULL; + } + + box = util_add_box(scr, EINA_FALSE); + if (!box) { + _ERR("failed to add box"); + evas_object_del(base); + free(priv); + return NULL; + } + + evas_object_show(box); + elm_object_content_set(scr, box); + + elm_object_part_content_set(base, PART_ACTION_MENU, scr); + priv->win = win; priv->base = base; + priv->scr = scr; + priv->box = box; viewmgr_set_view_data(VIEW_ACTION_MENU, priv); @@ -898,6 +973,8 @@ static void _show(void *view_data) priv = view_data; + elm_scroller_region_show(priv->scr, 0, 0, 0, 0); + evas_object_show(priv->base); viewmgr_update_view(VIEW_BASE, UPDATE_TOAST_HIDE, NULL); @@ -973,6 +1050,7 @@ static void _destroy(void *view_data) priv = view_data; inputmgr_remove_callback(priv->tv_btn, &_handler); + inputmgr_remove_callback(priv->more_btn, &_handler); inputmgr_remove_callback(priv->grid, &_handler); for (i = 0; i < NUM_MENU_BTN; i++) -- 2.7.4 From 98fc5bc531ca00fa125ec6f1e9e8a5b3f36bb94a Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Thu, 1 Oct 2015 16:50:19 +0900 Subject: [PATCH 13/16] gallery: add place view mode Change-Id: Iba098da8aba0bafd52a07c8f336df90dbe59cc4f Signed-off-by: Jehun Lim --- include/data/mediadata.h | 1 + include/define.h | 2 + include/grid/grid.h | 7 ++ res/edc/widgets/gengrid.edc | 179 ++++++++++++++++++++++++++++++++++++++++++++ src/data/mediadata.c | 101 +++++++++++++++++++++++++ src/grid/grid_gallery.c | 129 ++++++++++++++++++++++++++++++- src/layout/gallery.c | 4 +- 7 files changed, 417 insertions(+), 6 deletions(-) diff --git a/include/data/mediadata.h b/include/data/mediadata.h index 709bb67..ebd07d2 100644 --- a/include/data/mediadata.h +++ b/include/data/mediadata.h @@ -23,6 +23,7 @@ enum media_group_type { E_GROUP_MEDIA_DATE = 0, E_GROUP_MEDIA_NAME, E_GROUP_MEDIA_GENRE, + E_GROUP_MEDIA_PLACE, E_GROUP_MEDIA_TYPE, E_GROUP_MEDIA_MAX }; diff --git a/include/define.h b/include/define.h index 6aa800e..95da4b2 100644 --- a/include/define.h +++ b/include/define.h @@ -68,6 +68,8 @@ #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_CITY "elm.text.city" +#define PART_ELM_TEXT_COUNTRY "elm.text.country" #define PART_ELM_TEXT_PLAYTIME "elm.text.playtime" #define PART_ELM_TEXT_COUNT "elm.text.count" #define PART_ELM_SWALLOW_THUMBNAIL "elm.swallow.thumbnail" diff --git a/include/grid/grid.h b/include/grid/grid.h index 39b2450..5c7855f 100644 --- a/include/grid/grid.h +++ b/include/grid/grid.h @@ -96,6 +96,13 @@ struct grid_data *get_music_grid_data(int type); #define MOVIE_FOLDER_ITEM_NUM MOVIE_NAME_ITEM_NUM #define MOVIE_FOLDER_GRID_PADDING MOVIE_NAME_GRID_PADDING +#define STYLE_GALLERY_PLACE "place_item" +#define GALLERY_PLACE_ITEM_PADDING GALLERY_EVENT_ITEM_PADDING +#define GALLERY_PLACE_ITEM_X GALLERY_EVENT_ITEM_X +#define GALLERY_PLACE_ITEM_Y GALLERY_EVENT_ITEM_Y +#define GALLERY_PLACE_ITEM_NUM GALLERY_EVENT_ITEM_NUM +#define GALLERY_PLACE_GRID_PADDING GALLERY_EVENT_GRID_PADDING + #define STYLE_MUSIC_ALBUM "album_item" #define MUSIC_ALBUM_ITEM_PADDING 26 #define MUSIC_ALBUM_ITEM_X (212 + MUSIC_ALBUM_ITEM_PADDING) diff --git a/res/edc/widgets/gengrid.edc b/res/edc/widgets/gengrid.edc index 6bd69a5..be7d595 100644 --- a/res/edc/widgets/gengrid.edc +++ b/res/edc/widgets/gengrid.edc @@ -2277,6 +2277,185 @@ group { } group { + name: "elm/gengrid/item/place_item/default"; + inherit: "elm/gengrid/item/genre_item/default"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text.city elm.text.country elm.text.count"; + data.item: "contents" "elm.swallow.bg"; + data.item: "focus_highlight" "on"; + parts { + part { + name: "padding_title_left"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "bg"; + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + min: 14 66; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "padding_title_right"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 1.0 0.0; + } + rel2 { + to: "bg"; + relative: 1.0 0.0; + } + min: 14 66; + align: 1.0 0.0; + fixed: 1 1; + } + } + part { + name: PART_ELM_TEXT_CITY; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_title_left"; + relative: 1.0 1.0; + } + rel2 { + to: "padding_title_right"; + relative: 0.0 1.0; + } + text { + font: FONT_LIGHT; + size: 28; + align: 0.5 0.5; + } + min: 0 28; + align: 0.5 0.0; + color: COLOR_TEXT_FOCUS; + fixed: 0 1; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + } + } + part { + name: "padding_country"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_ELM_TEXT_CITY; + relative: 0.0 1.0; + } + rel2.to: PART_ELM_TEXT_CITY; + min: 0 12; + align: 0.5 0.0; + fixed: 0 1; + } + } + part { + name: PART_ELM_TEXT_COUNTRY; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_country"; + relative: 0.0 1.0; + } + rel2.to: "padding_country"; + text { + font: FONT_LIGHT; + size: 28; + align: 0.5 0.5; + } + min: 0 28; + align: 0.5 0.0; + color: 255 255 255 122; + fixed: 0 1; + map { + perspective_on: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + } + } + } + programs { + program { + name: "go_active"; + signal: "elm,state,focused"; + source: "elm"; + action: STATE_SET "selected_0" 0.0; + target: "part_focus1"; + target: "part_focus2"; + target: "part_focus3"; + target: "part_focus4"; + after: "focus,in,anim"; + } + program { + name: "focus,in,anim"; + action: STATE_SET "selected" 0.0; + target: "defaultbg"; + target: PART_ELM_SWALLOW_BG; + target: "part_focus1"; + target: "part_focus2"; + target: "part_focus3"; + target: "part_focus4"; + target: PART_ELM_TEXT_CITY; + target: PART_ELM_TEXT_COUNTRY; + target: PART_ELM_TEXT_COUNT; + transition: TRANSITION_FOCUS; + } + program { + name: "go_passive"; + signal: "elm,state,unfocused"; + source: "elm"; + action: STATE_SET "selected_0" 0.0; + target: "part_focus1"; + target: "part_focus2"; + target: "part_focus3"; + target: "part_focus4"; + transition: TRANSITION_FOCUS; + after: "focus,out,anim"; + } + program { + name: "focus,out,anim"; + action: STATE_SET "default" 0.0; + target: PART_ELM_SWALLOW_BG; + target: "defaultbg"; + target: "part_focus1"; + target: "part_focus2"; + target: "part_focus3"; + target: "part_focus4"; + target: PART_ELM_TEXT_CITY; + target: PART_ELM_TEXT_COUNTRY; + target: PART_ELM_TEXT_COUNT; + } + } +} + +group { name: "elm/gengrid/item/movie_item_favorite/default"; inherit: "elm/gengrid/item/movie_item/default"; parts { diff --git a/src/data/mediadata.c b/src/data/mediadata.c index 0be0959..6fdf0cb 100644 --- a/src/data/mediadata.c +++ b/src/data/mediadata.c @@ -24,6 +24,8 @@ #define STR_IMAGE_NAME "Photo" #define STR_VIDEO_NAME "Video" +#define STR_PLACE_UNKNOWN "Unknown" + 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); @@ -31,6 +33,7 @@ typedef char *(*group_name_get)(app_media_info *info); static int _compare_cb_date(const void *, const void *); static int _compare_cb_name(const void *, const void *); static int _compare_cb_genre(const void *, const void *); +static int _compare_cb_place(const void *, const void *); static int _compare_cb_type(const void *, const void *); static int _compare_title(struct group_info *, app_media_info *); @@ -42,6 +45,9 @@ static void *_get_data_time(app_media_info *info); static int _compare_genre(struct group_info *, app_media_info *); static char *_get_genre(app_media_info *); static void *_get_data_genre(app_media_info *); +static int _compare_place(struct group_info *, app_media_info *); +static char *_get_place(app_media_info *); +static void *_get_data_place(app_media_info *); static int _compare_type(struct group_info *, app_media_info *); static char *_get_type(app_media_info *); static void *_get_data_type(app_media_info *); @@ -81,6 +87,12 @@ static struct _list_info g_group_info[E_GROUP_MEDIA_MAX] = { .name_get = _get_genre, .data_get = _get_data_genre, }, + [E_GROUP_MEDIA_PLACE] = { + .sort_cmp_cb = _compare_cb_place, + .media_cmp = _compare_place, + .name_get = _get_place, + .data_get = _get_data_place, + }, [E_GROUP_MEDIA_TYPE] = { .sort_cmp_cb = _compare_cb_type, .media_cmp = _compare_type, @@ -237,6 +249,53 @@ static char *_get_genre(app_media_info *info) return strdup(genre); } +static void _get_place_string(app_media_info *info, char **city, char **country) +{ + char str[64]; + char *p, *tmp; + + if (!info->location_tag) + return; + + strcpy(str, info->location_tag); + + p = strtok_r(str, "/", &tmp); + if (!p) + p = STR_PLACE_UNKNOWN; + + *city = strdup(p); + + p = strtok_r(tmp, "", &tmp); + if (!p) + p = STR_PLACE_UNKNOWN; + + *country = strdup(p); +} + +static int _compare_place(struct group_info *gi, app_media_info *info) +{ + if (!gi || !gi->data || !info->location_tag) + return -1; + + return strcmp(gi->data, info->location_tag); +} + +static void *_get_data_place(app_media_info *info) +{ + if (!info->location_tag) + return NULL; + + return strdup(info->location_tag); +} + +static char *_get_place(app_media_info *info) +{ + if (!info->location_tag) + return NULL; + + return strdup(info->location_tag); +} + static int _compare_type(struct group_info *gi, app_media_info *info) { int *type; @@ -347,6 +406,48 @@ static int _compare_cb_genre(const void *data1, const void *data2) return strcmp(genre1, genre2); } +static int _compare_cb_place(const void *data1, const void *data2) +{ + app_media *am1, *am2; + app_media_info *info1, *info2; + char *city1, *city2; + char *country1, *country2; + int r; + + am1 = (app_media *)data1; + am2 = (app_media *)data2; + + info1 = app_media_get_info(am1); + info2 = app_media_get_info(am2); + + if (!info1 || !info2) + return -1; + + _get_place_string(info1, &city1, &country1); + _get_place_string(info2, &city2, &country2); + + if (!city1 || !city2 || !country1 || !country2) + return -1; + + r = strcmp(country1, country2); + if (!r) + r = strcmp(city1, city2); + else { + /* NOTE: to set "Unknown" as the last item */ + if (r < 0 && !strcmp(country1, STR_PLACE_UNKNOWN)) + r = 1; + else if (r > 0 && !strcmp(country2, STR_PLACE_UNKNOWN)) + r = -1; + } + + free(city1); + free(city2); + free(country1); + free(country2); + + return r; +} + static int _compare_cb_type(const void *data1, const void *data2) { app_media *am1, *am2; diff --git a/src/grid/grid_gallery.c b/src/grid/grid_gallery.c index 6f20856..9d9aafc 100644 --- a/src/grid/grid_gallery.c +++ b/src/grid/grid_gallery.c @@ -29,7 +29,9 @@ #include "grid/grid.h" #include "util/util.h" -static char *_grid_text_get(void *data, Evas_Object *obj, const char *part) +#define STR_PLACE_NAME "City" + +static char *_media_text_get(void *data, Evas_Object *obj, const char *part) { app_media *am; app_media_info *info; @@ -59,7 +61,7 @@ static char *_grid_text_get(void *data, Evas_Object *obj, const char *part) return NULL; } -static Evas_Object *_grid_content_get(void *data, +static Evas_Object *_media_content_get(void *data, Evas_Object *obj, const char *part) { Evas_Object *eo; @@ -110,6 +112,70 @@ static Evas_Object *_grid_content_get(void *data, return eo; } +static char *_place_text_get(void *data, Evas_Object *obj, const char *part) +{ + struct group_info *gi; + int cnt; + char buf[64]; + char *city, *country, *tmp; + + if (!data) + return NULL; + + gi = data; + + if (!strcmp(part, PART_ELM_TEXT_COUNT)) { + cnt = eina_list_count(gi->list); + snprintf(buf, sizeof(buf), "%d", cnt); + return strdup(buf); + } else { + strcpy(buf, gi->name); + + city = strtok_r(buf, "/", &tmp); + country = strtok_r(tmp, "", &tmp); + + if (!strcmp(part, PART_ELM_TEXT_CITY)) + return strdup(city); + else if (!strcmp(part, PART_ELM_TEXT_COUNTRY)) { + if (!country) + return NULL; + + return strdup(country); + } + } + + return NULL; +} + +static Evas_Object *_place_content_get(void *data, Evas_Object *obj, + const char *part) +{ + Evas_Object *eo; + struct group_info *gi; + struct color_data bg; + + if (!data) + return NULL; + + gi = data; + + eo = NULL; + if (!strcmp(part, PART_ELM_SWALLOW_BG)) { + eo = evas_object_rectangle_add(obj); + if (!eo) { + _ERR("failed to create rectangle object"); + return NULL; + } + + app_contents_get_color(gi->name, &bg, NULL); + evas_object_color_set(eo, bg.r, bg.g, bg.b, bg.a); + + evas_object_show(eo); + } + + return eo; +} + static Eina_List *_get_event_list(struct datamgr *dmgr) { if (!dmgr) { @@ -120,6 +186,32 @@ static Eina_List *_get_event_list(struct datamgr *dmgr) return dmgr->ops->get_group(dmgr->handle, E_GROUP_MEDIA_DATE, NULL); } +static Eina_List *_get_place_list(struct datamgr *dmgr) +{ + Eina_List *list; + struct group_info *gi; + + if (!dmgr) { + _ERR("invalid argument"); + return NULL; + } + + gi = calloc(1, sizeof(*gi)); + if (!gi) { + _ERR("failed to allocate memory"); + return NULL; + } + + gi->name = STR_PLACE_NAME; + gi->list = dmgr->ops->get_group(dmgr->handle, + E_GROUP_MEDIA_PLACE, NULL); + + list = NULL; + list = eina_list_append(list, gi); + + return list; +} + static Eina_List *_get_type_list(struct datamgr *dmgr) { if (!dmgr) { @@ -140,6 +232,21 @@ static void _free_media_list(struct datamgr *dmgr, Eina_List *list) dmgr->ops->free_group(list); } +static void _free_place_list(struct datamgr *dmgr, Eina_List *list) +{ + struct group_info *gi; + + if (!dmgr) { + _ERR("invalid argument"); + return; + } + + EINA_LIST_FREE(list, gi) { + dmgr->ops->free_group(gi->list); + free(gi); + } +} + static void _key_down_cb(void *data, Elm_Object_Item *it, Evas_Event_Key_Down *ev) { @@ -200,8 +307,13 @@ static void _selected_cb(void *data, Elm_Object_Item *it) static struct grid_class _gclass[] = { [E_GALLERY_EVENT] = { .item_style = STYLE_GALLERY_EVENT, - .text_get = _grid_text_get, - .content_get = _grid_content_get + .text_get = _media_text_get, + .content_get = _media_content_get + }, + [E_GALLERY_PLACE] = { + .item_style = STYLE_GALLERY_PLACE, + .text_get = _place_text_get, + .content_get = _place_content_get }, /* Other view mode class will be added later */ }; @@ -218,6 +330,15 @@ static struct grid_data _gdata[] = { .key_down_cb = _key_down_cb, .selected_cb = _selected_cb }, + [E_GALLERY_PLACE] = { + .item_x = GALLERY_PLACE_ITEM_X, + .item_y = GALLERY_PLACE_ITEM_Y, + .item_num = GALLERY_PLACE_ITEM_NUM, + .grid_padding = GALLERY_PLACE_GRID_PADDING, + .gclass = &_gclass[E_GALLERY_PLACE], + .get_item_list = _get_place_list, + .free_item_list = _free_place_list + }, [E_GALLERY_VIDEO] = { .item_x = GALLERY_EVENT_ITEM_X, .item_y = GALLERY_EVENT_ITEM_Y, diff --git a/src/layout/gallery.c b/src/layout/gallery.c index f8a5157..028403c 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -435,8 +435,8 @@ static void _update(void *layout_data, int update_type, void *data) vdata = data; mode = vdata->index; - /* Place and folder view mode will be implemented later. */ - if (mode == E_GALLERY_PLACE || mode == E_GALLERY_FOLDER) + /* Folder view mode will be implemented later. */ + if (mode == E_GALLERY_FOLDER) return; if (mode == priv->view_mode) -- 2.7.4 From 28a75dfb23d22cca03f5b0e5a361082765ead5f0 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Fri, 2 Oct 2015 10:11:00 +0900 Subject: [PATCH 14/16] mediadata: set "Unknown" if location_tag is null Change-Id: I4f8b9c244387a0399c03ace24e52a30d25b89c3a Signed-off-by: Minkyu Kang --- src/data/mediadata.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/data/mediadata.c b/src/data/mediadata.c index 6fdf0cb..772fef5 100644 --- a/src/data/mediadata.c +++ b/src/data/mediadata.c @@ -254,8 +254,11 @@ static void _get_place_string(app_media_info *info, char **city, char **country) char str[64]; char *p, *tmp; - if (!info->location_tag) + if (!info->location_tag) { + *city = strdup(STR_PLACE_UNKNOWN); + *country = strdup(STR_PLACE_UNKNOWN); return; + } strcpy(str, info->location_tag); @@ -274,16 +277,19 @@ static void _get_place_string(app_media_info *info, char **city, char **country) static int _compare_place(struct group_info *gi, app_media_info *info) { - if (!gi || !gi->data || !info->location_tag) + if (!gi || !gi->data) return -1; + if (!info->location_tag) + return strcmp(gi->data, STR_PLACE_UNKNOWN); + return strcmp(gi->data, info->location_tag); } static void *_get_data_place(app_media_info *info) { if (!info->location_tag) - return NULL; + return strdup(STR_PLACE_UNKNOWN); return strdup(info->location_tag); } @@ -291,7 +297,7 @@ static void *_get_data_place(app_media_info *info) static char *_get_place(app_media_info *info) { if (!info->location_tag) - return NULL; + return strdup(STR_PLACE_UNKNOWN); return strdup(info->location_tag); } -- 2.7.4 From bdd565b2695b50c3fb772af9841f3a0d7f216811 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Thu, 1 Oct 2015 21:19:38 +0900 Subject: [PATCH 15/16] detail: add gallery place detail view Change-Id: I4bee62f3589073cde75418105c982316ad75bf2c Signed-off-by: Jehun Lim --- include/view.h | 1 + src/grid/grid_gallery.c | 33 +++++++++++++++++++++++++---- src/layout/gallery.c | 3 +++ src/view/detail.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 87 insertions(+), 5 deletions(-) diff --git a/include/view.h b/include/view.h index ef90d13..8f8c3b9 100644 --- a/include/view.h +++ b/include/view.h @@ -60,6 +60,7 @@ enum update_type { enum detail_view_type { E_DETAIL_MOVIE_GENRE = 0, + E_DETAIL_GALLERY_PLACE, E_DETAIL_MUSIC_ALBUM, E_DETAIL_MUSIC_ARTIST, E_DETAIL_MUSIC_GENRE, diff --git a/src/grid/grid_gallery.c b/src/grid/grid_gallery.c index 9d9aafc..e8e3295 100644 --- a/src/grid/grid_gallery.c +++ b/src/grid/grid_gallery.c @@ -278,7 +278,7 @@ static void _key_down_cb(void *data, Elm_Object_Item *it, } } -static void _selected_cb(void *data, Elm_Object_Item *it) +static void _media_selected_cb(void *data, Elm_Object_Item *it) { struct view_update_data vdata; struct datamgr *dmgr; @@ -304,6 +304,30 @@ static void _selected_cb(void *data, Elm_Object_Item *it) viewmgr_push_view(VIEW_VIEWER); } +static void _place_selected_cb(void *data, Elm_Object_Item *it) +{ + struct view_update_data vdata; + struct group_info *gi; + + if (!it) { + _ERR("invalid argument"); + return; + } + + gi = elm_object_item_data_get(it); + if (!gi) { + _ERR("failed to get group info"); + return; + } + + vdata.list = gi->list; + vdata.index = E_DETAIL_GALLERY_PLACE; + vdata.id = gi->name; + + viewmgr_update_view(VIEW_DETAIL, UPDATE_CONTENT, &vdata); + viewmgr_push_view(VIEW_DETAIL); +} + static struct grid_class _gclass[] = { [E_GALLERY_EVENT] = { .item_style = STYLE_GALLERY_EVENT, @@ -328,7 +352,7 @@ static struct grid_data _gdata[] = { .get_item_list = _get_event_list, .free_item_list = _free_media_list, .key_down_cb = _key_down_cb, - .selected_cb = _selected_cb + .selected_cb = _media_selected_cb }, [E_GALLERY_PLACE] = { .item_x = GALLERY_PLACE_ITEM_X, @@ -337,7 +361,8 @@ static struct grid_data _gdata[] = { .grid_padding = GALLERY_PLACE_GRID_PADDING, .gclass = &_gclass[E_GALLERY_PLACE], .get_item_list = _get_place_list, - .free_item_list = _free_place_list + .free_item_list = _free_place_list, + .selected_cb = _place_selected_cb }, [E_GALLERY_VIDEO] = { .item_x = GALLERY_EVENT_ITEM_X, @@ -348,7 +373,7 @@ static struct grid_data _gdata[] = { .get_item_list = _get_type_list, .free_item_list = _free_media_list, .key_down_cb = _key_down_cb, - .selected_cb = _selected_cb + .selected_cb = _media_selected_cb }, /* Other view mode data will be added later */ }; diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 028403c..0fd1cfa 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -414,6 +414,9 @@ static void _update(void *layout_data, int update_type, void *data) listmgr_focus_content_list(priv->listmgr, vdata->id); break; + case UPDATE_BACK: + listmgr_focus_content_list(priv->listmgr, NULL); + break; case UPDATE_RECENT: if (!data) { _ERR("invalid argument"); diff --git a/src/view/detail.c b/src/view/detail.c index 7d28b1c..d1d95f2 100644 --- a/src/view/detail.c +++ b/src/view/detail.c @@ -37,6 +37,7 @@ static Evas_Object *_album_content_get(void *data, Evas_Object *obj, const char *part); static void _get_movie_count(char *str, int size, Eina_List *list); +static void _get_gallery_count(char *str, int size, Eina_List *list); static void _get_song_count(char *str, int size, Eina_List *list); static void _get_album_count(char *str, int size, Eina_List *list); @@ -70,6 +71,15 @@ static struct _view_info view_info[E_DETAIL_MAX] = { .get_content_info = _get_movie_count, .detail_update = EINA_FALSE, }, + [E_DETAIL_GALLERY_PLACE] = { + .grid_style = STYLE_GALLERY_EVENT, + .grid_item_x = GALLERY_EVENT_ITEM_X, + .grid_item_y = GALLERY_EVENT_ITEM_Y, + .get_grid_text = _grid_text_get, + .get_grid_content = _grid_content_get, + .get_content_info = _get_gallery_count, + .detail_update = EINA_FALSE, + }, [E_DETAIL_MUSIC_ALBUM] = { .grid_style = STYLE_MUSIC_SONG_DETAIL, .grid_item_x = MUSIC_SONG_ITEM_X, @@ -203,6 +213,7 @@ static void _media_selected(void *data) switch (priv->view_type) { case E_DETAIL_MOVIE_GENRE: + case E_DETAIL_GALLERY_PLACE: viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); viewmgr_push_view(VIEW_VIEWER); break; @@ -457,6 +468,26 @@ static void _get_movie_count(char *str, int size, Eina_List *list) snprintf(str, size, "%d movies", eina_list_count(list)); } +static void _get_gallery_count(char *str, int size, Eina_List *list) +{ + Eina_List *l; + app_media *am; + app_media_info *mi; + int count[E_FILE_MAX] = {0}; + + EINA_LIST_FOREACH(list, l, am) { + mi = app_media_get_info(am); + if (!mi) + continue; + + count[mi->media_type]++; + } + + snprintf(str, size, "%d contents | %d photos, %d videos", + eina_list_count(list), + count[E_FILE_PHOTO], count[E_FILE_VIDEO]); +} + static void _get_song_count(char *str, int size, Eina_List *list) { snprintf(str, size, "%d songs", eina_list_count(list)); @@ -467,11 +498,33 @@ static void _get_album_count(char *str, int size, Eina_List *list) snprintf(str, size, "%d albums", eina_list_count(list)); } +static void _get_place_title(const char *title, char *str, int size) +{ + char buf[64], s[64]; + char *city, *country, *tmp; + + strcpy(buf, title); + + city = strtok_r(buf, "/", &tmp); + country = strtok_r(tmp, "", &tmp); + + snprintf(str, size, "%s", city); + + if (country) { + snprintf(s, sizeof(s), ", %s", country); + strcat(str, s); + } +} + static void _update_title_area(struct _priv *priv, const char *title) { char buf[64]; - elm_object_part_text_set(priv->base, PART_DETAIL_TITLE, title); + if (priv->view_type == E_DETAIL_GALLERY_PLACE) { + _get_place_title(title, buf, sizeof(buf)); + elm_object_part_text_set(priv->base, PART_DETAIL_TITLE, buf); + } else + elm_object_part_text_set(priv->base, PART_DETAIL_TITLE, title); priv->vinfo->get_content_info(buf, sizeof(buf), priv->media_list); elm_object_part_text_set(priv->base, PART_DETAIL_CONTENT_INFO, buf); -- 2.7.4 From a759a446c4093a7dc0eeaed907caae7f6fd7d781 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Fri, 2 Oct 2015 14:08:45 +0900 Subject: [PATCH 16/16] viewer/mplayer: add previous view id Change-Id: I0064d747e2bda2e35c36445483c6e384684f54ae Signed-off-by: Jehun Lim --- src/grid/grid_gallery.c | 1 + src/grid/grid_movie.c | 1 + src/grid/grid_music.c | 1 + src/layout/gallery.c | 1 + src/layout/movie.c | 2 ++ src/layout/music.c | 2 ++ src/view/action_menu.c | 1 + src/view/base.c | 1 + src/view/detail.c | 1 + src/view/mplayer.c | 15 +++++++++++---- src/view/viewer.c | 14 ++++++++++---- 11 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/grid/grid_gallery.c b/src/grid/grid_gallery.c index e8e3295..2ea4cd5 100644 --- a/src/grid/grid_gallery.c +++ b/src/grid/grid_gallery.c @@ -299,6 +299,7 @@ static void _media_selected_cb(void *data, Elm_Object_Item *it) vdata.list = dmgr->ops->get_list(dmgr->handle, E_LIST_MEDIA, NULL); vdata.index = util_get_media_index(vdata.list, am); + vdata.id = VIEW_BASE; viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); viewmgr_push_view(VIEW_VIEWER); diff --git a/src/grid/grid_movie.c b/src/grid/grid_movie.c index 70c54b5..04f7e0a 100644 --- a/src/grid/grid_movie.c +++ b/src/grid/grid_movie.c @@ -276,6 +276,7 @@ static void _media_selected_cb(void *data, Elm_Object_Item *it) vdata.list = dmgr->ops->get_list(dmgr->handle, E_LIST_MEDIA, NULL); vdata.index = util_get_media_index(vdata.list, am); + vdata.id = VIEW_BASE; viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); viewmgr_push_view(VIEW_VIEWER); diff --git a/src/grid/grid_music.c b/src/grid/grid_music.c index 2bf8a38..928478d 100644 --- a/src/grid/grid_music.c +++ b/src/grid/grid_music.c @@ -343,6 +343,7 @@ static void _media_selected_cb(void *data, Elm_Object_Item *it) vdata.list = dmgr->ops->get_list(dmgr->handle, E_LIST_MEDIA, NULL); vdata.index = util_get_media_index(vdata.list, am); + vdata.id = VIEW_BASE; viewmgr_update_view(VIEW_MPLAYER, UPDATE_CONTENT, &vdata); viewmgr_push_view(VIEW_MPLAYER); diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 0fd1cfa..779de14 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -82,6 +82,7 @@ static void _recent_item_selected(struct _priv *priv, app_media *am) vdata.list = dmgr->ops->get_list(dmgr->handle, E_LIST_MEDIA, NULL); vdata.index = util_get_media_index_from_id(vdata.list, info->media_id); + vdata.id = VIEW_BASE; viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); viewmgr_push_view(VIEW_VIEWER); diff --git a/src/layout/movie.c b/src/layout/movie.c index 37023bd..509fa12 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -253,6 +253,7 @@ static void _recent_item_selected(struct _priv *priv, app_media *am) vdata.list = dmgr->ops->get_list(dmgr->handle, E_LIST_MEDIA, NULL); vdata.index = util_get_media_index_from_id(vdata.list, info->media_id); + vdata.id = VIEW_BASE; viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); viewmgr_push_view(VIEW_VIEWER); @@ -275,6 +276,7 @@ static void _recent_selected_cb(void *data, Evas_Object *obj) 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_VIEWER, UPDATE_CONTENT, &vdata); viewmgr_push_view(VIEW_VIEWER); diff --git a/src/layout/music.c b/src/layout/music.c index cf1ac9a..cb9ec00 100644 --- a/src/layout/music.c +++ b/src/layout/music.c @@ -197,6 +197,7 @@ static void _recent_item_selected(struct _priv *priv, app_media *am) vdata.list = dmgr->ops->get_list(dmgr->handle, E_LIST_MEDIA, NULL); vdata.index = util_get_media_index_from_id(vdata.list, info->media_id); + vdata.id = VIEW_BASE; viewmgr_update_view(VIEW_MPLAYER, UPDATE_CONTENT, &vdata); viewmgr_push_view(VIEW_MPLAYER); @@ -219,6 +220,7 @@ static void _playing_selected_cb(void *data, Evas_Object *obj) 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/action_menu.c b/src/view/action_menu.c index 0eb90b6..5a86e49 100644 --- a/src/view/action_menu.c +++ b/src/view/action_menu.c @@ -350,6 +350,7 @@ static void _grid_selected(void *data) vdata.list = priv->favorite_list; vdata.index = util_get_media_index(vdata.list, am); + vdata.id = VIEW_BASE; _hide_view(priv, false); diff --git a/src/view/base.c b/src/view/base.c index 3f8150e..03f2961 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -457,6 +457,7 @@ static void _update_favorite_view(struct _priv *priv, const char *id) vdata.list = _get_favorite_list(type); vdata.index = _get_media_index(vdata.list, info->media_id); + vdata.id = NULL; if (type == CONTENTS_MOVIE || type == CONTENTS_GALLERY) { viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); diff --git a/src/view/detail.c b/src/view/detail.c index d1d95f2..f7ec7de 100644 --- a/src/view/detail.c +++ b/src/view/detail.c @@ -210,6 +210,7 @@ static void _media_selected(void *data) vdata.list = priv->media_list; vdata.index = util_get_media_index(vdata.list, am); + vdata.id = VIEW_DETAIL; switch (priv->view_type) { case E_DETAIL_MOVIE_GENRE: diff --git a/src/view/mplayer.c b/src/view/mplayer.c index f207e9c..9144827 100644 --- a/src/view/mplayer.c +++ b/src/view/mplayer.c @@ -74,6 +74,8 @@ struct _priv { struct playermgr *player; struct progressbar *progress; struct controller *ctl; + + const char *prev_view; }; struct _btn_info { @@ -570,7 +572,13 @@ static void _pop_view(struct _priv *priv) { struct view_update_data vdata; - if (viewmgr_active_view_count() > 1) { + if (!priv->prev_view) { + viewmgr_pop_view(); + ui_app_exit(); + 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); @@ -578,9 +586,6 @@ static void _pop_view(struct _priv *priv) } viewmgr_pop_view(); - - if (viewmgr_active_view_count() == 0) - ui_app_exit(); } static void _key_down(int id, void *data, Evas *e, Evas_Object *obj, @@ -1085,6 +1090,8 @@ static void _update(void *view_data, int update_type, void *data) vdata->list, vdata->index); } + priv->prev_view = vdata->id; + _add_playlist_item(priv); break; case UPDATE_PLAYER: diff --git a/src/view/viewer.c b/src/view/viewer.c index ff7bc71..51420de 100644 --- a/src/view/viewer.c +++ b/src/view/viewer.c @@ -87,6 +87,8 @@ struct _priv { struct _slideshow slideshow; bool bar_show; + + const char *prev_view; }; struct _btn_info { @@ -752,16 +754,19 @@ static void _pop_view(struct _priv *priv) priv->viewer.cur == VIEWER_VIDEO) _player_stop(priv); - if (viewmgr_active_view_count() > 1) { + if (!priv->prev_view) { + viewmgr_pop_view(); + ui_app_exit(); + return; + } + + if (!strcmp(priv->prev_view, VIEW_BASE)) { vdata.index = priv->playlist.cur; vdata.id = _get_current_media_id(priv); viewmgr_update_view(VIEW_BASE, UPDATE_FOCUS, &vdata); } viewmgr_pop_view(); - - if (viewmgr_active_view_count() == 0) - ui_app_exit(); } static int _player_get_position(void *data) @@ -1280,6 +1285,7 @@ static void _update(void *view_data, int update_type, void *data) priv->playlist.list = vdata->list; priv->playlist.cur = vdata->index; + priv->prev_view = vdata->id; priv->viewer.foc = BTN_LOC_NONE; priv->slideshow.enable = false; break; -- 2.7.4