Apply EFL migration of thread, common
[apps/core/preloaded/message-app.git] / thread / src / msg-ui-thread-callback.c
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
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
7  *
8  *    http://www.tizenopensource.org/license
9  *
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.
15  */
16
17
18 #include "msg-ui-thread-main.h"
19
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);
25
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);
28
29
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)
31 {
32         MSG_UI_ENTER();
33
34         int list_idx = 0;
35         bool multiple_action = false;
36         if (!user_param || !pMsgIdList)
37                 return;
38
39         PMSG_THREAD_DATA pData = user_param;
40         PMSG_THREAD_LIST_DATA pListData = NULL;
41
42         if (msg_ui_thread_get_app_state(pData) == MSG_UI_STATE_DESTROY)
43                 return;
44
45         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "type is %d", type);
46
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
53                         }
54
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);
58                                 else
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.");
64                                         return;
65                                 }
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) {
69                                         int idx = 0;
70
71                                         for (idx = 0; idx < pMsgIdList->nCount; idx++) {
72                                                 msg_ui_thread_list_msg_item_delete(pListData, pMsgIdList->msgIdList[idx]);
73                                         }
74                                 } else {
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);
78                                         int smsCnt = 0;
79                                         int mmsCnt = 0;
80                                         msg_error_t err =  MSG_SUCCESS;
81
82                                         gen_item = elm_genlist_first_item_get(pListData->genlist);
83                                         while (gen_item) {
84                                                 if (elm_genlist_item_parent_get(gen_item) == NULL) {
85                                                         gen_item = elm_genlist_item_next_get(gen_item);
86                                                         continue;
87                                                 }
88
89                                                 item_data = (PMSG_APP_THREAD_DATA_S) elm_object_item_data_get(gen_item);
90
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);
95                                                         break;
96                                                 }
97
98                                                 msg_get_int_value(threadInfo, MSG_THREAD_MMS_COUNT_INT, &mmsCnt);
99                                                 msg_get_int_value(threadInfo, MSG_THREAD_SMS_COUNT_INT, &smsCnt);
100
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);
105
106                                                 gen_item = elm_genlist_item_next_get(gen_item);
107                                         }
108                                         msg_release_struct(&threadInfo);
109                                 }
110                         } else if (type == MSG_STORAGE_CHANGE_UPDATE) {
111                                 int idx = 0;
112
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;
118                                                 int thread_id = 0;
119
120                                                 err = msg_get_message(pData->msgHandle, pMsgIdList->msgIdList[idx], msgInfo, sendOpt);
121
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);
126                                                         return;
127                                                 }
128
129                                                 msg_get_int_value(msgInfo, MSG_MESSAGE_THREAD_ID_INT, &thread_id);
130
131                                                 msg_release_struct(&msgInfo);
132                                                 msg_release_struct(&sendOpt);
133
134                                                 if (msg_ui_thread_list_item_update(pListData, thread_id) == EINA_FALSE)
135                                                         __msg_ui_thread_insert_and_select_gen_item(pListData);
136                                         } else {
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);
139                                         }
140                                 }
141                         }
142                 }
143         }
144
145         MSG_UI_LEAVE();
146 }
147
148 static void __msg_ui_thread_insert_and_select_gen_item(PMSG_THREAD_LIST_DATA pListData)
149 {
150         MSG_UI_ENTER();
151
152         int sel_thread_id = 0, sel_msg_id = 0;
153
154         if (pListData->sel_gen_item) {
155                 sel_thread_id = pListData->sel_thread_id;
156                 sel_msg_id = pListData->sel_msg_id;
157         }
158
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);
162                 else
163                         msg_ui_thread_msg_list_load(pListData, pListData->list_type);
164                 msg_ui_thread_select_item_by_msg_id(pListData, sel_msg_id);
165         } else {
166                 msg_ui_thread_list_load(pListData, FALSE);
167                 msg_ui_thread_select_item_by_thread_id(pListData, sel_thread_id);
168         }
169
170         if (pListData->sel_gen_item)
171                 elm_genlist_item_selected_set(pListData->sel_gen_item, true);
172
173         MSG_UI_LEAVE();
174 }
175
176 void msg_ui_thread_ctlbar_multi_action_cb(void *data, Evas_Object *obj, void *event_info)
177 {
178         D_ENTER;
179         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
180
181         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
182         MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, pListData->multi_action_thread);
183
184         if (pListData->popup) {
185                 evas_object_del(pListData->popup);
186                 pListData->popup = NULL;
187         }
188
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;
198                 }
199         }
200
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);
204         }
205 }
206
207 void msg_ui_thread_multi_action_thread_feedback_fn(void *data, Ecore_Thread *thread, void *msg_data)
208 {
209         D_ENTER;
210
211         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !thread || !data || !msg_data);
212
213         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
214         int *ret = msg_data;
215
216         if (*ret == MSG_SUCCESS) {
217                 if (pListData->progressbar)
218                         elm_progressbar_value_set(pListData->progressbar, (double)(pListData->sel_index+1)/pListData->check_cnt);
219         } else {
220                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "fail action. %d", *ret);
221
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);
225
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"));
232
233                 pListData->action_type = THREAD_ACTION_NONE;
234                 pListData->include_protected_msg = false;
235                 if (ret)
236                         free(ret);
237                 return;
238         }
239
240         if (pListData->sel_index + 1 == pListData->check_cnt)
241                 __msg_ui_thread_multi_action_finish(pListData);
242         else
243                 pListData->sel_index++;
244
245         if (ret)
246                 free(ret);
247 }
248
249 void msg_ui_thread_multi_action_thread_fn(void *data, Ecore_Thread *thread)
250 {
251         D_ENTER;
252
253         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data);
254
255         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
256         Eina_List *list;
257
258         void* item_data = NULL;
259
260         EINA_LIST_FOREACH(pListData->chk_list, list, item_data) {
261                 int *ret = calloc(1, sizeof(int));
262
263                 if (item_data) {
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);
269                                 } else {
270                                         PMSG_APP_THREAD_MSG_DATA_S data = (PMSG_APP_THREAD_MSG_DATA_S)item_data;
271
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;
277
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);
283                                                         goto MSG_FAIL;
284                                                 }
285
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);
290                                                         *ret = MSG_SUCCESS;
291                                                         ecore_thread_feedback(thread, (void *)ret);
292                                                         continue;
293                                                 }
294
295                                                 *ret = msg_delete_message(msg_ui_thread_get_data_handle(), data->msg_id);
296
297                                                 msg_release_struct(&msgInfo);
298                                                 msg_release_struct(&sendOpt);
299                                         } else {
300                                                 *ret = msg_delete_message(msg_ui_thread_get_data_handle(), data->msg_id);
301                                         }
302                                 }
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;
308                                 int msg_id = 0;
309                                 msg_struct_t msgInfo = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
310                                 msg_struct_t sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
311
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);
317                                         goto MSG_FAIL;
318                                 }
319
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);
322
323                                 msg_release_struct(&msgInfo);
324                                 msg_release_struct(&sendOpt);
325                         }
326
327 MSG_FAIL:
328                         ecore_thread_feedback(thread, (void *)ret);
329
330                         if (*ret != MSG_SUCCESS)
331                                 return;
332                 } else {
333                         *ret = MSG_ERR_NULL_POINTER;
334                         ecore_thread_feedback(thread, (void *)ret);
335                         return;
336                 }
337         }
338 }
339
340 static void __msg_ui_thread_multi_action_finish(PMSG_THREAD_LIST_DATA pListData)
341 {
342         D_ENTER;
343
344         if (pListData->popup) {
345                 evas_object_del(pListData->popup);
346                 pListData->popup = NULL;
347         }
348
349         msg_ui_thread_show_action_finish_info(pListData, pListData->action_type, NULL);
350
351         pListData->multi_action_thread = NULL;
352         pListData->action_type = THREAD_ACTION_NONE;
353         pListData->include_protected_msg = false;
354
355         msg_ui_thread_show_normal_mode(pListData);
356
357         if (pListData->list_type == THREAD_NORMAL_LIST_TYPE) {
358                 msg_ui_thread_list_load(pListData, FALSE);
359         } else {
360                 PMSG_THREAD_LIST_DATA pDefaultListData = msg_ui_thread_get_default_list();
361
362                 msg_ui_thread_msg_list_load(pListData, pListData->list_type);
363
364                 if (pDefaultListData)
365                         msg_ui_thread_list_load(pDefaultListData, FALSE); //might be changed
366         }
367 }
368
369 void msg_ui_thread_ctlbar_checkbox_cb(void *data, Evas_Object *obj, void *event_info)
370 {
371         MSG_UI_ENTER();
372         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
373
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};
377
378         pListData->view_mode = THREAD_EDIT_VIEW;
379         pListData->check_cnt = 0;
380         pListData->sel_index = 0;
381
382         if (pListData->popup) {
383                 evas_object_del(pListData->popup);
384                 pListData->popup = NULL;
385         }
386
387         it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
388         if (it_sweep) {
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);
392         }
393
394         elm_genlist_decorate_mode_set(pListData->genlist, EINA_TRUE);
395         elm_genlist_select_mode_set(pListData->genlist, ELM_OBJECT_SELECT_MODE_ALWAYS);
396
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"));
399         else
400                 snprintf(buf, sizeof(buf), "%s",  dgettext("sys_string", "IDS_COM_SK_DELETE"));
401
402         elm_object_item_text_set(pListData->nf_it, buf);
403
404         __msg_ui_thread_add_navi_select_all_ly(pListData);
405         msg_ui_thread_set_navi_toolbar_item(pListData);
406
407         evas_object_hide(pListData->search_btn);
408         elm_object_item_part_content_unset(pListData->nf_it, "title_right_btn");
409
410         MSG_UI_LEAVE();
411 }
412
413 static void __msg_ui_thread_add_navi_select_all_ly(PMSG_THREAD_LIST_DATA pListData)
414 {
415         if (!pListData) {
416                 MSG_UI_DEBUG(MSG_UI_LEVEL_ASSERT,"[ASSERT] pListData is NULL");
417                 return;
418         }
419
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);
426
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);
432
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"));
435         }
436
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);
440         } else {
441                 edje_object_signal_emit(_EDJ(pListData->content_ly), "show_searchbar", "sel_all");
442         }
443         evas_object_show(pListData->sel_all_ly);
444         elm_object_part_content_set(pListData->content_ly, "sel_all", pListData->sel_all_ly);
445 }
446
447 static void __msg_ui_thread_sel_all_ly_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
448 {
449         MSG_UI_ENTER();
450
451         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
452
453         pListData->sel_all_checked = !pListData->sel_all_checked;
454         elm_check_state_pointer_set(pListData->sel_all_box, &pListData->sel_all_checked);
455
456         msg_ui_thread_sel_all_clicked_cb(pListData, NULL, NULL);
457
458         MSG_UI_LEAVE();
459 }
460
461 void msg_ui_thread_ctlbar_spam_setting_cb(void *data, Evas_Object *obj, void *event_info)
462 {
463         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
464         Elm_Object_Item* it_sweep = NULL;
465
466         it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
467         if (it_sweep) {
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);
470         }
471
472         msg_ui_thread_launch_spam_setting(pListData);
473 }
474
475
476 void msg_ui_thread_ctlbar_compose_cb(void *data, Evas_Object *obj, void *event_info)
477 {
478         MSG_UI_ENTER();
479         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
480
481         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
482         Elm_Object_Item* it_sweep = NULL;
483         service_h svc_handle = NULL;
484
485         if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
486                 D_EMSG("service_create() is failed !!");
487                 return;
488         }
489
490         it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
491         if (it_sweep) {
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);
494         }
495
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");
498
499         service_destroy(svc_handle);
500
501         MSG_UI_LEAVE();
502 }
503
504 void msg_ui_thread_ctlbar_message_box_cb(void *data, Evas_Object *obj, void *event_info)
505 {
506         MSG_UI_ENTER();
507         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
508
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;
512
513         if (pListData->popup) {
514                 evas_object_del(pListData->popup);
515                 pListData->popup = NULL;
516         }
517
518         it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
519         if (it_sweep) {
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);
522         }
523
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);
528
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);
531
532
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);
536
537         // move ctx popup
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);
541
542         evas_object_show(ctx_popup);
543         pListData->popup = ctx_popup;
544
545         MSG_UI_LEAVE();
546 }
547
548 static void __msg_ui_thread_ctxpopup_dismissed_cb(void *data, Evas_Object *obj, void *event_info)
549 {
550         MSG_UI_ENTER();
551         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
552
553         if (pListData->popup) {
554                 evas_object_del(pListData->popup);
555                 pListData->popup = NULL;
556         }
557
558         MSG_UI_LEAVE();
559 }
560
561 static void __msg_ui_thread_ctxpopup_clicked_cb(void *data, Evas_Object *obj, void *event_info)
562 {
563         MSG_UI_ENTER();
564
565         ThreadMsgListType list_type = THREAD_NORMAL_LIST_TYPE;
566         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
567
568         const char *label = elm_object_item_text_get((Elm_Object_Item *)event_info);
569
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;
576         } else {
577                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "[ERROR] invalid list type");
578                 return;
579         }
580
581         if (pListData->popup) {
582                 evas_object_del(pListData->popup);
583                 pListData->popup = NULL;
584         }
585
586         msg_ui_thread_load_message_box(list_type);
587         MSG_UI_LEAVE();
588 }
589
590 void msg_ui_thread_sel_all_clicked_cb(void *data, Evas_Object *obj, void *event_info)
591 {
592         MSG_UI_ENTER();
593
594         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
595         Elm_Object_Item *it;
596
597         void* item_data = NULL;
598
599         if (pListData->sel_all_checked) {
600                 pListData->check_cnt = pListData->item_cnt;
601         } else {
602                 pListData->check_cnt = 0;
603                 pListData->chk_list = eina_list_free(pListData->chk_list);
604         }
605
606         it = elm_genlist_first_item_get(pListData->genlist);
607
608         while (it) {
609                 if (elm_genlist_item_parent_get(it) == NULL) {
610                         it = elm_genlist_item_next_get(it);
611                         continue;
612                 }
613
614                 item_data = elm_object_item_data_get(it);
615                 if (item_data) {
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;
619                         } else {
620                                 PMSG_APP_THREAD_MSG_DATA_S data = (PMSG_APP_THREAD_MSG_DATA_S)item_data;
621                                 data->is_check = pListData->sel_all_checked;
622                         }
623                 }
624
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);
627
628                 it = elm_genlist_item_next_get(it);
629         }
630
631         elm_genlist_realized_items_update(pListData->genlist);
632         msg_ui_thread_show_select_info(pListData);
633
634         MSG_UI_LEAVE();
635 }
636
637 void msg_ui_thread_list_checked_cb(void *data, Evas_Object *obj, void *event_info)
638 {
639         MSG_UI_ENTER();
640
641         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
642         void* item_data = NULL;
643         Eina_Bool is_check = EINA_FALSE;
644
645         item_data = evas_object_data_get(obj, "item_data");
646
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;
650         } else {
651                 PMSG_APP_THREAD_MSG_DATA_S data = (PMSG_APP_THREAD_MSG_DATA_S)item_data;
652                 is_check = data->is_check;
653         }
654
655         if (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);
659         } else {
660                 pListData->check_cnt--;
661                 pListData->chk_list = eina_list_remove(pListData->chk_list, item_data);
662         }
663
664         if (pListData->item_cnt == pListData->check_cnt)
665                 elm_check_state_set(pListData->sel_all_box, EINA_TRUE);
666         else
667                 elm_check_state_set(pListData->sel_all_box, EINA_FALSE);
668
669         msg_ui_thread_show_select_info(pListData);
670         MSG_UI_LEAVE();
671 }
672
673 void msg_ui_thread_back_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
674 {
675         MSG_UI_ENTER();
676
677         if (!data)
678                 return;
679
680         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
681         PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
682
683         if (pData->detail_layout) {
684                 if (pData->isRotate == true)
685                         elm_naviframe_item_pop(pData->split_data->navi_frame);
686                 else
687                         elm_naviframe_item_pop(pData->navi_frame);
688                 pData->detail_layout = NULL;
689
690                 if (pListData->sel_msg_id) {
691                         msg_ui_thread_list_msg_item_update(pListData, pListData->sel_msg_id);
692
693                         pListData->sel_gen_item = NULL;
694                         pListData->sel_msg_id = 0;
695                 }
696
697                 if (pData->isRotate == false)
698                         return;
699         }
700
701         if (pListData->search_mode == THREAD_SEARCH_ON) {
702                 msg_ui_thread_cancel_search_mode(pListData);
703                 return;
704         }
705
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);
710                         else
711                                 msg_ui_thread_list_load(pListData, FALSE);
712                         pData->isIncomingMsg = false;
713                 }
714
715                 msg_ui_thread_show_normal_mode(pListData);
716         } else {
717                 if (pListData->list_type == THREAD_NORMAL_LIST_TYPE) {
718                         elm_win_lower(pData->win_main);
719                 } else {
720                         PMSG_THREAD_LIST_DATA pPrevList = msg_ui_thread_get_prev_list(pListData);
721                         msg_ui_thread_set_navi_toolbar_item(pPrevList);
722
723                         elm_naviframe_item_pop(pData->navi_frame);
724                         elm_genlist_clear(pListData->genlist);
725                         msg_ui_thread_destroy_thread_list_data(pListData);
726
727                         if (pData->isRotate == true) {
728                                 msg_ui_thread_destroy_split_data(pData->split_data);
729                                 msg_ui_thread_split_view_show(pData);
730                         }
731                 }
732         }
733
734         MSG_UI_LEAVE();
735 }
736
737 void msg_ui_thread_search_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
738 {
739         MSG_UI_ENTER();
740
741         if (!data)
742                 return;
743
744         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
745         Evas_Object *entry = NULL;
746
747         if (pListData->item_cnt <= 0)
748                 return;
749
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);
752
753         entry = elm_object_part_content_get(pListData->searchbar, "elm.swallow.content");
754         elm_object_focus_set(entry, EINA_TRUE);
755
756         evas_object_hide(pListData->search_btn);
757         elm_object_item_part_content_unset(pListData->nf_it, "title_right_btn");
758
759         MSG_UI_LEAVE();
760 }
761
762 void msg_ui_thread_searchbar_entry_focus_cb(void *data, Evas_Object *obj, void *event_info)
763 {
764         D_ENTER;
765
766         MSG_UI_RETM_IF(MSG_UI_LEVEL_ASSERT, !data, "[ASSERT] data is NULL");
767
768         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
769         Elm_Object_Item* it_sweep = NULL;
770
771         pListData->search_mode = THREAD_SEARCH_ON;
772         elm_genlist_mode_set(pListData->genlist, ELM_LIST_COMPRESS);
773
774         it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
775         if (it_sweep) {
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);
778         }
779
780         if (!elm_entry_is_empty(obj))
781                 elm_object_signal_emit(pListData->searchbar, "elm,state,eraser,show", "elm");
782
783         elm_object_signal_emit(pListData->searchbar, "elm,state,guidetext,hide", "elm");
784         elm_object_signal_emit(pListData->searchbar, "cancel,in", "");
785
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);
788
789         D_LEAVE;
790 }
791
792 void msg_ui_thread_searchbar_entry_unfocus_cb(void *data, Evas_Object *obj, void *event_info)
793 {
794         D_ENTER;
795
796         evas_object_smart_callback_del(obj, "changed", msg_ui_thread_searchbar_entry_change_cb);
797
798         if (!data)
799                 return;
800
801         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
802
803         elm_object_signal_emit(pListData->searchbar, "elm,state,eraser,hide", "elm");
804         msg_ui_thread_set_navi_toolbar_item(pListData);
805
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);
809         }
810
811         D_LEAVE;
812 }
813
814 void msg_ui_thread_searchbar_entry_change_cb(void *data, Evas_Object *obj, void *event_info)
815 {
816         D_ENTER;
817
818         if (!data)
819                 return;
820
821         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
822
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;
827         }
828
829         pListData->search_timer = ecore_timer_add(0.2, __msg_ui_thread_searchbar_entry_timer_cb, pListData);
830
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");
834                 else
835                         elm_object_signal_emit(pListData->searchbar, "elm,state,eraser,show", "elm");
836         }
837
838         D_LEAVE;
839 }
840
841 static Eina_Bool __msg_ui_thread_searchbar_entry_timer_cb(void *data)
842 {
843         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
844
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;
849         }
850
851         return ECORE_CALLBACK_CANCEL;
852 }
853
854 void msg_ui_thread_searchbar_cancel_click_cb(void *data, Evas_Object *obj, void *event_info)
855 {
856         D_ENTER;
857
858         if (!data)
859                 return;
860
861         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
862         Evas_Object *entry = NULL;
863
864         if (pListData->search_timer) {
865                 ecore_timer_del(pListData->search_timer);
866                 pListData->search_timer = NULL;
867         }
868
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);
875
876         pListData->search_mode = THREAD_SEARCH_OFF;
877         elm_genlist_mode_set(pListData->genlist, ELM_LIST_SCROLL);
878
879         if (pListData->list_type== THREAD_NORMAL_LIST_TYPE)
880                 msg_ui_thread_list_load(pListData, FALSE);
881         else
882                 msg_ui_thread_msg_list_load(pListData, pListData->list_type);
883
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);
887
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);
891
892                 msg_ui_thread_show_toolbar(pListData);
893         }
894
895         D_LEAVE;
896 }
897
898 void msg_ui_thread_searchbar_eraser_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
899 {
900         D_ENTER;
901
902         if (!data)
903                 return;
904
905         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
906         Evas_Object *entry = NULL;
907
908         if (pListData->search_timer) {
909                 ecore_timer_del(pListData->search_timer);
910                 pListData->search_timer = NULL;
911         }
912
913         entry = elm_object_part_content_get(pListData->searchbar, "elm.swallow.content");
914         elm_object_text_set(entry, "");
915
916         elm_object_signal_emit(pListData->searchbar, "elm,state,eraser,hide", "elm");
917
918         D_LEAVE;
919 }
920
921 void msg_ui_thread_sweep_btn_cb(void *data, Evas_Object *obj, void *event_info)
922 {
923         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !obj || !data);
924
925         PMSG_THREAD_LIST_DATA pListData = data;
926         char address[DEF_THREAD_ADDR_LEN+1] = {0,};
927         Elm_Object_Item *it = NULL;
928
929         const char *label = elm_object_text_get(obj);
930         it = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
931
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"));
934                 return;
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"));
937                 return;
938         }
939
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");
943
944                 msg_struct_list_s addrList;
945
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);
948
949                 if (addrList.nCount == 1) {
950                         char strNumber[DEF_THREAD_ADDR_LEN + 1] = {0,};
951
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);
954
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);
962
963                                 msg_ui_thread_show_action_popup(pListData, THREAD_ACTION_BLOCK, text);
964                                 free(text);
965                                 return;
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);
969                         }
970                 } else if (addrList.nCount > 1) {
971                         msg_ui_thread_addr_select_popup(pListData, label, &addrList);
972                 }
973                 msg_release_list_struct(&addrList);
974         } else {
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");
977
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;
981
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);
987                         return;
988                 }
989
990                 if (g_strcmp0(label, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_COPY_TO_PHONE")) == 0) {
991                            int msg_id = 0;
992
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);
995                            if (msg_id >= 0)
996                                 msg_ui_thread_show_action_finish_info(pListData, THREAD_ACTION_COPY_TO_PHONE, NULL);
997                    } else {
998                         char strNumber[DEF_THREAD_ADDR_LEN + 1] = {0,};
999                         msg_struct_list_s *addr_list = NULL;
1000
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);
1004
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);
1013
1014                                         msg_ui_thread_show_action_popup(pListData, THREAD_ACTION_BLOCK, text);
1015                                         free(text);
1016                                         msg_release_struct(&msgInfo);
1017                                         msg_release_struct(&sendOpt);
1018                                         return;
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);
1022                                 }
1023                         } else {
1024                                 msg_ui_thread_addr_select_popup(pListData, label, addr_list);
1025                         }
1026                 }
1027
1028                 msg_release_struct(&msgInfo);
1029                 msg_release_struct(&sendOpt);
1030         }
1031
1032         if (it) {
1033                 elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE);
1034                 elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DEFAULT);
1035         }
1036 }
1037
1038 void msg_ui_thread_timezone_change_cb(keynode_t *key, void *data)
1039 {
1040         D_ENTER;
1041
1042         PMSG_THREAD_DATA pData = (PMSG_THREAD_DATA)data;
1043         PMSG_THREAD_LIST_DATA pListData = NULL;
1044
1045         char *timezone_id = NULL;
1046         UChar utimezone_id[DEF_BUF_LEN] = {0,};
1047         UErrorCode status = U_ZERO_ERROR;
1048         int i = 0;
1049
1050         timezone_id = vconf_get_str(VCONFKEY_SETAPPL_TIMEZONE_ID);
1051
1052         if (!timezone_id)
1053                 return;
1054
1055         u_uastrcpy(utimezone_id, timezone_id);
1056
1057         ucal_setDefaultTimeZone(utimezone_id, &status);
1058
1059         if (U_FAILURE(status))
1060                 return;
1061
1062         msg_ui_thread_get_locale(pData);
1063         msg_ui_thread_get_time_format(pData);
1064
1065         if (pData->date_ptn_default) {
1066                 free(pData->date_ptn_default);
1067                 pData->date_ptn_default = NULL;
1068         }
1069
1070         if (pData->date_ptn_year) {
1071                 free(pData->date_ptn_year);
1072                 pData->date_ptn_year = NULL;
1073         }
1074
1075         if (pData->time_12h_ptn) {
1076                 free(pData->time_12h_ptn);
1077                 pData->time_12h_ptn = NULL;
1078         }
1079
1080         if (pData->time_24h_ptn) {
1081                 free(pData->time_24h_ptn);
1082                 pData->time_24h_ptn = NULL;
1083         }
1084
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);
1089
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);
1094                 }
1095         }
1096
1097         D_LEAVE;
1098 }
1099
1100 void msg_ui_thread_gl_mode_right(void *data, Evas_Object *obj, void *event_info)
1101 {
1102         MSG_UI_ENTER();
1103
1104         MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, !data || !event_info);
1105
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);
1108
1109         Elm_Object_Item *it = (Elm_Object_Item *)elm_genlist_decorated_item_get(obj);
1110         if (it) {
1111                 if (it == event_info)
1112                         return;
1113
1114                 elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE);
1115                 elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DEFAULT);
1116         }
1117
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);
1121         }
1122
1123         MSG_UI_LEAVE();
1124 }
1125
1126 void msg_ui_thread_gl_mode_left(void *data, Evas_Object *obj, void *event_info)
1127 {
1128         MSG_UI_ENTER();
1129
1130         MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, !data || !event_info);
1131
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);
1134
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);
1138         }
1139
1140         MSG_UI_LEAVE();
1141 }