View: Enable the favorite button to be selected 51/46551/3 accepted/tizen/tv/20150825.060937 submit/tizen/20150824.133824
authorHyojung Jo <hj903.jo@samsung.com>
Fri, 21 Aug 2015 12:03:38 +0000 (21:03 +0900)
committerHyojung Jo <hj903.jo@samsung.com>
Tue, 25 Aug 2015 00:22:01 +0000 (09:22 +0900)
Change-Id: I5339c9155b4b2151112f7230b4ad8c72a83fac82
Signed-off-by: Hyojung Jo <hj903.jo@samsung.com>
30 files changed:
include/datamgr.h
include/define.h
include/grid.h
include/view.h [moved from include/view_action_menu.h with 77% similarity]
include/view_base.h [deleted file]
res/images/btn_menu_share_dis.png [deleted file]
res/images/btn_menu_share_foc.png [deleted file]
res/images/btn_menu_share_sel.png [deleted file]
res/images/btn_menu_unlock_foc.png [moved from res/images/btn_menu_share_nor.png with 51% similarity]
res/images/btn_menu_unlock_nor.png [new file with mode: 0644]
res/widgets/button.edc
res/widgets/gengrid_apps.edc
res/widgets/gengrid_gallery.edc
res/widgets/gengrid_movie.edc
res/widgets/gengrid_music.edc
res/widgets/gengrid_tv.edc
res/widgets/gengrid_webs.edc
src/data/app.c
src/data/channel.c
src/data/media.c
src/data/web.c
src/grid/grid_apps.c
src/grid/grid_gallery.c
src/grid/grid_movie.c
src/grid/grid_music.c
src/grid/grid_tv.c
src/grid/grid_webs.c
src/main.c
src/view/view_action_menu.c
src/view/view_base.c

index 1aba63f..be176d0 100644 (file)
@@ -24,12 +24,18 @@ enum data_type {
        DATA_DURATION,
 };
 
+enum action_type {
+       ACTION_LAUNCH = 0,
+       ACTION_UPDATE_FAVORITE,
+       ACTION_UPDATE_LOCK,
+};
+
 struct datamgr {
        Eina_List *(*get_favorites)(enum item_type type);
        void (*free_favorites)(Eina_List *list);
        int (*get_count)(enum item_type type);
        char *(*get_data)(void *data, enum data_type type);
-       bool (*action)(Elm_Object_Item *it);
+       bool (*action)(Elm_Object_Item *it, enum action_type type);
 };
 
 struct datamgr *get_channel_datamgr(void);
index 505fa8a..b34be59 100644 (file)
@@ -49,7 +49,6 @@
 #define STYLE_LIVETV_BTN "style.livetv.button"
 #define STYLE_ACTION_MENU_FAV_BTN "style.action.menu.favorite.button"
 #define STYLE_ACTION_MENU_LOCK_BTN "style.action.menu.lock.button"
-#define STYLE_ACTION_MENU_SHARE_BTN "style.action.menu.share.button"
 
 /* Signal */
 #define SIG_FOCUSED "focused"
 #define SIG_SELECTED "selected"
 #define SIG_UNSELECTED "unselected"
 #define SIG_ITEM_SELECTED "item.selected"
+#define SIG_ITEM_FOCUSED "item_focused"
 #define SIG_VISIBLE "visible"
 #define SIG_INVISIBLE "invisible"
 #define SIG_DISABLE "elm,state,disabled"
+#define SIG_TOGGLE "toggle"
 
 /* Source */
 #define SRC_EDC "edc"
@@ -73,7 +74,6 @@
 /* Text */
 #define STR_FAVORITE "Favorite"
 #define STR_LOCK "Lock"
-#define STR_SHARE "Share"
 #define STR_NULL "(NULL)"
 #define STR_NO_CONTENTS "No Contents"
 #define STR_CNT_TV "channels"
 #define ACTION_FAV_FOC_PNG "btn_menu_favorite_foc.png"
 #define ACTION_FAV_SEL_PNG "btn_menu_favorite_sel.png"
 #define ACTION_FAV_DIS_PNG "btn_menu_favorite_dis.png"
+#define ACTION_UNLOCK_NOR_PNG "btn_menu_unlock_nor.png"
+#define ACTION_UNLOCK_FOC_PNG "btn_menu_unlock_foc.png"
 #define ACTION_LOCK_NOR_PNG "btn_menu_lock_nor.png"
 #define ACTION_LOCK_FOC_PNG "btn_menu_lock_foc.png"
 #define ACTION_LOCK_SEL_PNG "btn_menu_lock_sel.png"
 #define ACTION_LOCK_DIS_PNG "btn_menu_lock_dis.png"
-#define ACTION_SHARE_NOR_PNG "btn_menu_share_nor.png"
-#define ACTION_SHARE_FOC_PNG "btn_menu_share_foc.png"
-#define ACTION_SHARE_SEL_PNG "btn_menu_share_sel.png"
-#define ACTION_SHARE_DIS_PNG "btn_menu_share_dis.png"
 
 /* Path */
 #define PATH_PLAY_ICON_PNG IMGDIR"/ic_thumbnail_play.png"
index 984ab34..bc55ff6 100644 (file)
@@ -17,6 +17,8 @@
 #ifndef __AIR_FAVORITE_GRID_H__
 #define __AIR_FAVORITE_GRID_H__
 
+#include "datamgr.h"
+
 struct grid_data {
        const char *id;
        Evas_Object *grid;
@@ -24,10 +26,11 @@ struct grid_data {
        int item_size_y;
        Eina_List *list;
        struct grid_class *gclass;
+       Elm_Object_Item *focused_item;
 
        Eina_List *(*create_item_list)(void);
        void (*destroy_item_list)(Eina_List *list);
-       void (*item_selected)(Elm_Object_Item *it);
+       bool (*item_action)(Elm_Object_Item *it, enum action_type type);
 };
 
 struct grid_data *get_tv_grid_data(void);
similarity index 77%
rename from include/view_action_menu.h
rename to include/view.h
index 4b44c54..a32afa3 100644 (file)
  * limitations under the License.
  */
 
-#ifndef __AIR_FAVORITE_VIEW_ACTION_MENU_H__
-#define __AIR_FAVORITE_VIEW_ACTION_MENU_H__
+#ifndef __AIR_FAVORITE_VIEW_H__
+#define __AIR_FAVORITE_VIEW_H__
 
+view_class *view_base_get_vclass(void);
 view_class *view_action_menu_get_vclass(void);
 
-#endif /* __AIR_FAVORITE_VIEW_ACTION_MENU_H__ */
+enum update_type {
+       UPDATE_DATA = 0,
+       UPDATE_GRID,
+};
+
+#endif /* __AIR_APPS_VIEW_H__ */
diff --git a/include/view_base.h b/include/view_base.h
deleted file mode 100644 (file)
index 61608f2..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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_FAVORITE_VIEW_BASE_H__
-#define __AIR_FAVORITE_VIEW_BASE_H__
-
-view_class *view_base_get_vclass(void);
-
-#endif /* __AIR_FAVORITE_VIEW_BASE_H__ */
diff --git a/res/images/btn_menu_share_dis.png b/res/images/btn_menu_share_dis.png
deleted file mode 100644 (file)
index 0a793aa..0000000
Binary files a/res/images/btn_menu_share_dis.png and /dev/null differ
diff --git a/res/images/btn_menu_share_foc.png b/res/images/btn_menu_share_foc.png
deleted file mode 100644 (file)
index 0bfcd19..0000000
Binary files a/res/images/btn_menu_share_foc.png and /dev/null differ
diff --git a/res/images/btn_menu_share_sel.png b/res/images/btn_menu_share_sel.png
deleted file mode 100644 (file)
index 05e8f16..0000000
Binary files a/res/images/btn_menu_share_sel.png and /dev/null differ
similarity index 51%
rename from res/images/btn_menu_share_nor.png
rename to res/images/btn_menu_unlock_foc.png
index bdea318..8e35489 100644 (file)
Binary files a/res/images/btn_menu_share_nor.png and b/res/images/btn_menu_unlock_foc.png differ
diff --git a/res/images/btn_menu_unlock_nor.png b/res/images/btn_menu_unlock_nor.png
new file mode 100644 (file)
index 0000000..fb89ee9
Binary files /dev/null and b/res/images/btn_menu_unlock_nor.png differ
index 0782ec8..2a8ecee 100644 (file)
@@ -17,6 +17,7 @@
 #define STATE_NORMAL 0
 #define STATE_SELECTED 1
 #define STATE_DISABLE 2
+#define STATE_TOGGLE 3
 
 group {
        name, "elm/button/base/style.menu.button";
@@ -736,66 +737,40 @@ group {
 
        programs{
                program {
-                       name, SIG_FOCUSED;
-                       signal, "elm,action,focus";
-                       source, "elm";
+                       name, "load";
+                       signal, "load";
+                       source, "";
                        script {
-                               new state;
-                               state = get_int(cur_state);
-                               if (state != STATE_DISABLE) {
-                                       set_int(cur_state, STATE_NORMAL);
-                                       run_program(PROGRAM:"focused,anim");
-                               }
+                               set_int(cur_state, STATE_NORMAL);
                        }
                }
 
                program {
-                       name, SIG_UNFOCUSED;
-                       signal, "elm,action,unfocus";
+                       name, SIG_FOCUSED;
+                       signal, "elm,action,focus";
                        source, "elm";
                        script {
                                new state;
                                state = get_int(cur_state);
-                               if (state == STATE_SELECTED) {
-                                       set_state(PART:"part.bg", "selected", 0.0);
-                                       set_state(PART:"elm.text", "selected", 0.0);
-                                       set_state(PART:"part.icon", "selected", 0.0);
-                               } else if (state != STATE_DISABLE) {
-                                       run_program(PROGRAM:"unfocused,anim");
+                               if (state == STATE_NORMAL) {
+                                       set_state(PART:"part.bg", "focused", 0.0);
+                                       set_state(PART:"part.icon", "focused", 0.0);
+                                       set_state(PART:"elm.text", "focused", 0.0);
                                }
                        }
                }
 
                program {
-                       name, "focused,anim";
-                       action, STATE_SET "focused" 0.0;
-                       target, "part.bg";
-                       target, "elm.text";
-                       target, "part.icon";
-                       transition, TRANSITION_FOCUS;
-               }
-
-               program {
-                       name, "unfocused,anim";
-                       action, STATE_SET "default" 0.0;
-                       target, "part.bg";
-                       target, "elm.text";
-                       target, "part.icon";
-                       transition, TRANSITION_FOCUS;
-               }
-
-               program {
-                       name, SIG_SELECTED;
-                       signal, SIG_SELECTED;
-                       source, SRC_ACTION_BTN;
+                       name, SIG_UNFOCUSED;
+                       signal, "elm,action,unfocus";
+                       source, "elm";
                        script {
                                new state;
                                state = get_int(cur_state);
-                               if (state != STATE_DISABLE) {
-                                       set_int(cur_state, STATE_SELECTED);
-                                       set_state(PART:"part.bg", "selected", 0.0);
-                                       set_state(PART:"elm.text", "selected", 0.0);
-                                       set_state(PART:"part.icon", "selected", 0.0);
+                               if (state == STATE_NORMAL) {
+                                       set_state(PART:"part.bg", "default", 0.0);
+                                       set_state(PART:"part.icon", "default", 0.0);
+                                       set_state(PART:"elm.text", "default", 0.0);
                                }
                        }
                }
@@ -827,6 +802,8 @@ group {
        inherit, "elm/button/base/style.action.menu.favorite.button";
        data.item, "focus_highlight" "on";
        images {
+               image, ACTION_UNLOCK_NOR_PNG COMP;
+               image, ACTION_UNLOCK_FOC_PNG COMP;
                image, ACTION_LOCK_NOR_PNG COMP;
                image, ACTION_LOCK_FOC_PNG COMP;
                image, ACTION_LOCK_SEL_PNG COMP;
@@ -850,11 +827,21 @@ group {
                                align, 0.5 0.5;
                                fixed, 1 1;
                                min, 60 60;
+                               image.normal, ACTION_UNLOCK_NOR_PNG;
+                       }
+                       description {
+                               state, "default.toggle" 0.0;
+                               inherit, "default" 0.0;
                                image.normal, ACTION_LOCK_NOR_PNG;
                        }
                        description {
                                state, "focused" 0.0;
                                inherit, "default" 0.0;
+                               image.normal, ACTION_UNLOCK_FOC_PNG;
+                       }
+                       description {
+                               state, "focused.toggle" 0.0;
+                               inherit, "default" 0.0;
                                image.normal, ACTION_LOCK_FOC_PNG;
                        }
                        description {
@@ -869,53 +856,116 @@ group {
                        }
                }
        }
-}
 
-group {
-       name, "elm/button/base/style.action.menu.share.button";
-       inherit, "elm/button/base/style.action.menu.favorite.button";
-       data.item, "focus_highlight" "on";
-       images {
-               image, ACTION_SHARE_NOR_PNG COMP;
-               image, ACTION_SHARE_FOC_PNG COMP;
-               image, ACTION_SHARE_SEL_PNG COMP;
-               image, ACTION_SHARE_DIS_PNG COMP;
-       }
-       parts {
-               part {
-                       name, "part.icon";
-                       type, IMAGE;
-                       scale, 1;
-                       description {
-                               state, "default" 0.0;
-                               rel1 {
-                                       to, "part.icon.bg";
-                                       relative, 0.5 0.5;
+       programs{
+               program {
+                       name, "load";
+                       signal, "load";
+                       source, "";
+                       script {
+                               set_int(cur_state, STATE_NORMAL);
+                       }
+               }
+
+               program {
+                       name, SIG_TOGGLE;
+                       signal, SIG_TOGGLE;
+                       source, SRC_ACTION_BTN;
+                       script {
+                               new state;
+                               state = get_int(cur_state);
+                               if (state == STATE_NORMAL) {
+                                       set_int(cur_state, STATE_TOGGLE);
+                                       set_state(PART:"part.icon", "default.toggle", 0.0);
                                }
-                               rel2 {
-                                       to, "part.icon.bg";
-                                       relative, 0.5 0.5;
+                       }
+               }
+
+               program {
+                       name, SIG_FOCUSED;
+                       signal, "elm,action,focus";
+                       source, "elm";
+                       script {
+                               new state;
+                               state = get_int(cur_state);
+                               if (state == STATE_NORMAL) {
+                                       set_state(PART:"part.icon", "focused", 0.0);
+                                       run_program(PROGRAM:"focused,anim");
+                               } else if (state == STATE_TOGGLE) {
+                                       set_state(PART:"part.icon", "focused.toggle", 0.0);
+                                       run_program(PROGRAM:"focused,anim");
                                }
-                               align, 0.5 0.5;
-                               fixed, 1 1;
-                               min, 60 60;
-                               image.normal, ACTION_SHARE_NOR_PNG;
                        }
-                       description {
-                               state, "focused" 0.0;
-                               inherit, "default" 0.0;
-                               image.normal, ACTION_SHARE_FOC_PNG;
+               }
+
+               program {
+                       name, SIG_UNFOCUSED;
+                       signal, "elm,action,unfocus";
+                       source, "elm";
+                       script {
+                               new state;
+                               state = get_int(cur_state);
+                               if (state == STATE_NORMAL) {
+                                       set_state(PART:"part.icon", "default", 0.0);
+                                       run_program(PROGRAM:"unfocused,anim");
+                               } else if (state != STATE_DISABLE) {
+                                       set_state(PART:"part.icon", "default.toggle", 0.0);
+                                       run_program(PROGRAM:"unfocused,anim");
+                               }
                        }
-                       description {
-                               state, "selected" 0.0;
-                               inherit, "default" 0.0;
-                               image.normal, ACTION_SHARE_SEL_PNG;
+               }
+
+               program {
+                       name, "focused,anim";
+                       action, STATE_SET "focused" 0.0;
+                       target, "part.bg";
+                       target, "elm.text";
+                       transition, TRANSITION_FOCUS;
+               }
+
+               program {
+                       name, "unfocused,anim";
+                       action, STATE_SET "default" 0.0;
+                       target, "part.bg";
+                       target, "elm.text";
+                       transition, TRANSITION_FOCUS;
+               }
+
+               program {
+                       name, SIG_SELECTED;
+                       signal, SIG_SELECTED;
+                       source, SRC_ACTION_BTN;
+                       script {
+                               new state;
+                               state = get_int(cur_state);
+                               if (state == STATE_NORMAL) {
+                                       set_int(cur_state, STATE_TOGGLE);
+                                       set_state(PART:"part.icon", "focused.toggle", 0.0);
+                               } else if (state == STATE_TOGGLE) {
+                                       set_int(cur_state, STATE_NORMAL);
+                                       set_state(PART:"part.icon", "focused", 0.0);
+                               }
                        }
-                       description {
-                               state, "disable" 0.0;
-                               inherit, "default" 0.0;
-                               image.normal, ACTION_SHARE_DIS_PNG;
+               }
+
+               program {
+                       name, SIG_DISABLE;
+                       signal, SIG_DISABLE;
+                       source, "elm";
+                       script {
+                               set_int(cur_state, STATE_DISABLE);
+                               set_state(PART:"part.bg", "disable", 0.0);
+                               set_state(PART:"elm.text", "disable", 0.0);
+                               set_state(PART:"part.icon", "disable", 0.0);
+                               set_state(PART:"event", "disable", 0.0);
                        }
                }
+
+               program {
+                       name, "mouse_unclick_after";
+                       signal, "mouse,clicked,1";
+                       source, "event";
+                       action, SIGNAL_EMIT "elm,action,click" "";
+               }
        }
 }
index bfa714a..de5ddc5 100644 (file)
@@ -376,6 +376,7 @@ group {
                        target, "part.focus.down";
                        target, "part.focus.right";
                        transition, TRANSITION_FOCUS;
+                       after, "item_focused";
                }
 
                program {
@@ -411,6 +412,11 @@ group {
                }
 
                program {
+                       name, "item_focused";
+                       action, SIGNAL_EMIT SIG_ITEM_FOCUSED SRC_EDC;
+               }
+
+               program {
                        name, SIG_SELECTED;
                        signal, "elm,state,selected";
                        source, "elm";
index 5efc967..27cf738 100644 (file)
@@ -372,6 +372,7 @@ group {
                        target, "part.focus.right";
                        target, PART_THUMB_TEXT;
                        transition, TRANSITION_FOCUS;
+                       after, "item_focused";
                }
 
                program {
@@ -401,6 +402,11 @@ group {
                }
 
                program {
+                       name, "item_focused";
+                       action, SIGNAL_EMIT SIG_ITEM_FOCUSED SRC_EDC;
+               }
+
+               program {
                        name, SIG_SELECTED;
                        signal, "elm,state,selected";
                        source, "elm";
index bd5214b..c58b196 100644 (file)
@@ -406,6 +406,7 @@ group {
                        target, "part.focus.right";
                        target, "part.focus.down";
                        transition, TRANSITION_FOCUS;
+                       after, "item_focused";
                }
 
                program {
@@ -442,6 +443,11 @@ group {
                }
 
                program {
+                       name, "item_focused";
+                       action, SIGNAL_EMIT SIG_ITEM_FOCUSED SRC_EDC;
+               }
+
+               program {
                        name, SIG_SELECTED;
                        signal, "elm,state,selected";
                        source, "elm";
index d1ed4cf..0449a3b 100644 (file)
@@ -564,6 +564,7 @@ group {
                        name, "focus.in.anim.2";
                        action, STATE_SET "focused" 0.0;
                        target, "part.default.text.bg";
+                       after, "item_focused";
                }
 
                program {
@@ -601,6 +602,11 @@ group {
                }
 
                program {
+                       name, "item_focused";
+                       action, SIGNAL_EMIT SIG_ITEM_FOCUSED SRC_EDC;
+               }
+
+               program {
                        name, SIG_SELECTED;
                        signal, "elm,state,selected";
                        source, "elm";
index a9f0526..b67e2c6 100644 (file)
@@ -401,6 +401,7 @@ group {
                        target, "part.focus.right";
                        target, "part.focus.down";
                        transition, TRANSITION_FOCUS;
+                       after, "item_focused";
                }
 
                program {
@@ -437,6 +438,11 @@ group {
                }
 
                program {
+                       name, "item_focused";
+                       action, SIGNAL_EMIT SIG_ITEM_FOCUSED SRC_EDC;
+               }
+
+               program {
                        name, SIG_SELECTED;
                        signal, "elm,state,selected";
                        source, "elm";
index 09e1517..aa810a8 100644 (file)
@@ -371,6 +371,7 @@ group {
                        target, "part.focus.right";
                        target, "part.focus.down";
                        transition, TRANSITION_FOCUS;
+                       after, "item_focused";
                }
 
                program {
@@ -406,6 +407,11 @@ group {
                }
 
                program {
+                       name, "item_focused";
+                       action, SIGNAL_EMIT SIG_ITEM_FOCUSED SRC_EDC;
+               }
+
+               program {
                        name, SIG_SELECTED;
                        signal, "elm,state,selected";
                        source, "elm";
index 016b246..75fd6ab 100644 (file)
@@ -153,9 +153,10 @@ static void _free_favorites(Eina_List *list)
        }
 }
 
-static bool _action(Elm_Object_Item *it)
+static bool _action(Elm_Object_Item *it, enum action_type type)
 {
        struct app_data *adata;
+       int r;
 
        if (!it) {
                _ERR("Invalid argument.");
@@ -166,8 +167,26 @@ static bool _action(Elm_Object_Item *it)
        if (!adata || !adata->id)
                return false;
 
-       if (!utils_launch_app(adata->id, NULL, NULL)) {
-               _ERR("Launch %s failed.", adata->id);
+       switch (type) {
+       case ACTION_LAUNCH:
+               if (!utils_launch_app(adata->id, NULL, NULL)) {
+                       _ERR("Launch %s failed.", adata->id);
+                       return false;
+               }
+
+               break;
+
+       case ACTION_UPDATE_FAVORITE:
+               r = app_contents_favorite_set(CONTENTS_APP, adata->id, false);
+               if (r != APP_CONTENTS_ERROR_NONE) {
+                       _ERR("Favorite unset failed.");
+                       return false;
+               }
+
+               break;
+
+       default:
+               _ERR("Unhandled action type.");
                return false;
        }
 
index 4d98241..5d5cb50 100644 (file)
@@ -100,11 +100,6 @@ static char *_get_channel_title(struct channel_data *cdata)
 {
        char str[SIZE_STR];
 
-       if (!cdata || !cdata->name) {
-               _ERR("Invalid argument.");
-               return NULL;
-       }
-
        if (cdata->minor > 0)
                snprintf(str, sizeof(str), "%ld-%ld %s", cdata->major,
                                cdata->minor, cdata->name);
@@ -156,7 +151,29 @@ static void _free_favorites(Eina_List *list)
        }
 }
 
-static bool _action(Elm_Object_Item *it)
+static bool _unset_favorite(struct channel_data *cdata)
+{
+       int r;
+
+       r = tv_service_channel_info_create();
+       if (r != TVS_ERROR_OK) {
+               _ERR("Tv Service channel info create failed.");
+               return false;
+       }
+
+       r = tv_service_delete_favorite_channel(cdata->id);
+       if (r != TVS_ERROR_OK) {
+               _ERR("Tv Service delete favorite channel failed.");
+               tv_service_channel_info_destroy();
+               return false;
+       }
+
+       tv_service_channel_info_destroy();
+
+       return true;
+}
+
+static bool _action(Elm_Object_Item *it, enum action_type type)
 {
        struct channel_data *cdata;
        char str[SIZE_STR];
@@ -170,10 +187,32 @@ static bool _action(Elm_Object_Item *it)
        if (!cdata)
                return false;
 
-       snprintf(str, sizeof(str), "%d", cdata->id);
+       switch (type) {
+       case ACTION_LAUNCH:
+               snprintf(str, sizeof(str), "%d", cdata->id);
+
+               if (!utils_launch_app(STR_LIVETV_APP_ID,
+                                       STR_KEY_SERVICE_ID, str)) {
+                       _ERR("Livetv launch failed.");
+                       return false;
+               }
+
+               break;
+
+       case ACTION_UPDATE_FAVORITE:
+               if (!_unset_favorite(cdata)) {
+                       _ERR("Unset favorite channel failed.");
+                       return false;
+               }
 
-       if (!utils_launch_app(STR_LIVETV_APP_ID, STR_KEY_SERVICE_ID, str)) {
-               _ERR("Livetv launch failed.");
+               break;
+
+       case ACTION_UPDATE_LOCK:
+               /* It will implemented later. */
+               break;
+
+       default:
+               _ERR("Unhandled action type.");
                return false;
        }
 
index f82fc27..7e17bbb 100644 (file)
@@ -102,7 +102,9 @@ static Eina_List *_get_favorites(enum item_type type)
        g_list_foreach(id_list, _media_favorite_list_foreach, &l);
 
        media_content_disconnect();
-       app_contents_free_favorite_list(id_list);
+
+       if (id_list)
+               app_contents_free_favorite_list(id_list);
 
        return l;
 }
@@ -112,8 +114,7 @@ static char *_get_video_duration(app_media_info *minfo)
        int duration, h, m, s, sec;
        char str[SIZE_STR];
 
-       if (!minfo || !minfo->video ||
-                       minfo->media_type != MEDIA_CONTENT_TYPE_VIDEO)
+       if (minfo->media_type != MEDIA_CONTENT_TYPE_VIDEO)
                return NULL;
 
        duration = minfo->video->duration;
@@ -200,7 +201,9 @@ static int _get_count(enum item_type type)
        }
 
        cnt = g_list_length(id_list);
-       app_contents_free_favorite_list(id_list);
+
+       if (id_list)
+               app_contents_free_favorite_list(id_list);
 
        return cnt;
 }
@@ -220,10 +223,11 @@ static void _free_favorites(Eina_List *list)
        }
 }
 
-static bool _action(Elm_Object_Item *it)
+static bool _action(Elm_Object_Item *it, enum action_type type)
 {
        app_media *am;
        app_media_info *minfo;
+       int r;
 
        if (!it) {
                _ERR("Invalid argument.");
@@ -243,9 +247,28 @@ static bool _action(Elm_Object_Item *it)
        if (!minfo->media_id)
                return false;
 
-       if (!utils_launch_app(STR_MEDIAHUB_APP_ID, STR_KEY_MEDIA_ID,
-                               minfo->media_id)) {
-               _ERR("Mediahub launch failed.");
+       switch (type) {
+       case ACTION_LAUNCH:
+               if (!utils_launch_app(STR_MEDIAHUB_APP_ID, STR_KEY_MEDIA_ID,
+                                       minfo->media_id)) {
+                       _ERR("Mediahub launch failed.");
+                       return false;
+               }
+
+               break;
+
+       case ACTION_UPDATE_FAVORITE:
+               r = app_contents_favorite_set(CONTENTS_MEDIA, minfo->media_id,
+                               false);
+               if (r != APP_CONTENTS_ERROR_NONE) {
+                       _ERR("Favorite unset failed.");
+                       return false;
+               }
+
+               break;
+
+       default:
+               _ERR("Unhandled action type.");
                return false;
        }
 
index fd9b216..e58437e 100644 (file)
@@ -125,7 +125,7 @@ static void _free_favorites(Eina_List *list)
        }
 }
 
-static bool _action(Elm_Object_Item *it)
+static bool _action(Elm_Object_Item *it, enum action_type type)
 {
        /* It will be implemented later. */
 
index 84c39f4..9ad702f 100644 (file)
@@ -22,7 +22,6 @@
 
 #include "define.h"
 #include "grid.h"
-#include "datamgr.h"
 
 #define STR_APPS "Apps"
 #define STYLE_APPS "style.apps"
@@ -155,21 +154,25 @@ static void _destroy_item_list(Eina_List *list)
        dmgr->free_favorites(list);
 }
 
-static void _item_selected(Elm_Object_Item *it)
+static bool _item_action(Elm_Object_Item *it, enum action_type type)
 {
        struct datamgr *dmgr;
 
        if (!it) {
                _ERR("Invalid argument.");
-               return;
+               return false;
        }
 
        dmgr = get_apps_datamgr();
        if (!dmgr || !dmgr->action)
-               return;
+               return false;
 
-       if (!dmgr->action(it))
+       if (!dmgr->action(it, type)) {
                _ERR("The item action failed.");
+               return false;
+       }
+
+       return true;
 }
 
 static struct grid_data _gdata = {
@@ -179,7 +182,7 @@ static struct grid_data _gdata = {
        .gclass = &_gclass,
        .create_item_list = _create_item_list,
        .destroy_item_list = _destroy_item_list,
-       .item_selected = _item_selected,
+       .item_action = _item_action,
 };
 
 struct grid_data *get_apps_grid_data(void)
index 448cb41..224ec41 100644 (file)
@@ -22,7 +22,6 @@
 
 #include "define.h"
 #include "grid.h"
-#include "datamgr.h"
 
 #define STR_GALLERY "Gallery"
 #define STYLE_GALLERY "style.gallery"
@@ -134,21 +133,25 @@ static void _destroy_item_list(Eina_List *list)
        dmgr->free_favorites(list);
 }
 
-static void _item_selected(Elm_Object_Item *it)
+static bool _item_action(Elm_Object_Item *it, enum action_type type)
 {
        struct datamgr *dmgr;
 
        if (!it) {
                _ERR("Invalid argument.");
-               return;
+               return false;
        }
 
        dmgr = get_media_datamgr();
        if (!dmgr || !dmgr->action)
-               return;
+               return false;
 
-       if (!dmgr->action(it))
+       if (!dmgr->action(it, type)) {
                _ERR("The item action failed.");
+               return false;
+       }
+
+       return true;
 }
 
 static struct grid_data _gdata = {
@@ -158,7 +161,7 @@ static struct grid_data _gdata = {
        .gclass = &_gclass,
        .create_item_list = _create_item_list,
        .destroy_item_list = _destroy_item_list,
-       .item_selected = _item_selected,
+       .item_action = _item_action,
 };
 
 struct grid_data *get_gallery_grid_data(void)
index 4c84b7d..959c1b1 100644 (file)
@@ -21,7 +21,6 @@
 
 #include "define.h"
 #include "grid.h"
-#include "datamgr.h"
 
 #define STR_MOVIE "Movie"
 #define STYLE_MOVIE "style.movie"
@@ -158,21 +157,25 @@ static void _destroy_item_list(Eina_List *list)
        dmgr->free_favorites(list);
 }
 
-static void _item_selected(Elm_Object_Item *it)
+static bool _item_action(Elm_Object_Item *it, enum action_type type)
 {
        struct datamgr *dmgr;
 
        if (!it) {
                _ERR("Invalid argument.");
-               return;
+               return false;
        }
 
        dmgr = get_media_datamgr();
        if (!dmgr || !dmgr->action)
-               return;
+               return false;
 
-       if (!dmgr->action(it))
+       if (!dmgr->action(it, type)) {
                _ERR("The item action failed.");
+               return false;
+       }
+
+       return true;
 }
 
 static struct grid_data _gdata = {
@@ -182,7 +185,7 @@ static struct grid_data _gdata = {
        .gclass = &_gclass,
        .create_item_list = _create_item_list,
        .destroy_item_list = _destroy_item_list,
-       .item_selected = _item_selected,
+       .item_action = _item_action,
 };
 
 struct grid_data *get_movie_grid_data(void)
index 5c10232..b723822 100644 (file)
@@ -22,7 +22,6 @@
 
 #include "define.h"
 #include "grid.h"
-#include "datamgr.h"
 
 #define STR_MUSIC "Music"
 #define STYLE_MUSIC "style.music"
@@ -132,21 +131,25 @@ static void _destroy_item_list(Eina_List *list)
        dmgr->free_favorites(list);
 }
 
-static void _item_selected(Elm_Object_Item *it)
+static bool _item_action(Elm_Object_Item *it, enum action_type type)
 {
        struct datamgr *dmgr;
 
        if (!it) {
                _ERR("Invalid argument.");
-               return;
+               return false;
        }
 
        dmgr = get_media_datamgr();
        if (!dmgr || !dmgr->action)
-               return;
+               return false;
 
-       if (!dmgr->action(it))
+       if (!dmgr->action(it, type)) {
                _ERR("The item action failed.");
+               return false;
+       }
+
+       return true;
 }
 
 static struct grid_data _gdata = {
@@ -156,7 +159,7 @@ static struct grid_data _gdata = {
        .gclass = &_gclass,
        .create_item_list = _create_item_list,
        .destroy_item_list = _destroy_item_list,
-       .item_selected = _item_selected,
+       .item_action = _item_action,
 };
 
 struct grid_data *get_music_grid_data(void)
index 96f7660..9849ff6 100644 (file)
@@ -154,21 +154,25 @@ static void _destroy_item_list(Eina_List *list)
        dmgr->free_favorites(list);
 }
 
-static void _item_selected(Elm_Object_Item *it)
+static bool _item_action(Elm_Object_Item *it, enum action_type type)
 {
        struct datamgr *dmgr;
 
        if (!it) {
                _ERR("Invalid argument.");
-               return;
+               return false;
        }
 
        dmgr = get_channel_datamgr();
        if (!dmgr || !dmgr->action)
-               return;
+               return false;
 
-       if (!dmgr->action(it))
+       if (!dmgr->action(it, type)) {
                _ERR("The item action failed.");
+               return false;
+       }
+
+       return true;
 }
 
 static struct grid_data _gdata = {
@@ -178,7 +182,7 @@ static struct grid_data _gdata = {
        .gclass = &_gclass,
        .create_item_list = _create_item_list,
        .destroy_item_list = _destroy_item_list,
-       .item_selected = _item_selected,
+       .item_action = _item_action,
 };
 
 struct grid_data *get_tv_grid_data(void)
index a36998e..ee42d6b 100644 (file)
@@ -21,7 +21,6 @@
 
 #include "define.h"
 #include "grid.h"
-#include "datamgr.h"
 
 #define STR_WEBS "Web"
 #define STYLE_WEBS "style.webs"
index 18f124c..5fea085 100644 (file)
@@ -21,8 +21,7 @@
 
 #include "define.h"
 #include "utils.h"
-#include "view_base.h"
-#include "view_action_menu.h"
+#include "view.h"
 
 SET_TAG(PACKAGE);
 
index 988442b..6991151 100644 (file)
 #include <Elementary.h>
 #include <viewmgr.h>
 #include <inputmgr.h>
+#include <app_contents.h>
 #include <app_debug.h>
 
 #include "define.h"
 #include "utils.h"
+#include "view.h"
+#include "grid.h"
+#include "datamgr.h"
 
 enum button_type {
        BTN_LIVETV = 0,
        BTN_FAVORITE,
        BTN_LOCK,
-       BTN_SHARE,
 };
 
 struct _priv {
@@ -33,6 +36,7 @@ struct _priv {
        Evas_Object *base;
        Evas_Object *live_btn;
        Evas_Object *menu_btn[COUNT_ACTION];
+       struct grid_data *gdata;
 };
 
 struct _action_info {
@@ -54,12 +58,6 @@ static struct _action_info action_info[] = {
                .title = STR_LOCK,
                .style = STYLE_ACTION_MENU_LOCK_BTN,
                .disable = EINA_TRUE
-       },
-       {
-               .id = BTN_SHARE,
-               .title = STR_SHARE,
-               .style = STYLE_ACTION_MENU_SHARE_BTN,
-               .disable = EINA_TRUE
        }
 };
 
@@ -75,19 +73,39 @@ static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj,
                elm_object_focus_set(obj, EINA_TRUE);
 }
 
-static void _favorite_selected(void *data, Evas_Object *obj)
+static void _livetv_selected(void *data, Evas_Object *obj)
 {
        /* It will be implemented later */
 }
 
-static void _livetv_selected(void *data, Evas_Object *obj)
+static void _favorite_selected(void *data, Evas_Object *obj)
 {
-       /* It will be implemented later */
+       struct _priv *priv;
+       struct grid_data *gdata;
+
+       if (!data) {
+               _ERR("Invalid argument.");
+               return;
+       }
+       priv = data;
+
+       if (!priv->gdata)
+               return;
+
+       gdata = priv->gdata;
+
+       if (!gdata->item_action(gdata->focused_item, ACTION_UPDATE_FAVORITE)) {
+               _ERR("Unfavorite failed.");
+               return;
+       }
+
+       /* FIXME: The base view will be reloaded later */
+
+       viewmgr_hide_view(VIEW_ID_ACTION_MENU);
 }
 
 static void _clicked_cb(int id, void *data, Evas_Object *obj)
 {
-
        switch (id) {
        case BTN_LIVETV:
                _livetv_selected(data, obj);
@@ -101,10 +119,6 @@ static void _clicked_cb(int id, void *data, Evas_Object *obj)
                /* It is not supported yet. */
                break;
 
-       case BTN_SHARE:
-               /* It is not supported yet. */
-               break;
-
        default:
                _ERR("Unhandled action type.");
        }
@@ -133,11 +147,6 @@ static bool _draw_livetv_area(struct _priv *priv)
 {
        Evas_Object *btn;
 
-       if (!priv || !priv->base) {
-               _ERR("Invalid argument.");
-               return false;
-       }
-
        btn = utils_add_button(priv->base,
                        PART_LIVETV_BTN, STR_LIVETV, STYLE_LIVETV_BTN);
        if (!btn) {
@@ -156,16 +165,11 @@ static bool _draw_livetv_area(struct _priv *priv)
        return true;
 }
 
-static bool _draw_menu_area(struct _priv *priv)
+static bool _draw_action_area(struct _priv *priv)
 {
        Evas_Object *table, *btn;
        int i, row = 0, col = 0;
 
-       if (!priv || !priv->base) {
-               _ERR("Invalid argument.");
-               return false;
-       }
-
        table = utils_add_table(priv->base, PART_ACTION_MENU,
                        SIZE_ACTION_TABLE_BORDER, SIZE_ACTION_TABLE_BORDER);
        if (!table) {
@@ -209,39 +213,6 @@ static bool _draw_menu_area(struct _priv *priv)
        return true;
 }
 
-static bool _draw_favorite_area(struct _priv *priv)
-{
-       if (!priv || !priv->base) {
-               _ERR("Invalid argument.");
-               return false;
-       }
-
-       /* It will be implemented later */
-
-       return true;
-}
-
-static void _draw_view_content(struct _priv *priv)
-{
-       if (!priv) {
-               _ERR("Invalid argument.");
-               return;
-       }
-
-       if (!_draw_livetv_area(priv)) {
-               _ERR("Draw livetv area failed.");
-               return;
-       }
-
-       if (!_draw_menu_area(priv)) {
-               _ERR("Draw menu area failed.");
-               return;
-       }
-
-       if (!_draw_favorite_area(priv))
-               _ERR("Draw favorite area failed.");
-}
-
 static Evas_Object *_create(Evas_Object *win, void *data)
 {
        struct _priv *priv;
@@ -275,7 +246,8 @@ static Evas_Object *_create(Evas_Object *win, void *data)
                return NULL;
        }
 
-       _draw_view_content(priv);
+       _draw_livetv_area(priv);
+       _draw_action_area(priv);
 
        return base;
 }
@@ -288,7 +260,7 @@ static void _show(void *data)
                _ERR("Get data failed.");
                return;
        }
-       priv = (struct _priv *)data;
+       priv = data;
 
        if (priv->base)
                evas_object_show(priv->base);
@@ -304,12 +276,26 @@ static void _hide(void *data)
                _ERR("Get data failed.");
                return;
        }
-       priv = (struct _priv *)data;
+       priv = data;
 
        if (priv->base)
                evas_object_hide(priv->base);
 }
 
+static void _update(void *view_data, int update_type, void *data)
+{
+       struct _priv *priv;
+
+       if (!view_data) {
+               _ERR("Get data failed.");
+               return;
+       }
+       priv = view_data;
+
+       if (update_type == UPDATE_DATA)
+               priv->gdata = data;
+}
+
 static void _destroy(void *data)
 {
        struct _priv *priv;
@@ -318,7 +304,7 @@ static void _destroy(void *data)
                _ERR("Get data failed.");
                return;
        }
-       priv = (struct _priv *)data;
+       priv = data;
 
        if (priv->base)
                evas_object_del(priv->base);
@@ -331,6 +317,7 @@ static view_class _vclass = {
        .create = _create,
        .show = _show,
        .hide = _hide,
+       .update = _update,
        .destroy = _destroy,
 };
 
index b5a39ed..7390fdf 100644 (file)
@@ -25,6 +25,7 @@
 #include "utils.h"
 #include "grid.h"
 #include "datamgr.h"
+#include "view.h"
 
 const char *str_count[] = {
        STR_CNT_TV,
@@ -59,11 +60,6 @@ static void _draw_content_count(Evas_Object *base, int count, int id)
        struct datamgr *dmgr;
        char str[SIZE_STR];
 
-       if (!base) {
-               _ERR("Invalid argument.");
-               return;
-       }
-
        snprintf(str, sizeof(str), "%d %s", count, str_count[id]);
        elm_object_part_text_set(base, PART_CONTENTS_COUNT, str);
        elm_object_part_text_set(base, PART_CONTENTS_SUBCOUNT, "");
@@ -228,6 +224,20 @@ static void _grid_focused_cb(int id, void *data, Evas_Object *obj,
                        SIG_SELECTED, SRC_MENU_BTN);
 }
 
+static void _grid_item_focused_cb(void *data, Elm_Object_Item *it,
+               const char *emission, const char *source)
+{
+       struct grid_data *gdata;
+
+       if (!data || !it) {
+               _ERR("Invalid argument.");
+               return;
+       }
+       gdata = data;
+
+       gdata->focused_item = it;
+}
+
 static void _grid_item_selected_cb(void *data, Elm_Object_Item *it,
                const char *emission, const char *source)
 {
@@ -239,8 +249,8 @@ static void _grid_item_selected_cb(void *data, Elm_Object_Item *it,
        }
        gdata = data;
 
-       if (gdata->item_selected)
-               gdata->item_selected(it);
+       if (gdata->item_action)
+               gdata->item_action(it, ACTION_LAUNCH);
 
        elm_gengrid_item_selected_set(it, EINA_FALSE);
 }
@@ -250,7 +260,7 @@ static void _grid_realized_cb(int id, void *data, Evas_Object *obj,
 {
        struct grid_data *gdata;
 
-       if (!item) {
+       if (!data || !item) {
                _ERR("Invalid argument.");
                return;
        }
@@ -261,6 +271,8 @@ static void _grid_realized_cb(int id, void *data, Evas_Object *obj,
                return;
        }
 
+       elm_object_item_signal_callback_add(item, SIG_ITEM_FOCUSED,
+                       SRC_EDC, _grid_item_focused_cb, gdata);
        elm_object_item_signal_callback_add(item, SIG_ITEM_SELECTED,
                        SRC_EDC, _grid_item_selected_cb, gdata);
 }
@@ -273,6 +285,8 @@ static void _grid_unrealized_cb(int id, void *data, Evas_Object *obj,
                return;
        }
 
+       elm_object_item_signal_callback_del(item, SIG_ITEM_FOCUSED,
+                       SRC_EDC, _grid_item_focused_cb);
        elm_object_item_signal_callback_del(item, SIG_ITEM_SELECTED,
                        SRC_EDC, _grid_item_selected_cb);
 }
@@ -281,6 +295,7 @@ static void _grid_key_down_cb(int id, void *data, Evas *e, Evas_Object *obj,
                Evas_Event_Key_Down *ev)
 {
        struct _priv *priv;
+       struct grid_data *gdata;
 
        if (!data || !ev) {
                _ERR("Invalid argument.");
@@ -289,15 +304,17 @@ static void _grid_key_down_cb(int id, void *data, Evas *e, Evas_Object *obj,
        priv = data;
 
        if (!strcmp(ev->keyname, KEY_BACK)
-                       || !strcmp(ev->keyname, KEY_BACK_REMOTE))
+                       || !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
                elm_object_focus_set(priv->menu[priv->cur_menu_id], EINA_TRUE);
+       } else if (!strcmp(ev->keyname, KEY_MENU)
+                       || !strcmp(ev->keyname, KEY_MENU_REMOTE)) {
+               gdata = _get_grid_data[id]();
+               if (!gdata)
+                       return;
 
-       /* FIXME: The action menu is blocked temporarily. */
-       /*
-       else if (!strcmp(ev->keyname, KEY_MENU)
-                       || !strcmp(ev->keyname, KEY_MENU_REMOTE))
+               viewmgr_update_view(VIEW_ID_ACTION_MENU, UPDATE_DATA, gdata);
                viewmgr_show_view(VIEW_ID_ACTION_MENU);
-       */
+       }
 }
 
 static input_handler _menu_input_handler = {
@@ -320,11 +337,6 @@ static bool _draw_top_area(struct _priv *priv)
        struct grid_data *gdata;
        int i;
 
-       if (!priv || !priv->base) {
-               _ERR("Invalid argument.");
-               return false;
-       }
-
        elm_object_part_text_set(priv->base, PART_TOP_TITLE, STR_FAVORITE);
 
        priv->box = utils_add_box(priv->base, PART_TOP_MENU, EINA_TRUE,
@@ -370,11 +382,6 @@ static bool _add_grid(struct _priv *priv, int id)
        struct grid_data *gdata;
        Evas_Object *grid;
 
-       if (!priv || !priv->base || !priv->gmgr) {
-               _ERR("Invalid argument.");
-               return false;
-       }
-
        gdata = _get_grid_data[id]();
        if (!gdata || !gdata->id || !gdata->gclass) {
                _ERR("Get grid data failed.");