2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "msg-ui-composer-bubble.h"
18 #include "msg-ui-composer-data.h"
20 static int _parse_bundle_data(PMSG_BUBBLE_DATA bubble_data, service_h svc_handle)
27 char *thread_id = NULL;
28 msg_struct_t threadInfo = NULL;
31 service_get_extra_data(svc_handle, MSG_BUNDLE_KEY_THREAD_ID, &thread_id);
32 bubble_data->threadId = thread_id?(msg_thread_id_t)atoi(thread_id):0;
33 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Thread ID from bundle data=%d", bubble_data->threadId);
35 msg_struct_list_s addrList;
37 memset(&addrList, 0x00, sizeof(msg_struct_list_s));
39 err = msg_get_address_list(bubble_data->msgHandle, bubble_data->threadId, &addrList);
40 if (err == MSG_SUCCESS) {
41 bubble_data->addr_list.addr_cnt = addrList.nCount;
43 for (i =0; i<addrList.nCount; i++) {
44 msg_get_int_value(addrList.msg_struct_info[i], MSG_ADDRESS_INFO_CONTACT_ID_INT, &bubble_data->addr_list.addr_info[i].contact_id);
45 msg_get_str_value(addrList.msg_struct_info[i], MSG_ADDRESS_INFO_DISPLAYNAME_STR, bubble_data->addr_list.addr_info[i].name, DEF_THREAD_NAME_LEN);
46 msg_get_str_value(addrList.msg_struct_info[i], MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, bubble_data->addr_list.addr_info[i].address, DEF_THREAD_ADDR_LEN);
49 msg_release_list_struct(&addrList);
52 D_MSG("[ERROR] msg_get_address_list return error [%d]", err);
55 threadInfo = msg_create_struct(MSG_STRUCT_THREAD_INFO);
56 err = msg_get_thread(bubble_data->msgHandle, bubble_data->threadId, threadInfo);
57 if (err == MSG_SUCCESS)
58 msg_get_str_value(threadInfo, MSG_THREAD_NAME_STR, bubble_data->threadName, DEF_THREAD_NAME_LEN);
60 D_MSG("[ERROR] msg_get_thread return error [%d]", err);
62 msg_release_struct(&threadInfo);
68 static int _parse_bundle_with_msg_id(PMSG_BUBBLE_DATA bubble_data, int msgId)
72 msg_error_t err = MSG_SUCCESS;
73 msg_struct_t msgInfo = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
74 msg_struct_t sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
75 msg_struct_list_s addrList;
78 D_MSG("Message ID from bundle = %d", msgId);
80 err = msg_get_message(bubble_data->msgHandle, msgId, msgInfo, sendOpt);
81 if (err != MSG_SUCCESS) {
82 D_EMSG("msg_get_message is failed err = %d", err);
83 msg_release_struct(&msgInfo);
84 msg_release_struct(&sendOpt);
88 msg_get_int_value(msgInfo, MSG_MESSAGE_THREAD_ID_INT, (int *)(&bubble_data->threadId));
89 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Thread ID from bundle data=%d", bubble_data->threadId);
91 memset(&addrList, 0x00, sizeof(msg_struct_list_s));
92 msg_get_address_list(bubble_data->msgHandle, bubble_data->threadId, &addrList);
94 bubble_data->addr_list.addr_cnt = addrList.nCount;
96 for (i=0; i<addrList.nCount; i++) {
97 /** contact ID & display name */
99 msg_get_int_value(addrList.msg_struct_info[i], MSG_ADDRESS_INFO_CONTACT_ID_INT, &contact_id);
101 if (contact_id > 0) {
102 bubble_data->addr_list.addr_info[i].contact_id = contact_id;
103 msg_get_str_value(addrList.msg_struct_info[i], MSG_ADDRESS_INFO_DISPLAYNAME_STR, bubble_data->addr_list.addr_info[i].name, DEF_THREAD_NAME_LEN);
105 bubble_data->addr_list.addr_info[i].contact_id = 0;
109 msg_get_str_value(addrList.msg_struct_info[i], MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, bubble_data->addr_list.addr_info[i].address, DEF_THREAD_ADDR_LEN);
112 msg_release_list_struct(&addrList);
114 if (bubble_data->addr_list.addr_info[0].contact_id > 0)
115 snprintf(bubble_data->threadName, DEF_THREAD_NAME_LEN, "%s", bubble_data->addr_list.addr_info[0].name);
117 snprintf(bubble_data->threadName, DEF_THREAD_NAME_LEN, "%s", bubble_data->addr_list.addr_info[0].address);
119 msg_release_struct(&msgInfo);
120 msg_release_struct(&sendOpt);
128 PMSG_BUBBLE_DATA msg_ui_bubble_init_bubble_data(msg_handle_t msgHandle, void *callback_data)
132 PMSG_BUBBLE_DATA bubble_data = NULL;
134 bubble_data = (PMSG_BUBBLE_DATA)calloc(1, sizeof(MSG_BUBBLE_DATA));
136 bubble_data->msgHandle = msgHandle;
138 bubble_data->viewmode = BUBBLE_NORMAL_VIEW;
139 bubble_data->ug_state = BUBBLE_UG_START;
142 bubble_data->callback_data = callback_data;
148 void msg_ui_bubble_deinit_bubble_data(void *data)
155 PMSG_BUBBLE_DATA bubble_data = data;
157 evas_object_smart_callback_del(bubble_data->scrl, "edge,top", msg_ui_bubble_scroll_edge_top_cb);
159 msg_ui_bubble_init_bubble_list(bubble_data);
161 if (bubble_data->title_menu_opened)
162 msg_ui_bubble_close_title_menu_genlist(bubble_data);
164 if (bubble_data->date_ptn_default) {
165 free(bubble_data->date_ptn_default);
166 bubble_data->date_ptn_default = NULL;
169 if (bubble_data->date_ptn_year) {
170 free(bubble_data->date_ptn_year);
171 bubble_data->date_ptn_year = NULL;
174 if (bubble_data->time_12h_ptn) {
175 free(bubble_data->time_12h_ptn);
176 bubble_data->time_12h_ptn = NULL;
179 if (bubble_data->time_24h_ptn) {
180 free(bubble_data->time_24h_ptn);
181 bubble_data->time_24h_ptn = NULL;
184 if (bubble_data->del_thread) {
185 if (ecore_thread_cancel(bubble_data->del_thread) == EINA_FALSE) {
186 D_MSG("ecore_thread_cancel is done.");
188 D_MSG("ecore_thread_cancel is failed.");
191 bubble_data->del_thread = NULL;
194 if (bubble_data->resend_idler) {
195 ecore_idler_del(bubble_data->resend_idler);
196 bubble_data->resend_idler = NULL;
199 if (bubble_data->retrieve_idler) {
200 ecore_idler_del(bubble_data->retrieve_idler);
201 bubble_data->retrieve_idler = NULL;
203 if (bubble_data->bubble_layout) {
204 evas_object_del(bubble_data->bubble_layout);
205 bubble_data->bubble_layout = NULL;
207 if (bubble_data->title_button) {
208 evas_object_del(bubble_data->title_button);
209 bubble_data->title_button = NULL;
212 if (vconf_ignore_key_changed(VCONFKEY_SYSTEM_TIME_CHANGED, msg_ui_bubble_timezone_change_cb) < 0) {
213 D_EMSG("Fail to remove vconf CB with [%s]", VCONFKEY_SYSTEM_TIME_CHANGED);
221 void msg_ui_bubble_parse_bubble_data(PMSG_BUBBLE_DATA bubble_data, service_h svc_handle)
223 char *key_type = NULL;
225 service_get_extra_data(svc_handle, MSG_BUNDLE_KEY_TYPE, &key_type);
226 if (key_type && g_strcmp0(key_type, MSG_BUNDLE_VALUE_MSG_ID) == 0) { /* From logs */
228 char *msg_id_str = NULL;
229 service_get_extra_data(svc_handle, MSG_BUNDLE_KEY_MSG_ID, &msg_id_str);
234 msg_id = atoi(msg_id_str);
235 _parse_bundle_with_msg_id(bubble_data, msg_id);
238 _parse_bundle_data(bubble_data, svc_handle);
242 void msg_ui_bubble_start_bubble_list(PMSG_BUBBLE_DATA bubble_data)
246 MSG_UI_RETM_IF(MSG_UI_LEVEL_ERR, bubble_data == NULL, "PMSG_BUBBLE_DATA is NULL");
248 msg_ui_bubble_init_bubble_list(bubble_data);
250 bubble_data->box = elm_box_add(bubble_data->bubble_layout);
251 evas_object_size_hint_weight_set(bubble_data->box, EVAS_HINT_EXPAND, 0.0);
252 elm_object_content_set(bubble_data->scrl, bubble_data->box);
254 if (bubble_data->viewmode == BUBBLE_EDIT_VIEW) {
255 msg_ui_bubble_change_normal_navi_control(bubble_data);
258 bubble_data->viewmode = BUBBLE_NORMAL_VIEW;
260 /* To avoid a fluctuation of bubble list on split view. */
261 //elm_scroller_region_show(bubble_data->scrl, 0, 0, 0, 0);
266 void msg_ui_bubble_init_bubble_list(PMSG_BUBBLE_DATA bubble_data)
270 MSG_UI_RETM_IF(MSG_UI_LEVEL_ERR, bubble_data == NULL, "PMSG_BUBBLE_DATA is NULL");
272 PMSG_APP_CONV_DATA_S item_data = NULL;
273 BUBBLE_PACK_INFO *pack_info = NULL;
275 bubble_data->bubble_count = 0;
276 bubble_data->bubble_index = 0;
277 bubble_data->added_count = 0;
278 bubble_data->check_cnt = 0;
279 bubble_data->copy_id = 0;
280 bubble_data->resend_id = 0;
281 bubble_data->retrieve_id = 0;
282 bubble_data->draft_msg_id = 0;
284 if (bubble_data->load_animator) {
285 ecore_animator_del(bubble_data->load_animator);
286 bubble_data->load_animator = NULL;
289 if (bubble_data->add_animator) {
290 ecore_animator_del(bubble_data->add_animator);
291 bubble_data->add_animator = NULL;
294 if (bubble_data->box && bubble_data->scrl) {
295 elm_object_content_unset(bubble_data->scrl);
296 evas_object_del(bubble_data->box);
297 bubble_data->box = NULL;
300 EINA_LIST_FREE(bubble_data->bubble_list, item_data) {
302 if (item_data->msgTime)
303 free(item_data->msgTime);
309 EINA_LIST_FREE(bubble_data->added_list, pack_info) {
314 bubble_data->realized_list = eina_list_free(bubble_data->realized_list);
315 bubble_data->chk_list = eina_list_free(bubble_data->chk_list);
320 Evas_Object *msg_ui_bubble_create_toolbar(void *user_data)
323 D_EMSG("[ERROR] user_data is NULL");
327 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)user_data;
328 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S*)bubble_data->callback_data;
330 Evas_Object *toolbar = elm_toolbar_add(cd->navi_bar);
333 D_EMSG("toolbar is NULL");
337 elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND);
338 elm_object_style_set(toolbar, "naviframe");
343 Evas_Object *msg_ui_bubble_create_view(Evas_Object *parent, void *user_data)
345 if (!parent || !user_data)
348 PMSG_BUBBLE_DATA bubble_data = user_data;
350 Evas_Object *bubble_layout = NULL;
351 Evas_Object *scroller = NULL;
353 bubble_layout = elm_layout_add(parent);
354 elm_layout_theme_set(bubble_layout, "layout", "application", "noindicator");
355 evas_object_size_hint_weight_set(bubble_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
356 evas_object_size_hint_fill_set(bubble_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
357 evas_object_show(bubble_layout);
359 scroller = elm_scroller_add(parent);
360 evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
361 elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_TRUE);
362 elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
363 elm_object_part_content_set(bubble_layout, "elm.swallow.content", scroller);
364 evas_object_smart_callback_add(scroller, "scroll,drag,start", msg_ui_bubble_scroll_drag_start_cb, user_data);
365 evas_object_event_callback_add(bubble_layout, EVAS_CALLBACK_MOUSE_UP, msg_ui_bubble_main_layout_clicked_cb, bubble_data->callback_data);
367 bubble_data->parent_layout = parent;
368 bubble_data->bubble_layout = bubble_layout;
369 bubble_data->scrl = scroller;
371 return bubble_layout;
374 void msg_ui_bubble_start_view(PMSG_BUBBLE_DATA bubble_data)
379 msg_ui_bubble_reg_bubble_cb_func(bubble_data);
380 msg_ui_bubble_get_locale(bubble_data);
381 msg_ui_bubble_get_time_format(bubble_data);
382 bubble_data->time_12h_ptn = msg_common_get_date_best_pattern(bubble_data->locale, MSG_UI_TIME_PATTERN_12H);
383 bubble_data->time_24h_ptn = msg_common_get_date_best_pattern(bubble_data->locale, MSG_UI_TIME_PATTERN_24H);
384 bubble_data->date_ptn_default = msg_common_get_date_best_pattern(bubble_data->locale, MSG_UI_DATE_PATTERN_DEFAULT);
385 bubble_data->date_ptn_year = msg_common_get_date_best_pattern(bubble_data->locale, MSG_UI_DATE_PATTERN_YEAR);
387 if (vconf_notify_key_changed(VCONFKEY_SYSTEM_TIME_CHANGED, msg_ui_bubble_timezone_change_cb, (void *)bubble_data) < 0) {
388 D_EMSG("Fail to register vconf CB with [%s]", VCONFKEY_SYSTEM_TIME_CHANGED);
391 #ifdef _BUBBLE_FLICK_EVENT
392 evas_object_event_callback_add(bubble_data->bubble_layout, EVAS_CALLBACK_MOUSE_DOWN, msg_ui_bubble_layout_mouse_down_cb, (const void*)bubble_data);
394 msg_ui_bubble_list_load(bubble_data);
397 Evas_Object *msg_ui_bubble_toolbar_btn_create(Evas_Object *parent, char *icon_path, char *button_text)
400 D_MSG_RETVM_IF(parent == NULL, NULL, "parent == NULL");
402 Evas_Object *button = elm_button_add(parent);
404 evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
405 evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
407 elm_object_style_set(button, "naviframe_control/default");
410 Evas_Object *icon = elm_icon_add(button);
411 elm_image_file_set(icon, MSG_IMAGES_EDJ, icon_path);
412 elm_object_content_set(button,icon);
413 evas_object_size_hint_min_set(icon, 50, 50);
414 evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
415 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
416 } else if (button_text) {
417 elm_object_text_set(button, button_text);
419 evas_object_show(button);
425 void msg_ui_bubble_reg_bubble_cb_func(PMSG_BUBBLE_DATA pData)
427 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
429 MSG_UI_RETM_IF(MSG_UI_LEVEL_ERR, pData == NULL, "PMSG_BUBBLE_DATA is NULL");
431 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)pData->callback_data;
433 msg_reg_storage_change_callback(pData->msgHandle, &msg_ui_bubble_msg_storage_change_cb, (void *)cd);
435 MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);