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://www.tizenopensource.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.
18 #include "msg-ui-thread-main.h"
20 static void __msg_ui_thread_insert_and_select_gen_item(PMSG_THREAD_LIST_DATA pListData);
21 static void __msg_ui_thread_add_navi_select_all_ly(PMSG_THREAD_LIST_DATA pListData);
22 static void __msg_ui_thread_sel_all_ly_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info);
23 static void __msg_ui_thread_multi_action_finish(PMSG_THREAD_LIST_DATA pListData);
24 static Eina_Bool __msg_ui_thread_searchbar_entry_timer_cb(void *data);
26 static void __msg_ui_thread_ctxpopup_clicked_cb(void *data, Evas_Object *obj, void *event_info);
27 static void __msg_ui_thread_ctxpopup_dismissed_cb(void *data, Evas_Object *obj, void *event_info);
30 void msg_ui_thread_storage_change_cb(msg_handle_t handle, msg_storage_change_type_t type, msg_id_list_s *pMsgIdList, void *user_param)
35 bool multiple_action = false;
36 if (!user_param || !pMsgIdList)
39 PMSG_THREAD_DATA pData = user_param;
40 PMSG_THREAD_LIST_DATA pListData = NULL;
42 if (msg_ui_thread_get_app_state(pData) == MSG_UI_STATE_DESTROY)
45 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "type is %d", type);
47 for (list_idx = MSG_THREAD_LIST_MAX_COUNT-1; list_idx >= 0; list_idx--) {
48 if (pData->list_data[list_idx] != NULL) {
49 pListData = pData->list_data[list_idx];
50 if (pListData->multi_action_thread != NULL || multiple_action == true) {
51 multiple_action = true;
52 break; //finish multi action, reload msg list
55 if (type == MSG_STORAGE_CHANGE_CONTACT) {
56 if (pListData->app_data_type == THREAD_LIST_APP_DATA_THREAD)
57 msg_ui_thread_list_update(pListData);
59 msg_ui_thread_list_msg_list_update(pListData);
60 } else if (type == MSG_STORAGE_CHANGE_INSERT) {
61 if (pListData->view_mode == THREAD_EDIT_VIEW) {
62 pData->isIncomingMsg = true;
63 D_MSG("Current mode is EDIT.");
66 __msg_ui_thread_insert_and_select_gen_item(pListData);
67 } else if (type == MSG_STORAGE_CHANGE_DELETE) {
68 if (pListData->app_data_type == THREAD_LIST_APP_DATA_MSG) {
71 for (idx = 0; idx < pMsgIdList->nCount; idx++) {
72 msg_ui_thread_list_msg_item_delete(pListData, pMsgIdList->msgIdList[idx]);
75 Elm_Object_Item *gen_item = NULL;
76 PMSG_APP_THREAD_DATA_S item_data = NULL;
77 msg_struct_t threadInfo = msg_create_struct(MSG_STRUCT_THREAD_INFO);
80 msg_error_t err = MSG_SUCCESS;
82 gen_item = elm_genlist_first_item_get(pListData->genlist);
84 if (elm_genlist_item_parent_get(gen_item) == NULL) {
85 gen_item = elm_genlist_item_next_get(gen_item);
89 item_data = (PMSG_APP_THREAD_DATA_S) elm_object_item_data_get(gen_item);
91 err = msg_get_thread(msg_ui_thread_get_data_handle(), item_data->thread_id, threadInfo);
92 if (err != MSG_SUCCESS) {
93 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_get_thread() is failed : err = %d", err);
94 msg_ui_thread_list_item_delete(pListData, item_data->thread_id);
98 msg_get_int_value(threadInfo, MSG_THREAD_MMS_COUNT_INT, &mmsCnt);
99 msg_get_int_value(threadInfo, MSG_THREAD_SMS_COUNT_INT, &smsCnt);
101 if (smsCnt+mmsCnt == 0)
102 msg_ui_thread_list_item_delete(pListData, item_data->thread_id);
103 else if ((item_data->sms_cnt + item_data->mms_cnt) != (smsCnt+mmsCnt))
104 msg_ui_thread_list_item_update(pListData, item_data->thread_id);
106 gen_item = elm_genlist_item_next_get(gen_item);
108 msg_release_struct(&threadInfo);
110 } else if (type == MSG_STORAGE_CHANGE_UPDATE) {
113 for (idx = 0; idx < pMsgIdList->nCount; idx++) {
114 if (pListData->app_data_type == THREAD_LIST_APP_DATA_THREAD) {
115 msg_struct_t msgInfo = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
116 msg_struct_t sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
117 msg_error_t err = MSG_SUCCESS;
120 err = msg_get_message(pData->msgHandle, pMsgIdList->msgIdList[idx], msgInfo, sendOpt);
122 if (err != MSG_SUCCESS) {
123 msg_release_struct(&msgInfo);
124 msg_release_struct(&sendOpt);
125 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "error : msg_id : %d, error : %d", pMsgIdList->msgIdList[idx], err);
129 msg_get_int_value(msgInfo, MSG_MESSAGE_THREAD_ID_INT, &thread_id);
131 msg_release_struct(&msgInfo);
132 msg_release_struct(&sendOpt);
134 if (msg_ui_thread_list_item_update(pListData, thread_id) == EINA_FALSE)
135 __msg_ui_thread_insert_and_select_gen_item(pListData);
137 if (msg_ui_thread_list_msg_item_update(pListData, pMsgIdList->msgIdList[idx]) == EINA_FALSE)
138 __msg_ui_thread_insert_and_select_gen_item(pListData);
148 static void __msg_ui_thread_insert_and_select_gen_item(PMSG_THREAD_LIST_DATA pListData)
152 int sel_thread_id = 0, sel_msg_id = 0;
154 if (pListData->sel_gen_item) {
155 sel_thread_id = pListData->sel_thread_id;
156 sel_msg_id = pListData->sel_msg_id;
159 if (pListData->app_data_type == THREAD_LIST_APP_DATA_MSG) {
160 if (pListData->search_mode == THREAD_SEARCH_ON)
161 msg_ui_thread_search_msg_list_load(pListData);
163 msg_ui_thread_msg_list_load(pListData, pListData->list_type);
164 msg_ui_thread_select_item_by_msg_id(pListData, sel_msg_id);
166 msg_ui_thread_list_load(pListData, FALSE);
167 msg_ui_thread_select_item_by_thread_id(pListData, sel_thread_id);
170 if (pListData->sel_gen_item)
171 elm_genlist_item_selected_set(pListData->sel_gen_item, true);
176 void msg_ui_thread_ctlbar_multi_action_cb(void *data, Evas_Object *obj, void *event_info)
179 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
181 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
182 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, pListData->multi_action_thread);
184 if (pListData->popup) {
185 evas_object_del(pListData->popup);
186 pListData->popup = NULL;
189 if (obj == pListData->toolbar_btn[CONTROLBAR_ITEM_1]) {
190 pListData->action_type = THREAD_ACTION_DELETE;
191 msg_ui_thread_show_action_popup(pListData, THREAD_ACTION_DELETE, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_DELETE_Q"));
192 } else if (obj == pListData->toolbar_btn[CONTROLBAR_ITEM_2]) {
193 if (pListData->list_type == THREAD_SPAM_LIST_TYPE) {
194 pListData->action_type = THREAD_ACTION_RESTORE;
195 msg_ui_thread_show_action_popup(pListData, THREAD_ACTION_RESTORE, dgettext(MESSAGE_PKGNAME, "IDS_MSG_BODY_MESSAGE_WILL_BE_RESTORED"));
196 } else if (pListData->list_type == THREAD_SIM_LIST_TYPE) {
197 pListData->action_type = THREAD_ACTION_COPY_TO_PHONE;
201 if (pListData->popup == NULL) {
202 pListData->popup = msg_ui_thread_show_notify_with_progressbar(pListData, pListData->check_cnt);
203 pListData->multi_action_thread = ecore_thread_feedback_run(msg_ui_thread_multi_action_thread_fn, msg_ui_thread_multi_action_thread_feedback_fn, NULL, NULL, (void *)pListData, EINA_TRUE);
207 void msg_ui_thread_multi_action_thread_feedback_fn(void *data, Ecore_Thread *thread, void *msg_data)
211 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !thread || !data || !msg_data);
213 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
216 if (*ret == MSG_SUCCESS) {
217 if (pListData->progressbar)
218 elm_progressbar_value_set(pListData->progressbar, (double)(pListData->sel_index+1)/pListData->check_cnt);
220 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "fail action. %d", *ret);
222 /** __msg_ui_thread_multi_action_finish function contains evas_object_del(thread_data->popup), */
223 /** so, call __msg_ui_thread_multi_action_finish() first, after that make "unable to delete" popup */
224 __msg_ui_thread_multi_action_finish(pListData);
226 if (pListData->action_type == THREAD_ACTION_DELETE)
227 msg_ui_thread_show_notify(pListData, dgettext("sys_string", "IDS_COM_POP_UNABLE_TO_DELETE"));
228 else if (pListData->action_type == THREAD_ACTION_COPY_TO_PHONE)
229 msg_ui_thread_show_notify(pListData, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_POP_UNABLE_TO_COPY"));
230 else if (pListData->action_type == THREAD_ACTION_RESTORE)
231 msg_ui_thread_show_notify(pListData, dgettext("sys_string", "IDS_COM_POP_MOVING_FAILED"));
233 pListData->action_type = THREAD_ACTION_NONE;
234 pListData->include_protected_msg = false;
240 if (pListData->sel_index + 1 == pListData->check_cnt)
241 __msg_ui_thread_multi_action_finish(pListData);
243 pListData->sel_index++;
249 void msg_ui_thread_multi_action_thread_fn(void *data, Ecore_Thread *thread)
253 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data);
255 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
258 void* item_data = NULL;
260 EINA_LIST_FOREACH(pListData->chk_list, list, item_data) {
261 int *ret = calloc(1, sizeof(int));
264 if (pListData->action_type == THREAD_ACTION_DELETE) {
265 if (pListData->list_type == THREAD_NORMAL_LIST_TYPE) {
266 PMSG_APP_THREAD_DATA_S data = (PMSG_APP_THREAD_DATA_S)item_data;
267 *ret = msg_delete_thread_message_list(msg_ui_thread_get_data_handle(), data->thread_id, pListData->include_protected_msg);
268 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "pListData->include_protected_msg = %d", pListData->include_protected_msg);
270 PMSG_APP_THREAD_MSG_DATA_S data = (PMSG_APP_THREAD_MSG_DATA_S)item_data;
272 if (pListData->include_protected_msg == false) {
273 msg_struct_t msgInfo = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
274 msg_struct_t sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
275 bool bProtect = false;
276 msg_error_t err = MSG_SUCCESS;
278 err = msg_get_message(msg_ui_thread_get_data_handle(), (msg_message_id_t)data->msg_id, msgInfo, sendOpt);
279 if (err != MSG_SUCCESS) {
280 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_get_message() is failed : err = %d", err);
281 msg_release_struct(&msgInfo);
282 msg_release_struct(&sendOpt);
286 msg_get_bool_value(msgInfo, MSG_MESSAGE_PROTECTED_BOOL, &bProtect);
287 if (bProtect == true) {
288 msg_release_struct(&msgInfo);
289 msg_release_struct(&sendOpt);
291 ecore_thread_feedback(thread, (void *)ret);
295 *ret = msg_delete_message(msg_ui_thread_get_data_handle(), data->msg_id);
297 msg_release_struct(&msgInfo);
298 msg_release_struct(&sendOpt);
300 *ret = msg_delete_message(msg_ui_thread_get_data_handle(), data->msg_id);
303 } else if (pListData->action_type == THREAD_ACTION_RESTORE) {
304 PMSG_APP_THREAD_MSG_DATA_S data = (PMSG_APP_THREAD_MSG_DATA_S)item_data;
305 *ret = msg_move_msg_to_folder(msg_ui_thread_get_data_handle(), data->msg_id, MSG_INBOX_ID);
306 } else if (pListData->action_type == THREAD_ACTION_COPY_TO_PHONE) {
307 PMSG_APP_THREAD_MSG_DATA_S data = (PMSG_APP_THREAD_MSG_DATA_S)item_data;
309 msg_struct_t msgInfo = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
310 msg_struct_t sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
312 *ret = msg_get_message(msg_ui_thread_get_data_handle(), (msg_message_id_t)data->msg_id, msgInfo, sendOpt);
313 if (*ret != MSG_SUCCESS) {
314 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_get_message() is failed : err = %d, msgid = %d", *ret, data->msg_id);
315 msg_release_struct(&msgInfo);
316 msg_release_struct(&sendOpt);
320 msg_set_int_value(msgInfo, MSG_MESSAGE_STORAGE_ID_INT, MSG_STORAGE_PHONE);
321 msg_id = msg_add_message(msg_ui_thread_get_data_handle(), msgInfo, sendOpt);
323 msg_release_struct(&msgInfo);
324 msg_release_struct(&sendOpt);
328 ecore_thread_feedback(thread, (void *)ret);
330 if (*ret != MSG_SUCCESS)
333 *ret = MSG_ERR_NULL_POINTER;
334 ecore_thread_feedback(thread, (void *)ret);
340 static void __msg_ui_thread_multi_action_finish(PMSG_THREAD_LIST_DATA pListData)
344 if (pListData->popup) {
345 evas_object_del(pListData->popup);
346 pListData->popup = NULL;
349 msg_ui_thread_show_action_finish_info(pListData, pListData->action_type, NULL);
351 pListData->multi_action_thread = NULL;
352 pListData->action_type = THREAD_ACTION_NONE;
353 pListData->include_protected_msg = false;
355 msg_ui_thread_show_normal_mode(pListData);
357 if (pListData->list_type == THREAD_NORMAL_LIST_TYPE) {
358 msg_ui_thread_list_load(pListData, FALSE);
360 PMSG_THREAD_LIST_DATA pDefaultListData = msg_ui_thread_get_default_list();
362 msg_ui_thread_msg_list_load(pListData, pListData->list_type);
364 if (pDefaultListData)
365 msg_ui_thread_list_load(pDefaultListData, FALSE); //might be changed
369 void msg_ui_thread_ctlbar_checkbox_cb(void *data, Evas_Object *obj, void *event_info)
372 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
374 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
375 Elm_Object_Item* it_sweep = NULL;
376 char buf[DEF_BUF_LEN_S] = {0};
378 pListData->view_mode = THREAD_EDIT_VIEW;
379 pListData->check_cnt = 0;
380 pListData->sel_index = 0;
382 if (pListData->popup) {
383 evas_object_del(pListData->popup);
384 pListData->popup = NULL;
387 it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
389 elm_genlist_item_decorate_mode_set(it_sweep, "slide", EINA_FALSE);
390 elm_genlist_item_select_mode_set(it_sweep, ELM_OBJECT_SELECT_MODE_DEFAULT);
391 elm_genlist_item_update(it_sweep);
394 elm_genlist_decorate_mode_set(pListData->genlist, EINA_TRUE);
395 elm_genlist_select_mode_set(pListData->genlist, ELM_OBJECT_SELECT_MODE_ALWAYS);
397 if (pListData->list_type == THREAD_SIM_LIST_TYPE || pListData->list_type == THREAD_SPAM_LIST_TYPE)
398 snprintf(buf, sizeof(buf), "%s", dgettext("sys_string", "IDS_COM_SK_EDIT"));
400 snprintf(buf, sizeof(buf), "%s", dgettext("sys_string", "IDS_COM_SK_DELETE"));
402 elm_object_item_text_set(pListData->nf_it, buf);
404 __msg_ui_thread_add_navi_select_all_ly(pListData);
405 msg_ui_thread_set_navi_toolbar_item(pListData);
407 evas_object_hide(pListData->search_btn);
408 elm_object_item_part_content_unset(pListData->nf_it, "title_right_btn");
413 static void __msg_ui_thread_add_navi_select_all_ly(PMSG_THREAD_LIST_DATA pListData)
416 MSG_UI_DEBUG(MSG_UI_LEVEL_ASSERT,"[ASSERT] pListData is NULL");
420 if (!pListData->sel_all_ly) {
421 pListData->sel_all_ly = elm_layout_add(pListData->content_ly);
422 elm_layout_theme_set(pListData->sel_all_ly, "genlist", "item", "select_all/default");
423 evas_object_size_hint_weight_set(pListData->sel_all_ly, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
424 evas_object_size_hint_align_set(pListData->sel_all_ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
425 evas_object_event_callback_add(pListData->sel_all_ly, EVAS_CALLBACK_MOUSE_DOWN, __msg_ui_thread_sel_all_ly_mouse_down_cb, pListData);
427 pListData->sel_all_box = elm_check_add(pListData->sel_all_ly);
428 elm_check_state_pointer_set(pListData->sel_all_box, &pListData->sel_all_checked);
429 evas_object_propagate_events_set(pListData->sel_all_box, EINA_FALSE);
430 evas_object_smart_callback_add(pListData->sel_all_box, "changed", msg_ui_thread_sel_all_clicked_cb, pListData);
431 evas_object_show(pListData->sel_all_box);
433 elm_object_part_content_set(pListData->sel_all_ly, "elm.icon", pListData->sel_all_box);
434 elm_object_part_text_set(pListData->sel_all_ly, "elm.text", dgettext("sys_string", "IDS_COM_BODY_SELECT_ALL"));
437 if (msg_ui_thread_rotation_get() == true) {
438 elm_object_part_content_unset(pListData->content_ly, "sel_all");
439 evas_object_hide(pListData->searchbar);
441 edje_object_signal_emit(_EDJ(pListData->content_ly), "show_searchbar", "sel_all");
443 evas_object_show(pListData->sel_all_ly);
444 elm_object_part_content_set(pListData->content_ly, "sel_all", pListData->sel_all_ly);
447 static void __msg_ui_thread_sel_all_ly_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
451 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
453 pListData->sel_all_checked = !pListData->sel_all_checked;
454 elm_check_state_pointer_set(pListData->sel_all_box, &pListData->sel_all_checked);
456 msg_ui_thread_sel_all_clicked_cb(pListData, NULL, NULL);
461 void msg_ui_thread_ctlbar_spam_setting_cb(void *data, Evas_Object *obj, void *event_info)
463 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
464 Elm_Object_Item* it_sweep = NULL;
466 it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
468 elm_genlist_item_decorate_mode_set(it_sweep, "slide", EINA_FALSE);
469 elm_genlist_item_select_mode_set(it_sweep, ELM_OBJECT_SELECT_MODE_DEFAULT);
472 msg_ui_thread_launch_spam_setting(pListData);
476 void msg_ui_thread_ctlbar_compose_cb(void *data, Evas_Object *obj, void *event_info)
479 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
481 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
482 Elm_Object_Item* it_sweep = NULL;
483 service_h svc_handle = NULL;
485 if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
486 D_EMSG("service_create() is failed !!");
490 it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
492 elm_genlist_item_decorate_mode_set(it_sweep, "slide", EINA_FALSE);
493 elm_genlist_item_select_mode_set(it_sweep, ELM_OBJECT_SELECT_MODE_DEFAULT);
496 if (msg_ui_load_composer_ug(svc_handle, MSG_COMPOSER_UG_TYPE_COMPOSER) == MSG_UI_RET_ERR)
497 D_MSG("Failed to load composer ug");
499 service_destroy(svc_handle);
504 void msg_ui_thread_ctlbar_message_box_cb(void *data, Evas_Object *obj, void *event_info)
507 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
509 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
510 PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
511 Elm_Object_Item* it_sweep = NULL;
513 if (pListData->popup) {
514 evas_object_del(pListData->popup);
515 pListData->popup = NULL;
518 it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
520 elm_genlist_item_decorate_mode_set(it_sweep, "slide", EINA_FALSE);
521 elm_genlist_item_select_mode_set(it_sweep, ELM_OBJECT_SELECT_MODE_DEFAULT);
524 // Create pop-up ( Spam / SIM (it will be extended) )
525 Evas_Object *ctx_popup = NULL;
526 ctx_popup = elm_ctxpopup_add(pData->navi_frame);
527 evas_object_smart_callback_add(ctx_popup, "dismissed", __msg_ui_thread_ctxpopup_dismissed_cb, pListData);
529 if (pListData->item_cnt > 0)
530 elm_ctxpopup_item_append(ctx_popup, dgettext("sys_string", "IDS_COM_SK_DELETE"), NULL, msg_ui_thread_ctlbar_checkbox_cb, pListData);
533 elm_ctxpopup_item_append(ctx_popup, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_CB_MESSAGES"), NULL, __msg_ui_thread_ctxpopup_clicked_cb, pListData);
534 elm_ctxpopup_item_append(ctx_popup, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_SIM_CARD_MESSAGES"), NULL, __msg_ui_thread_ctxpopup_clicked_cb, pListData);
535 elm_ctxpopup_item_append(ctx_popup, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_SPAM_MESSAGES"), NULL, __msg_ui_thread_ctxpopup_clicked_cb, pListData);
538 Evas_Coord x, y, w, h;
539 evas_object_geometry_get(obj, &x, &y, &w, &h);
540 evas_object_move(ctx_popup, x , y);
542 evas_object_show(ctx_popup);
543 pListData->popup = ctx_popup;
548 static void __msg_ui_thread_ctxpopup_dismissed_cb(void *data, Evas_Object *obj, void *event_info)
551 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
553 if (pListData->popup) {
554 evas_object_del(pListData->popup);
555 pListData->popup = NULL;
561 static void __msg_ui_thread_ctxpopup_clicked_cb(void *data, Evas_Object *obj, void *event_info)
565 ThreadMsgListType list_type = THREAD_NORMAL_LIST_TYPE;
566 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
568 const char *label = elm_object_item_text_get((Elm_Object_Item *)event_info);
570 if (strcmp(label, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_SPAM_MESSAGES")) == 0) {
571 list_type = THREAD_SPAM_LIST_TYPE;
572 } else if (strcmp(label, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_SIM_CARD_MESSAGES")) == 0) {
573 list_type = THREAD_SIM_LIST_TYPE;
574 } else if (strcmp(label, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_CB_MESSAGES")) == 0) {
575 list_type = THREAD_CBMSG_LIST_TYPE;
577 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "[ERROR] invalid list type");
581 if (pListData->popup) {
582 evas_object_del(pListData->popup);
583 pListData->popup = NULL;
586 msg_ui_thread_load_message_box(list_type);
590 void msg_ui_thread_sel_all_clicked_cb(void *data, Evas_Object *obj, void *event_info)
594 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
597 void* item_data = NULL;
599 if (pListData->sel_all_checked) {
600 pListData->check_cnt = pListData->item_cnt;
602 pListData->check_cnt = 0;
603 pListData->chk_list = eina_list_free(pListData->chk_list);
606 it = elm_genlist_first_item_get(pListData->genlist);
609 if (elm_genlist_item_parent_get(it) == NULL) {
610 it = elm_genlist_item_next_get(it);
614 item_data = elm_object_item_data_get(it);
616 if (pListData->app_data_type == THREAD_LIST_APP_DATA_THREAD) {
617 PMSG_APP_THREAD_DATA_S data = (PMSG_APP_THREAD_DATA_S)item_data;
618 data->is_check = pListData->sel_all_checked;
620 PMSG_APP_THREAD_MSG_DATA_S data = (PMSG_APP_THREAD_MSG_DATA_S)item_data;
621 data->is_check = pListData->sel_all_checked;
625 if (pListData->sel_all_checked && !eina_list_data_find(pListData->chk_list, item_data))
626 pListData->chk_list = eina_list_append(pListData->chk_list, item_data);
628 it = elm_genlist_item_next_get(it);
631 elm_genlist_realized_items_update(pListData->genlist);
632 msg_ui_thread_show_select_info(pListData);
637 void msg_ui_thread_list_checked_cb(void *data, Evas_Object *obj, void *event_info)
641 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
642 void* item_data = NULL;
643 Eina_Bool is_check = EINA_FALSE;
645 item_data = evas_object_data_get(obj, "item_data");
647 if (pListData->app_data_type == THREAD_LIST_APP_DATA_THREAD) {
648 PMSG_APP_THREAD_DATA_S data = (PMSG_APP_THREAD_DATA_S)item_data;
649 is_check = data->is_check;
651 PMSG_APP_THREAD_MSG_DATA_S data = (PMSG_APP_THREAD_MSG_DATA_S)item_data;
652 is_check = data->is_check;
656 pListData->check_cnt++;
657 if (!eina_list_data_find(pListData->chk_list, item_data))
658 pListData->chk_list = eina_list_append(pListData->chk_list, item_data);
660 pListData->check_cnt--;
661 pListData->chk_list = eina_list_remove(pListData->chk_list, item_data);
664 if (pListData->item_cnt == pListData->check_cnt)
665 elm_check_state_set(pListData->sel_all_box, EINA_TRUE);
667 elm_check_state_set(pListData->sel_all_box, EINA_FALSE);
669 msg_ui_thread_show_select_info(pListData);
673 void msg_ui_thread_back_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
680 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
681 PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
683 if (pData->detail_layout) {
684 if (pData->isRotate == true)
685 elm_naviframe_item_pop(pData->split_data->navi_frame);
687 elm_naviframe_item_pop(pData->navi_frame);
688 pData->detail_layout = NULL;
690 if (pListData->sel_msg_id) {
691 msg_ui_thread_list_msg_item_update(pListData, pListData->sel_msg_id);
693 pListData->sel_gen_item = NULL;
694 pListData->sel_msg_id = 0;
697 if (pData->isRotate == false)
701 if (pListData->search_mode == THREAD_SEARCH_ON) {
702 msg_ui_thread_cancel_search_mode(pListData);
706 if (pListData->view_mode == THREAD_EDIT_VIEW) {
707 if (pData->isIncomingMsg == true) {
708 if (pListData->app_data_type == THREAD_LIST_APP_DATA_MSG)
709 msg_ui_thread_msg_list_load(pListData, pListData->list_type);
711 msg_ui_thread_list_load(pListData, FALSE);
712 pData->isIncomingMsg = false;
715 msg_ui_thread_show_normal_mode(pListData);
717 if (pListData->list_type == THREAD_NORMAL_LIST_TYPE) {
718 elm_win_lower(pData->win_main);
720 PMSG_THREAD_LIST_DATA pPrevList = msg_ui_thread_get_prev_list(pListData);
721 msg_ui_thread_set_navi_toolbar_item(pPrevList);
723 elm_naviframe_item_pop(pData->navi_frame);
724 elm_genlist_clear(pListData->genlist);
725 msg_ui_thread_destroy_thread_list_data(pListData);
727 if (pData->isRotate == true) {
728 msg_ui_thread_destroy_split_data(pData->split_data);
729 msg_ui_thread_split_view_show(pData);
737 void msg_ui_thread_search_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
744 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
745 Evas_Object *entry = NULL;
747 if (pListData->item_cnt <= 0)
750 edje_object_signal_emit(_EDJ(pListData->content_ly), "show_searchbar", "sel_all");
751 elm_object_part_content_set(pListData->content_ly, "sel_all", pListData->searchbar);
753 entry = elm_object_part_content_get(pListData->searchbar, "elm.swallow.content");
754 elm_object_focus_set(entry, EINA_TRUE);
756 evas_object_hide(pListData->search_btn);
757 elm_object_item_part_content_unset(pListData->nf_it, "title_right_btn");
762 void msg_ui_thread_searchbar_entry_focus_cb(void *data, Evas_Object *obj, void *event_info)
766 MSG_UI_RETM_IF(MSG_UI_LEVEL_ASSERT, !data, "[ASSERT] data is NULL");
768 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
769 Elm_Object_Item* it_sweep = NULL;
771 pListData->search_mode = THREAD_SEARCH_ON;
772 elm_genlist_mode_set(pListData->genlist, ELM_LIST_COMPRESS);
774 it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
776 elm_genlist_item_decorate_mode_set(it_sweep, "slide", EINA_FALSE);
777 elm_genlist_item_select_mode_set(it_sweep, ELM_OBJECT_SELECT_MODE_DEFAULT);
780 if (!elm_entry_is_empty(obj))
781 elm_object_signal_emit(pListData->searchbar, "elm,state,eraser,show", "elm");
783 elm_object_signal_emit(pListData->searchbar, "elm,state,guidetext,hide", "elm");
784 elm_object_signal_emit(pListData->searchbar, "cancel,in", "");
786 evas_object_smart_callback_add(obj, "changed", msg_ui_thread_searchbar_entry_change_cb, pListData);
787 evas_object_smart_callback_add(obj, "preedit,changed", msg_ui_thread_searchbar_entry_change_cb, pListData);
792 void msg_ui_thread_searchbar_entry_unfocus_cb(void *data, Evas_Object *obj, void *event_info)
796 evas_object_smart_callback_del(obj, "changed", msg_ui_thread_searchbar_entry_change_cb);
801 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
803 elm_object_signal_emit(pListData->searchbar, "elm,state,eraser,hide", "elm");
804 msg_ui_thread_set_navi_toolbar_item(pListData);
806 if (elm_entry_is_empty(obj)) {
807 elm_object_signal_emit(pListData->searchbar, "elm,state,guidetext,show", "elm");
808 elm_genlist_mode_set(pListData->genlist, ELM_LIST_SCROLL);
814 void msg_ui_thread_searchbar_entry_change_cb(void *data, Evas_Object *obj, void *event_info)
821 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
823 /* Make timer for check user's input */
824 if (pListData->search_timer) {
825 ecore_timer_del(pListData->search_timer);
826 pListData->search_timer = NULL;
829 pListData->search_timer = ecore_timer_add(0.2, __msg_ui_thread_searchbar_entry_timer_cb, pListData);
831 if (elm_object_focus_get(obj)) {
832 if (elm_entry_is_empty(obj))
833 elm_object_signal_emit(pListData->searchbar, "elm,state,eraser,hide", "elm");
835 elm_object_signal_emit(pListData->searchbar, "elm,state,eraser,show", "elm");
841 static Eina_Bool __msg_ui_thread_searchbar_entry_timer_cb(void *data)
843 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
845 msg_ui_thread_search_msg_list_load(pListData);
846 if (pListData->search_timer) {
847 ecore_timer_del(pListData->search_timer);
848 pListData->search_timer = NULL;
851 return ECORE_CALLBACK_CANCEL;
854 void msg_ui_thread_searchbar_cancel_click_cb(void *data, Evas_Object *obj, void *event_info)
861 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
862 Evas_Object *entry = NULL;
864 if (pListData->search_timer) {
865 ecore_timer_del(pListData->search_timer);
866 pListData->search_timer = NULL;
869 entry = elm_object_part_content_get(pListData->searchbar, "elm.swallow.content");
870 elm_object_text_set(entry, "");
871 elm_object_signal_emit(pListData->searchbar, "elm,state,guidetext,show", "elm");
872 evas_object_hide(obj);
873 elm_object_signal_emit(pListData->searchbar, "cancel,out", "");
874 elm_object_focus_set(entry, EINA_FALSE);
876 pListData->search_mode = THREAD_SEARCH_OFF;
877 elm_genlist_mode_set(pListData->genlist, ELM_LIST_SCROLL);
879 if (pListData->list_type== THREAD_NORMAL_LIST_TYPE)
880 msg_ui_thread_list_load(pListData, FALSE);
882 msg_ui_thread_msg_list_load(pListData, pListData->list_type);
884 if (msg_ui_thread_rotation_get() == false) {
885 evas_object_show(pListData->search_btn);
886 elm_object_item_part_content_set(pListData->nf_it, "title_right_btn", pListData->search_btn);
888 edje_object_signal_emit(_EDJ(pListData->content_ly), "hide_searchbar", "sel_all");
889 elm_object_part_content_unset(pListData->content_ly, "sel_all");
890 evas_object_hide(pListData->searchbar);
892 msg_ui_thread_show_toolbar(pListData);
898 void msg_ui_thread_searchbar_eraser_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
905 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
906 Evas_Object *entry = NULL;
908 if (pListData->search_timer) {
909 ecore_timer_del(pListData->search_timer);
910 pListData->search_timer = NULL;
913 entry = elm_object_part_content_get(pListData->searchbar, "elm.swallow.content");
914 elm_object_text_set(entry, "");
916 elm_object_signal_emit(pListData->searchbar, "elm,state,eraser,hide", "elm");
921 void msg_ui_thread_sweep_btn_cb(void *data, Evas_Object *obj, void *event_info)
923 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !obj || !data);
925 PMSG_THREAD_LIST_DATA pListData = data;
926 char address[DEF_THREAD_ADDR_LEN+1] = {0,};
927 Elm_Object_Item *it = NULL;
929 const char *label = elm_object_text_get(obj);
930 it = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
932 if (g_strcmp0(label, dgettext("sys_string", "IDS_COM_SK_DELETE")) == 0) {
933 msg_ui_thread_show_action_popup(pListData, THREAD_ACTION_DELETE, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_DELETE_Q"));
935 } else if (g_strcmp0(label, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_SK_RESTORE")) == 0) {
936 msg_ui_thread_show_action_popup(pListData, THREAD_ACTION_RESTORE, dgettext(MESSAGE_PKGNAME, "IDS_MSG_BODY_MESSAGE_WILL_BE_RESTORED"));
940 if (pListData->app_data_type == THREAD_LIST_APP_DATA_THREAD) {
941 PMSG_APP_THREAD_DATA_S sel_peer_item = NULL;
942 sel_peer_item = (PMSG_APP_THREAD_DATA_S)evas_object_data_get(obj, "sel_peer_data");
944 msg_struct_list_s addrList;
946 memset(&addrList, 0x00, sizeof(msg_struct_list_s));
947 msg_get_address_list(msg_ui_thread_get_data_handle(), sel_peer_item->thread_id, &addrList);
949 if (addrList.nCount == 1) {
950 char strNumber[DEF_THREAD_ADDR_LEN + 1] = {0,};
952 msg_get_str_value(addrList.msg_struct_info[0], MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, strNumber, DEF_THREAD_ADDR_LEN);
953 strncpy(address, strNumber, DEF_THREAD_ADDR_LEN);
955 if (g_strcmp0(label, dgettext("sys_string", "IDS_COM_BODY_CALL")) == 0)
956 msg_ui_thread_launch_voice_call(address);
957 else if (g_strcmp0(label, dgettext("sys_string", "IDS_COM_BODY_VIDEO_CALL")) == 0)
958 msg_ui_thread_launch_video_call(address);
959 else if (g_strcmp0(label, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_BLOCK")) == 0) {
960 char *szbuf = dgettext(MESSAGE_PKGNAME, "IDS_MSGF_POP_BLOCK_PS_Q");
961 char *text = g_strdup_printf(szbuf, strNumber);
963 msg_ui_thread_show_action_popup(pListData, THREAD_ACTION_BLOCK, text);
966 } else if (g_strcmp0(label, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_UNBLOCK")) == 0) {
967 if(msg_common_delete_block_number(msg_ui_thread_get_data_handle(), address) == MSG_SUCCESS)
968 msg_ui_thread_show_action_finish_info(pListData, THREAD_ACTION_UNBLOCK, address);
970 } else if (addrList.nCount > 1) {
971 msg_ui_thread_addr_select_popup(pListData, label, &addrList);
973 msg_release_list_struct(&addrList);
975 PMSG_APP_THREAD_MSG_DATA_S sel_peer_item = NULL;
976 sel_peer_item = (PMSG_APP_THREAD_MSG_DATA_S)evas_object_data_get(obj, "sel_peer_data");
978 msg_struct_t msgInfo = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
979 msg_struct_t sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
980 msg_error_t err = MSG_SUCCESS;
982 err = msg_get_message(msg_ui_thread_get_data_handle(), (msg_message_id_t)sel_peer_item->msg_id, msgInfo, sendOpt);
983 if (err != MSG_SUCCESS) {
984 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_get_message() is failed : err = %d, msgid = %d", err, sel_peer_item->msg_id);
985 msg_release_struct(&msgInfo);
986 msg_release_struct(&sendOpt);
990 if (g_strcmp0(label, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_COPY_TO_PHONE")) == 0) {
993 msg_set_int_value(msgInfo, MSG_MESSAGE_STORAGE_ID_INT, MSG_STORAGE_PHONE);
994 msg_id = msg_add_message(msg_ui_thread_get_data_handle(), msgInfo, sendOpt);
996 msg_ui_thread_show_action_finish_info(pListData, THREAD_ACTION_COPY_TO_PHONE, NULL);
998 char strNumber[DEF_THREAD_ADDR_LEN + 1] = {0,};
999 msg_struct_list_s *addr_list = NULL;
1001 msg_get_list_handle(msgInfo, MSG_MESSAGE_ADDR_LIST_STRUCT, (void **)&addr_list);
1002 msg_get_str_value(addr_list->msg_struct_info[0], MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, strNumber, DEF_THREAD_ADDR_LEN);
1003 strncpy(address, strNumber, DEF_THREAD_ADDR_LEN);
1005 if (sel_peer_item->addr_cnt == 1) {
1006 if (g_strcmp0(label, dgettext("sys_string", "IDS_COM_BODY_CALL")) == 0)
1007 msg_ui_thread_launch_voice_call(address);
1008 else if (g_strcmp0(label, dgettext("sys_string", "IDS_COM_BODY_VIDEO_CALL")) == 0)
1009 msg_ui_thread_launch_video_call(address);
1010 else if (g_strcmp0(label, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_BLOCK")) == 0) {
1011 char *szbuf = dgettext(MESSAGE_PKGNAME, "IDS_MSGF_POP_BLOCK_PS_Q");
1012 char *text = g_strdup_printf(szbuf, strNumber);
1014 msg_ui_thread_show_action_popup(pListData, THREAD_ACTION_BLOCK, text);
1016 msg_release_struct(&msgInfo);
1017 msg_release_struct(&sendOpt);
1019 } else if (g_strcmp0(label, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_UNBLOCK")) == 0) {
1020 if (msg_common_delete_block_number(msg_ui_thread_get_data_handle(), address) == MSG_SUCCESS)
1021 msg_ui_thread_show_action_finish_info(pListData, THREAD_ACTION_UNBLOCK, address);
1024 msg_ui_thread_addr_select_popup(pListData, label, addr_list);
1028 msg_release_struct(&msgInfo);
1029 msg_release_struct(&sendOpt);
1033 elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE);
1034 elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DEFAULT);
1038 void msg_ui_thread_timezone_change_cb(keynode_t *key, void *data)
1042 PMSG_THREAD_DATA pData = (PMSG_THREAD_DATA)data;
1043 PMSG_THREAD_LIST_DATA pListData = NULL;
1045 char *timezone_id = NULL;
1046 UChar utimezone_id[DEF_BUF_LEN] = {0,};
1047 UErrorCode status = U_ZERO_ERROR;
1050 timezone_id = vconf_get_str(VCONFKEY_SETAPPL_TIMEZONE_ID);
1055 u_uastrcpy(utimezone_id, timezone_id);
1057 ucal_setDefaultTimeZone(utimezone_id, &status);
1059 if (U_FAILURE(status))
1062 msg_ui_thread_get_locale(pData);
1063 msg_ui_thread_get_time_format(pData);
1065 if (pData->date_ptn_default) {
1066 free(pData->date_ptn_default);
1067 pData->date_ptn_default = NULL;
1070 if (pData->date_ptn_year) {
1071 free(pData->date_ptn_year);
1072 pData->date_ptn_year = NULL;
1075 if (pData->time_12h_ptn) {
1076 free(pData->time_12h_ptn);
1077 pData->time_12h_ptn = NULL;
1080 if (pData->time_24h_ptn) {
1081 free(pData->time_24h_ptn);
1082 pData->time_24h_ptn = NULL;
1085 pData->time_12h_ptn = msg_common_get_date_best_pattern(pData->locale, MSG_UI_TIME_PATTERN_12H);
1086 pData->time_24h_ptn = msg_common_get_date_best_pattern(pData->locale, MSG_UI_TIME_PATTERN_24H);
1087 pData->date_ptn_default = msg_common_get_date_best_pattern(pData->locale, MSG_UI_DATE_PATTERN_DEFAULT);
1088 pData->date_ptn_year = msg_common_get_date_best_pattern(pData->locale, MSG_UI_DATE_PATTERN_YEAR);
1090 for (i = 0; i < MSG_THREAD_LIST_MAX_COUNT; i++) {
1091 if (pData->list_data[i] != NULL) {
1092 pListData = pData->list_data[i];
1093 elm_genlist_realized_items_update(pListData->genlist);
1100 void msg_ui_thread_gl_mode_right(void *data, Evas_Object *obj, void *event_info)
1104 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, !data || !event_info);
1106 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
1107 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, pListData->view_mode != THREAD_NORMAL_VIEW);
1109 Elm_Object_Item *it = (Elm_Object_Item *)elm_genlist_decorated_item_get(obj);
1111 if (it == event_info)
1114 elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE);
1115 elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DEFAULT);
1118 if (pListData->search_mode == THREAD_SEARCH_OFF) {
1119 elm_genlist_item_decorate_mode_set(event_info, "slide", EINA_TRUE);
1120 elm_genlist_item_select_mode_set(event_info, ELM_OBJECT_SELECT_MODE_NONE);
1126 void msg_ui_thread_gl_mode_left(void *data, Evas_Object *obj, void *event_info)
1130 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, !data || !event_info);
1132 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
1133 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, pListData->view_mode != THREAD_NORMAL_VIEW);
1135 if (pListData->search_mode == THREAD_SEARCH_OFF) {
1136 elm_genlist_item_decorate_mode_set(event_info, "slide", EINA_FALSE);
1137 elm_genlist_item_select_mode_set(event_info, ELM_OBJECT_SELECT_MODE_DEFAULT);