summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJehun Lim <jehun.lim@samsung.com>2015-10-06 14:43:20 +0900
committerJehun Lim <jehun.lim@samsung.com>2015-10-07 10:47:19 +0900
commit0911ba4df13b62ed6fa71febd49a92c186e20532 (patch)
treeab1ee736c4f60414505a4a65c49d9ce11247e8d2
parent75e7dcdd0df41485c7081d3b05ef0a620b0c5264 (diff)
downloadair_mediahub-0911ba4df13b62ed6fa71febd49a92c186e20532.tar.gz
air_mediahub-0911ba4df13b62ed6fa71febd49a92c186e20532.tar.bz2
air_mediahub-0911ba4df13b62ed6fa71febd49a92c186e20532.zip
detail: add play info item
Change-Id: Ibeecae8d573991c8bf865100d05ce6ee227a0e93 Signed-off-by: Jehun Lim <jehun.lim@samsung.com>
-rw-r--r--include/define.h1
-rw-r--r--include/view/detail.h12
-rw-r--r--res/edc/images/ic_mini_player_pause.pngbin0 -> 1877 bytes
-rw-r--r--res/edc/view/detail.edc4
-rw-r--r--res/edc/widgets/button.edc195
-rw-r--r--src/layout/music.c1
-rw-r--r--src/view/detail.c289
7 files changed, 491 insertions, 11 deletions
diff --git a/include/define.h b/include/define.h
index 95da4b2..453835e 100644
--- a/include/define.h
+++ b/include/define.h
@@ -86,6 +86,7 @@
#define SIG_ITEM_UNSELECTED "item,unselected"
#define SIG_ITEM_TOGGLED "item,toggled"
#define SIG_ELM_HIDE "elm,state,hide"
+#define SIG_ELM_ENABLED "elm,state,enabled"
#define SIG_ELM_DISABLED "elm,state,disabled"
#define SIG_ELM_FOCUS "elm,action,focus"
#define SIG_ELM_UNFOCUS "elm,action,unfocus"
diff --git a/include/view/detail.h b/include/view/detail.h
index 2f36bed..89d0853 100644
--- a/include/view/detail.h
+++ b/include/view/detail.h
@@ -28,10 +28,20 @@
#define PART_DETAIL_THUMBNAIL "part.detail_thumbnail"
#define PART_DETAIL_CONTENT_INFO "part.detail_content_info"
#define PART_DETAIL_THUMBNAIL_AREA "part.detail_thumbnail_area"
-#define PART_DETAIL_PLAYING_INFO "part.detail_playing_info"
+#define PART_DETAIL_PLAY_INFO "part.detail_play_info"
/* signal */
#define SIG_SHOW_THUMBNAIL "show,thumbnail"
#define SIG_HIDE_THUMBNAIL "hide,thumbnail"
+#define SIG_SET_STATUS_PLAY "set,play"
+#define SIG_SET_STATUS_PAUSE "set,pause"
+#define SIG_SET_STATUS_STOP "set,stop"
+
+/* images */
+#define IMAGE_MINI_PLAYER_PLAY "ic_mini_player_play_nor.png"
+#define IMAGE_MINI_PLAYER_PAUSE "ic_mini_player_pause.png"
+
+/* style */
+#define STYLE_BTN_PLAY_INFO "detail_btn_play_info"
#endif /* __AIR_MEDIAHUB_VIEW_DETAIL_H__ */
diff --git a/res/edc/images/ic_mini_player_pause.png b/res/edc/images/ic_mini_player_pause.png
new file mode 100644
index 0000000..327c5ac
--- /dev/null
+++ b/res/edc/images/ic_mini_player_pause.png
Binary files differ
diff --git a/res/edc/view/detail.edc b/res/edc/view/detail.edc
index 9be3cd2..fd2b15a 100644
--- a/res/edc/view/detail.edc
+++ b/res/edc/view/detail.edc
@@ -184,13 +184,13 @@ group {
relative: 1.0 1.0;
}
rel2 {
- to: PART_DETAIL_PLAYING_INFO;
+ to: PART_DETAIL_PLAY_INFO;
relative: 1.0 0.0;
}
}
}
part {
- name: PART_DETAIL_PLAYING_INFO;
+ name: PART_DETAIL_PLAY_INFO;
type: SWALLOW;
scale: 1;
description {
diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc
index a68f5cd..e32c9c8 100644
--- a/res/edc/widgets/button.edc
+++ b/res/edc/widgets/button.edc
@@ -4489,6 +4489,201 @@ group {
}
group {
+ name: "elm/button/base/detail_btn_play_info";
+ data.item: "focus_highlight" "on";
+ images {
+ image: IMAGE_MINI_PLAYER_PLAY COMP;
+ image: IMAGE_MINI_PLAYER_PAUSE COMP;
+ }
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ color: COLOR_ITEM_BG;
+ }
+ description {
+ state: "focused" 0.0;
+ inherit: "default" 0.0;
+ color: COLOR_ITEM_FOCUS;
+ }
+ }
+ part {
+ name: "padding_status";
+ type: SPACER;
+ mouse_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel2.relative: 0.0 0.0;
+ min: 36 26;
+ align: 0.0 0.0;
+ fixed: 1 1;
+ }
+ }
+ part {
+ name: PART_PLAY_INFO_STATUS;
+ type: IMAGE;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 {
+ to: "padding_status";
+ relative: 1.0 1.0;
+ }
+ rel2.to: "padding_status";
+ image.normal: IMAGE_MINI_PLAYER_PLAY;
+ min: 0 54;
+ align: 0.0 0.0;
+ fixed: 1 1;
+ }
+ description {
+ state: "play" 0.0;
+ inherit: "default" 0.0;
+ min: 54 54;
+ }
+ description {
+ state: "pause" 0.0;
+ inherit: "play" 0.0;
+ image.normal: IMAGE_MINI_PLAYER_PAUSE;
+ }
+ }
+ part {
+ name: "padding_text";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 {
+ to: PART_PLAY_INFO_STATUS;
+ relative: 1.0 0.0;
+ }
+ rel2.to: PART_PLAY_INFO_STATUS;
+ min: 0 0;
+ align: 0.0 0.5;
+ fixed: 1 0;
+ }
+ description {
+ state: "play" 0.0;
+ inherit: "default" 0.0;
+ min: 10 0;
+ }
+ description {
+ state: "pause" 0.0;
+ inherit: "play" 0.0;
+ }
+ }
+ part {
+ name: "elm.text";
+ type: TEXT;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 {
+ to: "padding_text";
+ relative: 1.0 0.0;
+ }
+ rel2.to: "padding_text";
+ text {
+ font: FONT_LIGHT;
+ size: 32;
+ align: 0.0 0.5;
+ }
+ min: 1694 0;
+ align: 0.0 0.5;
+ color: COLOR_TEXT_TITLE;
+ fixed: 1 0;
+ }
+ description {
+ state: "focused" 0.0;
+ inherit: "default" 0.0;
+ color: COLOR_TEXT_FOCUS;
+ }
+ description {
+ state: "disabled" 0.0;
+ inherit: "default" 0.0;
+ color: COLOR_TEXT_DISABLED;
+ }
+ }
+ part {
+ name: "event";
+ type: RECT;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 0;
+ }
+ }
+ }
+ programs {
+ program {
+ name: "button_clicked";
+ signal: "mouse,clicked,1";
+ source: "event";
+ action: SIGNAL_EMIT "elm.action,click" "";
+ }
+ program {
+ name: "focused";
+ signal: "elm,action,focus";
+ source: "elm";
+ action: STATE_SET "focused" 0.0;
+ target: "bg";
+ target: "elm.text";
+ transition: TRANSITION_FOCUS;
+ }
+ program {
+ name: "unfocused";
+ signal: "elm,action,unfocus";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ target: "elm.text";
+ transition: TRANSITION_FOCUS;
+ }
+ program {
+ name: SIG_ELM_ENABLED;
+ signal: SIG_ELM_ENABLED;
+ source: SIG_SOURCE_ELM;
+ action: STATE_SET "default" 0.0;
+ target: "elm.text";
+ }
+ program {
+ name: SIG_ELM_DISABLED;
+ signal: SIG_ELM_DISABLED;
+ source: SIG_SOURCE_ELM;
+ action: STATE_SET "disabled" 0.0;
+ target: "elm.text";
+ }
+ program {
+ name: SIG_SET_STATUS_PLAY;
+ signal: SIG_SET_STATUS_PLAY;
+ source: SIG_SOURCE_SRC;
+ action: STATE_SET "play" 0.0;
+ target: PART_PLAY_INFO_STATUS;
+ target: "padding_text";
+ }
+ program {
+ name: SIG_SET_STATUS_PAUSE;
+ signal: SIG_SET_STATUS_PAUSE;
+ source: SIG_SOURCE_SRC;
+ action: STATE_SET "pause" 0.0;
+ target: PART_PLAY_INFO_STATUS;
+ target: "padding_text";
+ }
+ program {
+ name: SIG_SET_STATUS_STOP;
+ signal: SIG_SET_STATUS_STOP;
+ source: SIG_SOURCE_SRC;
+ action: STATE_SET "default" 0.0;
+ target: PART_PLAY_INFO_STATUS;
+ target: "padding_text";
+ }
+ }
+}
+
+group {
name: "elm/button/base/zoom_btn_up";
data.item, "focus_highlight" "on";
images {
diff --git a/src/layout/music.c b/src/layout/music.c
index 02695ef..d4ae86a 100644
--- a/src/layout/music.c
+++ b/src/layout/music.c
@@ -598,7 +598,6 @@ static void _update(void *layout_data, int update_type, void *data)
switch (update_type) {
case UPDATE_CONTENT:
_update_content_list(priv);
- _update_playing_item(priv, NULL);
break;
case UPDATE_CONTENT_ITEM:
listmgr_update_content_item(priv->listmgr);
diff --git a/src/view/detail.c b/src/view/detail.c
index f14d85b..d55d2ca 100644
--- a/src/view/detail.c
+++ b/src/view/detail.c
@@ -28,6 +28,9 @@
#include "grid/grid.h"
#include "util/util.h"
+#define STR_NO_PLAY_MOVIE "No recently watched movie"
+#define STR_NO_PLAY_MUSIC "No music in playlist"
+
struct _priv;
static char *_grid_text_get(void *data, Evas_Object *obj, const char *part);
@@ -45,6 +48,11 @@ static void _get_album_info(struct _priv *priv, const char *title);
static void _album_selected(void *data);
+enum _object_type {
+ DETAIL_GRID = 0,
+ DETAIL_PLAY_INFO
+};
+
struct _list_info {
Eina_List *list;
const char *title;
@@ -61,6 +69,8 @@ struct _view_info {
void (*selected)(void *data);
bool detail_update;
+
+ int app_contents_type;
};
static struct _view_info view_info[E_DETAIL_MAX] = {
@@ -72,6 +82,7 @@ static struct _view_info view_info[E_DETAIL_MAX] = {
.get_grid_content = _grid_content_get,
.get_content_info = _get_movie_info,
.detail_update = EINA_FALSE,
+ .app_contents_type = CONTENTS_MOVIE,
},
[E_DETAIL_GALLERY_PLACE] = {
.grid_style = STYLE_GALLERY_EVENT,
@@ -81,6 +92,7 @@ static struct _view_info view_info[E_DETAIL_MAX] = {
.get_grid_content = _grid_content_get,
.get_content_info = _get_gallery_info,
.detail_update = EINA_FALSE,
+ .app_contents_type = CONTENTS_GALLERY,
},
[E_DETAIL_MUSIC_ALBUM] = {
.grid_style = STYLE_MUSIC_SONG_DETAIL,
@@ -90,6 +102,7 @@ static struct _view_info view_info[E_DETAIL_MAX] = {
.get_grid_content = _grid_content_get,
.get_content_info = _get_song_info,
.detail_update = EINA_FALSE,
+ .app_contents_type = CONTENTS_MUSIC,
},
[E_DETAIL_MUSIC_ARTIST] = {
.grid_style = STYLE_MUSIC_ALBUM,
@@ -100,6 +113,7 @@ static struct _view_info view_info[E_DETAIL_MAX] = {
.get_content_info = _get_album_info,
.selected = _album_selected,
.detail_update = EINA_TRUE,
+ .app_contents_type = CONTENTS_MUSIC,
},
[E_DETAIL_MUSIC_GENRE] = {
.grid_style = STYLE_MUSIC_SONG_DETAIL,
@@ -109,6 +123,7 @@ static struct _view_info view_info[E_DETAIL_MAX] = {
.get_grid_content = _grid_content_get,
.get_content_info = _get_song_info,
.detail_update = EINA_FALSE,
+ .app_contents_type = CONTENTS_MUSIC,
},
};
@@ -116,21 +131,33 @@ struct _priv {
Evas_Object *win;
Evas_Object *base;
Evas_Object *grid;
+ Evas_Object *btn;
Evas_Object *thumbnail;
Elm_Object_Item *focused_it;
Eina_List *media_list;
Eina_List *view_list;
+ Eina_List *play_list;
struct datamgr *dmgr;
+ app_media *play_info;
+
int view_type;
int depth;
+ int status;
+
struct _view_info *vinfo;
};
+static void _destroy_play_list(struct _priv *priv)
+{
+ eina_list_free(priv->play_list);
+ priv->play_list = NULL;
+}
+
static void _update_view(struct _priv *priv)
{
struct _list_info *linfo;
@@ -169,12 +196,25 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj,
priv = data;
- if (!strcmp(ev->keyname, KEY_BACK) ||
- !strcmp(ev->keyname, KEY_ESC)) {
- if (priv->depth > 0)
- _update_view(priv);
- else
- _pop_view();
+ switch (id) {
+ case DETAIL_GRID:
+ if (!strcmp(ev->keyname, KEY_BACK) ||
+ !strcmp(ev->keyname, KEY_ESC)) {
+ if (priv->depth > 0)
+ _update_view(priv);
+ else
+ _pop_view();
+ }
+
+ break;
+ case DETAIL_PLAY_INFO:
+ if (!strcmp(ev->keyname, KEY_BACK) ||
+ !strcmp(ev->keyname, KEY_ESC))
+ elm_object_focus_set(priv->grid, EINA_TRUE);
+
+ break;
+ default:
+ break;
}
}
@@ -192,6 +232,44 @@ static void _focused_cb(int id, void *data, Evas_Object *obj,
priv->focused_it = it;
}
+static void _clicked_cb(int id, void *data, Evas_Object *obj)
+{
+ struct view_update_data vdata;
+ struct _priv *priv;
+ int type;
+
+ if (!data) {
+ _ERR("invalid argument");
+ return;
+ }
+
+ priv = data;
+
+ type = priv->vinfo->app_contents_type;
+
+ switch (type) {
+ case CONTENTS_MOVIE:
+ _destroy_play_list(priv);
+
+ priv->play_list = eina_list_append(priv->play_list,
+ priv->play_info);
+
+ vdata.list = priv->play_list;
+ vdata.index = 0;
+ vdata.id = VIEW_DETAIL;
+
+ viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata);
+ viewmgr_push_view(VIEW_VIEWER);
+
+ break;
+ case CONTENTS_MUSIC:
+ viewmgr_push_view(VIEW_MPLAYER);
+ break;
+ default:
+ break;
+ }
+}
+
static void _media_selected(void *data)
{
struct _priv *priv;
@@ -298,6 +376,7 @@ static void _selected_cb(int id, void *data, Evas_Object *obj,
static input_handler _handler = {
.key_down = _key_down_cb,
.focused = _focused_cb,
+ .clicked = _clicked_cb,
.selected = _selected_cb
};
@@ -467,6 +546,72 @@ static Elm_Gengrid_Item_Class *_get_grid_item_class(struct _view_info *vinfo)
return ic;
}
+static app_media *_get_app_media(const char *id)
+{
+ media_info_h media;
+ app_media *am;
+ int r;
+
+ r = media_content_connect();
+ if (r != MEDIA_CONTENT_ERROR_NONE) {
+ _ERR("failed to connect to media content");
+ return NULL;
+ }
+
+ r = media_info_get_media_from_db(id, &media);
+ if (r != MEDIA_CONTENT_ERROR_NONE) {
+ _ERR("failed to get media handle");
+ return NULL;
+ }
+
+ am = app_media_create(media);
+ if (!am) {
+ _ERR("failed to create app media");
+ return NULL;
+ }
+
+ media_content_disconnect();
+
+ return am;
+}
+
+static app_media *_get_play_item(struct _priv *priv, const char *id)
+{
+ GList *rlist;
+ app_media *am;
+ struct recent_data *rdata;
+ int type;
+ int r;
+
+ if (id) {
+ am = _get_app_media(id);
+ return am;
+ }
+
+ type = view_info[priv->view_type].app_contents_type;
+
+ rlist = NULL;
+ am = NULL;
+ r = app_contents_get_recent_list(type, 1, &rlist);
+ if (r != APP_CONTENTS_ERROR_NONE) {
+ _ERR("failed to get recent list");
+ return NULL;
+ }
+
+ rdata = g_list_nth_data(rlist, 0);
+ if (!rdata || !rdata->id) {
+ _ERR("failed to get recent item");
+ app_contents_free_recent_list(rlist);
+ return NULL;
+ }
+
+ am = _get_app_media(rdata->id);
+
+ app_contents_free_recent_list(rlist);
+
+ return am;
+}
+
static void _get_place_title(const char *title, char *str, int size)
{
char buf[64], s[64];
@@ -575,6 +720,64 @@ static void _get_album_info(struct _priv *priv, const char *title)
elm_object_part_text_set(priv->base, PART_DETAIL_CONTENT_INFO, buf);
}
+static void _set_no_play_info(struct _priv *priv)
+{
+ int type;
+ char buf[64] = {0};
+
+ type = priv->vinfo->app_contents_type;
+
+ if (type == CONTENTS_MOVIE)
+ snprintf(buf, sizeof(buf), STR_NO_PLAY_MOVIE);
+ else if (type == CONTENTS_MUSIC)
+ snprintf(buf, sizeof(buf), STR_NO_PLAY_MUSIC);
+
+ elm_object_text_set(priv->btn, buf);
+
+ elm_object_signal_emit(priv->btn, SIG_SET_STATUS_STOP, SIG_SOURCE_SRC);
+
+ elm_object_disabled_set(priv->btn, EINA_TRUE);
+}
+
+static void _set_movie_play_info(struct _priv *priv, app_media_info *mi)
+{
+ struct tm tm;
+ char date[32], buf[256];
+
+ elm_object_signal_emit(priv->btn, SIG_SET_STATUS_STOP, SIG_SOURCE_SRC);
+
+ localtime_r(&mi->played_time, &tm);
+ strftime(date, sizeof(date), "%Y.%m.%d", &tm);
+
+ snprintf(buf, sizeof(buf), "%s - %s", mi->title, date);
+
+ elm_object_text_set(priv->btn, buf);
+ elm_object_disabled_set(priv->btn, EINA_FALSE);
+}
+
+static void _set_music_play_info(struct _priv *priv, app_media_info *mi)
+{
+ char buf[256];
+
+ switch (priv->status) {
+ case E_PLAYER_PLAY:
+ elm_object_signal_emit(priv->btn, SIG_SET_STATUS_PLAY,
+ SIG_SOURCE_SRC);
+ break;
+ case E_PLAYER_PAUSE:
+ elm_object_signal_emit(priv->btn, SIG_SET_STATUS_PAUSE,
+ SIG_SOURCE_SRC);
+ break;
+ default:
+ break;
+ }
+
+ snprintf(buf, sizeof(buf), "%s - %s", mi->title, mi->audio->artist);
+
+ elm_object_text_set(priv->btn, buf);
+ elm_object_disabled_set(priv->btn, EINA_FALSE);
+}
+
static void _update_title_area(struct _priv *priv, const char *title)
{
view_info[priv->view_type].get_content_info(priv, title);
@@ -612,6 +815,43 @@ static bool _update_thumbnail_area(struct _priv *priv)
return true;
}
+static bool _update_play_info(struct _priv *priv, const char *id)
+{
+ app_media *am;
+ app_media_info *mi;
+ int type;
+
+ type = view_info[priv->view_type].app_contents_type;
+
+ if (type == CONTENTS_GALLERY ||
+ (type == CONTENTS_MUSIC && priv->status == E_PLAYER_STOP)) {
+ _set_no_play_info(priv);
+ return true;
+ }
+
+ am = _get_play_item(priv, id);
+ if (!am) {
+ _set_no_play_info(priv);
+ return false;
+ }
+
+ mi = app_media_get_info(am);
+ if (!mi) {
+ _ERR("failed to get app media info");
+ _set_no_play_info(priv);
+ return false;
+ }
+
+ if (type == CONTENTS_MOVIE)
+ _set_movie_play_info(priv, mi);
+ else if (type == CONTENTS_MUSIC)
+ _set_music_play_info(priv, mi);
+
+ priv->play_info = am;
+
+ return true;
+}
+
static bool _draw_title_area(struct _priv *priv)
{
Evas_Object *img;
@@ -642,13 +882,32 @@ static bool _draw_thumbnail_area(struct _priv *priv)
elm_object_part_content_set(priv->base,
PART_DETAIL_THUMBNAIL_AREA, grid);
- inputmgr_add_callback(grid, 0, &_handler, priv);
+ inputmgr_add_callback(grid, DETAIL_GRID, &_handler, priv);
priv->grid = grid;
return true;
}
+static bool _draw_play_info(struct _priv *priv)
+{
+ Evas_Object *btn;
+
+ btn = util_add_button(priv->base, STYLE_BTN_PLAY_INFO, NULL);
+ if (!btn) {
+ _ERR("failed to add button");
+ return false;
+ }
+
+ elm_object_part_content_set(priv->base, PART_DETAIL_PLAY_INFO, btn);
+
+ inputmgr_add_callback(btn, DETAIL_PLAY_INFO, &_handler, priv);
+
+ priv->btn = btn;
+
+ return true;
+}
+
static bool _draw_items(struct _priv *priv)
{
if (!_draw_title_area(priv)) {
@@ -661,6 +920,11 @@ static bool _draw_items(struct _priv *priv)
return false;
}
+ if (!_draw_play_info(priv)) {
+ _ERR("failed to draw play info");
+ return false;
+ }
+
return true;
}
@@ -791,8 +1055,16 @@ static void _update(void *view_data, int update_type, void *data)
_update_title_area(priv, vdata->id);
_update_thumbnail_area(priv);
+ _update_play_info(priv, NULL);
break;
+ case UPDATE_PLAY_INFO:
+ _update_play_info(priv, vdata->id);
+ break;
+ case UPDATE_PLAYER:
+ priv->status = vdata->status;
+ _update_play_info(priv, NULL);
+ break;
default:
break;
}
@@ -809,6 +1081,9 @@ static void _destroy(void *view_data)
priv = view_data;
+ _destroy_play_list(priv);
+ app_media_destroy(priv->play_info);
+
datamgr_destroy(priv->dmgr);
evas_object_del(priv->base);