2 This file is part of Telegram application for tizen
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public
15 License along with this library; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 #include "tg_messaging_view.h"
20 #include "tg_db_wrapper.h"
21 #include "server_requests.h"
22 #include <attach_panel.h>
23 #include <mime_type.h>
24 #include <Elementary.h>
25 #include "tg_user_info_view.h"
26 #include "tg_chat_info_view.h"
27 #include "tg_audio_player.h"
28 #include <metadata_extractor.h>
29 #include "tg_search_peer_view.h"
31 #define PROFILE_BEGIN(pfid) \
32 unsigned int __prf_l1_##pfid = __LINE__;\
33 struct timeval __prf_1_##pfid;\
34 struct timeval __prf_2_##pfid;\
36 gettimeofday(&__prf_1_##pfid, 0);\
37 DBG("**PROFILE BEGIN** [TG: %s() :%s %u ~ ] " #pfid \
38 " -> Start Time: %u.%06u seconds\n",\
40 rindex(__FILE__,'/')+1, \
42 (unsigned int)__prf_1_##pfid.tv_sec,\
43 (unsigned int)__prf_1_##pfid.tv_usec );\
47 #define PROFILE_END(pfid) \
48 unsigned int __prf_l2_##pfid = __LINE__;\
50 gettimeofday(&__prf_2_##pfid, 0);\
51 long __ds = __prf_2_##pfid.tv_sec - __prf_1_##pfid.tv_sec;\
52 long __dm = __prf_2_##pfid.tv_usec - __prf_1_##pfid.tv_usec;\
53 if ( __dm < 0 ) { __ds--; __dm = 1000000 + __dm; } \
54 DBG("**PROFILE END** [TG: %s() :%s %u ~ %u] " #pfid \
55 " -> Elapsed Time: %u.%06u seconds\n",\
57 rindex(__FILE__, '/')+1,\
60 (unsigned int)(__ds),\
61 (unsigned int)(__dm));\
64 static int scroller_show_bottom_edge(Evas_Object *scroller)
67 LOGE("Cannot get the scroller");
70 Evas_Object *box_layout = NULL;
71 Evas_Object *box = NULL;
72 Eina_List *list = NULL;
74 box_layout = elm_object_content_get(scroller);
76 LOGE("Fail to get the box into scroller");
79 list = elm_box_children_get(box_layout);
81 LOGE("Fail to get the list into box");
85 box = eina_list_nth(list, 0);
87 LOGE("Fail to get the box into box layout");
92 evas_object_geometry_get(box, NULL, NULL, NULL, &h);
93 elm_scroller_region_show(scroller, 0, h, 720, 1280);
100 static void scroller_push_item(Evas_Object *scroller, Evas_Object *item)
102 Evas_Object *box_layout = NULL;
103 Evas_Object *box = NULL;
104 Eina_List *list = NULL;
106 box_layout = elm_object_content_get(scroller);
108 LOGE("Fail to get the box into scroller");
112 list = elm_box_children_get(box_layout);
114 LOGE("Fail to get the list into box");
118 box = eina_list_nth(list, 0);
120 LOGE("Fail to get the box into box layout");
124 eina_list_free(list);
126 elm_box_pack_end(box, item);
127 //elm_box_recalculate(box);
132 /************************ Menu Handler ********************/
134 void on_messaging_menu_option_selected_cb(void *data, Evas_Object *obj, void *event_info)
136 appdata_s *ad = data;
137 Elm_Object_Item *it = event_info;
138 elm_genlist_item_selected_set(it, EINA_FALSE);
139 int id = (int)elm_object_item_data_get(it);
142 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
143 tg_peer_info_s *user_data = sel_item->use_data;
145 if (!sel_item || !user_data) {
146 show_toast(ad, "There are no messages to delete.");
148 evas_object_del(ad->msg_popup);
149 ad->msg_popup = NULL;
155 if (get_buddy_unknown_status(user_data->peer_id) && user_data->peer_type == TGL_PEER_USER) {
158 ad->is_loading_from_msg_view = EINA_TRUE;
159 on_create_new_contact(ad);
160 } else if (id == 1) {
162 // mark all the massages for deletion.
163 char* tablename = get_table_name_from_number(user_data->peer_id);
164 mark_all_records_for_deletion(tablename);
165 // delete date messages
166 delete_date_messages_from_table(tablename);
169 // clear all messages
170 Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
173 Evas_Object *box_layout = NULL;
174 Evas_Object *box = NULL;
175 Eina_List *list = NULL;
177 box_layout = elm_object_content_get(scroller);
179 LOGE("Fail to get the box into scroller");
183 list = elm_box_children_get(box_layout);
185 LOGE("Fail to get the list into box");
189 box = eina_list_nth(list, 0);
191 LOGE("Fail to get the box into box layout");
195 eina_list_free(list);
197 elm_box_recalculate(box);
200 // send request to server
201 send_delete_group_chat_request(ad, ad->service_client, user_data->peer_id);
203 if (ad->main_item_in_cahtting_data) {
204 tg_main_list_item_s* old_item = ad->main_item_in_cahtting_data;
205 if (old_item->last_message) {
206 free(old_item->last_message);
207 old_item->last_message = NULL;
209 old_item->last_message = strdup("");
212 Evas_Object *nomsg_layout = evas_object_data_get(ad->nf, "chat_list_no_msg_text");
214 elm_object_signal_emit(nomsg_layout, "show", "message");
218 char* tablename = get_table_name_from_number(user_data->peer_id);
219 delete_all_records(tablename);
222 // clear all messages
223 Evas_Object *genlist = evas_object_data_get(ad->nf, "chat_list");
224 elm_genlist_clear(genlist);
226 // remove main item from main list
227 if (ad->main_item_in_cahtting_data) {
228 tg_main_list_item_s* old_item = ad->main_item_in_cahtting_data;
229 if (old_item->peer_print_name) {
230 free(old_item->peer_print_name);
231 old_item->peer_print_name = NULL;
233 if (old_item->last_message) {
234 free(old_item->last_message);
235 old_item->last_message = NULL;
237 if (old_item->profile_pic_path) {
238 free(old_item->profile_pic_path);
239 old_item->profile_pic_path = NULL;
241 old_item->date_lbl = NULL;
242 old_item->msg_status_lbl = NULL;
243 old_item->main_item_layout = NULL;
244 old_item->profile_pic = NULL;
245 old_item->profile_pic_path = NULL;
246 old_item->status_lbl = NULL;
247 old_item->user_name_lbl = NULL;
248 ad->main_list = eina_list_remove(ad->main_list, ad->main_item_in_cahtting_data);
250 ad->main_item_in_cahtting_data = NULL;
253 ad->is_last_msg_changed = EINA_FALSE;
256 app_nf_back_cb(ad, NULL, NULL);
259 evas_object_del(ad->msg_popup);
260 ad->msg_popup = NULL;
265 if (user_data->peer_type == TGL_PEER_USER) {
267 launch_user_info_screen(ad, user_data->peer_id);
268 } else if (id == 1) {
269 // mark all the massages for deletion.
270 char* tablename = get_table_name_from_number(user_data->peer_id);
271 mark_all_records_for_deletion(tablename);
272 // delete date messages
273 delete_date_messages_from_table(tablename);
276 // clear all messages
277 Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
280 Evas_Object *box_layout = NULL;
281 Evas_Object *box = NULL;
282 Eina_List *list = NULL;
284 box_layout = elm_object_content_get(scroller);
286 LOGE("Fail to get the box into scroller");
290 list = elm_box_children_get(box_layout);
292 LOGE("Fail to get the list into box");
296 box = eina_list_nth(list, 0);
298 LOGE("Fail to get the box into box layout");
302 eina_list_free(list);
304 elm_box_recalculate(box);
306 // send request to server
307 send_delete_all_messages_request(ad, ad->service_client, user_data->peer_id, user_data->peer_type);
309 Evas_Object *nomsg_layout = evas_object_data_get(ad->nf, "chat_list_no_msg_text");
311 elm_object_signal_emit(nomsg_layout, "show", "message");
313 } else if (id == 2) {
314 show_loading_popup(ad);
315 char* tablename = get_table_name_from_number(user_data->peer_id);
316 delete_all_records(tablename);
319 elm_naviframe_item_pop(ad->nf);
320 load_registered_user_data(ad);
321 load_buddy_list_data(ad);
322 load_unknown_buddy_list_data(ad);
324 load_main_list_data(ad);
325 ecore_timer_add(1, on_load_main_view_requested, ad);
327 } else if (user_data->peer_type == TGL_PEER_CHAT) {
329 // mark all the massages for deletion.
330 char* tablename = get_table_name_from_number(user_data->peer_id);
331 mark_all_records_for_deletion(tablename);
332 // delete date messages
333 delete_date_messages_from_table(tablename);
336 // clear all messages
337 Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
340 Evas_Object *box_layout = NULL;
341 Evas_Object *box = NULL;
342 Eina_List *list = NULL;
344 box_layout = elm_object_content_get(scroller);
346 LOGE("Fail to get the box into scroller");
350 list = elm_box_children_get(box_layout);
352 LOGE("Fail to get the list into box");
356 box = eina_list_nth(list, 0);
358 LOGE("Fail to get the box into box layout");
362 eina_list_free(list);
364 elm_box_recalculate(box);
366 send_delete_all_messages_request(ad, ad->service_client, user_data->peer_id, user_data->peer_type);
368 Evas_Object *nomsg_layout = evas_object_data_get(ad->nf, "chat_list_no_msg_text");
370 elm_object_signal_emit(nomsg_layout, "show", "message");
373 } else if (id == 1) {
374 //send group chat delete request
375 show_loading_popup(ad);
376 send_delete_group_chat_request(ad, ad->service_client, user_data->peer_id);
381 evas_object_del(ad->msg_popup);
382 ad->msg_popup = NULL;
388 char* on_messaging_menu_group_text_get_cb(void *data, Evas_Object *obj, const char *part)
392 return strdup(i18n_get_text("IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3"));
394 return strdup(i18n_get_text("IDS_TGRAM_OPT_DELETE"));
398 char* on_messaging_menu_text_get_cb(void *data, Evas_Object *obj, const char *part)
401 appdata_s *ad = evas_object_data_get(obj, "app_data");
402 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
403 tg_peer_info_s *user_data = sel_item->use_data;
404 if ((user_data->peer_type == TGL_PEER_USER) && get_buddy_unknown_status(user_data->peer_id)) {
406 return strdup(i18n_get_text("IDS_TGRAM_OPT_ADD_TO_CONTACTS_ABB2"));
407 } else if (id == 1) {
408 return strdup(i18n_get_text("IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3"));
410 return strdup(i18n_get_text("IDS_TGRAM_OPT_DELETE"));
414 return strdup(i18n_get_text("IDS_TGRAM_OPT_VIEW_PROFILE_ABB"));
415 } else if (id == 1) {
416 return strdup(i18n_get_text("IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3"));
418 return strdup(i18n_get_text("IDS_TGRAM_OPT_DELETE"));
423 void on_msg_popup_back_cb(void *data, Evas_Object *obj, void *event_info)
425 appdata_s *ad = data;
427 evas_object_del(ad->msg_popup);
428 ad->msg_popup = NULL;
432 void on_messaging_menu_button_clicked(void *data, Evas_Object *obj, void *event_info)
434 appdata_s *ad = data;
435 if (ad->msg_popup || ad->current_app_state != TG_CHAT_MESSAGING_VIEW_STATE) {
439 static Elm_Genlist_Item_Class itc;
440 //Evas_Object *popup;
441 Evas_Object *genlist;
443 Evas_Object *win = ad->win;
445 ad->msg_popup = elm_popup_add(win);
446 elm_popup_align_set(ad->msg_popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
447 eext_object_event_callback_add(ad->msg_popup, EEXT_CALLBACK_BACK, on_msg_popup_back_cb, ad);
448 evas_object_size_hint_weight_set(ad->msg_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
450 evas_object_data_set(ad->msg_popup, "app_data", ad);
452 genlist = elm_genlist_add(ad->msg_popup);
453 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
454 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
456 evas_object_data_set(genlist, "app_data", ad);
458 itc.item_style = "default";
459 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
460 if (sel_item->use_data->peer_type == TGL_PEER_USER) {
461 itc.func.text_get = on_messaging_menu_text_get_cb;
462 } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
463 itc.func.text_get = on_messaging_menu_group_text_get_cb;
468 itc.func.content_get = NULL;
469 itc.func.state_get = NULL;
472 if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
473 for (i = 0; i < 2; i++) {
474 elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, on_messaging_menu_option_selected_cb, ad);
477 for (i = 0; i < 3; i++) {
478 elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, on_messaging_menu_option_selected_cb, ad);
481 evas_object_show(genlist);
483 elm_object_content_set(ad->msg_popup, genlist);
484 evas_object_show(ad->msg_popup);
488 /************************ Menu Handler ********************/
493 static Evas_Object *create_image_object_from_file(const char *icon_name, Evas_Object *parent)
495 Evas_Object *icon = elm_image_add(parent);
496 evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
497 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
498 elm_image_file_set(icon, icon_name, NULL);
499 evas_object_show(icon);
503 void on_chat_profile_pic_changed(appdata_s *ad, char *file_path)
505 if (!ad || !file_path) {
509 Evas_Object *profile_image = evas_object_data_get(ad->nf, "profile_picture");
511 elm_image_file_set(profile_image, file_path, NULL);
516 void on_group_chat_info_changed(appdata_s *ad, char *type_of_change)
518 if (!ad || !type_of_change) {
521 if (strstr(type_of_change, "edit_title") != NULL) {
522 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
524 tg_peer_info_s* user = sel_item->use_data;
525 char* user_name = replace(sel_item->use_data->print_name, '_', " ");
526 char temp_name[512] = {'\0'};
527 snprintf(temp_name, 512, "%s", user_name);
529 Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
530 elm_object_item_part_text_set(nf_it, "title", temp_name);
532 } else if (strstr(type_of_change, "delete_photo") != NULL) {
534 } else if (strstr(type_of_change, "add_user") != NULL) {
535 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
537 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
539 } else if (strstr(type_of_change, "delete_user") != NULL) {
540 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
542 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
549 void on_sent_media_item_clicked(void* data, Evas_Object* layout, void* event_info)
551 appdata_s* ad = evas_object_data_get(layout, "app_data");
552 char* media_type_str = evas_object_data_get(layout, "media_type");
553 char* media_file = evas_object_data_get(layout, "media_file");
555 if (access(media_file, F_OK) != -1) {
561 if (media_file && strlen(media_file) > 0) {
562 app_control_h app_control;
563 int ret = app_control_create(&app_control);
564 if (ret != APP_CONTROL_ERROR_NONE) {
565 show_toast(ad, "Error: Can not load image");
568 app_control_set_operation(app_control, APP_CONTROL_OPERATION_VIEW);
569 if (media_type_str && strstr(media_type_str, "video") != NULL) {
570 app_control_set_mime(app_control, "video/*");
571 } else if (media_type_str && strstr(media_type_str, "audio") != NULL) {
572 app_control_set_mime(app_control, "audio/*");
574 app_control_set_mime(app_control, "image/*");
576 app_control_set_uri(app_control, media_file);
578 app_control_send_launch_request(app_control, NULL, NULL);
579 app_control_destroy(app_control);
583 static Evas_Object *get_gif_image_from_path(const char* path, Evas_Object* parent, char *key)
585 if (!path || !parent || !key) {
588 LOGD("key : %s", key);
589 Evas_Object *media_image = elm_image_add(parent);
590 elm_image_aspect_fixed_set(media_image, EINA_FALSE);
591 elm_image_file_set(media_image, path, key);
592 evas_object_size_hint_weight_set(media_image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
593 evas_object_size_hint_align_set(media_image, EVAS_HINT_FILL, EVAS_HINT_FILL);
594 evas_object_show(media_image);
598 static Evas_Object *get_image_from_path(const char* path, Evas_Object* parent)
600 if (!path || !parent) {
603 Evas_Object *media_image = elm_image_add(parent);
604 elm_image_aspect_fixed_set(media_image, EINA_FALSE);
605 elm_image_file_set(media_image, path, NULL);
606 evas_object_size_hint_weight_set(media_image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
607 evas_object_size_hint_align_set(media_image, EVAS_HINT_FILL, EVAS_HINT_FILL);
608 evas_object_show(media_image);
612 int get_image_size(long long media_id)
614 Eina_List* media_sizes = get_image_sizes_from_db(media_id);
615 int row_count = eina_list_count(media_sizes);
621 for (int i = 0 ; i < row_count ; i++) {
622 Eina_List* row_vals = eina_list_nth(media_sizes, i);
623 int *temp_size1 = (int *)eina_list_nth(row_vals, 0);
628 int *temp_size2 = (int*)eina_list_nth(row_vals, 3);
633 int *temp_size3 = (int*)eina_list_nth(row_vals, 6);
638 int *temp_size4 = (int*)eina_list_nth(row_vals, 9);
643 eina_list_free(row_vals);
646 eina_list_free(media_sizes);
650 } else if (size2 > 0) {
652 } else if (size3 > 0) {
654 } else if (size4 > 0) {
662 void on_media_chat_item_clicked(void* data, Evas_Object *entry, void* event_info)
664 Evas_Object *button = evas_object_data_get(entry, "button_object");
666 char* img_state = evas_object_data_get(button, "image_state");
667 if (img_state && strstr(img_state, "download_in_progress") != NULL) {
672 appdata_s* ad = evas_object_data_get(entry, "app_data");
673 char *temp_media_id = evas_object_data_get(entry, "media_id");
674 char *media_type_str = evas_object_data_get(entry, "media_type");
676 if (media_type_str && strstr(media_type_str, "location") != NULL) {
677 char *url = evas_object_data_get(entry, "location_url");
678 launch_app_control(ad, media_type_str, url);
682 long long media_id = atoll(temp_media_id);
684 char *media_file = get_media_path_from_db(media_id);
686 if (access(media_file, F_OK) != -1) {
692 if (!media_file || strlen(media_file) <= 0) {
693 Eina_Bool ret = send_request_for_media_downloading(ad, ad->service_client, ad->peer_in_cahtting_data->use_data->peer_id, media_id);
695 show_toast(ad, "Please check your network connection.");
699 char temp_msg[256] = {0,};
700 snprintf(temp_msg, sizeof(temp_msg), "%s", "Downloading...");
701 elm_object_part_text_set(button, "size", temp_msg);
703 Evas_Object* progressbar = elm_progressbar_add(button);
704 elm_object_style_set(progressbar, "process_small");
705 evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
706 evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
707 elm_progressbar_pulse(progressbar, EINA_TRUE);
708 evas_object_show(progressbar);
710 Evas_Object* old_content = elm_object_part_content_unset(button, "download_image");
712 evas_object_del(old_content);
715 elm_object_part_content_set(button, "download_image", progressbar);
716 evas_object_data_set(button, "image_state", "download_in_progress");
719 launch_app_control(ad, media_type_str, media_file);
723 static void on_video_play_pressed(void *data, Evas_Object *obj, void *event_info)
727 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_PRESS_ICON), NULL);
730 static void on_video_play_unpressed(void *data, Evas_Object *obj, void *event_info)
734 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
737 static Evas_Object* get_video_paly_icon(Evas_Object *parent)
739 Evas_Object* play_pause_btn = elm_button_add(parent);
740 elm_object_style_set(play_pause_btn, "transparent");
741 evas_object_size_hint_align_set(play_pause_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
742 evas_object_size_hint_weight_set(play_pause_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
744 Evas_Object* play_pause_icon = elm_image_add(parent);
745 evas_object_size_hint_align_set(play_pause_icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
746 evas_object_size_hint_weight_set(play_pause_icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
748 elm_image_file_set(play_pause_icon, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
750 elm_image_resizable_set(play_pause_icon, EINA_TRUE, EINA_TRUE);
751 evas_object_show(play_pause_icon);
753 elm_object_content_set(play_pause_btn, play_pause_icon);
755 evas_object_smart_callback_add(play_pause_btn, "pressed", on_video_play_pressed, play_pause_icon);
756 evas_object_smart_callback_add(play_pause_btn, "unpressed", on_video_play_unpressed, play_pause_icon);
757 return play_pause_btn;
760 static Evas_Object *get_media_layout_with_play(char *img_path, Evas_Object *parent, Eina_Bool show_play_icon)
762 char edj_path[PATH_MAX] = {0, };
763 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
764 Evas_Object *rec_video_layout = elm_layout_add(parent);
765 elm_layout_file_set(rec_video_layout, edj_path, "bubble_video_item_layout");
766 evas_object_size_hint_weight_set(rec_video_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
767 evas_object_size_hint_align_set(rec_video_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
768 evas_object_show(rec_video_layout);
770 Evas_Object *vid_thumb_icon = get_image_from_path(img_path, parent);
771 elm_object_part_content_set(rec_video_layout, "swallow.video_thumb_item", vid_thumb_icon);
773 if (show_play_icon) {
774 /* Evas_Object* play_img = get_image_from_path(ui_utils_get_resource(MEDIA_PLAY_ICON), parent);
775 elm_object_part_content_set(rec_video_layout, "swallow.play_btn", play_img);*/
777 Evas_Object* play_pause_btn = get_video_paly_icon(parent);
778 elm_object_part_content_set(rec_video_layout, "swallow.play_btn", play_pause_btn);
781 return rec_video_layout;
784 void audio_player_progress_updated(void* handler, int current, int total, void *user_data)
786 Evas_Object *parent = user_data;
787 Evas_Object *progressbar = evas_object_data_get(parent, "progress_control");
790 int seconds = (int) (current / 1000) % 60 ;
791 int minutes = (int) ((current / (1000*60)) % 60);
793 char tot_dur[256] = {0,};
795 if (seconds < 10 && minutes < 10) {
797 } else if (seconds > 10 && minutes < 10) {
799 } else if (seconds < 10 && minutes > 10) {
805 sprintf(tot_dur, format, minutes, seconds);
806 elm_object_part_text_set(progressbar, "elm.text.bottom.right", tot_dur);
808 double current_status = (double)((double)current/(double)total);
810 elm_progressbar_value_set(progressbar, current_status);
814 void audio_player_state_changed(void* handler, TG_AUDIO_PLAYER_STATE state, void *user_data)
816 tg_player_handler *audio_payer = handler;
817 Evas_Object *parent = user_data;
819 if (!audio_payer || !parent) {
823 Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(parent, "is_play_mode");
824 switch (audio_payer->state) {
825 case TG_AUDIO_PLAYER_STATE_NONE:
827 case TG_AUDIO_PLAYER_STATE_INITIALIZED:
828 evas_object_data_set(parent, "tg_audio_player", audio_payer);
829 play_audio_player(audio_payer);
831 case TG_AUDIO_PLAYER_STATE_PLAYING:
832 elm_image_file_set(parent, ui_utils_get_resource(TG_PAUSE_NORMAL_ICON), NULL);
833 is_play_mode = !is_play_mode;
834 evas_object_data_set(parent, "is_play_mode", is_play_mode);
836 case TG_AUDIO_PLAYER_STATE_INTERRUPTED:
837 elm_image_file_set(parent, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
838 is_play_mode = !is_play_mode;
839 evas_object_data_set(parent, "is_play_mode", is_play_mode);
841 case TG_AUDIO_PLAYER_STATE_PAUSE:
842 elm_image_file_set(parent, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
843 is_play_mode = !is_play_mode;
844 evas_object_data_set(parent, "is_play_mode", is_play_mode);
846 case TG_AUDIO_PLAYER_STATE_ERROR:
848 case TG_AUDIO_PLAYER_STATE_END:
849 destroy_audio_player(audio_payer);
852 is_play_mode = EINA_FALSE;
853 evas_object_data_set(parent, "is_play_mode", is_play_mode);
854 evas_object_data_set(parent, "tg_audio_player", NULL);
855 elm_image_file_set(parent, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
856 audio_player_progress_updated(NULL, 0, 1, parent);
864 static void on_message_play_pause_clicked(void *data, Evas_Object *obj, void *event_info)
869 appdata_s * ad = evas_object_data_get(data, "app_data");
870 char *audio_file = evas_object_data_get(data, "audio_file_path");
871 char *media_id = evas_object_data_get(data, "media_id");
872 if (!audio_file || strlen(audio_file) <= 0 || (audio_file && strstr(audio_file, "_null_")) != NULL) {
873 //there is no file. download it.
874 Evas_Object *progressbar = evas_object_data_get(data, "progress_control");
875 Eina_Bool is_download_in_progress = (Eina_Bool)evas_object_data_get(progressbar, "is_download_in_progress");
877 if (is_download_in_progress) {
880 elm_object_style_set(progressbar, "pending");
881 Eina_Bool ret = send_request_for_media_downloading(ad, ad->service_client, ad->peer_in_cahtting_data->use_data->peer_id, atoll(media_id));
883 show_toast(ad, "Please check your network connection.");
890 tg_player_handler *audio_payer = evas_object_data_get(data, "tg_audio_player");
893 audio_payer = init_audio_player(audio_file, &audio_player_state_changed, &audio_player_progress_updated, data);
896 show_toast(ad, "Unsupported file.");
901 if (audio_payer->state == TG_AUDIO_PLAYER_STATE_PAUSE || audio_payer->state == TG_AUDIO_PLAYER_STATE_INTERRUPTED) {
903 play_audio_player(audio_payer);
905 } else if (audio_payer->state == TG_AUDIO_PLAYER_STATE_PLAYING) {
907 pause_audio_player(audio_payer);
912 static void on_message_play_pause_pressed(void *data, Evas_Object *obj, void *event_info)
917 Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(data, "is_play_mode");
919 elm_image_file_set(data, ui_utils_get_resource(TG_PAUSE_PRESS_ICON), NULL);
921 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_PRESS_ICON), NULL);
925 static void on_message_play_pause_unpressed(void *data, Evas_Object *obj, void *event_info)
930 Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(data, "is_play_mode");
933 elm_image_file_set(data, ui_utils_get_resource(TG_PAUSE_NORMAL_ICON), NULL);
935 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
939 static void progressbar_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
945 static Evas_Object *create_audio_progressbar(Evas_Object *parent, int duration)
947 Evas_Object *progressbar;
949 progressbar = elm_progressbar_add(parent);
950 evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, 0.5);
951 evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
952 elm_progressbar_value_set(progressbar, 0.0);
953 evas_object_event_callback_add(progressbar, EVAS_CALLBACK_DEL, progressbar_del_cb, NULL);
954 evas_object_show(progressbar);
956 elm_object_part_text_set(progressbar, "elm.text.top.left", "");
957 elm_object_part_text_set(progressbar, "elm.text.top.right", "");
959 elm_object_part_text_set(progressbar, "elm.text.bottom.right", "00:00");
965 static Evas_Object *get_audio_layout_with_play(Evas_Object *parent)
967 Evas_Object* chat_scroller = parent;
968 Evas_Object *rec_video_layout = NULL;
969 tgl_media_s *media_msg = NULL;
970 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
971 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
972 int message_id = (int)evas_object_data_get(chat_scroller, "message_id");
974 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
975 int buddy_id = sel_item->use_data->peer_id;
976 char* tablename = get_table_name_from_number(buddy_id);
978 tg_message_s* msg = get_message_from_message_table(message_id, tablename);
986 Evas_Object *parent_obj = evas_object_data_get(chat_scroller, "parent_obj"); //entry
990 media_msg = get_media_details_from_db(atoll(msg->media_id));
992 char *audio_file = media_msg->file_path;
994 char edj_path[PATH_MAX] = {0, };
995 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
996 rec_video_layout = elm_layout_add(parent);
997 elm_layout_file_set(rec_video_layout, edj_path, "bubble_audio_item_layout");
998 evas_object_size_hint_weight_set(rec_video_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
999 evas_object_size_hint_align_set(rec_video_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1000 evas_object_show(rec_video_layout);
1002 /**************** play icon **********************/
1003 Evas_Object* play_pause_btn = elm_button_add(parent);
1004 elm_object_style_set(play_pause_btn, "transparent");
1005 evas_object_size_hint_align_set(play_pause_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
1006 evas_object_size_hint_weight_set(play_pause_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1008 Evas_Object* play_pause_icon = elm_image_add(parent);
1009 evas_object_size_hint_align_set(play_pause_icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
1010 evas_object_size_hint_weight_set(play_pause_icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1011 elm_image_file_set(play_pause_icon, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
1013 elm_image_resizable_set(play_pause_icon, EINA_TRUE, EINA_TRUE);
1014 evas_object_show(play_pause_icon);
1015 elm_object_content_set(play_pause_btn, play_pause_icon);
1017 Eina_Bool is_play_mode = EINA_TRUE;
1018 evas_object_data_set(play_pause_icon, "is_play_mode", is_play_mode);
1021 evas_object_data_set(play_pause_icon, "audio_file_path", strdup(audio_file));
1023 evas_object_data_set(play_pause_icon, "app_data", ad);
1024 evas_object_data_set(play_pause_icon, "user_id", (void*)user_id);
1025 evas_object_data_set(play_pause_icon, "message_id", (void*)message_id);
1026 evas_object_data_set(play_pause_icon, "media_id", strdup(msg->media_id));
1028 evas_object_smart_callback_add(parent_obj, "clicked", on_message_play_pause_clicked, play_pause_icon);
1029 evas_object_smart_callback_add(parent_obj, "pressed", on_message_play_pause_pressed, play_pause_icon);
1030 evas_object_smart_callback_add(parent_obj, "unpressed", on_message_play_pause_unpressed, play_pause_icon);
1032 evas_object_smart_callback_add(play_pause_btn, "clicked", on_message_play_pause_clicked, play_pause_icon);
1033 evas_object_smart_callback_add(play_pause_btn, "pressed", on_message_play_pause_pressed, play_pause_icon);
1034 evas_object_smart_callback_add(play_pause_btn, "unpressed", on_message_play_pause_unpressed, play_pause_icon);
1035 elm_object_part_content_set(rec_video_layout, "swallow.play_icon", play_pause_btn);
1036 /**************** play icon **********************/
1038 /*************** progress bar ********************/
1040 int total_duration = 0;
1042 metadata_extractor_h metadata;
1043 metadata_extractor_create(&metadata);
1044 int ret = metadata_extractor_set_path(metadata, audio_file);
1046 ret = metadata_extractor_get_metadata(metadata, METADATA_DURATION, &value);
1047 metadata_extractor_destroy(metadata);
1050 total_duration = atoi(value);
1054 total_duration = media_msg->doc_duration;
1055 //convert into milli secs
1056 total_duration = 1000 * total_duration;
1059 Evas_Object *progress = create_audio_progressbar(parent, total_duration);
1061 evas_object_data_set(parent_obj, "play_pause_icon", play_pause_icon);
1062 evas_object_data_set(parent_obj, "progress_bar", progress);
1064 elm_object_part_content_set(rec_video_layout, "swallow.progress_icon", progress);
1066 evas_object_data_set(play_pause_icon, "progress_control", (void*)progress);
1067 Eina_Bool is_download_in_progress = EINA_FALSE;
1068 evas_object_data_set(progress, "is_download_in_progress", (void*)is_download_in_progress);
1070 /*************** progress bar ********************/
1076 msg->message = NULL;
1078 if (msg->media_id) {
1079 free(msg->media_id);
1080 msg->media_id = NULL;
1083 free_media_details(media_msg);
1085 return rec_video_layout;
1089 static Evas_Object * item_provider(void *data, Evas_Object *entry, const char *item)
1091 Evas_Object *layout = NULL;
1092 if (!strcmp(item, "itemprovider")) {
1093 Evas_Object* chat_scroller = data;
1094 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1095 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1096 int message_id = (int)evas_object_data_get(chat_scroller, "message_id");
1098 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1099 int buddy_id = sel_item->use_data->peer_id;
1101 char* tablename = get_table_name_from_number(buddy_id);
1102 tg_message_s* msg = get_message_from_message_table(message_id, tablename);
1108 Evas_Object *item_to_display = NULL;
1109 tgl_media_s *media_msg = NULL;
1110 if (msg->media_type == tgl_message_media_photo || msg->media_type == tgl_message_media_document) {
1112 Eina_Bool is_blur_image = EINA_FALSE;
1113 char* img_path = NULL;
1114 Evas_Object *temp = NULL;
1115 temp = evas_object_data_get(entry, "img_object");
1118 tmp = ui_utils_get_resource(BLUR_BG);
1119 img_path = strdup(tmp);
1120 is_blur_image = EINA_TRUE;
1122 item_to_display = temp;
1125 if (msg->media_type == tgl_message_media_document) {
1126 media_msg = get_media_details_from_db(atoll(msg->media_id));
1128 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1129 if (img_path == NULL || strlen(img_path) == 0) {
1130 img_path = strdup(ui_utils_get_resource(TG_VIDEO_ICON));
1133 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1138 img_path = strdup(ui_utils_get_resource(TG_AUDIO_ICON));
1140 char* media_file = get_media_path_from_db(atoll(msg->media_id));
1141 if (!media_file || (media_file && !strcmp(media_file, "_null_")) || (media_file && strlen(media_file) <= 0) || (media_file && access(media_file, F_OK) == -1)) {
1142 is_blur_image = EINA_TRUE;
1145 if (media_file && strstr(media_file, ".webp") != NULL) {
1146 is_blur_image = EINA_FALSE;
1152 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1154 evas_object_data_set(chat_scroller, "parent_obj", (void*)entry);
1155 item_to_display = get_audio_layout_with_play(chat_scroller);
1157 } else if (msg->out) {
1159 if (msg->media_type == tgl_message_media_photo) {
1161 //item_to_display = get_image_from_path(img_path, entry);
1164 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1166 item_to_display = get_media_layout_with_play(img_path, entry, EINA_TRUE);
1169 //item_to_display = get_image_from_path(img_path, entry);
1170 elm_image_animated_set(item_to_display, EINA_TRUE);
1171 elm_image_animated_play_set(item_to_display, EINA_TRUE);
1176 if (!is_blur_image) {
1178 if (msg->media_type == tgl_message_media_photo) {
1180 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1183 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1185 item_to_display = get_media_layout_with_play(img_path, entry, EINA_TRUE);
1188 if (media_msg && media_msg->mime_type && strstr(media_msg->mime_type, "webp") != NULL) {
1189 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1191 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1192 elm_image_animated_set(item_to_display, EINA_TRUE);
1193 elm_image_animated_play_set(item_to_display, EINA_TRUE);
1199 char edj_path[PATH_MAX] = {0, };
1200 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1201 Evas_Object *rec_img_layout = elm_layout_add(entry);
1202 elm_layout_file_set(rec_img_layout, edj_path, "bubble_received_media_layout");
1203 evas_object_size_hint_weight_set(rec_img_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1204 evas_object_size_hint_align_set(rec_img_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1205 evas_object_show(rec_img_layout);
1206 Evas_Object *img_item = NULL;
1209 if (msg->media_type == tgl_message_media_photo) {
1210 img_item = get_image_from_path(img_path, entry);
1212 if ((media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) || (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL)) {
1213 img_item = get_media_layout_with_play(img_path, entry, EINA_FALSE);
1215 img_item = get_image_from_path(img_path, entry);
1218 elm_object_part_content_set(rec_img_layout, "swallow.image_item", img_item);
1221 if (msg->media_type == tgl_message_media_photo) {
1222 media_size = get_image_size(atoll(msg->media_id));
1224 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1225 media_size = get_media_size_from_db(atoll(msg->media_id));
1226 } else if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1227 media_size = get_media_size_from_db(atoll(msg->media_id));
1229 media_size = get_media_size_from_db(atoll(msg->media_id));
1233 int media_size_kbs = (media_size < (1 << 20)); //convert to kbs
1234 char media_size_str[10] = { 0, };
1235 if (media_size_kbs > 0) {
1236 sprintf(media_size_str, "%dKB", media_size_kbs);
1238 sprintf(media_size_str, "%dB", media_size);
1242 Evas_Object *size_btn = elm_layout_add(entry);
1243 elm_layout_file_set(size_btn, edj_path, "download_btn");
1244 elm_object_part_text_set(size_btn, "size", media_size_str);
1245 evas_object_size_hint_weight_set(size_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1246 evas_object_size_hint_align_set(size_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
1247 evas_object_show(size_btn);
1249 evas_object_data_set(size_btn, "image_state", "ready_to_download");
1251 Evas_Object* download_img = get_image_from_path(ui_utils_get_resource(MEDIA_DOWNLOAD_ICON), entry);
1252 elm_object_part_content_set(size_btn, "download_image", download_img);
1254 elm_object_part_content_set(rec_img_layout, "swallow.download_btn", size_btn);
1256 evas_object_data_set(entry, "image_object", (void*)img_item);
1257 evas_object_data_set(entry, "button_object", (void*)size_btn);
1258 evas_object_data_set(entry, "image_size", (void*)strdup(media_size_str));
1260 //ad->loaded_msg_list = eina_list_append(ad->loaded_msg_list, entry);
1262 item_to_display = rec_img_layout;
1270 // delete media details
1274 evas_object_data_set(entry, "chat_list", (void*)chat_scroller);
1275 evas_object_data_set(entry, "message_id", (void*)message_id);
1276 evas_object_data_set(entry, "app_data", (void*)ad);
1279 if (msg->media_type == tgl_message_media_photo) {
1280 evas_object_data_set(entry, "media_type", (void*)strdup("image"));
1281 } else if (msg->media_type == tgl_message_media_geo) {
1282 evas_object_data_set(entry, "media_type", (void*)strdup("location"));
1284 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1285 evas_object_data_set(entry, "media_type", (void*)strdup("video"));
1286 } else if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1287 evas_object_data_set(entry, "media_type", (void*)strdup("audio"));
1289 if (media_msg && media_msg->mime_type && strstr(media_msg->mime_type, "webp") != NULL) {
1290 evas_object_data_set(entry, "media_type", (void*)strdup("image"));
1292 evas_object_data_set(entry, "media_type", (void*)strdup("animated_gif"));
1297 evas_object_data_set(entry, "media_id", (void*)strdup(msg->media_id));
1298 if (item_to_display) {
1299 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1300 layout = item_to_display;
1302 char edj_path[PATH_MAX] = {0, };
1303 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1304 layout = elm_layout_add(entry);
1305 elm_layout_file_set(layout, edj_path, "chat_image_layout");
1306 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1307 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1308 evas_object_show(layout);
1310 Evas_Object *rounded_layout = elm_layout_add(entry);
1311 elm_layout_file_set(rounded_layout, edj_path, "rounded_corner_layout");
1312 evas_object_size_hint_weight_set(rounded_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1313 evas_object_size_hint_align_set(rounded_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1314 evas_object_show(rounded_layout);
1315 elm_object_part_content_set(rounded_layout, "content", item_to_display);
1317 elm_object_part_content_set(layout, "swallow.chat_image", rounded_layout);
1318 evas_object_smart_callback_add(entry, "clicked", on_media_chat_item_clicked, NULL);
1324 msg->message = NULL;
1327 if (msg->media_id) {
1328 free(msg->media_id);
1329 msg->media_id = NULL;
1333 free_media_details(media_msg);
1339 static void __resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1341 appdata_s *ad = data;
1342 Evas_Object *layout = NULL;
1343 Evas_Object *chat_scroller = NULL;
1345 layout = evas_object_data_get(ad->nf, "main_layout");
1346 chat_scroller = evas_object_data_get(ad->nf, "chat_list");
1348 int is_end_edge = 0;
1349 is_end_edge = (int)evas_object_data_get(layout, "is_end_edge");
1353 ret = scroller_show_bottom_edge(chat_scroller);
1355 LOGE("Fail to show the bottom of scroller");
1360 static void _create_image_item(tg_message_s *msg, Evas_Object *entry, char *image, int size)
1362 char* img_path = NULL;
1363 img_path = get_video_thumb_path_from_db(atoll(msg->media_id));
1364 if (img_path == NULL || (img_path && strlen(img_path) == 0) || (img_path && strstr(img_path, "_null_") != NULL)) {
1365 img_path = get_media_path_from_db(atoll(msg->media_id));
1366 if (access(img_path, F_OK) == -1) {
1372 Evas_Object *img_item = NULL;
1373 char key[256] = {0, };
1374 snprintf(key, sizeof(key), "%d", msg->msg_id);
1376 if (img_path && strstr(img_path, ".webp") != NULL) {
1377 img_item = get_image_from_path(img_path, entry);
1380 if (msg->media_type == tgl_message_media_document) {
1381 img_item = get_gif_image_from_path(img_path, entry, key);
1383 img_item = get_image_from_path(img_path, entry);
1391 evas_object_data_set(entry, "img_object", img_item);
1392 elm_image_object_size_get(img_item, &w, &h);
1395 if (img_path && strstr(img_path, ".webp") != NULL) {
1399 entry_h = (318 * h) / w;
1402 evas_object_data_set(entry, "img_object", NULL);
1405 snprintf(image, size - 1, "<item size=318x%d vsize=full href=itemprovider></item>", entry_h);
1408 Evas_Object *on_message_item_content_get_cb(void *data, Evas_Object *obj, const char *part)
1410 Evas_Object *entry = NULL;
1411 Evas_Object *layout = NULL;
1413 char edj_path[PATH_MAX] = {0, };
1414 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1416 if (!strcmp(part, "elm.icon.entry")) {
1418 int message_id = (int)data;
1419 Evas_Object *chat_scroller = obj;
1420 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1422 Evas_Object *nomsg_layout = evas_object_data_get(ad->nf, "chat_list_no_msg_text");
1424 elm_object_signal_emit(nomsg_layout, "hide", "message");
1427 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1428 evas_object_data_set(chat_scroller, "message_id", data);
1431 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1432 int buddy_id = sel_item->use_data->peer_id;
1434 char* tablename = get_table_name_from_number(buddy_id);
1435 tg_message_s* msg = get_message_from_message_table(message_id, tablename);
1436 //Eina_Bool is_blur_image = EINA_FALSE;
1442 update_msg_into_db(msg, tablename);
1443 ad->is_last_msg_changed = EINA_TRUE;
1453 if (msg->service == 2) {
1454 layout = elm_layout_add(obj);
1455 elm_layout_file_set(layout, edj_path, "chat_date_item");
1456 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1457 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1458 evas_object_show(layout);
1460 // convert date from string to int
1461 char *date_str = msg->message;
1462 int date_num = atoi(date_str);
1464 // convert date format
1465 time_t t = date_num;
1466 char *format = NULL;
1467 format = "%a, %e %b %Y";
1470 (void) localtime_r(&t, <);
1472 if (strftime(res, sizeof(res), format, <) == 0) {
1473 (void) fprintf(stderr, "strftime(3): cannot format supplied "
1474 "date/time into buffer of size %u "
1476 sizeof(res), format);
1479 elm_object_part_text_set(layout, "elm.text", res);
1481 } else if (msg->service == 1) {
1482 layout = elm_layout_add(obj);
1483 elm_layout_file_set(layout, edj_path, "chat_service_item_box");
1484 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1485 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1486 evas_object_show(layout);
1488 elm_object_part_text_set(layout, "elm.text", msg->message);
1492 evas_object_data_set(entry, "chat_list", (void*)chat_scroller);
1493 evas_object_data_set(entry, "message_id", (void*)message_id);
1495 if (msg->media_type != tgl_message_media_none) {
1496 entry = elm_entry_add(obj);
1497 elm_entry_editable_set(entry, EINA_FALSE);
1498 elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
1499 elm_entry_single_line_set(entry, EINA_TRUE);
1500 elm_entry_input_panel_enabled_set(entry, EINA_FALSE);
1502 LOGD("This is label message!");
1503 entry = elm_label_add(obj);
1505 layout = elm_layout_add(obj);
1508 elm_layout_file_set(layout, edj_path, "entry,send,layout");
1509 elm_object_style_set(entry, "sentmessage1");
1510 //sender_name = replace(ad->current_user_data->print_name, '_', " ");
1512 elm_layout_file_set(layout, edj_path, "entry,receive,layout");
1513 elm_object_style_set(entry, "readmessage1");
1515 /* If you need to get the name, you need this code */
1517 char *sender_name = NULL;
1518 if (sel_item->use_data->peer_type == TGL_PEER_USER) {
1519 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1520 } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
1521 int from_id = msg->from_id;
1522 // get name of buddy
1523 char* buddy_name = get_buddy_name_from_id(from_id);
1525 sender_name = replace(buddy_name, '_', " ");
1529 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1534 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1535 elm_object_part_content_set(layout, "elm.swallow.content", entry);
1536 evas_object_show(layout);
1538 evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1539 evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
1540 evas_object_show(entry);
1541 // To be handled for group chat
1543 Eina_Strbuf *buf = eina_strbuf_new();
1544 char *caption = NULL;
1546 LOGD("entry media type is %d", msg->media_type);
1547 if (msg->media_type == tgl_message_media_none) {
1548 char *temp_msg = replace(msg->message, '\n', "<br>");
1549 elm_object_part_text_set(entry, "elm.text", temp_msg);
1550 //eina_strbuf_append(buf, temp_msg);
1551 //elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1552 eina_strbuf_free(buf);
1554 } else if (msg->media_type == tgl_message_media_photo || msg->media_type == tgl_message_media_document) {
1555 elm_entry_item_provider_append(entry, item_provider, chat_scroller);
1557 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1558 if (media_msg && media_msg->caption && strlen(media_msg->caption) > 0) {
1559 caption = strdup(media_msg->caption);
1563 if (media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1564 if (ad->target_direction == TELEGRAM_TARGET_DIRECTION_PORTRAIT || ad->target_direction == TELEGRAM_TARGET_DIRECTION_PORTRAIT_INVERSE) {
1565 eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1567 eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1570 } else if (media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1571 eina_strbuf_append(buf, "<item size=318x200 vsize=full hsize=full href=itemprovider></item>");
1573 char image[256] = {0,};
1574 _create_image_item(msg, entry, image, sizeof(image));
1575 eina_strbuf_append(buf, image);
1580 if (media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1581 eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1582 } else if (media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1583 eina_strbuf_append(buf, "<item size=318x200 vsize=full hsize=full href=itemprovider></item>");
1585 char image[256] = {0,};
1586 _create_image_item(msg, entry, image, sizeof(image));
1587 eina_strbuf_append(buf, image);
1591 free_media_details(media_msg);
1592 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1593 eina_strbuf_free(buf);
1594 } else if (msg->media_type == tgl_message_media_geo) {
1596 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1598 char loc_url[4*256] = {0,};
1600 if (media_msg->caption && strlen(media_msg->caption) > 0) {
1601 caption = strdup(media_msg->caption);
1603 snprintf(loc_url, sizeof(loc_url), "https://maps.google.com/?q=%s,%s", media_msg->latitude, media_msg->longitude);
1604 char temp_msg[4*256] = {0,};
1605 snprintf(temp_msg, sizeof(temp_msg), "<font=Tizen:style=Normal|underline color=#0000FF align=left><font_size=15>%s</font_size></font>", loc_url);
1606 eina_strbuf_append(buf, temp_msg);
1607 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1608 eina_strbuf_free(buf);
1611 free_media_details(media_msg);
1612 evas_object_data_set(entry, "media_type", (void*)strdup("location"));
1613 evas_object_data_set(entry, "location_url", (void*)strdup(loc_url));
1614 evas_object_smart_callback_add(entry, "clicked", on_media_chat_item_clicked, NULL);
1616 } else if (msg->media_type == tgl_message_media_contact) {
1618 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1621 if (media_msg->caption && strlen(media_msg->caption) > 0) {
1622 caption = strdup(media_msg->caption);
1624 char temp_msg[4*256] = {0,};
1625 snprintf(temp_msg, sizeof(temp_msg), "<font=Tizen:style=Normal|underline color=#000000 align=left><font_size=15>%s %s, %s</font_size></font>", media_msg->first_name, media_msg->last_name, media_msg->phone_no);
1626 eina_strbuf_append(buf, temp_msg);
1627 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1628 eina_strbuf_free(buf);
1629 free_media_details(media_msg);
1632 } else if (msg->media_type == tgl_message_media_unsupported) {
1634 } else if (msg->media_type == tgl_message_media_photo_encr) {
1636 } else if (msg->media_type == tgl_message_media_document_encr) {
1641 ad->loaded_msg_list = eina_list_append(ad->loaded_msg_list, entry);
1644 LOGD("caption is (%s)", caption);
1649 time_t t = msg->date;
1650 const char *format = "%I:%M %p";
1653 (void) localtime_r(&t, <);
1655 if (strftime(res, sizeof(res), format, <) == 0) {
1656 (void) fprintf(stderr, "strftime(3): cannot format supplied "
1657 "date/time into buffer of size %u "
1659 sizeof(res), format);
1662 char time_str[20] = {0,};
1663 snprintf(time_str, sizeof(time_str) - 1, "%s", res);
1664 elm_object_part_text_set(entry, "time", time_str);
1665 Evas_Object *status_obj;
1666 status_obj = elm_icon_add(entry);
1667 evas_object_size_hint_weight_set(status_obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1668 evas_object_size_hint_align_set(status_obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
1670 if (msg->msg_state == TG_MESSAGE_STATE_SENDING) {
1671 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENDING_ICON), NULL);
1672 elm_object_signal_emit(entry, "status_on", "status");
1673 } else if (msg->msg_state == TG_MESSAGE_STATE_SENT) {
1674 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENT_ICON), NULL);
1675 elm_object_signal_emit(entry, "status_on", "status");
1676 } else if (msg->msg_state == TG_MESSAGE_STATE_DELIVERED) {
1677 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_DELIVERED_ICON), NULL);
1678 elm_object_signal_emit(entry, "status_on", "status");
1679 } else if (msg->msg_state == TG_MESSAGE_STATE_RECEIVED) {
1680 elm_object_signal_emit(entry, "status_off", "status");
1681 } else if (msg->msg_state == TG_MESSAGE_STATE_FAILED) {
1682 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_FAILED_ICON), NULL);
1683 elm_object_signal_emit(entry, "status_on", "status");
1684 } else if (msg->msg_state == TG_MESSAGE_STATE_READ) {
1685 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_READ_ICON), NULL);
1686 elm_object_signal_emit(entry, "status_on", "status");
1687 } else if (msg->msg_state == TG_MESSAGE_STATE_UNKNOWN) {
1688 elm_object_signal_emit(entry, "status_off", "status");
1691 elm_object_part_content_set(entry, "status_icon", status_obj);
1692 evas_object_show(status_obj);
1696 msg->message = NULL;
1699 if (msg->media_id) {
1700 free(msg->media_id);
1701 msg->media_id = NULL;
1707 if (chat_scroller) {
1708 int size = elm_genlist_items_count(chat_scroller);
1710 Elm_Object_Item *litem = elm_genlist_nth_item_get(chat_scroller, size -1);
1711 elm_genlist_item_show(litem, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1719 void on_text_message_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
1724 void on_text_message_received_from_buddy(appdata_s* ad, long long message_id, int type_of_chat)
1729 peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
1730 tg_peer_info_s* peer_item = pic_peer_item->use_data;
1731 char* tablename = get_table_name_from_number(peer_item->peer_id);
1732 tg_message_s* msg = get_message_from_message_table(message_id, tablename);
1734 Evas_Object* chat_scroller = evas_object_data_get(ad->nf, "chat_list");
1735 Evas_Object *message = NULL;
1738 // update peer table
1740 peer_item->last_msg_id = msg->msg_id;
1741 peer_item->last_msg_date = msg->date;
1742 insert_or_update_peer_into_database(peer_item);
1745 Evas_Object *layout = evas_object_data_get(ad->nf, "main_layout");
1747 int is_end_edge = (int) evas_object_data_get(layout, "is_end_edge");
1749 Evas_Object *bubble_layout = NULL;
1750 bubble_layout = elm_object_part_content_get(layout, "swallow.messagebubble");
1752 int user_id = (int) evas_object_data_get(chat_scroller, "user_id");
1753 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1754 char *sender_name = NULL;
1755 if (sel_item->use_data->peer_type == TGL_PEER_USER) {
1756 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1757 } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
1758 int from_id = msg->from_id;
1759 // get name of buddy
1760 char* buddy_name = get_buddy_name_from_id(from_id);
1762 sender_name = replace(buddy_name, '_', " ");
1766 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1769 elm_object_part_text_set(bubble_layout, "text_name", sender_name);
1770 elm_object_part_text_set(bubble_layout, "text_message", msg->message);
1771 elm_object_signal_emit(layout, "show", "bubblemessage");
1777 msg->message = NULL;
1780 if (msg->media_id) {
1781 free(msg->media_id);
1782 msg->media_id = NULL;
1789 message = on_message_item_content_get_cb((void *)message_id, chat_scroller, "elm.icon.entry");
1790 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)message_id);
1791 scroller_push_item(chat_scroller, message);
1793 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1794 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1796 send_request_for_marked_as_read(ad, ad->service_client, sel_item->use_data->peer_id, sel_item->use_data->peer_type);
1797 ad->is_last_msg_changed = EINA_TRUE;
1798 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
1802 void on_media_download_completed(appdata_s* ad, int buddy_id, long long media_id, const char *file_path, const char *caption)
1807 if (ad->loaded_msg_list && eina_list_count(ad->loaded_msg_list) > 0) {
1808 for (int i = eina_list_count(ad->loaded_msg_list) - 1 ; i >= 0; i--) {
1809 Evas_Object* entry = eina_list_nth(ad->loaded_msg_list, i);
1812 char* media_type_str = evas_object_data_get(entry, "media_type");
1813 char* media_id_str = evas_object_data_get(entry, "media_id");
1814 char* media_size_str = evas_object_data_get(entry, "image_size");
1815 Evas_Object *img_item = evas_object_data_get(entry, "image_object");
1816 Evas_Object *size_btn = evas_object_data_get(entry, "button_object");
1820 long long lmedia_id = atoll(media_id_str);
1822 if (media_id == lmedia_id) {
1823 if (img_item || (media_type_str && strstr(media_type_str, "audio") != NULL)) {
1826 if (file_path && strstr(file_path, "failed_to_load") != NULL) {
1828 if (media_type_str && (strstr(media_type_str, "audio") != NULL)) {
1829 Evas_Object *play_pause_icon = evas_object_data_get(entry, "play_pause_icon");
1830 Evas_Object *progressbar = evas_object_data_get(entry, "progress_bar");
1831 evas_object_data_set(progressbar, "is_download_in_progress", EINA_FALSE);
1832 evas_object_data_set(play_pause_icon, "audio_file_path", NULL);
1834 elm_object_style_set(progressbar, "default");
1840 Evas_Object* progress = elm_object_part_content_get(size_btn, "download_image");
1842 evas_object_del(progress);
1844 Evas_Object* download_img = get_image_from_path(ui_utils_get_resource(MEDIA_DOWNLOAD_ICON), size_btn);
1845 elm_object_part_content_set(size_btn, "download_image", download_img);
1846 evas_object_data_set(size_btn, "image_state", "ready_to_download");
1847 char temp_msg[256] = {0,};
1848 snprintf(temp_msg, sizeof(temp_msg), "<font=Tizen:style=Bold color=#008000 align=center><font_size=30>%s</font_size></font>", media_size_str);
1849 elm_object_text_set(size_btn, temp_msg);
1855 if (media_type_str && (strstr(media_type_str, "audio") != NULL)) {
1856 Evas_Object *play_pause_icon = evas_object_data_get(entry, "play_pause_icon");
1857 Evas_Object *progressbar = evas_object_data_get(entry, "progress_bar");
1858 evas_object_data_set(progressbar, "is_download_in_progress", EINA_FALSE);
1859 elm_object_style_set(progressbar, "default");
1860 evas_object_data_set(play_pause_icon, "audio_file_path", file_path);
1862 metadata_extractor_h metadata;
1863 metadata_extractor_create(&metadata);
1864 int ret = metadata_extractor_set_path(metadata, file_path);
1866 ret = metadata_extractor_get_metadata(metadata, METADATA_DURATION, &value);
1867 metadata_extractor_destroy(metadata);
1871 duration = atoi(value);
1875 elm_object_part_text_set(progressbar, "elm.text.top.left", "");
1876 elm_object_part_text_set(progressbar, "elm.text.top.right", "");
1882 evas_object_del(size_btn);
1885 if (media_type_str && (strstr(media_type_str, "video") != NULL)) {
1886 Evas_Object* play_img = get_video_paly_icon(img_item);
1887 //Evas_Object* play_img = get_image_from_path(ui_utils_get_resource(MEDIA_PLAY_ICON), img_item);
1888 elm_object_part_content_set(img_item, "swallow.play_btn", play_img);
1889 } else if (media_type_str && strstr(media_type_str, "image") != NULL) {
1891 img_item = get_image_from_path(file_path, entry);
1893 elm_image_object_size_get(img_item, &w, &h);
1894 entry_h = (318 * h) / w;
1895 Eina_Strbuf *buf = eina_strbuf_new();
1896 char image[256] = {0,};
1897 evas_object_data_set(entry, "img_object", img_item);
1898 snprintf(image, sizeof(image) - 1, "<item size=318x%d vsize=full href=itemprovider></item>", entry_h);
1899 eina_strbuf_append(buf, image);
1900 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1901 eina_strbuf_free(buf);
1903 } else if (media_type_str && strstr(media_type_str, "animated_gif") != NULL) {
1905 int msg_id = (int) evas_object_data_get(entry, "message_id");
1906 char key[256] = {0, };
1907 snprintf(key, sizeof(key), "%d", msg_id);
1909 img_item = get_gif_image_from_path(file_path, entry, key);
1910 //elm_image_animated_set(img_item, EINA_TRUE);
1911 //elm_image_animated_play_set(img_item, EINA_TRUE);
1913 elm_image_object_size_get(img_item, &w, &h);
1914 entry_h = (318 * h) / w;
1915 evas_object_data_set(entry, "img_object", img_item);
1916 Eina_Strbuf *buf = eina_strbuf_new();
1917 char image[256] = {0,};
1918 snprintf(image, sizeof(image) - 1, "<item size=318x%d vsize=full href=itemprovider></item>", entry_h);
1919 eina_strbuf_append(buf, image);
1920 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1921 eina_strbuf_free(buf);
1933 //elm_object_part_content_set(comp_img_layout, "swallow.chat_send_image", image);
1935 void on_video_thumb_download_completed(appdata_s* ad, int buddy_id, long long media_id, const char* file_path, const char *caption)
1937 on_media_download_completed(ad, buddy_id, media_id, file_path, caption);
1940 void on_text_message_state_changed(appdata_s* ad, tg_message_s *msg, int type_of_chat)
1946 peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
1947 if (pic_peer_item) {
1948 tg_peer_info_s* peer_item = pic_peer_item->use_data;
1949 // update peer table
1951 peer_item->last_msg_id = msg->msg_id;
1952 peer_item->last_msg_date = msg->date;
1953 insert_or_update_peer_into_database(peer_item);
1957 if (ad->loaded_msg_list && eina_list_count(ad->loaded_msg_list) > 0) {
1958 for (int i = eina_list_count(ad->loaded_msg_list) - 1 ; i >= 0; i--) {
1959 Evas_Object* entry = eina_list_nth(ad->loaded_msg_list, i);
1962 int message_id = (int)evas_object_data_get(entry, "message_id");
1963 if (message_id == msg->msg_id || message_id == msg->unique_id) {
1965 evas_object_data_set(entry, "media_id", (void*)strdup(msg->media_id));
1966 evas_object_data_set(entry, "message_id", (void*)message_id);
1968 Evas_Object* status_obj = elm_object_part_content_get(entry, "status_icon");
1970 if (msg->msg_state == TG_MESSAGE_STATE_SENDING) {
1971 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENDING_ICON), NULL);
1972 elm_object_signal_emit(entry, "status_on", "status");
1973 } else if (msg->msg_state == TG_MESSAGE_STATE_SENT) {
1974 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENT_ICON), NULL);
1975 elm_object_signal_emit(entry, "status_on", "status");
1976 } else if (msg->msg_state == TG_MESSAGE_STATE_DELIVERED) {
1977 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_DELIVERED_ICON), NULL);
1978 elm_object_signal_emit(entry, "status_on", "status");
1979 } else if (msg->msg_state == TG_MESSAGE_STATE_RECEIVED) {
1980 elm_object_signal_emit(entry, "status_off", "status");
1981 } else if (msg->msg_state == TG_MESSAGE_STATE_FAILED) {
1982 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_FAILED_ICON), NULL);
1983 elm_object_signal_emit(entry, "status_on", "status");
1984 } else if (msg->msg_state == TG_MESSAGE_STATE_READ) {
1985 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_READ_ICON), NULL);
1986 elm_object_signal_emit(entry, "status_on", "status");
1987 } else if (msg->msg_state == TG_MESSAGE_STATE_UNKNOWN) {
1988 elm_object_signal_emit(entry, "status_off", "status");
1998 Eina_Bool add_date_item_to_chat(void *data)
2000 Evas_Object *chat_scroller = data;
2001 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2005 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2006 if (!ad->peer_list) {
2010 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2012 char* msg_table = get_table_name_from_number(sel_item->use_data->peer_id);
2013 create_buddy_msg_table(msg_table);
2014 int msg_id = insert_current_date_to_table(msg_table);
2018 // send request to service
2019 Evas_Object *message = NULL;
2021 message = on_message_item_content_get_cb((void *)msg_id, chat_scroller, "elm.icon.entry");
2022 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)msg_id);
2023 scroller_push_item(chat_scroller, message);
2025 ad->is_last_msg_changed = EINA_TRUE;
2033 static Eina_Bool on_new_text_message_send_cb(void *data)
2035 Evas_Object *chat_scroller = data;
2036 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2037 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2038 Evas_Object *text_entry = evas_object_data_get(chat_scroller, "text_entry");
2040 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2042 const char* text_to_send = elm_entry_entry_get(text_entry);
2043 if (!text_to_send || (strlen(text_to_send) == 0))
2044 return ECORE_CALLBACK_CANCEL;
2046 int unique_id = get_time_stamp_in_macro();
2047 if (unique_id < 0) {
2048 unique_id = -1 * unique_id;
2051 msg.msg_id = unique_id;
2052 msg.from_id = ad->current_user_data->user_id.id;
2053 msg.date = time(NULL);
2056 msg.fwd_from_id = 0;
2057 msg.fwd_from_id = 0;
2059 msg.message = (char*)text_to_send;
2060 msg.message_len = strlen(text_to_send);
2061 msg.media_type = tgl_message_media_none;
2065 msg.to_id = sel_item->use_data->peer_id;
2067 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2068 msg.is_marked_for_delete = 0;
2069 char* msg_table = get_table_name_from_number(msg.to_id);
2070 create_buddy_msg_table(msg_table);
2071 insert_msg_into_db(&msg, msg_table, unique_id);
2074 peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
2075 if (pic_peer_item) {
2076 tg_peer_info_s* peer_item = pic_peer_item->use_data;
2077 // update peer table
2079 peer_item->last_msg_id = msg.msg_id;
2080 peer_item->last_msg_date = msg.date;
2081 insert_or_update_peer_into_database(peer_item);
2085 // send request to service
2086 send_request_for_message_transport(ad, ad->service_client, sel_item->use_data->peer_id, msg.msg_id, tgl_message_media_none, text_to_send, sel_item->use_data->peer_type);
2088 Evas_Object *message = NULL;
2090 message = on_message_item_content_get_cb((void *)unique_id, chat_scroller, "elm.icon.entry");
2091 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)unique_id);
2092 scroller_push_item(chat_scroller, message);
2094 elm_entry_entry_set(text_entry, "");
2095 ad->is_last_msg_changed = EINA_TRUE;
2096 return ECORE_CALLBACK_CANCEL;
2099 static void on_text_message_send_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2101 Evas_Object* chat_scroller = data;
2102 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2106 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2107 Evas_Object* text_entry = evas_object_data_get(chat_scroller, "text_entry");
2110 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2111 const char* text_to_send = elm_entry_markup_to_utf8(elm_object_text_get(text_entry));
2112 if (!text_to_send || (strlen(text_to_send) == 0))
2115 if (add_date_item_to_chat(data)) {
2116 //ecore_timer_add(2, on_new_text_message_send_cb, chat_scroller);
2121 int unique_id = get_time_stamp_in_macro();
2122 if (unique_id < 0) {
2123 unique_id = -1 * unique_id;
2126 msg.msg_id = unique_id;
2127 msg.from_id = ad->current_user_data->user_id.id;
2128 msg.date = time(NULL);
2131 msg.fwd_from_id = 0;
2132 msg.fwd_from_id = 0;
2134 msg.message = (char*)text_to_send;
2135 msg.message_len = strlen(text_to_send);
2136 msg.media_type = tgl_message_media_none;
2140 msg.to_id = sel_item->use_data->peer_id;
2142 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2143 msg.is_marked_for_delete = 0;
2144 char* msg_table = get_table_name_from_number(msg.to_id);
2145 create_buddy_msg_table(msg_table);
2146 insert_msg_into_db(&msg, msg_table, unique_id);
2149 peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
2150 if (pic_peer_item) {
2151 tg_peer_info_s* peer_item = pic_peer_item->use_data;
2152 // update peer table
2154 peer_item->last_msg_id = msg.msg_id;
2155 peer_item->last_msg_date = msg.date;
2156 insert_or_update_peer_into_database(peer_item);
2160 // send request to service
2161 send_request_for_message_transport(ad, ad->service_client, sel_item->use_data->peer_id, msg.msg_id, tgl_message_media_none, text_to_send, sel_item->use_data->peer_type);
2163 Evas_Object *message = NULL;
2165 Evas_Object *layout = evas_object_data_get(ad->nf, "main_layout");
2166 evas_object_data_set(layout, "is_end_edge", (void *) 1);
2168 message = on_message_item_content_get_cb((void *)unique_id, chat_scroller, "elm.icon.entry");
2169 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)unique_id);
2170 scroller_push_item(chat_scroller, message);
2172 elm_entry_entry_set(text_entry, "");
2173 ad->is_last_msg_changed = EINA_TRUE;
2176 void on_user_status_changed(appdata_s* ad, char* status)
2181 Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
2182 char status_str[256] = {0,};
2183 snprintf(status_str, sizeof(status_str) - 1, "%s", status);
2184 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2187 static void compare_with_current_date(int rtime, Elm_Object_Item *nf_it)
2189 char time_str[256] = {0,};
2190 time_t local_t = time(NULL);
2196 diff_sec = local_t - rtime;
2197 diff_min = diff_sec / 60;
2198 diff_hour = diff_min / 60;
2199 diff_day = diff_hour / 24;
2200 LOGD("different : day : %d, hour = %d, min = %d, sec = %d", diff_day, diff_hour, diff_min, diff_sec);
2203 if (diff_day > 30) {
2204 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_LONG_TIME_AGO_ABB"));
2209 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_WITHIN_A_MONTH_ABB"));
2213 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_WITHIN_A_WEEK_ABB"));
2217 if (diff_hour > 1) {
2218 snprintf(time_str, sizeof(time_str) - 1, i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_PD_HOURS_AGO_ABB"), diff_hour);
2222 if (diff_hour == 1) {
2223 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_1_HOUR_AGO_ABB"));
2227 snprintf(time_str, sizeof(time_str) - 1, i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_PD_MINUTES_AGO_ABB"), diff_min);
2230 if (diff_min == 1) {
2231 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_1_MINUTE_AGO_ABB"));
2234 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_RECENTLY_ABB"));
2237 elm_object_item_part_text_set(nf_it, "subtitle", time_str);
2240 void on_user_presence_state_changed(appdata_s* ad, int buddy_id)
2244 int type_of_chat = ad->peer_in_cahtting_data->use_data->peer_type;
2245 Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
2247 if (type_of_chat == TGL_PEER_USER) {
2249 Eina_List* buddy_details_array = get_buddy_info(buddy_id);
2250 if (buddy_details_array && eina_list_count(buddy_details_array) > 0) {
2251 Eina_List* buddy_details = eina_list_nth(buddy_details_array, 0);
2252 if (buddy_details && eina_list_count(buddy_details) > 0) {
2253 int* temp_online = (int*)eina_list_nth(buddy_details, 12);
2254 int is_online = *temp_online;
2255 int* temp_last_seen = (int*)eina_list_nth(buddy_details, 13);
2256 int last_seen = *temp_last_seen;
2258 if (is_online > 0) {
2259 char status_str[256] = {0,};
2260 snprintf(status_str, sizeof(status_str) - 1, "%s", i18n_get_text("IDS_TGRAM_SBODY_ONLINE"));
2261 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2263 compare_with_current_date(last_seen, nf_it);
2266 for (int i = 0 ; i < eina_list_count(buddy_details_array); i++) {
2267 void* val = eina_list_nth(buddy_details, i);
2270 eina_list_free(buddy_details);
2272 eina_list_free(buddy_details_array);
2275 } else if (type_of_chat == TGL_PEER_CHAT) {
2277 tg_chat_info_s* chat_info = get_chat_info(buddy_id);
2279 char status_str[256] = {0,};
2280 snprintf(status_str, sizeof(status_str) - 1, "Unidentified.");
2281 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2285 int user_list_size = chat_info->user_list_size;
2286 int online_members = 0;
2288 char *names_of_buddies = NULL;
2291 for (int i = 0; i < user_list_size; i++) {
2293 int is_online = get_buddy_online_status(chat_info->chat_users[i]);
2294 if (is_online > 0) {
2298 char *buddy_full_name = NULL;
2299 int buddy_id = chat_info->chat_users[i];
2301 if (buddy_id == ad->current_user_data->user_id.id) {
2302 buddy_full_name = strdup(ad->current_user_data->print_name);
2304 buddy_full_name = get_buddy_name_from_id(buddy_id);
2307 if (buddy_full_name) {
2308 char *buddy_name = replace(buddy_full_name, '_', " ");
2310 if (!names_of_buddies) {
2311 names_of_buddies = (char*)malloc(strlen(buddy_name) + 1);
2312 strcpy(names_of_buddies, buddy_name);
2314 names_of_buddies = (char*)realloc(names_of_buddies, strlen(names_of_buddies) + strlen(" / ") + strlen(buddy_name) + 1);
2315 strcat(names_of_buddies, " / ");
2316 strcat(names_of_buddies, buddy_name);
2319 free(buddy_full_name);
2323 evas_object_data_set(ad->nf, "names_of_buddies", (void*)names_of_buddies);
2326 if (online_members == 0) {
2327 char status_str[256] = {0,};
2328 snprintf(status_str, sizeof(status_str) - 1, "<font=Tizen:style=Bold color=#ffffff align=left><font_size=30>%d %s</font_size></font>", user_list_size, i18n_get_text("IDS_TGRAM_BODY_PD_PARTICIPANTS"));
2329 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2331 char status_str[256] = {0,};
2332 snprintf(status_str, sizeof(status_str) - 1, "<font=Tizen:style=Bold color=#ffffff align=left><font_size=30>%d %s, %d %s</font_size></font>", user_list_size, , online_members, i18n_get_text("IDS_TGRAM_SBODY_ONLINE"));
2333 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2336 char status_str[256] = {0,};
2337 snprintf(status_str, sizeof(status_str) - 1, i18n_get_text("IDS_TGRAM_BODY_PD_PARTICIPANTS"), user_list_size);
2339 char temp_status_str[512] = {0,};
2340 snprintf(temp_status_str, sizeof(temp_status_str) - 1, "%s", status_str);
2342 elm_object_item_part_text_set(nf_it, "subtitle", temp_status_str);
2346 if (chat_info->print_title) {
2347 free(chat_info->print_title);
2348 chat_info->print_title = NULL;
2350 if (chat_info->photo_path) {
2351 free(chat_info->photo_path);
2352 chat_info->photo_path = NULL;
2354 if (chat_info->title) {
2355 free(chat_info->title);
2356 chat_info->title = NULL;
2363 static Eina_Bool on_change_input_type_requested(void *data)
2365 Evas_Object* text_entry = data;
2367 LOGE("Fail to get the text_entry");
2368 return ECORE_CALLBACK_CANCEL;
2370 elm_object_focus_set(text_entry, EINA_TRUE);
2371 elm_entry_input_panel_layout_set(text_entry, ELM_INPUT_PANEL_LAYOUT_EMOTICON);
2372 elm_entry_input_panel_show(text_entry);
2374 return ECORE_CALLBACK_CANCEL;
2377 static void on_message_cancel_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2379 Evas_Object *layout = data;
2381 LOGE("Fail to get the layout");
2384 elm_object_signal_emit(layout, "hide", "bubblemessage");
2387 static void on_message_smiley_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2389 Evas_Object* text_entry = data;
2391 LOGE("Fail to get the text_entry");
2394 ecore_timer_add(0.3, on_change_input_type_requested, text_entry);
2397 static void on_message_text_entry_clicked(void *data, Evas_Object *obj, void *event_info)
2400 LOGE("Fail to get the entry");
2403 /* This Api is needed for type of keyboard: emoticon or caractor */
2404 elm_entry_input_panel_layout_set(obj, ELM_INPUT_PANEL_LAYOUT_NORMAL);
2407 static void on_message_text_entry_changed(void *data, Evas_Object *obj, void *event_info)
2409 Evas_Object *layout = data;
2412 LOGE("Fail to get the entry layout");
2415 int attach_show = (int) evas_object_data_get(layout, "is_attach_show");
2417 if (elm_entry_is_empty(obj)) {
2419 elm_object_signal_emit(layout, "show", "attach_btn");
2420 evas_object_data_set(layout, "is_attach_show", (void *) 1);
2424 elm_object_signal_emit(layout, "hide", "attach_btn");
2425 evas_object_data_set(layout, "is_attach_show", (void *) 0);
2430 Evas_Object* create_chat_genlist(Evas_Object *win)
2432 Evas_Object *genlist;
2433 Elm_Theme *theme = elm_theme_new();
2434 char edj_path[PATH_MAX] = {0, };
2435 app_get_resource(TELEGRAM_GENLIST_THEME_EDJ, edj_path, (int)PATH_MAX);
2436 elm_theme_extension_add(theme, edj_path);
2437 genlist = elm_genlist_add(win);
2438 elm_object_theme_set(genlist, theme);
2439 elm_object_style_set(genlist, "telegram/default");
2440 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2441 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
2445 void on_list_media_item_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2450 static Eina_Bool on_new_contact_message_send_cb(void *data)
2452 Evas_Object *chat_scroller = data;
2453 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2454 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2456 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2458 int unique_id = time(NULL);
2460 char unique_id_str[50];
2461 sprintf(unique_id_str, "%d", unique_id);
2464 msg.msg_id = unique_id;
2465 msg.from_id = ad->current_user_data->user_id.id;
2466 msg.date = time(NULL);
2469 msg.fwd_from_id = 0;
2470 msg.fwd_from_id = 0;
2471 msg.unique_id = unique_id;
2473 msg.message_len = 0;
2474 msg.media_type = tgl_message_media_contact;
2475 msg.media_id = strdup(unique_id_str);
2478 msg.to_id = sel_item->use_data->peer_id;
2480 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2481 msg.is_marked_for_delete = 0;
2483 char* msg_table = get_table_name_from_number(msg.to_id);
2484 create_buddy_msg_table(msg_table);
2485 insert_msg_into_db(&msg, msg_table, unique_id);
2490 char *first_name = evas_object_data_get(chat_scroller, "contact_first_name");
2491 char *last_name = evas_object_data_get(chat_scroller, "contact_last_name");
2492 char *phone_number = evas_object_data_get(chat_scroller, "contact_phone_number");
2494 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, NULL, NULL, first_name, last_name, phone_number);
2498 // send request to service
2499 send_request_for_media_transport(ad, ad->service_client, sel_item->use_data->peer_id, msg.msg_id, unique_id, tgl_message_media_contact, NULL, sel_item->use_data->peer_type);
2501 Evas_Object *message = NULL;
2503 message = on_message_item_content_get_cb((void *)unique_id, chat_scroller, "elm.icon.entry");
2504 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2505 scroller_push_item(chat_scroller, message);
2509 return ECORE_CALLBACK_CANCEL;
2513 void send_contact_message_to_buddy(void *data, char *first_name, char *last_name, char *phone_number)
2515 Evas_Object *chat_scroller = data;
2516 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2520 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2522 if (add_date_item_to_chat(data)) {
2523 /* evas_object_data_set(chat_scroller, "contact_first_name", strdup(first_name));
2524 evas_object_data_set(chat_scroller, "contact_last_name", strdup(last_name));
2525 evas_object_data_set(chat_scroller, "contact_phone_number", strdup(phone_number));
2527 ecore_timer_add(2, on_new_contact_message_send_cb, chat_scroller);
2532 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2534 int unique_id = get_time_stamp_in_macro();
2535 if (unique_id < 0) {
2536 unique_id = -1 * unique_id;
2538 char unique_id_str[50];
2539 sprintf(unique_id_str, "%d", unique_id);
2542 msg.msg_id = unique_id;
2543 msg.from_id = ad->current_user_data->user_id.id;
2544 msg.date = time(NULL);
2547 msg.fwd_from_id = 0;
2548 msg.fwd_from_id = 0;
2549 msg.unique_id = unique_id;
2551 msg.message_len = 0;
2552 msg.media_type = tgl_message_media_contact;
2553 msg.media_id = strdup(unique_id_str);
2556 msg.to_id = sel_item->use_data->peer_id;
2558 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2559 msg.is_marked_for_delete = 0;
2561 char* msg_table = get_table_name_from_number(msg.to_id);
2562 create_buddy_msg_table(msg_table);
2563 insert_msg_into_db(&msg, msg_table, unique_id);
2567 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, NULL, NULL, first_name, last_name, phone_number);
2571 // send request to service
2572 send_request_for_media_transport(ad, ad->service_client, sel_item->use_data->peer_id, msg.msg_id, unique_id, tgl_message_media_contact, NULL, sel_item->use_data->peer_type);
2574 Evas_Object *message = NULL;
2576 message = on_message_item_content_get_cb((void *)unique_id, chat_scroller, "elm.icon.entry");
2577 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2578 scroller_push_item(chat_scroller, message);
2582 static Eina_Bool on_new_location_message_send_cb(void *data)
2584 Evas_Object *chat_scroller = data;
2585 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2586 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2588 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2590 int unique_id = time(NULL);
2592 char unique_id_str[50];
2593 sprintf(unique_id_str, "%d", unique_id);
2596 msg.msg_id = unique_id;
2597 msg.from_id = ad->current_user_data->user_id.id;
2598 msg.date = time(NULL);
2601 msg.fwd_from_id = 0;
2602 msg.fwd_from_id = 0;
2603 msg.unique_id = unique_id;
2605 msg.message_len = 0;
2606 msg.media_type = tgl_message_media_geo;
2607 msg.media_id = strdup(unique_id_str);
2610 msg.to_id = sel_item->use_data->peer_id;
2612 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2613 msg.is_marked_for_delete = 0;
2615 char* msg_table = get_table_name_from_number(msg.to_id);
2616 create_buddy_msg_table(msg_table);
2617 insert_msg_into_db(&msg, msg_table, unique_id);
2622 char *latitude = evas_object_data_get(chat_scroller, "contact_latitude");
2623 char *longitude = evas_object_data_get(chat_scroller, "contact_longitude");
2625 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, latitude, longitude, NULL, NULL, NULL);
2629 // send request to service
2630 send_request_for_media_transport(ad, ad->service_client, sel_item->use_data->peer_id, msg.msg_id, unique_id, tgl_message_media_geo, NULL, sel_item->use_data->peer_type);
2632 Evas_Object *message = NULL;
2634 message = on_message_item_content_get_cb((void *)unique_id, chat_scroller, "elm.icon.entry");
2635 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2636 scroller_push_item(chat_scroller, message);
2639 return ECORE_CALLBACK_CANCEL;
2642 void send_location_message_to_buddy(void *data, char *latitude, char *longitude)
2644 Evas_Object *chat_scroller = data;
2645 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2649 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2651 if (add_date_item_to_chat(data)) {
2652 /* evas_object_data_set(chat_scroller, "contact_latitude", strdup(latitude));
2653 evas_object_data_set(chat_scroller, "contact_longitude", strdup(longitude));
2654 ecore_timer_add(2, on_new_location_message_send_cb, chat_scroller);
2659 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2661 int unique_id = get_time_stamp_in_macro();
2662 if (unique_id < 0) {
2663 unique_id = -1 * unique_id;
2665 char unique_id_str[50];
2666 sprintf(unique_id_str, "%d", unique_id);
2669 msg.msg_id = unique_id;
2670 msg.from_id = ad->current_user_data->user_id.id;
2671 msg.date = time(NULL);
2674 msg.fwd_from_id = 0;
2675 msg.fwd_from_id = 0;
2676 msg.unique_id = unique_id;
2678 msg.message_len = 0;
2679 msg.media_type = tgl_message_media_geo;
2680 msg.media_id = strdup(unique_id_str);
2683 msg.to_id = sel_item->use_data->peer_id;
2685 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2686 msg.is_marked_for_delete = 0;
2688 char* msg_table = get_table_name_from_number(msg.to_id);
2689 create_buddy_msg_table(msg_table);
2690 insert_msg_into_db(&msg, msg_table, unique_id);
2694 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, latitude, longitude, NULL, NULL, NULL);
2698 // send request to service
2699 send_request_for_media_transport(ad, ad->service_client, sel_item->use_data->peer_id, msg.msg_id, unique_id, tgl_message_media_geo, NULL, sel_item->use_data->peer_type);
2701 Evas_Object *message = NULL;
2703 message = on_message_item_content_get_cb((void *)unique_id, chat_scroller, "elm.icon.entry");
2704 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2705 scroller_push_item(chat_scroller, message);
2710 static Eina_Bool on_new_media_message_send_cb(void *data)
2712 Evas_Object *chat_scroller = data;
2713 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2714 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2716 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2718 int unique_id = time(NULL);
2720 char unique_id_str[50];
2721 sprintf(unique_id_str, "%d", unique_id);
2723 char *file_type_char = evas_object_data_get(chat_scroller, "file_type");
2724 int file_type = atoi(file_type_char);
2725 char *file_path = evas_object_data_get(chat_scroller, "file_path");
2728 msg.msg_id = unique_id;
2729 msg.from_id = ad->current_user_data->user_id.id;
2730 msg.date = time(NULL);
2733 msg.fwd_from_id = 0;
2734 msg.fwd_from_id = 0;
2735 msg.unique_id = unique_id;
2737 msg.message_len = 0;
2738 msg.media_type = file_type;
2739 msg.media_id = strdup(unique_id_str);
2742 msg.to_id = sel_item->use_data->peer_id;
2744 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2745 msg.is_marked_for_delete = 0;
2747 char* msg_table = get_table_name_from_number(msg.to_id);
2748 create_buddy_msg_table(msg_table);
2749 insert_msg_into_db(&msg, msg_table, unique_id);
2753 if (file_type == tgl_message_media_photo) {
2754 Evas_Object *img = create_image_object_from_file(file_path, chat_scroller);
2755 elm_image_object_size_get(img, &img_width, &img_height);
2757 stat(file_path, &st);
2758 media_size = st.st_size;
2759 evas_object_del(img);
2762 insert_media_info_to_db(&msg, (char*)file_path, img_width, img_height, media_size, NULL, NULL , NULL, NULL, NULL);
2766 // send request to service
2767 send_request_for_media_transport(ad, ad->service_client, sel_item->use_data->peer_id, msg.msg_id, unique_id, file_type, file_path, sel_item->use_data->peer_type);
2769 Evas_Object *message = NULL;
2771 message = on_message_item_content_get_cb((void *)unique_id, chat_scroller, "elm.icon.entry");
2772 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2773 scroller_push_item(chat_scroller, message);
2776 ad->is_last_msg_changed = EINA_TRUE;
2777 return ECORE_CALLBACK_CANCEL;
2780 void send_media_message_to_buddy(void *data, const char* file_path, enum tgl_message_media_type file_type)
2782 Evas_Object *chat_scroller = data;
2783 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2787 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2788 if (add_date_item_to_chat(data)) {
2789 /* int temp_file_type = file_type;
2790 char file_type_char[10]= {0, };
2791 sprintf(file_type_char, "%d", temp_file_type);
2792 evas_object_data_set(chat_scroller, "file_type", strdup(file_type_char));
2793 evas_object_data_set(chat_scroller, "file_path", strdup(file_path));
2795 ecore_timer_add(2, on_new_media_message_send_cb, chat_scroller);
2799 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2801 int unique_id = get_time_stamp_in_macro();
2802 if (unique_id < 0) {
2803 unique_id = -1 * unique_id;
2805 char unique_id_str[50];
2806 sprintf(unique_id_str, "%d", unique_id);
2809 msg.msg_id = unique_id;
2810 msg.from_id = ad->current_user_data->user_id.id;
2811 msg.date = time(NULL);
2814 msg.fwd_from_id = 0;
2815 msg.fwd_from_id = 0;
2816 msg.unique_id = unique_id;
2818 msg.message_len = 0;
2819 msg.media_type = file_type;
2820 msg.media_id = strdup(unique_id_str);
2823 msg.to_id = sel_item->use_data->peer_id;
2825 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2826 msg.is_marked_for_delete = 0;
2828 char* msg_table = get_table_name_from_number(msg.to_id);
2829 create_buddy_msg_table(msg_table);
2830 insert_msg_into_db(&msg, msg_table, unique_id);
2834 if (file_type == tgl_message_media_photo) {
2835 Evas_Object* img = create_image_object_from_file(file_path, chat_scroller);
2836 elm_image_object_size_get(img, &img_width, &img_height);
2838 stat(file_path, &st);
2839 media_size = st.st_size;
2840 evas_object_del(img);
2843 insert_media_info_to_db(&msg, (char*)file_path, img_width, img_height, media_size, NULL, NULL , NULL, NULL, NULL);
2847 // send request to service
2848 send_request_for_media_transport(ad, ad->service_client, sel_item->use_data->peer_id, msg.msg_id, unique_id, file_type, file_path, sel_item->use_data->peer_type);
2850 Evas_Object *message = NULL;
2852 message = on_message_item_content_get_cb((void *)unique_id, chat_scroller, "elm.icon.entry");
2853 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2854 scroller_push_item(chat_scroller, message);
2857 ad->is_last_msg_changed = EINA_TRUE;
2860 static Eina_Bool on_timer_expired(void *data)
2862 Evas_Object *scroller = data;
2866 LOGE("Cannot get the scroller");
2867 return ECORE_CALLBACK_CANCEL;
2869 ret = scroller_show_bottom_edge(scroller);
2871 LOGE("Fail to show the bottom of scroller");
2874 return ECORE_CALLBACK_CANCEL;
2877 Eina_Bool load_chat_history(Evas_Object *chat_scroller)
2879 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2880 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2882 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2883 int buddy_id = sel_item->use_data->peer_id;
2885 char* tablename = get_table_name_from_number(buddy_id);
2887 Eina_List* col_types = NULL;
2888 col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
2890 Eina_List* col_names = NULL;
2891 col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MESSAGE_ID);
2893 char unknown_str[50];
2895 sprintf(unknown_str, "%d", unknown);
2897 char* where_clause = (char*)malloc(strlen(MESSAGE_INFO_TABLE_MARKED_FOR_DELETE) + strlen(" = ") + strlen(unknown_str) + 1);
2898 strcpy(where_clause, MESSAGE_INFO_TABLE_MARKED_FOR_DELETE);
2899 strcat(where_clause, " = ");
2900 strcat(where_clause, unknown_str);
2902 Eina_List* vals = get_values_from_table_sync_order_by(tablename, col_names, col_types, MESSAGE_INFO_TABLE_DATE, EINA_TRUE, where_clause, TG_DBMGR_NOLIMITED, TG_DBMGR_NOLIMITED);
2904 // set no messages yet
2907 int row_count = eina_list_count(vals);
2909 if (row_count <= 0) {
2910 // set no messages yet
2914 for (int i = 0 ; i < row_count ; i++) {
2915 Eina_List* row_vals = eina_list_nth(vals, i);
2916 int* temp_message_id = (int*)eina_list_nth(row_vals, 0);
2917 int message_id = *temp_message_id;
2918 Evas_Object *message = NULL;
2920 message = on_message_item_content_get_cb((void *)message_id, chat_scroller, "elm.icon.entry");
2921 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)message_id);
2922 scroller_push_item(chat_scroller, message);
2924 eina_list_free(row_vals);
2926 eina_list_free(vals);
2929 Ecore_Timer *timer = NULL;
2930 timer = ecore_timer_add(0.1, on_timer_expired, chat_scroller);
2938 void on_gallery_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2940 if (result == APP_CONTROL_RESULT_SUCCEEDED) {
2941 Evas_Object* chat_scroller = user_data;
2942 char* file_path = NULL;
2943 char** path_arryay = NULL;
2944 int array_length = 0;
2946 char* mime_type = NULL;
2947 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2949 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
2950 if (status != APP_CONTROL_ERROR_NONE) {
2951 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay, &array_length);
2952 if (status != APP_CONTROL_ERROR_NONE) {
2954 show_toast(ad, "Unable to get the result from attach panel");
2960 status = app_control_get_mime(reply, &mime_type);
2961 if (status != APP_CONTROL_ERROR_NONE) {
2963 show_toast(ad, "Unable to get the mime type from attach panel");
2968 for (int i = 0 ; i < array_length ; i++) {
2969 file_path = strdup(path_arryay[i]);
2970 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_photo);
2977 void on_location_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2979 Evas_Object* chat_scroller = user_data;
2980 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2981 if (result == APP_CONTROL_RESULT_SUCCEEDED) {
2982 char *latitude = NULL;
2983 char *longitude = NULL;
2984 app_control_get_extra_data(reply, "latitude", &latitude);
2985 app_control_get_extra_data(reply, "longitude", &longitude);
2987 if (latitude && longitude) {
2988 send_location_message_to_buddy(chat_scroller, latitude, longitude);
2990 //send_location_message_to_buddy(chat_scroller, "0.00000000000", "0.00000000000");
2991 show_toast(ad, "Unable to detect location values.");
2994 show_toast(ad, "Device does not support location feature.");
2998 void on_video_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3000 if (result == APP_CONTROL_RESULT_SUCCEEDED) {
3002 Evas_Object* chat_scroller = user_data;
3003 char* file_path = NULL;
3004 char** path_arryay = NULL;
3005 int array_length = 0;
3007 char* mime_type = NULL;
3008 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3010 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
3011 if (status != APP_CONTROL_ERROR_NONE) {
3012 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay, &array_length);
3013 if (status != APP_CONTROL_ERROR_NONE) {
3015 show_toast(ad, "Unable to get the result from attach panel");
3021 status = app_control_get_mime(reply, &mime_type);
3022 if (status != APP_CONTROL_ERROR_NONE) {
3024 show_toast(ad, "Unable to get the mime type from attach panel");
3028 for (int i = 0 ; i < array_length ; i++) {
3029 file_path = strdup(path_arryay[i]);
3030 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3037 void on_file_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3039 if (result == APP_CONTROL_RESULT_SUCCEEDED) {
3041 Evas_Object* chat_scroller = user_data;
3042 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3043 char* file_path = NULL;
3044 char** path_arryay = NULL;
3045 int array_length = 0;
3046 app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
3048 for (int i = 0 ; i < array_length ; i++) {
3049 file_path = strdup(path_arryay[i]);
3051 // get mime type of the file
3053 char *mime_type = NULL;
3055 char *extn = strrchr(file_path, '.');
3057 extn = replace(extn, '.', "");
3060 mime_type_get_mime_type(extn, &mime_type);
3064 if (strstr(mime_type, "video") != NULL) {
3065 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3066 } else if (strstr(mime_type, "audio") != NULL) {
3067 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3068 } else if (strstr(mime_type, "image") != NULL) {
3069 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_photo);
3071 show_toast(ad, "Unsupported file.");
3074 show_toast(ad, "Unsupported file.");
3082 static void on_voice_record_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3084 if (result == APP_CONTROL_RESULT_SUCCEEDED) {
3085 Evas_Object* chat_scroller = user_data;
3087 char* file_path = NULL;
3088 char** path_arryay = NULL;
3089 int array_length = 0;
3091 char* mime_type = NULL;
3092 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3094 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
3095 if (status != APP_CONTROL_ERROR_NONE) {
3096 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay, &array_length);
3097 if (status != APP_CONTROL_ERROR_NONE) {
3099 show_toast(ad, "Unable to get the result from attach panel");
3105 status = app_control_get_mime(reply, &mime_type);
3106 if (status != APP_CONTROL_ERROR_NONE) {
3108 show_toast(ad, "Unable to get the mime type from attach panel");
3113 for (int i = 0 ; i < array_length ; i++) {
3114 file_path = strdup(path_arryay[i]);
3115 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3122 void on_contact_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3124 if (result == APP_CONTROL_RESULT_SUCCEEDED) {
3126 Evas_Object* chat_scroller = user_data;
3127 char *contact_name = NULL;
3128 char *phone_number = NULL;
3129 app_control_get_extra_data(reply, "http://tizen.org/appcontrol/data/name", &contact_name);
3130 app_control_get_extra_data(reply, "http://tizen.org/appcontrol/data/phone", &phone_number);
3135 static void _result_cb(attach_panel_h attach_panel, attach_panel_content_category_e content_category, app_control_h result, app_control_result_e result_code, void *user_data)
3137 switch (content_category) {
3138 case ATTACH_PANEL_CONTENT_CATEGORY_IMAGE:
3139 case ATTACH_PANEL_CONTENT_CATEGORY_CAMERA:
3140 on_gallery_app_control_reply_cb(NULL, result, result_code, user_data);
3142 case ATTACH_PANEL_CONTENT_CATEGORY_VIDEO:
3143 case ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER:
3144 on_video_app_control_reply_cb(NULL, result, result_code, user_data);
3146 case ATTACH_PANEL_CONTENT_CATEGORY_VOICE:
3147 on_voice_record_reply_cb(NULL, result, result_code, user_data);
3149 case ATTACH_PANEL_CONTENT_CATEGORY_MYFILES:
3150 case ATTACH_PANEL_CONTENT_CATEGORY_AUDIO:
3151 on_file_app_control_reply_cb(NULL, result, result_code, user_data);
3153 case ATTACH_PANEL_CONTENT_CATEGORY_CONTACT:
3154 on_contact_app_control_reply_cb(NULL, result, result_code, user_data);
3159 attach_panel_hide(attach_panel);
3162 void on_media_type_selected_cb(void *data, Evas_Object *obj, void *event_info)
3164 Evas_Object* chat_scroller = data;
3165 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3166 const char *label = elm_object_item_text_get((Elm_Object_Item *) event_info);
3167 if (strcasecmp(label, POPUP_TEXT_TAKE_GALLERY) == 0) {
3168 app_control_h app_control;
3169 int ret = app_control_create(&app_control);
3170 if (ret != APP_CONTROL_ERROR_NONE) {
3171 show_toast(ad, "Error: Can not load image picker");
3175 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3177 app_control_set_mime(app_control, "image/*");
3178 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3179 app_control_send_launch_request(app_control, &on_gallery_app_control_reply_cb, data);
3180 app_control_destroy(app_control);
3181 } else if (strcasecmp(label, POPUP_TEXT_TAKE_PHOTO) == 0) {
3182 app_control_h app_control;
3183 int ret = app_control_create(&app_control);
3184 if (ret != APP_CONTROL_ERROR_NONE) {
3185 show_toast(ad, "Error: Can not load image picker");
3188 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3189 app_control_set_mime(app_control, "image/jpg");
3190 //app_control_add_extra_data(app_control, "crop", "caller_id");
3191 app_control_send_launch_request(app_control, &on_gallery_app_control_reply_cb, data);
3192 app_control_destroy(app_control);
3193 } else if (strcasecmp(label, POPUP_TEXT_TAKE_VIDEO) == 0) {
3194 app_control_h app_control;
3195 int ret = app_control_create(&app_control);
3196 if (ret != APP_CONTROL_ERROR_NONE) {
3197 show_toast(ad, "Error: Can not load image picker");
3201 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3203 int remain_byte_size = 10485760;
3204 int request_KB_size = 0;
3206 if (remain_byte_size >= 1024) {
3207 request_KB_size = remain_byte_size / 1024;
3209 // TODO: Need to check minimum size for recording
3210 request_KB_size = 1;
3213 char recording_size[128] = {0, };
3214 snprintf(recording_size, sizeof(recording_size), "%d", request_KB_size);
3215 app_control_set_mime(app_control, "video/3gp");
3216 app_control_add_extra_data(app_control, "LIMIT", recording_size);
3217 app_control_add_extra_data(app_control, "RESOLUTION", "VGA");
3218 app_control_add_extra_data(app_control, "CALLER", "telegram");
3220 app_control_send_launch_request(app_control, &on_video_app_control_reply_cb, data);
3221 app_control_destroy(app_control);
3222 } else if (strcasecmp(label, POPUP_TEXT_TAKE_AUDIO) == 0) {
3224 app_control_h app_control;
3225 int ret = app_control_create(&app_control);
3226 if (ret != APP_CONTROL_ERROR_NONE) {
3227 show_toast(ad, "Error: Can not load image picker");
3231 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3233 int size = 10485760;
3235 int remain_byte_size = (int)size;
3236 int request_KB_size = 0;
3238 if (remain_byte_size >= 1024) {
3239 request_KB_size = remain_byte_size / 1024;
3241 // TODO: Need to check minimum size for recording
3242 request_KB_size = 1;
3245 char recording_size[128] = {0, };
3246 snprintf(recording_size, sizeof(recording_size), "%d", request_KB_size);
3247 app_control_add_extra_data(app_control, "SIZE", recording_size);
3248 app_control_set_mime(app_control, "audio/*");
3249 app_control_send_launch_request(app_control, &on_voice_record_reply_cb, data);
3250 app_control_destroy(app_control);
3252 } else if (strcasecmp(label, POPUP_TEXT_TAKE_FILE) == 0) {
3253 app_control_h app_control;
3254 int ret = app_control_create(&app_control);
3255 if (ret != APP_CONTROL_ERROR_NONE) {
3256 show_toast(ad, "Error: Can not load image picker");
3260 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3262 app_control_set_mime(app_control, "*/*");
3263 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3264 app_control_send_launch_request(app_control, &on_file_app_control_reply_cb, data);
3265 app_control_destroy(app_control);
3267 } else if (strcasecmp(label, POPUP_TEXT_TAKE_LOCATION) == 0) {
3268 app_control_h app_control;
3269 int ret = app_control_create(&app_control);
3270 if (ret != APP_CONTROL_ERROR_NONE) {
3271 show_toast(ad, "Error: Can not load location picker");
3274 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3275 //app_control_set_app_id(app_control, "com.here.tizen.maps");
3276 app_control_set_uri(app_control, "geo");
3277 app_control_send_launch_request(app_control, &on_location_app_control_reply_cb, data);
3278 app_control_destroy(app_control);
3279 } else if (strcasecmp(label, POPUP_TEXT_TAKE_CONTACT) == 0) {
3280 app_control_h app_control;
3281 int ret = app_control_create(&app_control);
3282 if (ret != APP_CONTROL_ERROR_NONE) {
3283 show_toast(ad, "Error: Can not load location picker");
3286 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3287 app_control_set_mime(app_control, "application/vnd.tizen.contact");
3288 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3289 app_control_send_launch_request(app_control, &on_contact_app_control_reply_cb, data);
3290 app_control_destroy(app_control);
3293 evas_object_del(obj);
3297 void popup_move_dropdown(Evas_Object *ctxpopup, Evas_Object *btn)
3299 Evas_Coord x, y, w , h;
3300 evas_object_geometry_get(btn, &x, &y, &w, &h);
3301 evas_object_move(ctxpopup, x + (w / 2), y + h - 50);
3304 void on_media_attach_dismissed_cb(void *data, Evas_Object *obj, void *event_info)
3306 evas_object_del(obj);
3309 static void on_media_attach_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
3311 Evas_Object* chat_scroller = data;
3312 if (!chat_scroller) {
3315 appdata_s *ad = evas_object_data_get(chat_scroller, "app_data");
3319 attach_panel_h attach_panel = NULL;
3321 bool visible = false;
3323 attach_panel = evas_object_data_get(ad->conform, "attach_panel");
3325 if (attach_panel_get_visibility(attach_panel, &visible) != ATTACH_PANEL_ERROR_NONE) {
3326 attach_panel_set_result_cb(attach_panel, _result_cb, chat_scroller);
3330 attach_panel_show(attach_panel);
3332 attach_panel_set_result_cb(attach_panel, _result_cb, chat_scroller);
3336 ret = attach_panel_create(ad->conform, &attach_panel);
3338 if (!attach_panel) {
3341 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, NULL);
3342 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA, NULL);
3343 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE, NULL);
3344 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO, NULL);
3345 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_AUDIO, NULL);
3346 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CONTACT, NULL);
3347 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_MYFILES, NULL);
3348 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER, NULL);
3349 attach_panel_set_result_cb(attach_panel, _result_cb, chat_scroller);
3351 attach_panel_show(attach_panel);
3352 evas_object_data_set(ad->conform, "attach_panel", attach_panel);
3357 static void on_text_message_send_pressed(void *data, Evas_Object *obj, void *event_info)
3359 elm_image_file_set(data, ui_utils_get_resource(SEND_UNPRESSED_ICON), NULL);
3362 static void on_text_message_send_unpressed(void *data, Evas_Object *obj, void *event_info)
3364 elm_image_file_set(data, ui_utils_get_resource(SEND_PRESSED_ICON), NULL);
3368 void on_message_back_button_clicked(void *data, Evas_Object *obj, void *event_info)
3370 appdata_s *ad = data;
3374 app_nf_back_cb(data, obj, event_info);
3377 void on_user_info_button_clicked(void *data, Evas_Object *obj, void *event_info)
3379 appdata_s *ad = data;
3381 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
3382 tg_peer_info_s *user_data = sel_item->use_data;
3384 if (!sel_item || !user_data) {
3385 show_toast(ad, "Can not display user info");
3389 if (user_data->peer_type == TGL_PEER_USER) {
3390 launch_user_info_screen(ad, user_data->peer_id);
3391 } else if (user_data->peer_type == TGL_PEER_CHAT) {
3392 launch_chat_info_screen(ad, user_data->peer_id);
3398 void refresh_messaging_view(appdata_s *ad)
3403 Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
3406 Evas_Object *box_layout = NULL;
3407 Evas_Object *box = NULL;
3408 Eina_List *list = NULL;
3409 Eina_List *box_list = NULL;
3410 Evas_Object *last_item = NULL;
3412 box_layout = elm_object_content_get(scroller);
3414 LOGE("Fail to get the box into scroller");
3417 list = elm_box_children_get(box_layout);
3419 LOGE("Fail to get the list into box");
3423 box = eina_list_nth(list, 0);
3425 LOGE("Fail to get the box into box layout");
3429 box_list = elm_box_children_get(box);
3431 LOGE("Fail to get the box_list into box");
3435 last_item = eina_list_nth(box_list, eina_list_count(box_list)-1);
3437 LOGE("Fail to get the last item into box");
3442 evas_object_geometry_get(last_item, &x, &y, NULL, NULL);
3444 elm_scroller_region_show(scroller, x, y, -1, -1);
3446 eina_list_free(box_list);
3447 eina_list_free(list);
3451 static void on_expand_button_clicked(void *data, Evas_Object *obj, void *event_info)
3453 Evas_Object *expand_pic = data;
3457 appdata_s *ad = evas_object_data_get(expand_pic, "app_data");
3458 Evas_Object *parent_layout = evas_object_data_get(expand_pic, "parent_layout");
3460 Eina_Bool is_expanded = (Eina_Bool)evas_object_data_get(expand_pic, "is_expanded");
3464 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_CLOSE), NULL);
3466 Evas_Object *grp_names_bg = elm_bg_add(ad->nf);
3467 evas_object_size_hint_align_set(grp_names_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
3468 evas_object_size_hint_weight_set(grp_names_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3469 evas_object_color_set(grp_names_bg, 45, 165, 224, 202);
3470 elm_image_resizable_set(grp_names_bg, EINA_TRUE, EINA_TRUE);
3471 elm_image_fill_outside_set(grp_names_bg, EINA_TRUE);
3472 evas_object_show(grp_names_bg);
3473 elm_object_part_content_set(parent_layout, "swallow.group_detail_box,bg", grp_names_bg);
3475 Evas_Object* grp_names_lbl = elm_entry_add(ad->nf);
3476 elm_entry_cursor_end_set(grp_names_lbl);
3477 evas_object_size_hint_weight_set(grp_names_lbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3478 evas_object_size_hint_align_set(grp_names_lbl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3479 elm_entry_single_line_set(grp_names_lbl, EINA_FALSE);
3480 elm_entry_scrollable_set(grp_names_lbl, EINA_TRUE);
3481 elm_entry_cnp_mode_set(grp_names_lbl, ELM_CNP_MODE_NO_IMAGE);
3482 elm_entry_context_menu_disabled_set(grp_names_lbl, EINA_TRUE);
3483 elm_object_focus_set(grp_names_lbl, EINA_FALSE);
3484 elm_entry_editable_set(grp_names_lbl, EINA_FALSE);
3486 evas_object_show(grp_names_lbl);
3488 char *names_of_buddies = evas_object_data_get(ad->nf, "names_of_buddies");
3489 if (names_of_buddies) {
3490 int len = strlen(names_of_buddies);
3491 char *names_str = (char*)malloc(len + 256);
3492 sprintf(names_str, "<font=Tizen:style=Bold color=#FAFAFA align=center><font_size=40>%s</font_size></font>", names_of_buddies);
3493 elm_object_text_set(grp_names_lbl, names_str);
3497 elm_object_part_content_set(parent_layout, "swallow.group_detail_box", grp_names_lbl);
3501 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_OPEN), NULL);
3503 Evas_Object *grp_names_lbl = elm_object_part_content_get(parent_layout, "swallow.group_detail_box");
3504 if (grp_names_lbl) {
3505 evas_object_del(grp_names_lbl);
3506 grp_names_lbl = NULL;
3509 Evas_Object *grp_names_bg = elm_object_part_content_get(parent_layout, "swallow.group_detail_box,bg");
3511 evas_object_del(grp_names_bg);
3512 grp_names_bg = NULL;
3515 is_expanded = !is_expanded;
3516 evas_object_data_set(expand_pic, "is_expanded", (void *)is_expanded);
3519 static Eina_Bool _pop_cb(void *data, Elm_Object_Item *it)
3521 appdata_s *ad = data;
3522 attach_panel_h attach_panel = NULL;
3524 LOGE("Failed to get the ad");
3527 attach_panel = evas_object_data_get(ad->conform, "attach_panel");
3529 attach_panel_hide(attach_panel);
3535 static void _edge_cb(void *data, Evas_Object *scroller, void *event_info)
3537 Evas_Object *layout = data;
3538 int is_end_edge = 0;
3539 is_end_edge = (int)evas_object_data_get(layout, "is_end_edge");
3542 elm_object_signal_emit(layout, "hide", "bubblemessage");
3543 evas_object_data_set(layout, "is_end_edge", (void *) 1);
3547 static void _scroll_cb(void *data, Evas_Object *scroller, void *event_info)
3549 Evas_Object *layout = data;
3550 evas_object_data_set(layout, "is_end_edge", (void *) 0);
3553 void launch_messaging_view_cb(appdata_s* ad, int user_id)
3558 if (ad->msg_popup) {
3559 evas_object_del(ad->msg_popup);
3560 ad->msg_popup = NULL;
3563 delete_floating_button(ad);
3565 ad->current_app_state = TG_CHAT_MESSAGING_VIEW_STATE;
3566 ad->is_last_msg_changed = EINA_FALSE;
3567 send_request_for_server_connection_status(ad, ad->service_client);
3568 char edj_path[PATH_MAX] = {0, };
3569 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
3571 Evas_Object *layout = elm_layout_add(ad->nf);
3572 elm_layout_file_set(layout, edj_path, "chat_messaging_layout");
3573 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3574 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3575 evas_object_show(layout);
3577 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
3578 tg_peer_info_s* user = sel_item->use_data;
3580 /*************************** START: message list ************************************/
3582 Evas_Object* msg_box_layout = elm_layout_add(ad->nf);
3583 elm_layout_file_set(msg_box_layout, edj_path, "custom_gen_list");
3584 evas_object_size_hint_weight_set(msg_box_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3585 evas_object_size_hint_align_set(msg_box_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3586 evas_object_show(msg_box_layout);
3588 Evas_Object *list_bg = elm_image_add(msg_box_layout);
3589 evas_object_size_hint_align_set(list_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
3590 evas_object_size_hint_weight_set(list_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3591 if (ad->chat_background) {
3592 elm_image_file_set(list_bg, ad->chat_background, NULL);
3594 //elm_image_file_set(list_bg, ui_utils_get_resource(TG_CHAT_DEFAULT_BG), NULL);
3596 elm_image_resizable_set(list_bg, EINA_TRUE, EINA_TRUE);
3597 elm_image_fill_outside_set(list_bg, EINA_TRUE);
3598 evas_object_show(list_bg);
3600 elm_object_part_content_set(msg_box_layout, "swallow.gen_list.bg", list_bg);
3602 Evas_Object *chat_scroller = elm_scroller_add(ad->nf);
3603 evas_object_size_hint_weight_set(chat_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3604 evas_object_size_hint_align_set(chat_scroller, EVAS_HINT_FILL, 0.0);
3605 elm_scroller_policy_set(chat_scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
3606 evas_object_show(chat_scroller);
3607 evas_object_smart_callback_add(chat_scroller, "scroll", _scroll_cb, layout);
3608 evas_object_smart_callback_add(chat_scroller, "edge,bottom", _edge_cb, layout);
3609 evas_object_data_set(layout, "is_end_edge", (void *) 1);
3611 Evas_Object *align_box = elm_box_add(chat_scroller);
3613 LOGE("fail to add the box");
3617 elm_box_horizontal_set(align_box, EINA_FALSE);
3618 elm_box_align_set(align_box, 0.5, 0.0);
3619 evas_object_size_hint_weight_set(align_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3620 evas_object_size_hint_align_set(align_box, EVAS_HINT_FILL, 0.0);
3621 elm_object_content_set(chat_scroller, align_box);
3622 evas_object_show(align_box);
3624 Evas_Object *chat_box = elm_box_add(chat_scroller);
3626 LOGE("fail to add the box");
3629 elm_box_horizontal_set(chat_box, EINA_FALSE);
3630 elm_box_align_set(chat_box, 0.5, 0.0);
3631 evas_object_size_hint_weight_set(chat_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3632 evas_object_size_hint_align_set(chat_box, EVAS_HINT_FILL, 0.0);
3633 evas_object_show(chat_box);
3634 elm_box_pack_end(align_box, chat_box);
3635 evas_object_event_callback_add(chat_box, EVAS_CALLBACK_RESIZE, __resize_cb, ad);
3637 elm_object_part_content_set(msg_box_layout, "swallow.gen_list", chat_scroller);
3638 elm_object_part_content_set(layout, "swallow.chat_box", msg_box_layout);
3640 /********************** START: entry layout*******************************/
3641 Evas_Object* entry_box_layout = elm_layout_add(ad->win);
3642 if (!entry_box_layout) {
3643 LOGE("Fail to add the entry box layout");
3646 elm_layout_file_set(entry_box_layout, edj_path, "chat_entry_box");
3647 evas_object_size_hint_align_set(entry_box_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3648 evas_object_size_hint_weight_set(entry_box_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3649 evas_object_show(entry_box_layout);
3651 Evas_Object *entry_layout = elm_layout_add(entry_box_layout);
3652 if (!entry_layout) {
3653 LOGE("Fail to add the entry_layout");
3655 elm_layout_theme_set(entry_layout, "layout", "editfield", "singleline");
3657 Evas_Object* text_entry = elm_entry_add(entry_layout);
3659 LOGE("Fail to add the text_entry");
3662 elm_object_part_text_set(text_entry, "elm.guide", "Text message");
3663 elm_entry_line_wrap_set(text_entry, EINA_TRUE);
3664 elm_entry_scrollable_set(text_entry, EINA_TRUE);
3665 evas_object_size_hint_align_set(text_entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
3666 evas_object_size_hint_weight_set(text_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3667 evas_object_show(text_entry);
3668 evas_object_data_set(entry_box_layout, "is_attach_show", (void *) 1);
3670 elm_object_part_content_set(entry_layout, "elm.swallow.content", text_entry);
3671 evas_object_smart_callback_add(text_entry, "changed", on_message_text_entry_changed, entry_box_layout);
3672 evas_object_smart_callback_add(text_entry, "preedit,changed", on_message_text_entry_changed, entry_box_layout);
3673 evas_object_smart_callback_add(text_entry, "clicked", on_message_text_entry_clicked, NULL);
3674 elm_object_part_content_set(entry_box_layout, "swallow.text_entry", entry_layout);
3676 /* button clicked event */
3677 elm_object_signal_callback_add(entry_box_layout, "smile", "clicked", on_message_smiley_clicked, text_entry);
3678 elm_object_signal_callback_add(entry_box_layout, "attach", "clicked", on_media_attach_clicked, chat_scroller);
3679 elm_object_signal_callback_add(entry_box_layout, "send", "clicked", on_text_message_send_clicked, chat_scroller);
3680 elm_object_part_content_set(layout, "swallow.entry", entry_box_layout);
3682 /********************** END: entry layout*******************************/
3684 /************************* START: message bubble ************************/
3686 Evas_Object* bubble_layout = elm_layout_add(ad->win);
3687 if (!bubble_layout) {
3688 LOGE("Fail to add the bubble_layout");
3691 elm_layout_file_set(bubble_layout, edj_path, "bubble_layout");
3692 evas_object_size_hint_align_set(bubble_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3693 evas_object_size_hint_weight_set(bubble_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3694 evas_object_show(bubble_layout);
3695 elm_object_signal_callback_add(bubble_layout, "cancel", "clicked", on_message_cancel_clicked, layout);
3696 elm_object_part_content_set(layout, "swallow.messagebubble", bubble_layout);
3697 evas_object_data_set(ad->nf, "main_layout", layout);
3699 /********************** END: entry message bubble*******************************/
3701 evas_object_data_set(ad->nf, "chat_list", (void*)chat_scroller);
3702 evas_object_data_set(chat_scroller, "app_data", ad);
3703 evas_object_data_set(chat_scroller, "user_id", (void*)user_id);
3704 evas_object_data_set(chat_scroller, "text_entry", (void*)text_entry);
3706 /* Set the name in title area */
3708 char temp_name[512] = {'\0'};
3710 if ((user->peer_type == TGL_PEER_USER) && get_buddy_unknown_status(user->peer_id)) {
3711 //snprintf(temp_name, 512, "%s", get_buddy_phone_num_from_id(sel_item->use_data->peer_id));
3713 char *phone_num = get_buddy_phone_num_from_id(sel_item->use_data->peer_id);
3715 if (phone_num == NULL || (phone_num && strcmp(phone_num, "+") == 0)) {
3717 char *user_name = NULL;
3718 char *first_name = NULL;
3719 char *last_name = NULL;
3720 char *phone_num = NULL;
3721 get_buddy_contact_details_from_db(sel_item->use_data->peer_id, &first_name, &last_name, &phone_num);
3723 if (!first_name || strstr(first_name, "null") != 0) {
3727 if (!first_name && !last_name && phone_num) {
3728 first_name = phone_num;
3731 if (!last_name || strstr(last_name, "null") != 0) {
3734 user_name = (char*)malloc(strlen(first_name) + strlen(" ") + strlen(last_name) + 1);
3735 strcpy(user_name, first_name);
3736 strcat(user_name, " ");
3737 strcat(user_name, last_name);
3738 snprintf(temp_name, 512, "%s", user_name);
3741 if (sel_item->use_data->print_name) {
3742 snprintf(temp_name, 512, "%s", sel_item->use_data->print_name);
3744 snprintf(temp_name, 512, "%s", "unknown");
3747 snprintf(temp_name, 512, "%s", get_buddy_phone_num_from_id(sel_item->use_data->peer_id));
3753 char* user_name = replace(sel_item->use_data->print_name, '_', " ");
3754 snprintf(temp_name, 512, "%s", user_name);
3758 Elm_Object_Item *nf_it = elm_naviframe_item_push(ad->nf, temp_name, NULL, NULL, layout, NULL);
3759 evas_object_data_set(ad->nf, "navi_item", nf_it);
3761 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
3763 Evas_Object *back_btn = create_button(ad->nf, "naviframe/back_btn/default", NULL);
3764 evas_object_smart_callback_add(back_btn, "clicked", on_message_back_button_clicked, ad);
3765 elm_object_item_part_content_set(nf_it, "elm.swallow.prev_btn", back_btn);
3766 elm_naviframe_item_pop_cb_set(nf_it, _pop_cb, ad);
3768 /******************** expand ************************/
3769 if (user->peer_type == TGL_PEER_CHAT) {
3770 Evas_Object *expand_pic = NULL;
3771 expand_pic = elm_image_add(layout);
3772 evas_object_size_hint_weight_set(expand_pic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3773 evas_object_size_hint_align_set(expand_pic, EVAS_HINT_FILL, EVAS_HINT_FILL);
3774 elm_object_focus_set(expand_pic, EINA_FALSE);
3775 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_OPEN), NULL);
3776 evas_object_show(expand_pic);
3777 evas_object_data_set(expand_pic, "app_data", ad);
3778 evas_object_data_set(expand_pic, "parent_layout", layout);
3780 Eina_Bool is_expanded = EINA_FALSE;
3781 evas_object_data_set(expand_pic, "is_expanded", is_expanded);
3782 Evas_Object* expand_btn = elm_button_add(ad->layout);
3783 elm_object_style_set(expand_btn, "transparent");
3784 evas_object_smart_callback_add(expand_btn, "clicked", on_expand_button_clicked, expand_pic);
3785 elm_object_content_set(expand_btn, expand_pic);
3786 evas_object_show(expand_btn);
3787 elm_object_item_part_content_set(nf_it, "title_right_btn", expand_btn);
3790 /******************** expand ************************/
3792 Eina_Bool ret = load_chat_history(chat_scroller);
3794 int buddy_id = sel_item->use_data->peer_id;
3795 char* tablename = get_table_name_from_number(buddy_id);
3797 Eina_Bool res = set_all_rows_read(tablename);
3804 LOGD("There is no message in chat room");
3806 elm_object_part_text_set(layout, "no_msg_text", i18n_get_text("IDS_TGRAM_BODY_NO_MESSAGES_HERE_YET_ING"));
3807 elm_object_signal_emit(layout, "show", "message");
3809 evas_object_data_set(ad->nf, "chat_list_no_msg_text", layout);
3811 send_request_for_marked_as_read(ad, ad->service_client, sel_item->use_data->peer_id, sel_item->use_data->peer_type);
3812 eext_object_event_callback_add(ad->nf, EEXT_CALLBACK_MORE, on_messaging_menu_button_clicked, ad);