2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.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://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.
19 #include <ui-gadget.h>
20 #include <ui-gadget-module.h>
21 #include <sound_manager.h>
22 #include <system_info.h>
24 #include "msg-ui-thread-main.h"
25 #include "msg-ui-common-utility.h"
27 static void __rotate(app_device_orientation_e orientation, void *data);
28 static void __msg_ui_popup_warning(Evas_Object *parent, const char *msg);
29 static service_h __msg_ui_parse_sms_uri(service_h service, const char *uri);
30 static service_h __msg_ui_parse_mmsto_uri(service_h service, const char *uri);
31 static service_h __msg_ui_parse_file_uri(service_h service, const char *uri);
32 static service_h __get_service_with_new_msg(struct appdata *ad);
33 static service_h __get_service_with_msg_id(struct appdata *ad, service_h service);
35 void layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv);
36 void result_cb(ui_gadget_h ug, service_h result, void *priv);
37 void destroy_cb(ui_gadget_h ug, void *priv);
39 struct appdata *gAppData = NULL;
41 static void win_del(void *data, Evas_Object *obj, void *event)
46 static void main_quit_cb(void *data, Evas_Object *obj, void *event_info)
51 static void lang_changed(void *data)
54 struct appdata *ad = data;
56 ug_send_event(UG_EVENT_LANG_CHANGE);
58 msg_ui_thread_lang_changed(ad->thread_data);
61 static void low_battery_cb(void *data)
65 ug_send_event(UG_EVENT_LOW_BATTERY);
68 static void region_changed_cb(void *data)
72 ug_send_event(UG_EVENT_REGION_CHANGE);
75 static void device_orientation(app_device_orientation_e orientation, void *data)
79 struct appdata *ad = data;
80 if (ad == NULL || ad->win_main == NULL)
83 __rotate(orientation, data);
86 static void __rotate(app_device_orientation_e orientation, void *data)
88 struct appdata *ad = data;
90 int rot = THREAD_ROTATE_ANGLE_UNKNOWN;
92 switch (orientation) {
93 case APP_DEVICE_ORIENTATION_0:
94 rot = THREAD_ROTATE_ANGLE_PORTRAIT;
95 ret = ug_send_event(UG_EVENT_ROTATE_PORTRAIT);
97 case APP_DEVICE_ORIENTATION_180:
98 rot = THREAD_ROTATE_ANGLE_PORTRAIT_UPSIDEDOWN;
99 ret = ug_send_event(UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN);
101 case APP_DEVICE_ORIENTATION_270:
102 rot = THREAD_ROTATE_ANGLE_LANDSCAPE;
103 ret = ug_send_event(UG_EVENT_ROTATE_LANDSCAPE);
105 case APP_DEVICE_ORIENTATION_90:
106 rot = THREAD_ROTATE_ANGLE_LANDSCAPE_UPSIDEDOWN;
107 ret = ug_send_event(UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN);
110 rot = THREAD_ROTATE_ANGLE_UNKNOWN;
115 msg_ui_thread_rotation_set(ad->thread_data, rot);
116 elm_win_rotation_with_resize_set(ad->win_main, rot);
120 static void _block_clicked_cb(void *data, Evas_Object *obj, void *event_info)
122 evas_object_del(obj);
126 static void __msg_ui_popup_warning(Evas_Object *parent, const char *msg)
130 MSG_UI_RET_IF(MSG_UI_LEVEL_ASSERT, parent == NULL || msg == NULL);
132 Evas_Object *layout, *pu;
134 evas_object_show(parent);
136 layout = elm_layout_add(parent);
137 elm_layout_theme_set(layout, "layout", "application", "default");
138 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
139 elm_win_resize_object_add(parent, layout);
140 evas_object_show(layout);
142 pu = elm_popup_add(layout);
143 MSG_UI_RETM_IF(MSG_UI_LEVEL_ASSERT, pu == NULL, "Cannot add popup object\n");
144 evas_object_size_hint_weight_set(pu, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
145 evas_object_smart_callback_add(pu , "block,clicked", _block_clicked_cb, NULL);
147 elm_object_text_set(pu, msg);
148 elm_popup_timeout_set(pu, 2);
149 evas_object_smart_callback_add(pu, "timeout", main_quit_cb, NULL);
150 evas_object_show(pu);
155 static service_h __msg_ui_parse_sms_uri(service_h service, const char *uri)
159 char *content = NULL;
160 char *recipient = NULL;
161 char *body_text = NULL;
163 service_h svc_handle = NULL;
165 if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
166 D_EMSG("service_create() is failed !!");
170 char *scheme = g_strdup(uri);
173 strtok_r(scheme, ":", &content);
176 if (g_ascii_isdigit(content[0]) || (content[0] == '+' && g_ascii_isdigit(content[1]))) {
177 recipient = strtok_r(NULL, "?", &content);
178 D_MSG("APPSVC RECIPIENT = [%s]", recipient);
181 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_TO, recipient);
186 service_get_extra_data(service, SERVICE_DATA_TO, &recipient);
187 D_MSG("APPSVC RECIPIENT = [%s]", recipient);
188 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_TO, recipient);
192 service_get_extra_data(service, SERVICE_DATA_TEXT, &body_text);
194 D_MSG("APPSVC BODY_TEXT = [%s]", body_text);
195 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_BODY, body_text);
202 static service_h __msg_ui_parse_mmsto_uri(service_h service, const char *uri)
206 char *content = NULL;
207 char *recipient = NULL;
208 char *body_text = NULL;
209 char *subject = NULL;
210 char *attachment = NULL;
213 service_h svc_handle = NULL;
215 if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
216 D_EMSG("service_create() is failed !!");
220 char *scheme = g_strdup(uri);
223 strtok_r(scheme, ":", &content);
226 if (g_ascii_isdigit(content[0]) || (content[0] == '+' && g_ascii_isdigit(content[1]))) {
227 recipient = strtok_r(NULL, "?", &content);
228 cc = strtok_r(NULL, "&", &content);
230 strtok_r(NULL, "=", &cc);
232 D_MSG("APPSVC RECIPIENT = [%s]", recipient);
233 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_TO, recipient);
238 service_get_extra_data(service, SERVICE_DATA_TO, &recipient);
239 D_MSG("APPSVC RECIPIENT = [%s]", recipient);
240 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_TO, recipient);
244 service_get_extra_data(service, SERVICE_DATA_TEXT, &body_text);
246 D_MSG("APPSVC BODY_TEXT = [%s]", body_text);
247 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_BODY, body_text);
251 service_get_extra_data(service, SERVICE_DATA_SUBJECT, &subject);
253 D_MSG("APPSVC SUBJECT = [%s]", subject);
254 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_SUBJECT, subject);
258 service_get_extra_data(service, MSG_BUNDLE_KEY_ATTACHFILE, &attachment);
260 D_MSG("APPSVC ATTACHMENT = [%s]", attachment);
261 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_ATTACHFILE, attachment);
269 static service_h __msg_ui_parse_file_uri(service_h service, const char *uri)
273 char *content = NULL;
274 char attachment[DEF_IMG_PATH_LEN] = {0, };
278 service_h svc_handle = NULL;
280 if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
281 D_EMSG("service_create() is failed !!");
285 char *scheme = g_strdup(uri);
288 strtok_r(scheme, ":", &content);
289 D_MSG("content = [%s]", content);
292 len = strlen(content) - 2;
294 D_EMSG("len is less than 0 !!");
295 service_destroy(svc_handle);
300 /* Remove '//' from content string */
301 for (i = 0; i < len; i++) {
302 attachment[i] = content[i+2];
305 if (attachment[0] != '\0') {
306 D_MSG("APPSVC ATTACHMENT = [%s]", attachment);
307 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_ATTACHFILE, attachment);
312 D_EMSG("scheme is NULL!!");
313 service_destroy(svc_handle);
322 static service_h __get_service_app_svc_op(const char *operation, service_h service)
326 if (service == NULL || operation == NULL)
330 char *recipient = NULL;
331 char *body_text = NULL;
332 char *attachment = NULL;
333 char *subject = NULL;
335 service_h svc_handle = NULL;
337 if (g_strcmp0(operation, SERVICE_OPERATION_SEND) == 0) {
338 service_get_uri(service, &uri);
339 D_MSG("APPSVC URI = [%s]", uri);
342 if (g_str_has_prefix(uri, MSG_BUNDLE_VALUE_MMSTO_URI)) { /* MMS URI */
343 svc_handle = __msg_ui_parse_mmsto_uri(service, uri);
344 } else if (g_str_has_prefix(uri, MSG_BUNDLE_VALUE_FILE_URI)) {
346 svc_handle = __msg_ui_parse_file_uri(service, uri);
347 if (svc_handle == NULL) {
351 } else if (g_str_has_prefix(uri, "/")) {
352 if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
353 D_EMSG("service_create() is failed !!");
357 D_MSG("APPSVC ATTACHMENT = [%s]", uri);
358 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_ATTACHFILE, uri);
360 D_MSG("Not supported URI type");
364 if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
365 D_EMSG("service_create() is failed !!");
369 /* Add recipient number */
370 service_get_extra_data(service, SERVICE_DATA_TO, &recipient);
372 D_MSG("APPSVC RECIPIENT = [%s]", recipient);
373 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_TO, recipient);
377 service_get_extra_data(service, SERVICE_DATA_TEXT, &body_text);
379 D_MSG("APPSVC BODY_TEXT = [%s]", body_text);
380 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_BODY, body_text);
384 service_get_extra_data(service, SERVICE_DATA_SUBJECT, &subject);
386 D_MSG("APPSVC SUBJECT = [%s]", subject);
387 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_SUBJECT, subject);
391 service_get_extra_data(service, MSG_BUNDLE_KEY_ATTACHFILE, &attachment);
393 D_MSG("APPSVC ATTACHMENT = [%s]", attachment);
394 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_ATTACHFILE, attachment);
398 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_TYPE, MSG_BUNDLE_VALUE_COMPOSE);
400 } else if (g_strcmp0(operation, SERVICE_OPERATION_SEND_TEXT) == 0) {
401 service_get_uri(service, &uri);
402 D_MSG("APPSVC URI = [%s]", uri);
405 if (g_str_has_prefix(uri, MSG_BUNDLE_VALUE_SMS_URI)) { /* SMS URI */
406 svc_handle = __msg_ui_parse_sms_uri(service, uri);
408 D_MSG("Not supported mime type");
412 if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
413 D_EMSG("service_create() is failed !!");
418 service_get_extra_data(service, SERVICE_DATA_TEXT, &body_text);
420 D_MSG("APPSVC BODY_TEXT = [%s]", body_text);
421 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_BODY, body_text);
424 /* Add recipient number */
425 service_get_extra_data(service, SERVICE_DATA_TO, &recipient);
427 D_MSG("APPSVC RECIPIENT = [%s]", recipient);
428 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_TO, recipient);
432 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_TYPE, MSG_BUNDLE_VALUE_COMPOSE);
433 } else if (g_strcmp0(operation, SERVICE_OPERATION_DEFAULT) == 0) {
434 char *key_type = NULL;
436 service_get_extra_data(service, MSG_BUNDLE_KEY_TYPE, &key_type);
437 if (g_strcmp0(key_type, MSG_BUNDLE_VALUE_MSG_ID) == 0) {
438 msg_error_t err = MSG_SUCCESS;
439 msg_struct_t count_info = msg_create_struct(MSG_STRUCT_COUNT_INFO);
442 err = msg_count_message(gAppData->msgHandle, MSG_INBOX_ID, count_info);
443 if (err != MSG_SUCCESS) {
444 msg_release_struct(&count_info);
448 msg_get_int_value(count_info, MSG_COUNT_INFO_UNREAD_INT, &unread_cnt);
450 svc_handle = __get_service_with_msg_id(gAppData, service);
452 msg_release_struct(&count_info);
461 static service_h __get_service_with_new_msg(struct appdata *ad)
465 msg_error_t err = MSG_SUCCESS;
466 msg_struct_list_s peerList;
467 msg_struct_t sort_rule_t = msg_create_struct(MSG_STRUCT_SORT_RULE);
468 service_h svc_handle = NULL;
474 char buf[DEF_BUF_LEN_L] = {'0',};
475 char buf_contact[DEF_BUF_LEN] = {'0',};
477 msg_set_int_value(sort_rule_t, MSG_SORT_RULE_SORT_TYPE_INT, MSG_SORT_BY_THREAD_DATE);
478 msg_set_bool_value(sort_rule_t, MSG_SORT_RULE_ACSCEND_BOOL, false);
480 vconf_get_int(VCONFKEY_MESSAGE_RECV_SMS_STATE, &new_sms_cnt);
481 vconf_get_int(VCONFKEY_MESSAGE_RECV_MMS_STATE, &new_mms_cnt);
483 err = msg_get_thread_view_list(ad->msgHandle, sort_rule_t, &peerList);
484 if (err != MSG_SUCCESS) {
485 msg_release_struct(&sort_rule_t);
489 if (peerList.nCount <= 0) {
490 msg_release_list_struct(&peerList);
491 msg_release_struct(&sort_rule_t);
495 for (i=0; i<peerList.nCount; i++){
496 msg_get_int_value(peerList.msg_struct_info[i], MSG_THREAD_UNREAD_COUNT_INT, &unreadCnt);
501 if(i >= peerList.nCount) {
502 msg_release_list_struct(&peerList);
503 msg_release_struct(&sort_rule_t);
507 msg_get_int_value(peerList.msg_struct_info[i], MSG_THREAD_UNREAD_COUNT_INT, &unreadCnt);
508 if(unreadCnt == new_sms_cnt+new_mms_cnt){
509 if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
510 D_EMSG("service_create() is failed !!");
511 msg_release_list_struct(&peerList);
512 msg_release_struct(&sort_rule_t);
516 msg_struct_list_s *addrList = NULL;
519 char strName[DEF_THREAD_NAME_LEN+1] = {0,};
520 char strNumber[DEF_THREAD_ADDR_LEN+1] = {0,};
522 msg_get_int_value(peerList.msg_struct_info[i], MSG_THREAD_ID_INT, &thread_id);
523 msg_get_list_handle(peerList.msg_struct_info[i], MSG_MESSAGE_ADDR_LIST_STRUCT, (void **)&addrList);
525 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_TYPE, MSG_BUNDLE_VALUE_NEW_MSG);
526 snprintf(buf, DEF_BUF_LEN_L, "%d", thread_id);
527 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_THREAD_ID, buf);
528 msg_get_str_value(peerList.msg_struct_info[i], MSG_THREAD_NAME_STR, strName, DEF_THREAD_NAME_LEN);
529 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_THREAD_NAME, strName);
531 msg_get_str_value(addrList->msg_struct_info[0], MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, strNumber, DEF_THREAD_ADDR_LEN);
532 msg_get_int_value(addrList->msg_struct_info[0], MSG_ADDRESS_INFO_CONTACT_ID_INT, &contact_id);
534 snprintf(buf_contact, DEF_BUF_LEN, "%d", contact_id);
535 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_THREAD_ADDRESS, strNumber);
536 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_CONTACT_ID, buf_contact);
539 msg_release_struct(&sort_rule_t);
540 msg_release_list_struct(&peerList);
547 static service_h __get_service_with_msg_id(struct appdata *ad, service_h service)
551 service_h svc_handle = NULL;
553 if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
554 D_EMSG("service_create() is failed !!");
559 char *msg_id_str = NULL;
560 service_get_extra_data(service, MSG_BUNDLE_KEY_MSG_ID, &msg_id_str);
563 service_destroy(svc_handle);
567 msg_id = atoi(msg_id_str);
570 service_destroy(svc_handle);
574 msg_struct_t msgInfo = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
575 msg_struct_t sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
576 msg_error_t err = MSG_SUCCESS;
580 char buf_thread[DEF_BUF_LEN_S] = {0,};
581 char buf_contact[DEF_BUF_LEN_S] = {0,};
583 msg_struct_list_s *addr_list = NULL;
584 char strNumber[DEF_THREAD_ADDR_LEN + 1] = {0,};
585 char strName[DEF_THREAD_NAME_LEN + 1] = {0,};
587 err = msg_get_message(ad->msgHandle, (msg_message_id_t)msg_id, msgInfo, sendOpt);
589 if (err != MSG_SUCCESS) {
590 service_destroy(svc_handle);
591 msg_release_struct(&msgInfo);
592 msg_release_struct(&sendOpt);
596 msg_get_int_value(msgInfo, MSG_MESSAGE_THREAD_ID_INT, &thread_id);
597 snprintf(buf_thread, sizeof(buf_thread), "%d", thread_id);
599 msg_get_list_handle(msgInfo, MSG_MESSAGE_ADDR_LIST_STRUCT, (void **)&addr_list);
601 msg_get_str_value(addr_list->msg_struct_info[0], MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, strNumber, DEF_THREAD_ADDR_LEN);
602 msg_get_str_value(addr_list->msg_struct_info[0], MSG_ADDRESS_INFO_DISPLAYNAME_STR, strName, DEF_THREAD_NAME_LEN);
603 msg_get_int_value(addr_list->msg_struct_info[0], MSG_ADDRESS_INFO_CONTACT_ID_INT, &contact_id);
604 snprintf(buf_contact, sizeof(buf_contact), "%d", contact_id);
606 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_THREAD_ID, buf_thread);
607 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_THREAD_NAME, strName);
608 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_THREAD_ADDRESS, strNumber);
609 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_CONTACT_ID, buf_contact);
611 msg_release_struct(&msgInfo);
612 msg_release_struct(&sendOpt);
618 static Evas_Object* create_win(const char *name)
625 eo = elm_win_add(NULL, name, ELM_WIN_BASIC);
627 elm_win_title_set(eo, name);
628 evas_object_smart_callback_add(eo, "delete,request", win_del, NULL);
629 ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h);
630 evas_object_resize(eo, w, h);
631 elm_win_conformant_set(eo, EINA_TRUE);
638 void layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv)
643 Evas_Object *base, *win;
650 base = ug_get_layout(ug);
657 win = ug_get_window();
660 case UG_MODE_FULLVIEW:
661 evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
662 elm_win_resize_object_add(win, base);
663 evas_object_show(base);
665 case UG_MODE_FRAMEVIEW:
673 void result_cb(ui_gadget_h ug, service_h result, void *priv)
677 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !ug || !priv);
679 struct appdata *ad = priv;
681 PMSG_THREAD_DATA pData = (PMSG_THREAD_DATA)ad->thread_data;
682 PMSG_THREAD_LIST_DATA pListData = NULL;
684 char *str_result = NULL;
686 service_get_extra_data(result, MSG_BUNDLE_KEY_RESULT, &str_result);
688 if (!g_strcmp0(str_result, MSG_BUNDLE_VALUE_DEL_ALL))
695 pListData = msg_ui_thread_get_current_list();
697 if (!g_strcmp0(str_result, MSG_BUNDLE_VALUE_DEL_ALL)) {
703 if (pListData->app_data_type == THREAD_LIST_APP_DATA_MSG) {
704 service_get_extra_data(result, MSG_BUNDLE_KEY_MSG_ID, &buf);
707 msg_ui_thread_list_msg_item_delete(pListData, del_id);
710 service_get_extra_data(result, MSG_BUNDLE_KEY_THREAD_ID, &buf);
713 msg_ui_thread_list_item_delete(pListData, del_id);
717 if (pData->isRotate == true) {
718 if (!pData->split_data) {
719 msg_ui_thread_create_split_data();
720 msg_ui_thread_splitview_launch(pData, pData->split_data);
723 elm_object_part_content_set(pData->panes, "left", pData->layout_main);
724 elm_object_part_content_unset(pData->panes, "right");
725 elm_panes_content_left_size_set(pData->panes, 1.0);
728 pListData->sel_gen_item = NULL;
729 pListData->sel_thread_id = 0;
730 pListData->sel_msg_id = 0;
731 ad->composer_ug = NULL;
732 ad->ug_type = MSG_COMPOSER_UG_TYPE_NONE;
737 if (pListData->app_data_type == THREAD_LIST_APP_DATA_MSG) {
738 service_get_extra_data(result, MSG_BUNDLE_KEY_MSG_ID, &buf);
740 update_id = atoi(buf);
741 msg_ui_thread_list_msg_item_update(pListData, update_id);
744 service_get_extra_data(result, MSG_BUNDLE_KEY_THREAD_ID, &buf);
746 update_id = atoi(buf);
747 msg_ui_thread_list_item_update(pListData, update_id);
748 pListData->sel_thread_id = update_id;
756 void destroy_cb(ui_gadget_h ug, void *priv)
760 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !ug || !priv);
762 struct appdata *ad = (struct appdata *)priv;
763 int ug_type = ad->ug_type;
765 if (ug == ad->composer_ug) {
767 ad->composer_ug = NULL;
768 ad->ug_type = MSG_COMPOSER_UG_TYPE_NONE;
771 if (ad->layout_main) {
772 PMSG_THREAD_DATA pData = (PMSG_THREAD_DATA)ad->thread_data;
773 PMSG_THREAD_LIST_DATA pListData = NULL;
775 pListData = msg_ui_thread_get_current_list();
776 if (pListData == NULL) {
782 if (pData->isRotate == true) {
783 if (!pData->split_data) {
784 msg_ui_thread_create_split_data();
785 msg_ui_thread_splitview_launch(pData, pData->split_data);
787 if (ug_type == MSG_COMPOSER_UG_TYPE_VIEWER) {
788 msg_ui_thread_cancel_search_mode(pListData);
789 elm_win_lower(pData->win_main);
792 elm_object_part_content_set(pData->panes, "left", pData->layout_main);
793 elm_object_part_content_unset(pData->panes, "right");
794 elm_panes_content_left_size_set(pData->panes, 1.0);
798 if (pListData->sel_thread_id > 0)
799 msg_ui_thread_list_item_update(pListData, pListData->sel_thread_id);
801 if (pListData->sel_msg_id > 0)
802 msg_ui_thread_list_msg_item_update(pListData, pListData->sel_msg_id);
804 pListData->sel_gen_item = NULL;
805 pListData->sel_thread_id = 0;
806 pListData->sel_msg_id = 0;
808 pListData->view_mode = THREAD_NORMAL_VIEW;
814 int msg_ui_load_composer_ug(service_h svc_handle, MessageComposerUgType ug_type)
819 return MSG_UI_RET_ERR;
821 if (gAppData->composer_ug) {
822 if (ug_type == MSG_COMPOSER_UG_TYPE_COMPOSER && gAppData->ug_type == MSG_COMPOSER_UG_TYPE_VIEWER) {
823 ug_destroy(gAppData->composer_ug);
824 gAppData->composer_ug = NULL;
825 gAppData->ug_type = MSG_COMPOSER_UG_TYPE_NONE;
827 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_FROM, MSG_BUNDLE_VALUE_INTERNAL);
828 if (ug_type == MSG_COMPOSER_UG_TYPE_COMPOSER)
829 gAppData->composer_ug = ug_create(NULL, MSG_COMPOSER_UG_NAME, UG_MODE_FULLVIEW, svc_handle, &gAppData->cbs);
831 gAppData->composer_ug = ug_create(NULL, MSG_COMPOSER_UG_NAME, UG_MODE_FRAMEVIEW, svc_handle, &gAppData->cbs);
833 ug_send_message(gAppData->composer_ug, svc_handle);
836 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_FROM, MSG_BUNDLE_VALUE_INTERNAL);
837 if (ug_type == MSG_COMPOSER_UG_TYPE_COMPOSER)
838 gAppData->composer_ug = ug_create(NULL, MSG_COMPOSER_UG_NAME, UG_MODE_FULLVIEW, svc_handle, &gAppData->cbs);
840 gAppData->composer_ug = ug_create(NULL, MSG_COMPOSER_UG_NAME, UG_MODE_FRAMEVIEW, svc_handle, &gAppData->cbs);
843 if (!gAppData->composer_ug)
844 return MSG_UI_RET_ERR;
846 gAppData->ug_type = ug_type;
848 if (ug_type == MSG_COMPOSER_UG_TYPE_VIEWER) {
849 PMSG_THREAD_DATA pData = (PMSG_THREAD_DATA)gAppData->thread_data;
850 Evas_Object * layout = (Evas_Object *)ug_get_layout(gAppData->composer_ug);
851 elm_object_part_content_set(pData->panes, "right", layout);
852 msg_ui_thread_destroy_split_data(pData->split_data);
854 if (pData->isRotate == false) {
855 elm_object_part_content_unset(pData->panes, "left");
856 elm_panes_content_left_size_set(pData->panes, 0.0);
857 evas_object_hide(pData->layout_main);
861 return MSG_UI_RET_SUCCESS;
864 Evas_Object *msg_ui_get_composer_ug_viewer_layout(void)
868 if (!gAppData || !gAppData->composer_ug)
871 if (gAppData->ug_type != MSG_COMPOSER_UG_TYPE_VIEWER)
874 Evas_Object * layout = (Evas_Object *)ug_get_layout(gAppData->composer_ug);
881 void msg_ui_destroy_composer_ug(void)
883 if (!gAppData || !gAppData->composer_ug)
886 ug_destroy(gAppData->composer_ug);
888 PMSG_THREAD_DATA pData = (PMSG_THREAD_DATA)gAppData->thread_data;
889 PMSG_THREAD_LIST_DATA pListData = msg_ui_thread_get_current_list();
892 if (pData->isRotate == true) {
893 if (!pData->split_data) {
894 msg_ui_thread_create_split_data();
895 msg_ui_thread_splitview_launch(pData, pData->split_data);
899 pListData->sel_gen_item = NULL;
900 pListData->sel_thread_id = 0;
901 pListData->sel_msg_id = 0;
902 gAppData->composer_ug = NULL;
903 gAppData->ug_type = MSG_COMPOSER_UG_TYPE_NONE;
907 static bool app_create(void *data)
909 /* return TRUE : success, return FALSE : not to run main loop */
913 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, !data, MSG_UI_RET_ERR);
915 struct appdata *ad = data;
917 sound_manager_error_e err = SOUND_MANAGER_ERROR_NONE;
920 win = create_win(MESSAGE_PKGNAME);
926 ad->bg = elm_bg_add(ad->win_main);
927 evas_object_size_hint_weight_set(ad->bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
928 elm_win_resize_object_add(ad->win_main, ad->bg);
930 ad->conform = elm_conformant_add(win);
931 if (ad->conform == NULL)
934 evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
935 elm_win_resize_object_add(win, ad->conform);
936 evas_object_show(ad->conform);
938 err = sound_manager_set_session_type(SOUND_SESSION_TYPE_SHARE);
939 if (err != SOUND_MANAGER_ERROR_NONE)
940 D_MSG("sound_manager_set_session_type is failed, ret = [%d]", err);
942 UG_INIT_EFL(ad->win_main, UG_OPT_INDICATOR_ENABLE);
943 elm_win_indicator_mode_set(ad->win_main, ELM_WIN_INDICATOR_SHOW);
944 __rotate(app_get_device_orientation(), ad);
946 ad->cbs.layout_cb = layout_cb;
947 ad->cbs.result_cb = result_cb;
948 ad->cbs.destroy_cb = destroy_cb;
949 ad->cbs.priv = (void *)ad;
951 gAppData = ad; // Set global app data pointer;
957 static void app_terminate(void *data)
961 MSG_UI_RETM_IF(MSG_UI_LEVEL_ERR, !data, "data is null");
963 struct appdata *ad = data;
969 msg_ui_thread_deinit_thread_data(ad->thread_data);
972 err = msg_close_msg_handle(&ad->msgHandle);
973 D_MSG("msg_close_msg_handle, ret = [%d]", err);
979 static void app_pause(void *data)
983 msg_ui_thread_set_app_state(MSG_UI_STATE_PAUSE);
989 static void app_resume(void *data)
992 msg_ui_thread_set_app_state(MSG_UI_STATE_RUNNING);
999 static void app_service(service_h service, void *data)
1002 MSG_UI_RETM_IF(MSG_UI_LEVEL_ERR, !data, "data is NULL");
1004 struct appdata *ad = data;
1005 service_h svc_handle = NULL;
1006 msg_error_t err = MSG_SUCCESS;
1007 msg_handle_t msgHandle = NULL;
1008 bool isDefaultView = false;
1010 char *operation = NULL;
1011 char *cvalue = NULL;
1012 int ret = SYSTEM_INFO_ERROR_NONE;
1014 ret = system_info_get_value_string(SYSTEM_INFO_KEY_MODEL, &cvalue);
1015 if (ret == SYSTEM_INFO_ERROR_NONE && cvalue != NULL) {
1016 if (g_strcmp0(cvalue, "Emulator") == 0) {
1017 D_MSG("Not support in Emulator !!");
1023 int ret = service_create(&reply);
1024 if (ret != SERVICE_ERROR_NONE) {
1025 D_EMSG("service_create() is failed : ret = %d", ret);
1027 service_reply_to_launch_request(reply, service, SERVICE_RESULT_CANCELED);
1028 service_destroy(reply);
1031 /* Exit application because it is not supported in Emulator. */
1044 if (!ad->msgHandle) {
1045 err = msg_open_msg_handle(&msgHandle);
1046 if (err != MSG_SUCCESS) {
1047 MSG_UI_DEBUG(MSG_UI_LEVEL_ASSERT, "msg_open_msg_handle failed, Error=[%d]\n", err);
1048 __msg_ui_popup_warning(ad->win_main, dgettext("sys_string", "IDS_COM_POP_SERVICE_UNAVAILABLE"));
1051 ad->msgHandle = msgHandle;
1055 service_get_operation(service, &operation);
1057 svc_handle = __get_service_app_svc_op(operation, service);
1059 char *key_type = NULL;
1061 service_get_extra_data(service, MSG_BUNDLE_KEY_TYPE, &key_type);
1062 if (g_strcmp0(key_type, MSG_BUNDLE_VALUE_COMPOSE) == 0) {
1063 service_clone(&svc_handle, service);
1064 } else if (g_strcmp0(key_type, MSG_BUNDLE_VALUE_NEW_MSG) == 0) {
1065 svc_handle = __get_service_with_new_msg(ad);
1066 } else if (g_strcmp0(key_type, MSG_BUNDLE_VALUE_MSG_ID) == 0) {
1067 svc_handle = __get_service_with_msg_id(ad, service);
1069 char *mime_type = NULL;
1071 service_get_extra_data(service, AUL_K_MIME_TYPE, &mime_type);
1072 if (g_strcmp0(mime_type, MSG_BUNDLE_VALUE_SMS_URI) == 0)
1073 svc_handle = __msg_ui_parse_sms_uri(service, NULL);
1074 else if (g_strcmp0(mime_type, MSG_BUNDLE_VALUE_MMSTO_URI) == 0)
1075 svc_handle = __msg_ui_parse_mmsto_uri(service, NULL);
1077 isDefaultView = true;
1082 isDefaultView = true;
1084 isDefaultView = true;
1087 if (isDefaultView) {
1088 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "show DefaultView");
1089 if (ad->composer_ug) {
1090 ug_destroy(ad->composer_ug);
1091 ad->composer_ug = NULL;
1092 ad->ug_type = MSG_COMPOSER_UG_TYPE_NONE;
1095 if (!ad->thread_data)
1096 ad->thread_data = msg_ui_thread_init_thread_data(ad);
1098 if (!ad->layout_main) {
1099 ad->layout_main = msg_ui_thread_create_layout_main(ad->thread_data);
1100 evas_object_size_hint_weight_set(ad->layout_main, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1101 elm_object_content_set(ad->conform, ad->layout_main);
1103 msg_ui_thread_load_thread_view(ad->thread_data, service);
1105 msg_ui_thread_reset_thread_view(ad->thread_data, service);
1107 __rotate(app_get_device_orientation(), ad);
1109 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "show app-service view");
1110 /* If message app is called by app-service to display composer view,
1111 * list view should be destroyed because previous screen should be displayed
1112 * when user tap back button.
1114 MessageComposerUgType ug_type = MSG_COMPOSER_UG_TYPE_NONE;
1116 if (operation != NULL) {
1118 PMSG_THREAD_DATA pData = (PMSG_THREAD_DATA)ad->thread_data;
1120 if (g_strcmp0(operation, SERVICE_OPERATION_SEND) == 0 ||
1121 g_strcmp0(operation, SERVICE_OPERATION_SEND_TEXT) == 0) {
1122 if (ad->layout_main) {
1123 /* content unset composer */
1124 if (ad->ug_type == MSG_COMPOSER_UG_TYPE_VIEWER) {
1126 elm_object_part_content_unset(pData->panes, "right");
1130 for (i = MSG_THREAD_LIST_MAX_COUNT-1; i >= 0; i--) {
1131 if (pData->list_data[i] != NULL) {
1132 msg_ui_thread_destroy_thread_list_data(pData->list_data[i]);
1136 evas_object_del(ad->layout_main);
1137 ad->layout_main = NULL;
1139 ug_type = MSG_COMPOSER_UG_TYPE_COMPOSER;
1140 } else if (g_strcmp0(operation, SERVICE_OPERATION_DEFAULT) == 0) {
1141 char *key_type = NULL;
1143 service_get_extra_data(service, MSG_BUNDLE_KEY_TYPE, &key_type);
1144 if (g_strcmp0(key_type, MSG_BUNDLE_VALUE_MSG_ID) == 0) {
1145 if (ad->layout_main) {
1146 /* content unset composer */
1147 if (ad->ug_type == MSG_COMPOSER_UG_TYPE_VIEWER) {
1149 elm_object_part_content_unset(pData->panes, "right");
1153 for (i = MSG_THREAD_LIST_MAX_COUNT-1; i >= 0; i--) {
1154 if (pData->list_data[i] != NULL) {
1155 msg_ui_thread_destroy_thread_list_data(pData->list_data[i]);
1159 evas_object_del(ad->layout_main);
1160 ad->layout_main = NULL;
1162 ug_type = MSG_COMPOSER_UG_TYPE_VIEWER;
1167 if (ad->composer_ug) {
1168 ug_destroy(ad->composer_ug);
1169 ad->composer_ug = NULL;
1170 ad->ug_type = MSG_COMPOSER_UG_TYPE_NONE;
1173 ad->composer_ug = ug_create(NULL, MSG_COMPOSER_UG_NAME, UG_MODE_FULLVIEW, svc_handle, &ad->cbs);
1174 ad->ug_type = ug_type;
1178 service_destroy(svc_handle);
1181 evas_object_show(ad->win_main);
1182 elm_win_activate(ad->win_main);
1185 if (ad->layout_main == NULL && ad->composer_ug == NULL)
1191 int main(int argc, char *argv[])
1196 memset(&ad, 0x0, sizeof(struct appdata));
1198 app_event_callback_s event_callback;
1200 event_callback.create = app_create;
1201 event_callback.terminate = app_terminate;
1202 event_callback.pause = app_pause;
1203 event_callback.resume = app_resume;
1204 event_callback.service = app_service;
1205 event_callback.low_memory = NULL;
1206 event_callback.low_battery = low_battery_cb;
1207 event_callback.device_orientation = device_orientation;
1208 event_callback.language_changed = lang_changed;
1209 event_callback.region_format_changed = region_changed_cb;
1212 return app_efl_main(&argc, &argv, &event_callback, &ad);