2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.1 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <Elementary.h>
19 #include <package_manager.h>
20 #include <package_info.h>
21 #include <app_control.h>
23 #include "homescreen-efl.h"
27 #include "folder_panel.h"
28 #include "option_menu.h"
29 #include "folder_panel.h"
32 #include "data_model.h"
34 #define MAX_BADGE_COUNT_STR_LEN 32
35 #define MAX_BADGE_DISPLAY_COUNT 999
36 #define ABOVE_MAX_BADGE_APPENDIX "+"
39 Evas_Object *icon_layout;
40 Evas_Object *icon_image;
47 .runned_app_id = NULL,
48 .click_ignore = false,
51 static void __app_icon_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
52 static void __app_icon_pressed_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
53 static void __app_icon_launch_request_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *data);
54 static bool __app_icon_check_removeable_state(Evas_Object *icon);
55 static void __app_icon_check_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
56 static void __app_icon_uncheck_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
57 static Evas_Object *__app_icon_load(Evas_Object *parent, const char *icon_path);
58 static void __app_icon_uninstall_button_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
59 static void __app_icon_highlight_folder_icon_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
60 static void __app_icon_unhighlight_folder_icon_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
61 static void __app_icon_higlight_impossible_folder_icon_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
63 /*=========================================PUBLIC FUNCTIONS IMPLEMENTATION===========================================*/
64 HAPI Evas_Object *app_icon_create(Tree_node_t *tree_data, app_icon_type_t type)
66 Evas_Object *icon_image = NULL, *icon_layout = NULL, *folder_icon_layout = NULL;
67 Evas_Object *parent = home_screen_get_win();
68 app_item_t *item = NULL;
70 if (!parent || !tree_data) {
71 LOGE("[INVALID_PARAM][parent='%p'][item='%p']", parent, tree_data);
75 item = tree_data->data;
77 LOGE("[FAILED][item='%p']", item);
81 if (type == APP_ICON_TYPE_APP || type == APP_ICON_TYPE_FOLDER) {
82 icon_layout = util_create_edje_layout(parent, util_get_res_file_path(EDJE_DIR"/icon.edj"), GROUP_ICON_LY);
84 LOGE("Failed to create icon layout");
88 elm_object_signal_callback_add(icon_layout, SIGNAL_CHECKBOX_CHECKED, SIGNAL_SOURCE,
89 __app_icon_check_cb, tree_data);
90 elm_object_signal_callback_add(icon_layout, SIGNAL_CHECKBOX_UNCHECKED, SIGNAL_SOURCE,
91 __app_icon_uncheck_cb, tree_data);
92 elm_object_signal_callback_add(icon_layout, SIGNAL_UNINSTALL_BUTTON_CLICKED, SIGNAL_SOURCE,
93 __app_icon_uninstall_button_clicked_cb, tree_data);
95 elm_object_signal_callback_add(icon_layout, "mouse,down,1", SIGNAL_PRESS_SOURCE,
96 __app_icon_pressed_cb, (void *)item->type);
98 home_screen_mvc_set_ly_scale(icon_layout);
101 if (type == APP_ICON_TYPE_APP) {
102 icon_image = __app_icon_load(icon_layout, item->icon);
104 LOGE("Failed to create icon layout");
105 evas_object_del(icon_layout);
109 elm_object_part_content_set(icon_layout, PART_ICON_CONTENT, icon_image);
110 elm_object_signal_callback_add(icon_layout, SIGNAL_ICON_CLICKED, SIGNAL_SOURCE, __app_icon_clicked_cb, (void *)item->appid);
112 app_icon_set_label(icon_layout, item->label);
114 if (item->badge_count > 0)
115 app_icon_show_badge(icon_layout, item->badge_count);
117 evas_object_show(icon_image);
118 } else if (type == APP_ICON_TYPE_FOLDER) {
119 folder_icon_layout = elm_layout_add(parent);
120 if (!folder_icon_layout) {
121 LOGE("Failed to create icon layout");
122 evas_object_del(icon_layout);
126 if (!elm_layout_file_set(folder_icon_layout, util_get_res_file_path(EDJE_DIR"/folder.edj"), GROUP_FOLDER_ICON_LAYOUT)) {
127 LOGE("Failed to load edje file for layout");
128 evas_object_del(folder_icon_layout);
129 evas_object_del(icon_layout);
133 elm_object_part_content_set(icon_layout, PART_ICON_CONTENT, folder_icon_layout);
134 elm_object_signal_callback_add(icon_layout, SIGNAL_HIGHLIGHT_FOLDER, SIGNAL_SOURCE, __app_icon_highlight_folder_icon_cb, item);
135 elm_object_signal_callback_add(icon_layout, SIGNAL_HIGHLIGHT_IMPOSSIBLE_FOLDER, SIGNAL_SOURCE, __app_icon_higlight_impossible_folder_icon_cb, item);
136 elm_object_signal_callback_add(icon_layout, SIGNAL_UNHIGHLIGHT_FOLDER, SIGNAL_SOURCE, __app_icon_unhighlight_folder_icon_cb, item);
137 app_icon_set_label(icon_layout, item->label);
138 evas_object_show(folder_icon_layout);
140 /*create miniatures*/
142 icon_layout = __app_icon_load(parent, item->icon);
144 LOGE("Failed to create icon layout");
150 evas_object_size_hint_align_set(icon_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
151 evas_object_size_hint_weight_set(icon_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
152 evas_object_show(icon_layout);
154 evas_object_data_set(icon_layout, KEY_ICON_DATA, tree_data);
155 evas_object_data_set(icon_layout, KEY_IS_REPOSITIONABLE, (void *)true);
160 HAPI void app_icon_update_folder_icon(Tree_node_t *folder_node)
163 Evas_Object *miniatures_list_item = NULL;
164 Evas_Object *folder_icon = NULL;
165 Evas_Object *item = NULL;
166 Eina_List *it = NULL;
168 folder_data_t *folder_data = NULL;
169 app_item_t *tree_item = NULL;
171 char part_buf[BUF_SIZE];
172 char signal_buf[BUF_SIZE];
175 int miniatures_iterator = 0;
177 if (!folder_node || !folder_node->data || !folder_node->data->layout || !folder_node->data->data) {
178 LOGE("[INVALID_PARAMS]");
182 folder_icon = elm_object_part_content_get(folder_node->data->layout, PART_ICON_CONTENT);
184 LOGE("Failed to get folder icon");
188 folder_data = (folder_data_t *)folder_node->data->data;
191 LOGE("Failed to get folder_data");
195 EINA_LIST_FOREACH(folder_data->miniatures, it, miniatures_list_item) {
196 snprintf(part_buf, sizeof(part_buf), "miniature_%d", miniatures_iterator++);
197 elm_object_part_content_unset(folder_icon, part_buf);
198 evas_object_del(miniatures_list_item);
200 folder_data->miniatures = eina_list_free(folder_data->miniatures);
201 folder_data->miniatures = NULL;
203 if (!folder_node->first || !(miniatures = folder_node->first->count)) {
204 elm_object_signal_emit(folder_icon, SIGNAL_EMPTY_BG_SHOW, SIGNAL_SOURCE);
208 if (miniatures >= 3) {
212 miniatures_iterator = 0;
213 TREE_NODE_FOREACH(folder_node->first, it2)
215 tree_item = it2->data;
218 if (miniatures_iterator >= FOLDER_ICON_MAX_MINIATURES)
220 LOGI("label %s", tree_item->label);
221 item = app_icon_create(it2, APP_ICON_TYPE_MINIATURE);
226 folder_data->miniatures = eina_list_append(folder_data->miniatures, item);
227 if (!folder_data->miniatures) {
228 app_icon_destroy(item);
232 snprintf(part_buf, sizeof(part_buf), "miniature_%d", miniatures_iterator++);
233 elm_object_part_content_set(folder_icon, part_buf, item);
237 snprintf(signal_buf, sizeof(signal_buf), "set,miniatures,%d", miniatures);
238 elm_object_signal_emit(folder_icon, signal_buf, SIGNAL_SOURCE);
241 HAPI void app_icon_highlight_folder_icon(Evas_Object *folder_icon_layout, folder_icon_frame_type_t frame_type)
243 Evas_Object *icon = NULL;
244 Tree_node_t *node = NULL;
246 if (!folder_icon_layout) {
247 LOGE("Invalid parameter");
251 icon = elm_object_part_content_get(folder_icon_layout, PART_ICON_CONTENT);
253 LOGE("Failed to get icon");
257 node = evas_object_data_get(folder_icon_layout, KEY_ICON_DATA);
259 LOGE("[FAILED][node=NULL]");
263 LOGI("count %d ", node->count);
265 if (frame_type == FOLDER_ICON_FRAME_POSSIBLE) {
266 elm_object_signal_emit(icon, SIGNAL_FRAME_POSSIBLE_SHOW, SIGNAL_SOURCE);
267 } else if (frame_type == FOLDER_ICON_FRAME_IMPOSSIBLE) {
268 elm_object_signal_emit(icon, SIGNAL_FRAME_IMPOSSIBLE_SHOW, SIGNAL_SOURCE);
270 elm_object_signal_emit(icon, SIGNAL_FRAME_HIDE, SIGNAL_SOURCE);
274 HAPI void app_icon_set_click_ignore(bool ignore)
276 s_info.click_ignore = ignore;
277 folder_panel_set_click_ignore_state(ignore);
280 HAPI bool app_icon_set_view_mode(Evas_Object *icon, homescreen_view_t view, bool in_folder)
282 Tree_node_t *node = NULL;
285 case HOMESCREEN_VIEW_ALL_APPS:
286 in_folder ? elm_object_signal_emit(icon, SIGNAL_EDIT_MODE_BLACK_OFF, SIGNAL_SOURCE) :
287 elm_object_signal_emit(icon, SIGNAL_EDIT_MODE_OFF, SIGNAL_SOURCE);
288 elm_object_signal_emit(icon, SIGNAL_UNINSTALL_BUTTON_HIDE, SIGNAL_SOURCE);
289 elm_object_signal_emit(icon, SIGNAL_CHECKBOX_HIDE, SIGNAL_SOURCE);
290 app_icon_set_click_ignore(false);
292 case HOMESCREEN_VIEW_ALL_APPS_EDIT:
293 in_folder ? elm_object_signal_emit(icon, SIGNAL_EDIT_MODE_BLACK_ON, SIGNAL_SOURCE) :
294 elm_object_signal_emit(icon, SIGNAL_EDIT_MODE_ON, SIGNAL_SOURCE);
295 if (__app_icon_check_removeable_state(icon))
296 elm_object_signal_emit(icon, SIGNAL_UNINSTALL_BUTTON_SHOW, SIGNAL_SOURCE);
297 app_icon_set_click_ignore(true);
299 case HOMESCREEN_VIEW_ALL_APPS_CHOOSE:
300 in_folder ? elm_object_signal_emit(icon, SIGNAL_EDIT_MODE_BLACK_ON, SIGNAL_SOURCE) :
301 elm_object_signal_emit(icon, SIGNAL_EDIT_MODE_ON, SIGNAL_SOURCE);
302 elm_object_signal_emit(icon, SIGNAL_UNINSTALL_BUTTON_HIDE, SIGNAL_SOURCE);
304 node = evas_object_data_get(icon, KEY_ICON_DATA);
305 if (node && node->data->type != APP_ITEM_FOLDER)
306 elm_object_signal_emit(icon, SIGNAL_CHECKBOX_SHOW_UNCHECKED, SIGNAL_SOURCE);
308 elm_object_signal_emit(icon, SIGNAL_CHECKBOX_HIDE, SIGNAL_SOURCE);
310 app_icon_set_click_ignore(true);
312 case HOMESCREEN_VIEW_HOME:
313 case HOMESCREEN_VIEW_HOME_EDIT:
314 case HOMESCREEN_VIEW_HOME_ALL_PAGES:
316 app_icon_set_click_ignore(true);
323 HAPI void app_icon_set_label(Evas_Object *icon_layout, const char* label)
325 if (!icon_layout || !label) {
326 LOGE("Invalid parameter");
330 elm_object_part_text_set(icon_layout, PART_ICON_NAME, label);
333 HAPI void app_icon_set_label_black(Evas_Object *icon_layout)
335 if (home_screen_get_view_type() == HOMESCREEN_VIEW_ALL_APPS_EDIT) {
336 elm_object_signal_emit(icon_layout, SIGNAL_EDIT_MODE_BLACK_ON, SIGNAL_SOURCE);
338 elm_object_signal_emit(icon_layout, SIGNAL_BLACK_TEXT, SIGNAL_SOURCE);
342 HAPI void app_icon_set_color(Evas_Object *icon_layout, int r, int g, int b, int a)
345 LOGE("Failed to get folder icon layout");
349 evas_object_color_set(icon_layout, r, g, b, a);
352 HAPI void app_icon_destroy(Evas_Object *icon_layout)
355 LOGE("Invalid parameter : icon_layout is NULL");
359 evas_object_del(icon_layout);
363 HAPI void app_icon_show_badge(Evas_Object *app_icon_layout, const unsigned int number)
365 char number_str[MAX_BADGE_COUNT_STR_LEN];
367 if (!app_icon_layout) {
368 LOGE("Invalid state of the application - icon_layout is NULL");
373 app_icon_hide_badge(app_icon_layout);
377 if (number > MAX_BADGE_DISPLAY_COUNT) {
378 eina_convert_itoa(MAX_BADGE_DISPLAY_COUNT, number_str);
379 strncat(number_str, ABOVE_MAX_BADGE_APPENDIX, MAX_BADGE_COUNT_STR_LEN);
381 eina_convert_itoa(number, number_str);
384 elm_layout_text_set(app_icon_layout, "icon_badge_text", number_str);
386 elm_object_signal_emit(app_icon_layout, SIGNAL_BADGE_SHOW, SIGNAL_SOURCE);
389 HAPI void app_icon_hide_badge(Evas_Object *app_icon_layout)
391 if (!app_icon_layout) {
392 LOGE("Invalid state of the application - icon_layout is NULL");
396 elm_object_signal_emit(app_icon_layout, SIGNAL_BADGE_HIDE, SIGNAL_SOURCE);
399 HAPI void app_icon_show_label(Evas_Object *app_icon_layout)
401 Evas_Object *icon = NULL;
403 if (app_icon_layout) {
404 icon = elm_object_part_content_get(app_icon_layout, PART_ICON_CONTENT);
406 elm_object_signal_emit(icon, SIGNAL_LABEL_SHOW, SIGNAL_SOURCE);
410 HAPI void app_icon_hide_label(Evas_Object *app_icon_layout)
412 Evas_Object *icon = NULL;
414 if (app_icon_layout) {
415 icon = elm_object_part_content_get(app_icon_layout, PART_ICON_CONTENT);
417 elm_object_signal_emit(icon, SIGNAL_LABEL_HIDE, SIGNAL_SOURCE);
421 HAPI void app_icon_remove(Evas_Object *icon_layout)
424 LOGE("[INVALID_PARAM]");
428 evas_object_data_del(icon_layout, KEY_ICON_DATA);
429 evas_object_del(icon_layout);
433 /*=========================================PRIVATE FUNCTIONS IMPLEMENTATION======================================*/
434 static void __app_icon_launch_request_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *data)
436 LOGD("[__app_icon_launch_request_cb]");
438 case APP_CONTROL_RESULT_CANCELED:
439 LOGD("[APP_CONTROL_RESULT_CANCELED]");
440 s_info.runned_app_id = NULL;
442 case APP_CONTROL_RESULT_FAILED:
443 LOGD("[APP_CONTROL_RESULT_FAILED]");
444 s_info.runned_app_id = NULL;
446 case APP_CONTROL_RESULT_SUCCEEDED:
447 LOGD("[APP_CONTROL_RESULT_SUCCEEDED]");
450 LOGD("UNKNOWN ERROR");
451 s_info.runned_app_id = NULL;
456 static void __app_icon_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
458 char *appid = (char *) data;
459 app_control_h app_control_handle = NULL;
462 LOGE("Failed to obtain pgk_id of clicked application");
466 if (s_info.click_ignore == false) {
467 if (!s_info.runned_app_id) {
468 folder_panel_close_folder();
470 if (app_control_create(&app_control_handle) != APP_CONTROL_ERROR_NONE) {
471 LOGE("[FAILED][app_control_create]");
475 if (app_control_set_app_id(app_control_handle, appid) != APP_CONTROL_ERROR_NONE) {
476 LOGE("[FAILED][app_control_set_app_id]");
477 app_control_destroy(app_control_handle);
481 if (app_control_send_launch_request(app_control_handle, __app_icon_launch_request_cb, NULL) != APP_CONTROL_ERROR_NONE) {
482 LOGE("[FAILED][app_control_send_launch_request]");
483 app_control_destroy(app_control_handle);
486 app_control_destroy(app_control_handle);
492 static void __app_icon_pressed_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
494 app_item_type_t type = (app_item_type_t)data;
496 if (type == APP_ITEM_FOLDER ||
497 home_screen_get_view_type() == HOMESCREEN_VIEW_ALL_APPS)
498 elm_object_signal_emit(obj, SIGNAL_ICON_PRESS, SIGNAL_PRESS_SOURCE);
501 static bool __app_icon_check_removeable_state(Evas_Object *icon)
503 Tree_node_t *item = NULL;
505 LOGE("[INVALID_PARAM][icon='%p']", icon);
509 item = evas_object_data_get(icon, KEY_ICON_DATA);
511 LOGE("[FAILED][evas_object_data_get]");
516 LOGE("[FAILED][item->data='%p']", item->data);
520 return item->data->removable;
523 static void __app_icon_check_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
525 folder_checked_t check_info = FOLDER_PANEL_CHECKED_NONE;
526 Tree_node_t *node = (Tree_node_t *)data;
527 app_item_t *item = node->data;
529 char trbuf[PATH_MAX] = {0, };
531 if (item->type == APP_ITEM_ICON) {
532 item->is_checked = true;
533 if (node->parent->parent->data->type == APP_ITEM_FOLDER) {
535 check_info = folder_panel_set_content_checked(node->parent->parent);
537 switch (check_info) {
538 case FOLDER_PANEL_CHECKED_NONE:
539 elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_HIDE, SIGNAL_SOURCE);
541 case FOLDER_PANEL_CHECKED_ANY:
542 elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_SHOW_DIMMED, SIGNAL_SOURCE);
544 case FOLDER_PANEL_CHECKED_ALL:
545 elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_SHOW_CHECKED, SIGNAL_SOURCE);
549 } else if (item->type == APP_ITEM_FOLDER) {
550 data_model_check_all_apps(node, true);
552 option_menu_update_on_item_selected();
554 count = data_model_get_app_check_state();
555 if (count > FOLDER_MAX_ITEMS) {
556 __app_icon_uncheck_cb(data, obj, SIGNAL_CHECKBOX_UNCHECKED, SIGNAL_SOURCE);
557 elm_object_signal_emit(node->data->layout, SIGNAL_CHECKBOX_SHOW_UNCHECKED, SIGNAL_SOURCE);
559 popup_data_t *p_data = popup_create_data();
561 LOGE("[FAILED][failed to create popup data]");
565 snprintf(trbuf, sizeof(trbuf), _("IDS_HS_TPOP_MAXIMUM_NUMBER_OF_APPLICATIONS_IN_FOLDER_HPD_REACHED"),
568 p_data->type = POPUP_INFO;
569 p_data->popup_title_text = NULL;
570 p_data->popup_content_text = strdup(trbuf);
571 p_data->popup_confirm_text = NULL;
572 p_data->popup_cancel_text = NULL;
573 p_data->orientation = ELM_POPUP_ORIENT_CENTER;
574 p_data->visible_time = 2.0;
576 popup_show(p_data, NULL, NULL, NULL);
580 static void __app_icon_uncheck_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
582 folder_checked_t check_info = FOLDER_PANEL_CHECKED_NONE;
584 Tree_node_t *node = (Tree_node_t *)data;
585 app_item_t *item = node->data;
586 if (item->type == APP_ITEM_ICON) {
587 item->is_checked = false;
589 if (node->parent->parent->data->type == APP_ITEM_FOLDER) {
591 check_info = folder_panel_set_content_checked(node->parent->parent);
593 switch (check_info) {
594 case FOLDER_PANEL_CHECKED_NONE:
595 elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_HIDE, SIGNAL_SOURCE);
597 case FOLDER_PANEL_CHECKED_ANY:
598 elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_SHOW_DIMMED, SIGNAL_SOURCE);
600 case FOLDER_PANEL_CHECKED_ALL:
601 elm_object_signal_emit(node->parent->parent->data->layout, SIGNAL_CHECKBOX_SHOW_CHECKED, SIGNAL_SOURCE);
605 } else if (item->type == APP_ITEM_FOLDER) {
606 data_model_check_all_apps(node, false);
607 elm_object_signal_emit(item->layout, SIGNAL_CHECKBOX_HIDE, SIGNAL_SOURCE);
609 option_menu_update_on_item_selected();
612 Evas_Object *__app_icon_load(Evas_Object *parent, const char *icon_path)
614 Evas_Object *icon_image = NULL;
616 if (!parent || !icon_path) {
617 LOGE("Invalid parameter");
621 icon_image = elm_image_add(parent);
623 LOGE("Failed to create an icon.");
627 if ((strncmp("", icon_path, strlen(icon_path)) && elm_image_file_set(icon_image, icon_path, NULL)) || elm_image_file_set(icon_image, util_get_res_file_path(DEFAULT_APP_ICON), NULL))
630 evas_object_del(icon_image);
634 static void __app_icon_uninstall_button_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
636 LOGI("__app_icon_uninstall_button_clicked_cb");
637 Tree_node_t *app_node = NULL;
638 char buf[BUF_SIZE] = {0, };
640 app_node = (Tree_node_t *) data;
642 LOGE("[FAILED][evas_object_data_get]");
646 if (!app_node->data || !app_node->data->label) {
647 LOGE("[INVALID][invalid node data]");
651 popup_data_t *p_data = popup_create_data();
653 LOGE("[FAILED][failed to create popup data]");
657 if ((app_node->data->type == APP_ITEM_FOLDER) && (folder_panel_get_items_count(app_node) > 0)) {
658 p_data->type = POPUP_TWO_BUTTONS;
659 p_data->popup_title_text = strdup(_("IDS_HS_HEADER_REMOVE_FOLDER_ABB"));
660 p_data->popup_content_text = strdup(_("IDS_HS_BODY_FOLDER_WILL_BE_REMOVED_APPLICATIONS_IN_THIS_FOLDER_WILL_NOT_BE_UNINSTALLED"));
661 p_data->popup_confirm_text = strdup(_("IDS_ST_BUTTON_REMOVE_ABB2"));
662 p_data->popup_cancel_text = strdup(_("IDS_CAM_SK_CANCEL"));
663 p_data->orientation = ELM_POPUP_ORIENT_CENTER;
664 popup_show(p_data, app_icon_uninstall, NULL, (void *) obj);
665 } else if (app_node->data->type == APP_ITEM_ICON) {
666 snprintf(buf, sizeof(buf), _("IDS_HS_POP_PS_WILL_BE_UNINSTALLED"), app_node->data->label);
667 p_data->type = POPUP_TWO_BUTTONS;
668 p_data->popup_title_text = strdup(_("IDS_AT_BODY_UNINSTALL"));
669 p_data->popup_content_text = strdup(buf);
670 p_data->popup_confirm_text = strdup(_("IDS_AT_BODY_UNINSTALL"));
671 p_data->popup_cancel_text = strdup(_("IDS_CAM_SK_CANCEL"));
672 p_data->orientation = ELM_POPUP_ORIENT_CENTER;
673 popup_show(p_data, app_icon_uninstall, NULL, (void *) obj);
675 app_icon_uninstall((void *) obj);
676 popup_data_free(p_data);
680 void app_icon_uninstall(void *data)
682 Tree_node_t *app_node = NULL;
683 Evas_Object *icon = NULL;
685 icon = (Evas_Object *) data;
687 LOGE("[INVALID_PARAM][data='%p']", data);
691 LOGI("[%s]", evas_object_type_get(icon));
693 app_node = evas_object_data_get(icon, KEY_ICON_DATA);
694 if (!app_node || !app_node->data) {
695 LOGE("[FAILED][evas_object_data_get]");
699 all_apps_detach_from_grid(app_node->data->grid_item);
700 app_node->data->grid_item = NULL;
701 app_icon_remove(icon);
702 app_node->data->layout = NULL;
704 home_screen_mvc_item_uninstall_cb(app_node);
707 static void __app_icon_highlight_folder_icon_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
709 Evas_Object *icon = elm_object_part_content_get(obj, PART_ICON_CONTENT);
710 elm_object_signal_emit(icon, SIGNAL_FRAME_POSSIBLE_SHOW, SIGNAL_SOURCE);
713 static void __app_icon_unhighlight_folder_icon_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
715 Evas_Object *icon = elm_object_part_content_get(obj, PART_ICON_CONTENT);
716 elm_object_signal_emit(icon, SIGNAL_FRAME_HIDE, SIGNAL_SOURCE);
719 static void __app_icon_higlight_impossible_folder_icon_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
721 Evas_Object *icon = elm_object_part_content_get(obj, PART_ICON_CONTENT);
722 elm_object_signal_emit(icon, SIGNAL_FRAME_IMPOSSIBLE_SHOW, SIGNAL_SOURCE);
724 /*===============================================================================================================*/