enable to clear recent app item 73/42573/3
authorSoohye Shin <soohye.shin@samsung.com>
Tue, 30 Jun 2015 08:00:10 +0000 (17:00 +0900)
committerSoohye Shin <soohye.shin@samsung.com>
Tue, 30 Jun 2015 12:04:26 +0000 (21:04 +0900)
- add key and focus input handler
- modify recent delete edc for swallow icon
- draw no contents when there is no recent item

Change-Id: Ia374b6945b5103437bf09b25c51c6b0cf9d67458
Signed-off-by: Soohye Shin <soohye.shin@samsung.com>
edje/view/recent.edc
images/btn_bar_clearall_dis.png [new file with mode: 0644]
images/btn_bar_clearall_foc.png [new file with mode: 0644]
images/btn_bar_clearall_nor.png [new file with mode: 0644]
include/datamgr.h
include/defs.h
src/data/data_recent.c
src/data/datamgr.c
src/view/view_recent.c

index b6d8352..aba105f 100644 (file)
@@ -230,9 +230,6 @@ group {
 
 group {
        name, GRP_RECENT_DELETE;
-       images {
-               image, "btn_bar_clearall_nor.png" COMP;
-       }
        parts {
                part {
                        name, "bg";
@@ -241,20 +238,68 @@ group {
                        description {
                                state, "default" 0.0;
                                min, 82 104;
-                               visible, 0;
+                               color, 255 255 255 255;
+                       }
+                       description {
+                               state, "focus" 0.0;
+                               inherit, "default" 0.0;
+                               color, 0 119 246 255;
                        }
                }
                part {
-                       name, "ico";
-                       type, IMAGE;
+                       name, "clip";
+                       type, RECT;
+                       description {
+                               state, "default" 0.0;
+                               color, 0 0 0 0;
+                       }
+                       description {
+                               state, "focus" 0.0;
+                               inherit, "default" 0.0;
+                               color, 255 255 255 255;
+                       }
+               }
+               part {
+                       name, PART_RECENT_DELETE;
+                       type, SWALLOW;
                        scale, 1;
                        description {
                                state, "default" 0.0;
                                rel1.to, "bg";
                                rel2.to, "bg";
-                               image.normal, "btn_bar_clearall_nor.png";
                        }
                }
+               part {
+                       name, PART_RECENT_DELETE_FOCUS;
+                       type, SWALLOW;
+                       scale, 1;
+                       clip_to, "clip";
+                       description {
+                               state, "default" 0.0;
+                               rel1.to, PART_RECENT_DELETE;
+                               rel2.to, PART_RECENT_DELETE;
+                       }
+               }
+       }
+       programs {
+               program {
+                       name, "sig,focus";
+                       signal, SIG_FOCUS;
+                       source, SRC_PROG;
+                       action, STATE_SET "focus" 0.0;
+                       transition, LINEAR 0.5;
+                       target, "bg";
+                       target, "clip";
+               }
+               program {
+                       name, "sig,unfocus";
+                       signal, SIG_UNFOCUS;
+                       source, SRC_PROG;
+                       action, STATE_SET "default" 0.0;
+                       transition, LINEAR 0.5;
+                       target, "bg";
+                       target, "clip";
+               }
        }
 }
 
diff --git a/images/btn_bar_clearall_dis.png b/images/btn_bar_clearall_dis.png
new file mode 100644 (file)
index 0000000..fb138ea
Binary files /dev/null and b/images/btn_bar_clearall_dis.png differ
diff --git a/images/btn_bar_clearall_foc.png b/images/btn_bar_clearall_foc.png
new file mode 100644 (file)
index 0000000..950c901
Binary files /dev/null and b/images/btn_bar_clearall_foc.png differ
diff --git a/images/btn_bar_clearall_nor.png b/images/btn_bar_clearall_nor.png
new file mode 100644 (file)
index 0000000..8b63be7
Binary files /dev/null and b/images/btn_bar_clearall_nor.png differ
index ef0a272..853f14c 100644 (file)
@@ -57,6 +57,7 @@ struct data_class {
        void (*fini)(struct datamgr *dm);
        void (*select)(struct datamgr_item *di);
        Eina_List *(*get_items)(struct datamgr *dm);
+       void (*clear)(struct datamgr *dm);
        /* It should be added later */
 };
 
@@ -64,5 +65,6 @@ struct datamgr *datamgr_init(struct data_class *dclass, const char *view_id);
 void datamgr_fini(struct datamgr *dm);
 Eina_List *datamgr_get_items(struct datamgr *dm);
 void datamgr_select_item(struct datamgr *dm, struct datamgr_item *di);
+void datamgr_clear_item(struct datamgr *dm);
 
 #endif /* __AIR_HOME_DATAMGR_H__ */
index cf2a209..b817842 100644 (file)
@@ -58,6 +58,8 @@
 #define PART_RECENT_THUMBNAIL "part.recent.thumbnail"
 #define PART_RECENT_ICON "part.recent.icon"
 #define PART_RECENT_FAVORITE "part.recent.favorite"
+#define PART_RECENT_DELETE "part.recent.delete"
+#define PART_RECENT_DELETE_FOCUS "part.recent.delete.focus"
 #define PART_USER_EDIT_TITLE "part.user.edit.title"
 #define PART_USER_EDIT_BTN_DONE "part.user.edit.btn.done"
 #define PART_USER_EDIT_BTN_CANCEL "part.user.edit.btn.cancel"
 #define IMAGE_USER_DEFAULT_07_FOCUS IMAGEDIR"/ic_user_07_foc.png"
 #define IMAGE_USER_CURRENT_DEFAULT IMAGEDIR"/ic_user_profile_current_01_nor.png"
 #define IMAGE_USER_CURRENT_DEFAULT_FOCUS IMAGEDIR"/ic_user_profile_current_01_foc.png"
+#define IMAGE_RECENT_DELETE_NOR IMAGEDIR"/btn_bar_clearall_nor.png"
+#define IMAGE_RECENT_DELETE_FOC IMAGEDIR"/btn_bar_clearall_foc.png"
+#define IMAGE_RECENT_DELETE_DIS IMAGEDIR"/btn_bar_clearall_dis.png"
+#define IMAGE_RECENT_APP IMAGEDIR"/ic_thumbnail_app.png"
 
 #endif /* __AIR_HOME_DEFS_H__ */
index 460a06a..7a3c84d 100644 (file)
 #include "data_recent.h"
 #include "datamgr.h"
 #include "utils.h"
+#include "defs.h"
 
 /* FIXME: change default thumbnail */
 #define THUMB_DEFAULT "/usr/share/icons/default/small/apps_img_app_default_4x2.png"
 
-static struct datamgr_item *_new_datamgr_item(char *title, char *icon,
-               char *parameter, enum recent_item_type type)
+static struct datamgr_item *_new_datamgr_item(char *title, char *thumb,
+               char *parameter, char *icon, enum recent_item_type type)
 {
        struct datamgr_item *di;
 
@@ -40,7 +41,8 @@ static struct datamgr_item *_new_datamgr_item(char *title, char *icon,
        }
 
        di->title = strdup(title);
-       di->icon = strdup(icon);
+       di->icon = strdup(thumb);
+       di->focus_icon = strdup(icon);
        di->rtype = type;
        di->parameter = strdup(parameter);
        di->action = ITEM_SELECT_ACTION_LAUNCH;
@@ -87,7 +89,8 @@ static void _app_list_foreach(gpointer data, gpointer user_data)
        if (!strcmp(thumb_land, ""))
                thumb_land = THUMB_DEFAULT;
 
-       di = _new_datamgr_item(label, thumb_land, rdata->id, RECENT_ITEM_ICON);
+       di = _new_datamgr_item(label, thumb_land, rdata->id, IMAGE_RECENT_APP,
+                       RECENT_ITEM_ICON);
        if (di)
                dm->list = eina_list_append(dm->list, di);
 
@@ -181,11 +184,25 @@ static void _select(struct datamgr_item *di)
        }
 }
 
+void _clear(struct datamgr *dm)
+{
+       int r;
+
+       r = app_contents_recent_clear(CONTENTS_APP);
+       if (r != APP_CONTENTS_ERROR_NONE) {
+               _ERR("failed to clear app recent");
+               return;
+       }
+
+       /* It should be implemeted later about media contents */
+}
+
 static struct data_class dclass = {
        .init = _init,
        .fini = _fini,
        .get_items = _get_items,
-       .select = _select
+       .select = _select,
+       .clear = _clear
 };
 
 struct data_class *datamgr_recent_get_dclass(void)
index a9d398b..ac19f2d 100644 (file)
@@ -85,3 +85,16 @@ void datamgr_select_item(struct datamgr *dm, struct datamgr_item *di)
 
        dm->dclass->select(di);
 }
+
+void datamgr_clear_item(struct datamgr *dm)
+{
+       if (!dm || !dm->dclass) {
+               _ERR("Invalid argument");
+               return;
+       }
+
+       if (!dm->dclass->clear)
+               return;
+
+       dm->dclass->clear(dm);
+}
index cbc981f..c644ce2 100644 (file)
@@ -37,6 +37,7 @@ struct _priv {
        Evas_Object *box;
        Eina_List *list;
 
+       struct _bar_item *cur;
        struct datamgr *dm;
 };
 
@@ -47,26 +48,106 @@ struct _bar_item {
        struct _priv *priv;
 };
 
-static bool _add_delete_btn(struct _priv *priv, Evas_Object *base)
+static void _btn_focused(int id, void *data, Evas_Object *obj,
+               Elm_Object_Item *item)
+{
+       elm_object_signal_emit(obj, SIG_FOCUS, SRC_PROG);
+}
+
+static void _unfocused(int id, void *data, Evas_Object *obj,
+               Elm_Object_Item *item)
+{
+       elm_object_signal_emit(obj, SIG_UNFOCUS, SRC_PROG);
+}
+
+static void _hide_done(void *data, Evas_Object *obj, const char *emission,
+               const char *source)
+{
+       viewmgr_pop_view();
+}
+
+static void _dis_btn_key_down(int id, void *data, Evas *e, Evas_Object *obj,
+               Evas_Event_Key_Down *ev)
+{
+       struct _priv *priv;
+
+       if (!data)
+               return;
+
+       priv = data;
+
+       if (!strcmp(ev->keyname, KEY_BACK) ||
+                       !strcmp(ev->keyname, KEY_BACK_REMOTE) ||
+                       !strcmp(ev->keyname, KEY_DOWN)) {
+               elm_object_signal_emit(priv->base, SIG_HIDE_RECENT, SRC_PROG);
+       }
+}
+
+static input_handler dis_btn_handler = {
+       .key_down = _dis_btn_key_down
+};
+
+static void _btn_key_down(int id, void *data, Evas *e, Evas_Object *obj,
+               Evas_Event_Key_Down *ev)
+{
+       struct _priv *priv;
+
+       if (!data)
+               return;
+
+       priv = data;
+
+       if (!strcmp(ev->keyname, KEY_BACK) ||
+                       !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
+               elm_object_signal_emit(priv->base, SIG_HIDE_RECENT, SRC_PROG);
+       } else if (!strcmp(ev->keyname, KEY_ENTER) ||
+                       !strcmp(ev->keyname, KEY_ENTER_REMOTE)) {
+               datamgr_clear_item(priv->dm);
+               elm_object_signal_emit(priv->base, SIG_HIDE_RECENT, SRC_PROG);
+       } else if (!strcmp(ev->keyname, KEY_DOWN)) {
+               if (!priv->cur)
+                       priv->cur = eina_list_data_get(priv->list);
+               elm_object_focus_set(priv->cur->eo, EINA_TRUE);
+       }
+}
+
+static input_handler btn_handler = {
+       .focused = _btn_focused,
+       .unfocused = _unfocused,
+       .key_down = _btn_key_down
+};
+
+static void _add_delete_btn(struct _priv *priv, const char *ic_image,
+               const char *focus_ic_image, input_handler *handler)
 {
-       Evas_Object *btn;
+       Evas_Object *btn, *ic, *focus_ic;
 
-       btn = utils_add_layout(base, GRP_RECENT_DELETE, true,
+       btn = utils_add_layout(priv->base, GRP_RECENT_DELETE, true,
                        PART_RECENT_DELETE_ICON);
        if (!btn) {
                _ERR("failed to add delete icon");
-               return false;
+               return;
        }
+       evas_object_show(btn);
 
-       priv->del_btn = btn;
+       ic = utils_add_icon(btn, ic_image, PART_RECENT_DELETE);
+       if (!ic) {
+               _ERR("failed to add icon");
+               evas_object_del(btn);
+               return;
+       }
 
-       return true;
-}
+       focus_ic = utils_add_icon(btn, focus_ic_image,
+                       PART_RECENT_DELETE_FOCUS);
+       if (!focus_ic) {
+               _ERR("failed to add focus icon");
+               evas_object_del(btn);
+               return;
+       }
 
-static void _hide_done(void *data, Evas_Object *obj, const char *emission,
-               const char *source)
-{
-       viewmgr_pop_view();
+       inputmgr_add_callback(btn, 0, handler, priv);
+
+       priv->del_btn = btn;
 }
 
 static Evas_Object *_create(Evas_Object *win, void *data)
@@ -108,14 +189,6 @@ static Evas_Object *_create(Evas_Object *win, void *data)
        priv->base = base;
        priv->dm = dm;
 
-       if (!_add_delete_btn(priv, base)) {
-               _ERR("failed to add recent");
-               evas_object_del(base);
-               datamgr_fini(dm);
-               free(priv);
-               return NULL;
-       }
-
        viewmgr_set_view_data(VIEW_RECENT, priv);
        elm_object_signal_callback_add(base, SIG_HIDE_RECENT_DONE, SRC_EDJE,
                        _hide_done, NULL);
@@ -123,18 +196,6 @@ static Evas_Object *_create(Evas_Object *win, void *data)
        return base;
 }
 
-static void _focused(int id, void *data, Evas_Object *obj,
-               Elm_Object_Item *item)
-{
-       elm_object_signal_emit(obj, SIG_FOCUS, SRC_PROG);
-}
-
-static void _unfocused(int id, void *data, Evas_Object *obj,
-               Elm_Object_Item *item)
-{
-       elm_object_signal_emit(obj, SIG_UNFOCUS, SRC_PROG);
-}
-
 static void _eo_key_down(int id, void *data, Evas *e, Evas_Object *obj,
                Evas_Event_Key_Down *ev)
 {
@@ -156,8 +217,22 @@ static void _eo_key_down(int id, void *data, Evas *e, Evas_Object *obj,
        }
 }
 
+static void _eo_focused(int id, void *data, Evas_Object *obj,
+               Elm_Object_Item *item)
+{
+       struct _bar_item *bi;
+
+       if (!data)
+               return;
+
+       elm_object_signal_emit(obj, SIG_FOCUS, SRC_PROG);
+
+       bi = data;
+       bi->priv->cur = bi;
+}
+
 static input_handler eo_handler = {
-       .focused = _focused,
+       .focused = _eo_focused,
        .unfocused = _unfocused,
        .key_down = _eo_key_down
 };
@@ -165,7 +240,7 @@ static input_handler eo_handler = {
 static struct _bar_item *_pack_item(struct _priv *priv, Evas_Object *box,
                struct datamgr_item *di)
 {
-       Evas_Object *eo, *lbl, *sub_lbl, *ic;
+       Evas_Object *eo, *lbl, *sub_lbl, *thumb, *ic;
        struct _bar_item *bi;
        const char *group;
 
@@ -194,14 +269,18 @@ static struct _bar_item *_pack_item(struct _priv *priv, Evas_Object *box,
        }
        evas_object_show(eo);
 
-       ic = utils_add_icon(eo, di->icon, PART_RECENT_THUMBNAIL);
-       if (!ic) {
-               _ERR("failed to add icon");
+       thumb = utils_add_icon(eo, di->icon, PART_RECENT_THUMBNAIL);
+       if (!thumb) {
+               _ERR("failed to add thumb");
                evas_object_del(eo);
                free(bi);
                return NULL;
        }
-       elm_image_fill_outside_set(ic, EINA_TRUE);
+       elm_image_fill_outside_set(thumb, EINA_TRUE);
+
+       ic = utils_add_icon(eo, di->focus_icon, PART_RECENT_ICON);
+       if (!ic)
+               _ERR("failed to add icon");
 
        lbl = utils_add_label(eo, di->title, STYLE_LABEL_RECENT_TITLE,
                        PART_RECENT_TITLE);
@@ -220,6 +299,7 @@ static struct _bar_item *_pack_item(struct _priv *priv, Evas_Object *box,
                        _ERR("failed to add sub title");
        }
 
+       elm_object_focus_next_object_set(eo, priv->del_btn, ELM_FOCUS_UP);
        inputmgr_add_callback(eo, 0, &eo_handler, bi);
        elm_box_pack_end(box, eo);
 
@@ -240,6 +320,8 @@ static void _load_recent(struct _priv *priv)
        if (!list) {
                elm_object_part_text_set(priv->base, PART_RECENT_NO_CONTENTS,
                                MESSAGE_NO_CONTENTS);
+               _add_delete_btn(priv, IMAGE_RECENT_DELETE_DIS,
+                               IMAGE_RECENT_DELETE_DIS, &dis_btn_handler);
                return;
        }
 
@@ -260,6 +342,9 @@ static void _load_recent(struct _priv *priv)
        elm_object_part_text_set(priv->base, PART_RECENT_NO_CONTENTS, "");
        elm_box_padding_set(box, PADDING_BOX * elm_config_scale_get(), 0);
 
+       _add_delete_btn(priv, IMAGE_RECENT_DELETE_NOR, IMAGE_RECENT_DELETE_FOC,
+                       &btn_handler);
+
        EINA_LIST_FOREACH(list, l, di) {
                bi = _pack_item(priv, box, di);
                if (!bi)
@@ -289,11 +374,12 @@ static void _show(void *data)
 
        _load_recent(priv);
 
-       if (!priv->list)
-               return;
-
-       bi = eina_list_data_get(priv->list);
-       elm_object_focus_set(bi->eo, EINA_TRUE);
+       if (!priv->list) {
+               elm_object_focus_set(priv->del_btn, EINA_TRUE);
+       } else {
+               bi = eina_list_data_get(priv->list);
+               elm_object_focus_set(bi->eo, EINA_TRUE);
+       }
 }
 
 static void _unload_recent(struct _priv *priv)
@@ -308,6 +394,10 @@ static void _unload_recent(struct _priv *priv)
 
        elm_box_clear(priv->box);
        evas_object_del(priv->scr);
+       inputmgr_remove_callback(priv->del_btn, &btn_handler);
+       evas_object_del(priv->del_btn);
+
+       priv->del_btn = NULL;
        priv->box = NULL;
        priv->scr = NULL;
        priv->list = NULL;