2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (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://www.apache.org/licenses/LICENSE-2.0
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 <app_control.h>
19 #include <Elementary.h>
20 #include <ui-gadget-module.h>
21 #include <isf_control.h>
22 #include <system_info.h>
24 #include <privilege_checker.h>
25 #include <ui-gadget.h>
27 #include "attach_panel.h"
28 #include "attach_panel_internal.h"
29 #include "attach_bundle.h"
31 #include "content_list.h"
34 #include "ui_manager.h"
40 static const char *const ATTACH_PANEL_DOMAIN = "attach-panel";
41 static const char *const PLATFORM_FEATURE_CAMERA = "tizen.org/feature/camera";
42 static const char *const PLATFORM_FEATURE_MICROPHONE = "tizen.org/feature/microphone";
46 innate_content_s innate_content_info[ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER] = {
48 .appid = "attach-panel-gallery",
49 .name = "IDS_COM_TAB4_IMAGES_ABB2",
50 .operation = APP_CONTROL_OPERATION_PICK,
51 .selection_mode = "single",
52 .tabbar_name = "IDS_COM_TAB4_IMAGES_ABB2",
54 .content_category = ATTACH_PANEL_CONTENT_CATEGORY_IMAGE,
55 .is_ug = ATTACH_PANEL_CONTENT_CATEGORY_UG,
58 .appid = "attach-panel-camera",
59 .name = "IDS_COM_TAB4_CAMERA",
60 .operation = APP_CONTROL_OPERATION_CREATE_CONTENT,
61 .selection_mode = "single",
62 .tabbar_name = "IDS_COM_TAB4_CAMERA",
63 .content_category = ATTACH_PANEL_CONTENT_CATEGORY_CAMERA,
64 .is_ug = ATTACH_PANEL_CONTENT_CATEGORY_UG,
67 .appid = "attach-panel-voicerecorder",
68 .name = "IDS_COM_TAB4_VOICE",
69 .operation = APP_CONTROL_OPERATION_CREATE_CONTENT,
70 .selection_mode = "single",
71 .tabbar_name = "IDS_COM_TAB4_VOICE",
72 .content_category = ATTACH_PANEL_CONTENT_CATEGORY_VOICE,
73 .is_ug = ATTACH_PANEL_CONTENT_CATEGORY_UG,
77 .name = "IDS_COM_BUTTON2_VIDEOS",
78 .operation = APP_CONTROL_OPERATION_PICK,
79 .icon = "/usr/share/icons/video.png",
80 .selection_mode = "multiple",
81 .tabbar_name = "IDS_COM_TAB4_MORE_ABB",
83 .content_category = ATTACH_PANEL_CONTENT_CATEGORY_VIDEO,
84 .is_ug = ATTACH_PANEL_CONTENT_CATEGORY_APP,
88 .name = "IDS_COM_BUTTON2_AUDIO_FILES",
89 .operation = APP_CONTROL_OPERATION_PICK,
90 .icon = "/usr/share/icons/music.png",
91 .selection_mode = "multiple",
92 .tabbar_name = "IDS_COM_TAB4_MORE_ABB",
94 .content_category = ATTACH_PANEL_CONTENT_CATEGORY_AUDIO,
95 .is_ug = ATTACH_PANEL_CONTENT_CATEGORY_APP,
99 .name = "IDS_EMAIL_BUTTON2_CALENDAR",
100 .operation = APP_CONTROL_OPERATION_PICK,
101 .icon = "/usr/share/icons/calendar.png",
102 .tabbar_name = "IDS_COM_TAB4_MORE_ABB",
105 .selection_mode = "multiple",
106 .mime = "application/vnd.tizen.calendar",
108 .content_category = ATTACH_PANEL_CONTENT_CATEGORY_CALENDAR,
109 .is_ug = ATTACH_PANEL_CONTENT_CATEGORY_APP,
113 .name = "IDS_COM_BUTTON2_CONTACTS",
114 .operation = APP_CONTROL_OPERATION_PICK,
115 .icon = "/usr/share/icons/contact.png",
116 .tabbar_name = "IDS_COM_TAB4_MORE_ABB",
118 .item_type = "person",
119 .selection_mode = "multiple",
120 .mime = "application/vnd.tizen.contact",
121 .content_category = ATTACH_PANEL_CONTENT_CATEGORY_CONTACT,
122 .is_ug = ATTACH_PANEL_CONTENT_CATEGORY_APP,
126 .name = "IDS_COM_BUTTON_MY_FILES_ABB",
127 .operation = APP_CONTROL_OPERATION_PICK,
128 .tabbar_name = "IDS_COM_TAB4_MORE_ABB",
129 .icon = "/usr/share/icons/my_files.png",
130 .selection_mode = "multiple",
131 .content_category = ATTACH_PANEL_CONTENT_CATEGORY_MYFILES,
132 .is_ug = ATTACH_PANEL_CONTENT_CATEGORY_APP,
135 .appid = "record_video",
136 .name = "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB",
137 .operation = APP_CONTROL_OPERATION_CREATE_CONTENT,
138 .icon = "/usr/share/icons/default.png",
139 .tabbar_name = "IDS_COM_TAB4_MORE_ABB",
140 .selection_mode = "single",
142 .content_category = ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER,
143 .is_ug = ATTACH_PANEL_CONTENT_CATEGORY_APP,
149 static Evas_Object *__attach_panel_rect_add(Evas_Object *conformant, int height)
151 Evas_Object *rect = NULL;
153 retv_if(!conformant, NULL);
155 _D("attach panel rect create, height : %d", height);
157 rect = evas_object_rectangle_add(evas_object_evas_get(conformant));
158 retv_if(!rect, NULL);
160 evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
161 evas_object_size_hint_align_set(rect, EVAS_HINT_FILL, 1.0);
162 evas_object_size_hint_min_set(rect, 0, height);
163 evas_object_color_set(rect, 0, 0, 0, 0);
164 evas_object_show(rect);
171 static void __attach_panel_rect_del(Evas_Object *rect)
174 evas_object_del(rect);
179 static void __rotate_cb(void *data, Evas_Object *obj, void *event)
181 Evas_Object *win = obj;
182 attach_panel_h attach_panel = data;
187 ret_if(!attach_panel);
188 ret_if(!attach_panel->conformant);
190 angle = elm_win_rotation_get(win);
191 elm_win_screen_size_get(win, NULL, NULL, &w, &h);
192 _D("Angle is %d degree, win size is %d, %d", angle, w, h);
197 _D("resize the attach-panel to land(%d)", angle);
199 ug_send_event(UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN);
201 ug_send_event(UG_EVENT_ROTATE_LANDSCAPE);
204 attach_panel->rotate = EINA_TRUE;
206 if (ATTACH_PANEL_STATE_HIDE == attach_panel->attach_panel_port_state) {
207 attach_panel->attach_panel_land_state = ATTACH_PANEL_STATE_HIDE;
208 } else if (ATTACH_PANEL_STATE_HALF == attach_panel->attach_panel_port_state) {
209 attach_panel->attach_panel_land_state = ATTACH_PANEL_STATE_FULL;
210 _gesture_set_state(ATTACH_PANEL_STATE_FULL);
211 _content_list_send_message(attach_panel->content_list, APP_CONTROL_DATA_SELECTION_MODE, SELECTION_MODE_MULTIPLE, ATTACH_PANEL_CONTENT_CATEGORY_UG);
212 elm_object_signal_emit(attach_panel->conformant, "elm,state,attach_panel,show,full", "");
214 attach_panel->attach_panel_land_state = ATTACH_PANEL_STATE_FULL;
215 _gesture_set_state(ATTACH_PANEL_STATE_FULL);
220 _D("resize the attach-panel to port(%d)", angle);
222 ug_send_event(UG_EVENT_ROTATE_PORTRAIT);
224 ug_send_event(UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN);
226 attach_panel->rotate = EINA_FALSE;
228 if (ATTACH_PANEL_STATE_HIDE == attach_panel->attach_panel_land_state) {
229 attach_panel->attach_panel_port_state = ATTACH_PANEL_STATE_HIDE;
231 if (ATTACH_PANEL_STATE_HALF == attach_panel->attach_panel_port_state) {
232 _gesture_set_state(ATTACH_PANEL_STATE_HALF);
233 _content_list_send_message(attach_panel->content_list, APP_CONTROL_DATA_SELECTION_MODE, SELECTION_MODE_SINGLE, ATTACH_PANEL_CONTENT_CATEGORY_UG);
234 elm_object_signal_emit(attach_panel->conformant, "elm,state,attach_panel,show,half", "");
236 attach_panel->attach_panel_port_state = ATTACH_PANEL_STATE_FULL;
237 _gesture_set_state(ATTACH_PANEL_STATE_FULL);
242 _E("cannot reach here");
246 _scroller_resize(attach_panel->scroller, w, 0);
247 elm_scroller_page_show(attach_panel->scroller, attach_panel->cur_page_no, 0);
252 EXPORT_API int attach_panel_create(Evas_Object *conformant, attach_panel_h *attach_panel)
254 Evas_Object *old_panel = NULL;
255 attach_panel_h panel = NULL;
256 const char *type = NULL;
261 retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
262 retv_if(!conformant, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
264 old_panel = elm_object_part_content_get(conformant, "elm.swallow.attach_panel");
265 retv_if(old_panel, ATTACH_PANEL_ERROR_ALREADY_EXISTS);
267 type = elm_object_widget_type_get(conformant);
268 retv_if(!type, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
270 if (strcmp(type, "Elm_Conformant")) {
271 _E("This is not a conformant, %s", type);
272 return ATTACH_PANEL_ERROR_INVALID_PARAMETER;
275 bindtextdomain(ATTACH_PANEL_DOMAIN, "/usr/ug/res/locale");
277 panel = calloc(1, sizeof(attach_panel_s));
278 retv_if(!panel, ATTACH_PANEL_ERROR_OUT_OF_MEMORY);
279 panel->conformant = conformant;
281 evas_object_geometry_get(conformant, NULL, NULL, &width, &base_height);
282 panel->transit_width = width;
284 if (width > base_height) {
285 base_height = width * BASE_TRANSIT_HEIGHT_REL;
287 base_height = base_height * BASE_TRANSIT_HEIGHT_REL;
290 isf_control_get_recent_ime_geometry(NULL, NULL, NULL, &height);
291 if (!height || height < base_height) {
292 _E("Fail to get the recent ime height");
293 height = base_height;
295 panel->transit_height = height;
297 panel->attach_panel_rect = __attach_panel_rect_add(conformant, height);
298 goto_if(!panel->attach_panel_rect, ERROR);
299 elm_object_part_content_set(conformant, "elm.swallow.attach_panel_base", panel->attach_panel_rect);
301 panel->ui_manager = _ui_manager_create(panel);
302 goto_if(!panel->ui_manager, ERROR);
303 elm_object_part_content_set(conformant, "elm.swallow.attach_panel", panel->ui_manager);
304 panel->is_delete = EINA_FALSE;
305 panel->rotate = EINA_FALSE;
306 panel->flick = EINA_TRUE;
307 panel->cur_page_no = 0;
308 panel->magic_no = 0x1024;
310 panel->gesture = _gesture_create(panel);
311 goto_if(!panel->gesture, ERROR);
313 evas_object_smart_callback_add(panel->win, "wm,rotation,changed", __rotate_cb, panel);
314 elm_scroller_movement_block_set(panel->scroller, ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL);
315 __rotate_cb(panel, panel->win, NULL);
316 *attach_panel = panel;
318 return ATTACH_PANEL_ERROR_NONE;
321 if (panel->ui_manager) {
322 elm_object_part_content_unset(conformant, "elm.swallow.attach_panel");
323 _ui_manager_destroy(panel->ui_manager);
326 if (panel->attach_panel_rect) {
327 elm_object_part_content_unset(conformant, "elm.swallow.attach_panel_base");
328 __attach_panel_rect_del(panel->attach_panel_rect);
332 return ATTACH_PANEL_ERROR_NOT_INITIALIZED;
337 extern void _attach_panel_del(attach_panel_h attach_panel)
339 content_s *content_info = NULL;
342 ret_if(!attach_panel);
343 _D("%s : attach panel is destroyed", __func__);
345 if (0x1024 != attach_panel->magic_no) {
346 _D("attach panel is already destroyed");
350 attach_panel->magic_no = 0;
352 _gesture_destroy(attach_panel);
354 evas_object_smart_callback_del(attach_panel->win, "wm,rotation,changed", __rotate_cb);
355 elm_object_part_content_unset(attach_panel->conformant, "elm.swallow.attach_panel_base");
356 __attach_panel_rect_del(attach_panel->attach_panel_rect);
358 EINA_LIST_FOREACH(attach_panel->content_list, l, content_info) {
359 if (content_info->extra_data) {
360 bundle_free(content_info->extra_data);
361 content_info->extra_data = NULL;
365 elm_object_part_content_unset(attach_panel->conformant, "elm.swallow.attach_panel");
366 _ui_manager_destroy(attach_panel->ui_manager);
373 EXPORT_API int attach_panel_destroy(attach_panel_h attach_panel)
375 retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
376 _D("%s : attach panel will be destroyed", __func__);
378 if (EINA_TRUE == attach_panel->is_delete) {
379 _E("Attach panel is already removed");
380 return ATTACH_PANEL_ERROR_ALREADY_DESTROYED;
383 attach_panel->is_delete = EINA_TRUE;
384 if (ATTACH_PANEL_STATE_HIDE == _gesture_get_state()) {
385 _attach_panel_del(attach_panel);
387 attach_panel_hide(attach_panel);
390 return ATTACH_PANEL_ERROR_NONE;
395 static void __iter_cb(const char *key, const int type, bundle_keyval_t *kv, void *user_data)
397 int *bundle_is_op = user_data;
400 ret_if(!bundle_is_op);
402 if (!strncmp("__APP_SVC_", key, 10))
408 static const char *const PRIVILEGE_CAMERA = "http://tizen.org/privilege/camera";
409 static const char *const PRIVILEGE_RECORDER = "http://tizen.org/privilege/recorder";
410 static const char *const PRIVILEGE_APPMANAGER_LAUNCH = "http://tizen.org/privilege/appmanager.launch";
411 EXPORT_API int attach_panel_add_content_category(attach_panel_h attach_panel, attach_panel_content_category_e content_category, bundle *extra_data)
413 content_s *content_info = NULL;
414 bundle *dup_bundle = NULL;
416 int ret = SYSTEM_INFO_ERROR_NONE;
419 retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
420 retv_if(!attach_panel->ui_manager, ATTACH_PANEL_ERROR_NOT_INITIALIZED);
421 retv_if(content_category < ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
422 retv_if(content_category > ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
424 if (EINA_TRUE == attach_panel->is_delete) {
425 _E("Attach panel is already removed");
426 return ATTACH_PANEL_ERROR_ALREADY_DESTROYED;
429 switch (content_category) {
430 case ATTACH_PANEL_CONTENT_CATEGORY_CAMERA:
431 ret = system_info_get_platform_bool(PLATFORM_FEATURE_CAMERA, &value);
432 break_if(SYSTEM_INFO_ERROR_NONE != ret);
433 retv_if(false == value, ATTACH_PANEL_ERROR_UNSUPPORTED_CONTENT_CATEGORY);
435 ret = privilege_checker_check_privilege(PRIVILEGE_CAMERA);
436 retv_if(PRIVILEGE_CHECKER_ERR_UNDECLARED_PRIVILEGE == ret, ATTACH_PANEL_ERROR_PERMISSION_DENIED);
437 break_if(PRIVILEGE_CHECKER_ERR_NONE != ret);
439 case ATTACH_PANEL_CONTENT_CATEGORY_VOICE:
440 ret = system_info_get_platform_bool(PLATFORM_FEATURE_MICROPHONE, &value);
441 break_if(SYSTEM_INFO_ERROR_NONE != ret);
442 retv_if(false == value, ATTACH_PANEL_ERROR_UNSUPPORTED_CONTENT_CATEGORY);
444 ret = privilege_checker_check_privilege(PRIVILEGE_RECORDER);
445 retv_if(PRIVILEGE_CHECKER_ERR_UNDECLARED_PRIVILEGE == ret, ATTACH_PANEL_ERROR_PERMISSION_DENIED);
446 break_if(PRIVILEGE_CHECKER_ERR_NONE != ret);
448 case ATTACH_PANEL_CONTENT_CATEGORY_VIDEO:
449 case ATTACH_PANEL_CONTENT_CATEGORY_AUDIO:
450 case ATTACH_PANEL_CONTENT_CATEGORY_CALENDAR:
451 case ATTACH_PANEL_CONTENT_CATEGORY_CONTACT:
452 case ATTACH_PANEL_CONTENT_CATEGORY_MYFILES:
453 ret = privilege_checker_check_privilege(PRIVILEGE_APPMANAGER_LAUNCH);
454 retv_if(PRIVILEGE_CHECKER_ERR_UNDECLARED_PRIVILEGE == ret, ATTACH_PANEL_ERROR_PERMISSION_DENIED);
455 break_if(PRIVILEGE_CHECKER_ERR_NONE != ret);
461 EINA_LIST_FOREACH(attach_panel->content_list, l, content_info) {
462 if (content_info->innate_content_info->content_category == content_category) {
463 _E("The content category[%d] already exists in the panel", content_category);
464 return ATTACH_PANEL_ERROR_ALREADY_EXISTS;
469 int bundle_is_op = 0;
471 bundle_foreach(extra_data, (void *) __iter_cb, &bundle_is_op);
474 _E("bundle key is invalid value");
475 return ATTACH_PANEL_ERROR_INVALID_PARAMETER;
478 dup_bundle = bundle_dup(extra_data);
479 retv_if(!dup_bundle, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
482 _ui_manager_append_content_category(attach_panel->ui_manager, &innate_content_info[content_category-1], dup_bundle);
484 return ATTACH_PANEL_ERROR_NONE;
489 EXPORT_API int attach_panel_remove_content_category(attach_panel_h attach_panel, attach_panel_content_category_e content_category)
491 content_s *content_info = NULL;
494 retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
495 retv_if(!attach_panel->ui_manager, ATTACH_PANEL_ERROR_NOT_INITIALIZED);
496 retv_if(content_category < ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
497 retv_if(content_category > ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
499 if (EINA_TRUE == attach_panel->is_delete) {
500 _E("Attach panel is already removed");
501 return ATTACH_PANEL_ERROR_ALREADY_DESTROYED;
504 EINA_LIST_FOREACH(attach_panel->content_list, l, content_info) {
505 if (content_info->innate_content_info->content_category != content_category) {
508 bundle_free(content_info->extra_data);
509 content_info->extra_data = NULL;
510 _ui_manager_remove_content_category(attach_panel->ui_manager, content_info);
514 return ATTACH_PANEL_ERROR_NONE;
519 EXPORT_API int attach_panel_set_extra_data(attach_panel_h attach_panel, attach_panel_content_category_e content_category, bundle *extra_data)
521 app_control_h app_control = NULL;
522 ui_gadget_h ui_gadget = NULL;
523 content_s *content_info = NULL;
526 int ret = ATTACH_PANEL_ERROR_NONE;
527 int bundle_is_op = 0;
529 retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
530 retv_if(!attach_panel->ui_manager, ATTACH_PANEL_ERROR_NOT_INITIALIZED);
531 retv_if(content_category < ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
532 retv_if(content_category > ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
533 retv_if(!extra_data, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
535 bundle_foreach(extra_data, (void *) __iter_cb, &bundle_is_op);
538 _E("bundle key is invalid value");
539 return ATTACH_PANEL_ERROR_INVALID_PARAMETER;
542 EINA_LIST_FOREACH(attach_panel->content_list, l, content_info) {
543 if (content_info->innate_content_info->content_category == content_category) {
544 _D("add the data in %d content category", content_category);
549 if (content_info->extra_data) {
550 ret = _bundle_add_to_bundle(content_info->extra_data, extra_data);
551 retv_if(ret != ATTACH_PANEL_ERROR_NONE, ATTACH_PANEL_ERROR_OUT_OF_MEMORY);
553 bundle *dup_bundle = NULL;
555 dup_bundle = bundle_dup(extra_data);
556 retv_if(!dup_bundle, ATTACH_PANEL_ERROR_OUT_OF_MEMORY);
558 content_info->extra_data = dup_bundle;
561 if (innate_content_info[content_category-1].is_ug) {
562 if (!content_info->content) {
563 _D("Create ug because ug is not created yet");
564 content_info->content = _ui_manager_create_content(content_info->page, content_info, attach_panel);
565 retv_if(!content_info->content, ATTACH_PANEL_ERROR_OUT_OF_MEMORY);
566 if (ATTACH_PANEL_STATE_FULL == _gesture_get_state()) {
567 _content_list_send_message(attach_panel->content_list, APP_CONTROL_DATA_SELECTION_MODE, SELECTION_MODE_MULTIPLE, ATTACH_PANEL_CONTENT_CATEGORY_UG);
569 _content_list_send_message(attach_panel->content_list, APP_CONTROL_DATA_SELECTION_MODE, SELECTION_MODE_SINGLE, ATTACH_PANEL_CONTENT_CATEGORY_UG);
573 ret = app_control_create(&app_control);
574 retv_if(APP_CONTROL_ERROR_NONE != ret, ATTACH_PANEL_ERROR_OUT_OF_MEMORY);
576 ui_gadget = evas_object_data_get(content_info->content, DATA_KEY_UG);
578 _E("Fail to get the ui gadget from content_info");
579 app_control_destroy(app_control);
580 return ATTACH_PANEL_ERROR_OUT_OF_MEMORY;
583 ug_send_message(ui_gadget, app_control);
584 ret = app_control_destroy(app_control);
585 retv_if(APP_CONTROL_ERROR_NONE != ret, ATTACH_PANEL_ERROR_OUT_OF_MEMORY);
587 // In case of app, bundle is not used imediately.
588 // when app is launching, bundle is used.
591 return ATTACH_PANEL_ERROR_NONE;
596 EXPORT_API int attach_panel_set_result_cb(attach_panel_h attach_panel, attach_panel_result_cb result_cb, void *user_data)
598 retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
599 retv_if(!result_cb, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
601 if (EINA_TRUE == attach_panel->is_delete) {
602 _E("Attach panel is already removed");
603 return ATTACH_PANEL_ERROR_ALREADY_DESTROYED;
606 attach_panel->result_cb = result_cb;
607 attach_panel->result_data = user_data;
609 return ATTACH_PANEL_ERROR_NONE;
614 EXPORT_API int attach_panel_unset_result_cb(attach_panel_h attach_panel)
616 retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
618 if (EINA_TRUE == attach_panel->is_delete) {
619 _E("Attach panel is already removed");
620 return ATTACH_PANEL_ERROR_ALREADY_DESTROYED;
623 attach_panel->result_cb = NULL;
624 attach_panel->result_data = NULL;
626 return ATTACH_PANEL_ERROR_NONE;
631 EXPORT_API int attach_panel_set_event_cb(attach_panel_h attach_panel, attach_panel_event_cb event_cb, void *user_data)
633 retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
634 retv_if(!event_cb, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
636 if (EINA_TRUE == attach_panel->is_delete) {
637 _E("Attach panel is already removed");
638 return ATTACH_PANEL_ERROR_ALREADY_DESTROYED;
641 attach_panel->event_cb = event_cb;
642 attach_panel->event_data = user_data;
644 return ATTACH_PANEL_ERROR_NONE;
649 EXPORT_API int attach_panel_unset_event_cb(attach_panel_h attach_panel)
651 retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
653 if (EINA_TRUE == attach_panel->is_delete) {
654 _E("Attach panel is already removed");
655 return ATTACH_PANEL_ERROR_ALREADY_DESTROYED;
658 attach_panel->event_cb = NULL;
659 attach_panel->event_data = NULL;
661 return ATTACH_PANEL_ERROR_NONE;
666 EXPORT_API int attach_panel_show(attach_panel_h attach_panel)
668 Elm_Object_Item *first_it;
669 content_s *content_info = NULL;
672 retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
673 retv_if(!attach_panel->ui_manager, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
675 if (EINA_TRUE == attach_panel->is_delete) {
676 _E("Attach panel is already removed");
677 return ATTACH_PANEL_ERROR_ALREADY_DESTROYED;
680 if (ATTACH_PANEL_STATE_HIDE != _gesture_get_state()) {
681 _D("Attach panel is already shown");
682 return ATTACH_PANEL_ERROR_NONE;
685 isf_control_get_recent_ime_geometry(NULL, NULL, NULL, &height);
686 if (height && height > attach_panel->transit_height) {
687 _D("change the attach-panel's height(%d)", height);
688 evas_object_size_hint_min_set(attach_panel->attach_panel_rect, 0, height);
689 attach_panel->transit_height = height;
692 content_info = eina_list_nth(attach_panel->content_list, attach_panel->cur_page_no);
693 retv_if(!content_info, ATTACH_PANEL_ERROR_OUT_OF_MEMORY);
695 _toolbar_bring_in(attach_panel->toolbar, content_info->tabbar_item);
697 if (content_info->content) {
698 elm_scroller_page_show(attach_panel->scroller, attach_panel->cur_page_no, 0);
700 content_info->content = _ui_manager_create_content(content_info->page, content_info, attach_panel);
701 retv_if(!content_info->content, ATTACH_PANEL_ERROR_OUT_OF_MEMORY);
704 _content_list_set_resume(attach_panel->content_list, ATTACH_PANEL_CONTENT_CATEGORY_UG);
705 _content_list_send_message(attach_panel->content_list, "__ATTACH_PANEL_INITIALIZE__", MODE_ENABLE, ATTACH_PANEL_CONTENT_CATEGORY_UG);
706 evas_object_show(attach_panel->ui_manager);
708 _gesture_show(attach_panel);
710 attach_panel->content_list = _list_sort_by_rua(attach_panel->content_list);
711 _grid_refresh(attach_panel->grid);
713 first_it = elm_gengrid_first_item_get(attach_panel->grid);
715 elm_gengrid_item_show(first_it, ELM_GENGRID_ITEM_SCROLLTO_TOP);
718 return ATTACH_PANEL_ERROR_NONE;
723 EXPORT_API int attach_panel_hide(attach_panel_h attach_panel)
725 retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
726 retv_if(!attach_panel->ui_manager, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
728 if (EINA_TRUE == attach_panel->is_delete) {
729 _E("Attach panel is already removed");
730 return ATTACH_PANEL_ERROR_ALREADY_DESTROYED;
733 _content_list_set_pause(attach_panel->content_list, ATTACH_PANEL_CONTENT_CATEGORY_UG);
734 _gesture_hide(attach_panel);
736 return ATTACH_PANEL_ERROR_NONE;
741 EXPORT_API int attach_panel_get_visibility(attach_panel_h attach_panel, bool *visible)
743 retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
744 retv_if(!visible, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
746 if (EINA_TRUE == attach_panel->is_delete) {
747 _E("Attach panel is already removed");
748 return ATTACH_PANEL_ERROR_ALREADY_DESTROYED;
751 if (attach_panel->rotate) {
752 if (ATTACH_PANEL_STATE_HIDE == attach_panel->attach_panel_land_state) {
758 if (ATTACH_PANEL_STATE_HIDE == attach_panel->attach_panel_port_state) {
765 return ATTACH_PANEL_ERROR_NONE;