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>
18 #include <widget_viewer_evas.h>
19 #include <widget_errno.h>
22 #include "homescreen-efl.h"
23 #include "livebox/livebox_widget.h"
24 #include "livebox/livebox_panel.h"
25 #include "livebox/livebox_utils.h"
27 #include "data_model.h"
28 #include "page_scroller.h"
32 static int __livebox_widget_get_pkg_list_cb(const char *pkg_id, const char *widget_id, int is_prime, void *data);
34 static int request_cb(const char *appid,
37 const char *content_info,
44 static void update_content_info(Evas_Object *widget, const char *content_info);
47 Eina_List *widget_list;
52 void livebox_widget_init(void)
56 ret = widget_service_get_widget_list(__livebox_widget_get_pkg_list_cb, NULL);
58 if (ret == WIDGET_ERROR_INVALID_PARAMETER ||
59 ret == WIDGET_ERROR_IO_ERROR ||
60 ret == WIDGET_ERROR_PERMISSION_DENIED) {
61 LOGE("FAILED TO GET PKGLIST. ERROR CODE: %d", ret);
64 LOGI("SUCCESS TO GET PKGLIST. COUNT: %d", ret);
67 widget_viewer_evas_init(home_screen_get_win());
69 ret = shortcut_set_request_cb(request_cb, NULL);
71 LOGE("Failed to add shortcut event listener: 0x%X\n", ret);
74 Eina_List *livebox_widget_get_list(void)
76 if (!s_info.widget_list) {
77 LOGE("s_info.widget_list == NULL");
81 return s_info.widget_list;
84 static void widget_content_info_updated_cb(void *data, Evas_Object *obj, void *event_info)
86 widget_evas_event_info_s *info = event_info;
87 const char *content_info;
89 if (info->error != WIDGET_ERROR_NONE || !info->widget_app_id)
92 content_info = widget_viewer_evas_get_content_info(obj);
93 LOGD("Content inf is updated [%s] - [%s]\n", info->widget_app_id, content_info);
95 update_content_info(obj, content_info);
99 Evas_Object *livebox_widget_add(const char *pkg_name, Evas_Object *parent, char *content_info)
101 Evas_Object *livebox = widget_viewer_evas_add_widget(parent, pkg_name, content_info, WIDGET_VIEWER_EVAS_DEFAULT_PERIOD);
103 LOGE("livebox == NULL");
107 evas_object_smart_callback_add(livebox, WIDGET_SMART_SIGNAL_EXTRA_INFO_UPDATED, widget_content_info_updated_cb, NULL);
112 void livebox_widget_del(Evas_Object *widget)
115 LOGE("widget == NULL");
119 LOGI("DELETING WIDGET: %s", widget_viewer_evas_get_widget_id(widget));
120 widget_viewer_evas_set_permanent_delete(widget, 1);
123 void livebox_widget_fini(void)
126 widget_info_t *widget = NULL;
128 if (!s_info.widget_list) {
129 LOGE("s_info.widget_list == NULL");
133 EINA_LIST_FOREACH(s_info.widget_list, l, widget) {
135 LOGE("widget == NULL");
139 free(widget->pkg_id);
140 free(widget->widget_id);
143 eina_list_free(s_info.widget_list);
146 void livebox_widget_viewer_paused(void)
149 ret = widget_viewer_evas_notify_paused_status_of_viewer();
150 LOGD("Viewer is paused: %d\n", ret);
153 void livebox_widget_viewer_resumed(void)
155 Evas_Object *page = NULL;
156 Eina_List *lb_layouts = NULL;
158 Eina_List *l2 = NULL;
159 Eina_List *pages = NULL;
160 Evas_Object *widget = NULL;
161 Evas_Object *lb_layout = NULL;
162 const char *content_info = NULL;
164 static Eina_Bool app_created = EINA_TRUE;
166 ret = widget_viewer_evas_notify_resumed_status_of_viewer();
167 LOGD("Viewer is resumed: %d\n", ret);
170 app_created = EINA_FALSE;
174 pages = page_scroller_get_all_pages(livebox_panel_get());
177 LOGE("pages == NULL");
181 EINA_LIST_FOREACH(pages, l, page) {
183 LOGE("page == NULL");
187 lb_layouts = livebox_utils_get_liveboxes_on_page_list(page);
189 LOGE("lb_layouts == NULL");
193 EINA_LIST_FOREACH(lb_layouts, l2, lb_layout) {
195 LOGE("lb_layout == NULL");
199 widget = elm_layout_content_get(lb_layout, PART_LIVEBOX);
201 LOGE("widget == NULL");
205 content_info = widget_viewer_evas_get_content_info(widget);
206 update_content_info(widget, content_info);
208 LOGD("Content inf is updated [%s] - [%s]\n",
209 widget_viewer_evas_get_widget_id(widget),
215 void livebox_widget_get_dimensions(int size, int *x, int *y)
218 LOGE("Wrong arguments provided: %p %p", x, y);
223 case WIDGET_SIZE_TYPE_1x1:
227 case WIDGET_SIZE_TYPE_2x1:
231 case WIDGET_SIZE_TYPE_2x2:
235 case WIDGET_SIZE_TYPE_4x1:
239 case WIDGET_SIZE_TYPE_4x2:
243 case WIDGET_SIZE_TYPE_4x3:
247 case WIDGET_SIZE_TYPE_4x4:
251 case WIDGET_SIZE_TYPE_4x5:
255 case WIDGET_SIZE_TYPE_4x6:
259 case WIDGET_SIZE_TYPE_EASY_1x1:
263 case WIDGET_SIZE_TYPE_EASY_3x1:
267 case WIDGET_SIZE_TYPE_EASY_3x3:
271 case WIDGET_SIZE_TYPE_FULL:
275 case WIDGET_SIZE_TYPE_UNKNOWN:
285 void livebox_widget_get_size_available(Evas_Object *widget, int *cnt, int **size_list)
288 const char *widget_id = NULL;
292 LOGE("widget == NULL");
297 LOGE("size_list == NULL");
306 widget_id = widget_viewer_evas_get_widget_id(widget);
308 LOGE("widget_id == NULL");
314 ret = widget_service_get_supported_size_types(widget_id, cnt, size_list);
316 if (ret != 0 || *cnt == 0) {
317 LOGE("RESIZE COULD NOT GET SUPPORTED SIZES");
318 *size_list = calloc(WIDGET_NR_OF_SIZE_LIST, sizeof(widget_size_type_e));
320 (*size_list)[0] = WIDGET_SIZE_TYPE_4x2;
321 (*size_list)[1] = WIDGET_SIZE_TYPE_4x4;
324 LOGD("RESIZE AVAILABLE SIZE COUNT: %d", *cnt);
327 void livebox_widget_set_event_blocking(Evas_Object *widget)
330 LOGE("widget == NULL");
334 widget_viewer_evas_cancel_click_event(widget);
335 LOGI("BLOCKING: %s", widget_viewer_evas_get_widget_id(widget));
338 static int __livebox_widget_get_pkg_list_cb(const char *pkg_id, const char *widget_id, int is_prime, void *data)
340 widget_info_t *widget = NULL;
341 int cnt = WIDGET_NR_OF_SIZE_LIST;;
342 int *size_list = NULL;
345 LOGI("WIDGET: %s; %s; %d", pkg_id, widget_id, is_prime);
347 widget = calloc(1, sizeof(widget_info_t));
349 LOGE("widget == NULL");
353 widget->widget_id = strdup(widget_id);
354 widget->pkg_id = strdup(pkg_id);
355 widget->is_prime = is_prime;
357 ret = widget_service_get_supported_size_types(widget_id, &cnt, &size_list);
359 if(ret == 0 && cnt > 0) {
360 livebox_widget_get_dimensions(size_list[0], &widget->width, &widget->height);
361 LOGI("SIZE SET [%d, %d] ret == %d; cnt == %d", widget->width, widget->height, ret, cnt);
363 LOGE("COULD NOT GET AVAILABLE SiZES ret == %d; cnt == %d; size_list[0] == %d", ret, cnt, size_list[0]);
364 widget->width = LIVEBOX_ON_CREATE_SIZE;
365 widget->height = LIVEBOX_ON_CREATE_SIZE;
368 s_info.widget_list = eina_list_append(s_info.widget_list, widget);
372 static void livebox_widget_new(int widget_width, int widget_height, const char *content_info)
377 Tree_node_t *page_node = NULL;
378 Tree_node_t *item_node = NULL;
379 Evas_Object *page = NULL;
381 page_index = livebox_panel_find_empty_space(widget_width, widget_height, &pos_x, &pos_y);
384 page = page_scroller_get_page(livebox_panel_get(), page_index);
390 if (!livebox_panel_can_add_page()) {
391 LOGI("Cannot add new page");
395 page_node = data_model_add_widget_page();
397 livebox_panel_destroy();
398 LOGE("page_node == NULL");
402 page = livebox_panel_add_page(page_node, livebox_panel_get());
404 LOGE("page == NULL");
405 livebox_panel_destroy();
406 data_model_del_item(page_node);
410 page_index = page_scroller_get_page_count(livebox_panel_get()) - 1;
412 page_node = evas_object_data_get(page, KEY_ICON_DATA);
414 LOGE("obj_node == NULL");
415 livebox_panel_destroy();
420 item_node = data_model_add_widget(page_node, content_info, pos_x, pos_y, widget_width, widget_height, NULL);
422 LOGE("item == NULL");
426 elm_scroller_page_bring_in(livebox_panel_get(), page_index, 0);
427 livebox_panel_add_livebox(item_node, page, content_info, pos_x, pos_y, widget_width, widget_height, NULL);
428 livebox_panel_update_dynamic_index();
431 static void _cannot_add_widget_popup_show(void)
433 popup_data_t *data = popup_create_data();
435 LOGE("data == NULL");
439 data->orientation = ELM_POPUP_ORIENT_CENTER;
440 data->popup_cancel_text = NULL;
441 data->popup_confirm_text = NULL;
442 data->popup_content_text = strdup(_("IDS_HS_HEADER_UNABLE_TO_ADD_WIDGET_ABB"));
443 data->popup_title_text = NULL;
444 data->type = POPUP_INFO;
445 data->visible_time = 5.0;
447 popup_show(data, NULL, NULL, NULL);
450 static int request_cb(const char *appid, const char *name, int type,
451 const char *content_info, const char *icon, int pid, double period,
452 int allow_duplicate, void *data)
457 LOGI("====== WIDGET REQUEST ======");
458 LOGI("Package name: %s\n", appid);
459 LOGI("Name: %s\n", name);
460 LOGI("Type: %d\n", type);
461 LOGI("Content: %s\n", content_info);
462 LOGI("Icon: %s\n", icon);
463 LOGI("Requested from: %d\n", pid);
464 LOGI("Period: %lf\n", period);
465 LOGI("Allow duplicate: %d\n", allow_duplicate);
466 LOGI("CBDATA: %p\n", data);
467 LOGI("============================");
470 case WIDGET_SIZE_4x2:
474 case WIDGET_SIZE_4x4:
480 LOGE("Unsupported type: %x\n", type);
481 _cannot_add_widget_popup_show();
485 LOGI("Widget will be added: %dx%d\n", widget_width, widget_height);
487 livebox_widget_new(widget_width, widget_height, content_info);
488 home_screen_print_tree();
490 return 0; /*returns success. */
493 static void update_content_info(Evas_Object *widget, const char *content_info)
495 Evas_Object *parent = NULL;
496 Tree_node_t *node = NULL;
499 LOGE("widget == NULL");
503 parent = elm_object_parent_widget_get(widget);
505 LOGE("parent == NULL");
509 node = evas_object_data_get(parent, KEY_ICON_DATA);
511 LOGE("node == NULL");
515 data_model_update_content_info(node, content_info);