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 typedef struct buddies_name_and_id {
36 static int scroller_show_bottom_edge(Evas_Object *scroller)
39 LOGE("Cannot get the scroller");
42 Evas_Object *box_layout = NULL;
43 Evas_Object *box = NULL;
44 Eina_List *list = NULL;
47 box_layout = elm_object_content_get(scroller);
49 LOGE("Fail to get the box into scroller");
52 list = elm_box_children_get(box_layout);
54 LOGE("Fail to get the list into box");
58 box = eina_list_nth(list, 0);
60 LOGE("Fail to get the box into box layout");
63 evas_object_geometry_get(box, NULL, NULL, NULL, &h);
64 elm_scroller_region_show(scroller, 0, h, 720, 1280);
69 static int scroller_previous_region_get(Evas_Object *scroller)
72 LOGE("Cannot get the scroller");
75 Evas_Object *box_layout = NULL;
76 Evas_Object *box = NULL;
77 Eina_List *list = NULL;
80 box_layout = elm_object_content_get(scroller);
82 LOGE("Fail to get the box into scroller");
85 list = elm_box_children_get(box_layout);
87 LOGE("Fail to get the list into box");
91 box = eina_list_nth(list, 0);
93 LOGE("Fail to get the box into box layout");
97 evas_object_geometry_get(box, NULL, NULL, NULL, &h);
102 static int scroller_show_previous_region(Evas_Object *scroller)
105 LOGE("Cannot get the scroller");
108 Evas_Object *box_layout = NULL;
109 Evas_Object *box = NULL;
110 Eina_List *list = NULL;
113 box_layout = elm_object_content_get(scroller);
115 LOGE("Fail to get the box into scroller");
118 list = elm_box_children_get(box_layout);
120 LOGE("Fail to get the list into box");
124 box = eina_list_nth(list, 0);
126 LOGE("Fail to get the box into box layout");
130 prev_h = (int)evas_object_data_get(scroller, "previous_h");
131 evas_object_geometry_get(box, NULL, NULL, NULL, &h);
132 elm_scroller_region_show(scroller, 0, (h-prev_h), 720, 1280);
133 eina_list_free(list);
137 static void scroller_push_item(Evas_Object *scroller, Evas_Object *item, int prepand)
139 Evas_Object *box_layout = NULL;
140 Evas_Object *box = NULL;
141 Eina_List *list = NULL;
143 box_layout = elm_object_content_get(scroller);
145 LOGE("Fail to get the box into scroller");
149 list = elm_box_children_get(box_layout);
151 LOGE("Fail to get the list into box");
155 box = eina_list_nth(list, 0);
157 LOGE("Fail to get the box into box layout");
161 eina_list_free(list);
164 elm_box_pack_end(box, item);
167 elm_box_pack_start(box, item);
169 elm_box_recalculate(box);
173 /************************ Menu Handler ********************/
174 void clear_history_in_gui(appdata_s *ad, tg_peer_info_s *user_data, int peer_type, int peer_id)
176 if (!ad || !user_data)
180 char* tablename = get_table_name_from_number(user_data->peer_id);
181 mark_all_records_for_deletion(tablename);
182 delete_date_messages_from_table(tablename);
187 * Evas_Object *genlist = evas_object_data_get(ad->nf, "chat_list");
188 * elm_genlist_clear(genlist);
191 Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
192 Evas_Object *box_layout = NULL;
193 Evas_Object *box = NULL;
194 Eina_List *list = NULL;
196 box_layout = elm_object_content_get(scroller);
200 list = elm_box_children_get(box_layout);
204 box = eina_list_nth(list, 0);
208 eina_list_free(list);
210 elm_box_recalculate(box);
212 if (peer_type == TGL_PEER_USER)
213 send_delete_all_messages_request(ad, ad->service_client, user_data->peer_id, user_data->peer_type);
215 if (ad->main_item_in_cahtting_data) {
216 tg_main_list_item_s* old_item = ad->main_item_in_cahtting_data;
217 if (old_item->last_message) {
218 free(old_item->last_message);
219 old_item->last_message = NULL;
221 old_item->last_message = strdup("");
224 Evas_Object *nomsg_layout = evas_object_data_get(ad->nf, "chat_list_no_msg_text");
226 elm_object_signal_emit(nomsg_layout, "show", "message");
231 * [1] IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3
232 * [2] IDS_TGRAM_OPT_DELETE
237 * [0] IDS_TGRAM_OPT_VIEW_PROFILE_ABB
238 * [1] IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3
239 * [2] IDS_TGRAM_OPT_DELETE
242 * [0] IDS_TGRAM_OPT_ADD_TO_CONTACTS_ABB2
243 * [1] IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3
244 * [2] IDS_TGRAM_OPT_DELETE
247 * [1] IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3
248 * [2] IDS_TGRAM_OPT_DELETE
251 void on_messaging_menu_option_selected_cb(void *data, Evas_Object *obj, void *event_info)
253 appdata_s *ad = data;
254 Elm_Object_Item *it = event_info;
255 elm_genlist_item_selected_set(it, EINA_FALSE);
256 int id = (int)elm_object_item_data_get(it);
258 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
259 tg_peer_info_s *user_data = sel_item->use_data;
261 if (!sel_item || !user_data) {
263 evas_object_del(ad->msg_popup);
264 ad->msg_popup = NULL;
273 if (user_data->peer_type == TGL_PEER_USER) {
274 if (get_buddy_delete_status(user_data->peer_id)) {
277 } else if (get_buddy_unknown_status(user_data->peer_id)) {
279 ad->is_loading_from_msg_view = EINA_TRUE;
280 on_create_new_contact(ad);
282 launch_user_info_screen(ad, user_data->peer_id);
287 clear_history_in_gui(ad, user_data, user_data->peer_type, user_data->peer_id);
290 show_loading_popup(ad);
291 if (user_data->peer_type == TGL_PEER_CHAT) {
292 send_delete_group_chat_request(ad, ad->service_client, user_data->peer_id);
294 evas_object_del(ad->msg_popup);
295 ad->msg_popup = NULL;
299 clear_history_in_gui(ad, user_data, user_data->peer_type, user_data->peer_id);
300 if (ad->main_item_in_cahtting_data) {
301 tg_main_list_item_s* old_item = ad->main_item_in_cahtting_data;
302 if (old_item->peer_print_name)
303 free(old_item->peer_print_name);
304 old_item->peer_print_name = NULL;
306 if (old_item->last_message)
307 free(old_item->last_message);
308 old_item->last_message = NULL;
310 if (old_item->profile_pic_path)
311 free(old_item->profile_pic_path);
312 old_item->profile_pic_path = NULL;
314 old_item->date_lbl = NULL;
315 old_item->msg_status_lbl = NULL;
316 old_item->main_item_layout = NULL;
317 old_item->profile_pic = NULL;
318 old_item->profile_pic_path = NULL;
319 old_item->status_lbl = NULL;
320 old_item->user_name_lbl = NULL;
322 ad->main_list = eina_list_remove(ad->main_list, ad->main_item_in_cahtting_data);
323 ad->main_item_in_cahtting_data = NULL;
324 ad->is_last_msg_changed = EINA_FALSE;
327 elm_naviframe_item_pop(ad->nf);
328 load_registered_user_data(ad);
329 load_buddy_list_data(ad);
330 load_unknown_buddy_list_data(ad);
332 load_main_list_data(ad);
333 ecore_timer_add(1, on_load_main_view_requested, ad);
337 evas_object_del(ad->msg_popup);
338 ad->msg_popup = NULL;
344 char* on_messaging_menu_group_text_get_cb(void *data, Evas_Object *obj, const char *part)
350 return strdup(i18n_get_text("IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3"));
353 return strdup(i18n_get_text("IDS_TGRAM_OPT_DELETE"));
357 char* on_messaging_menu_text_get_cb(void *data, Evas_Object *obj, const char *part)
360 appdata_s *ad = evas_object_data_get(obj, "app_data");
361 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
362 tg_peer_info_s *user_data = sel_item->use_data;
364 if (user_data->peer_type != TGL_PEER_USER)
370 if (get_buddy_delete_status(user_data->peer_id))
372 else if (get_buddy_unknown_status(user_data->peer_id))
373 return strdup(i18n_get_text("IDS_TGRAM_OPT_ADD_TO_CONTACTS_ABB2"));
375 return strdup(i18n_get_text("IDS_TGRAM_OPT_VIEW_PROFILE_ABB"));
377 return strdup(i18n_get_text("IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3"));
380 return strdup(i18n_get_text("IDS_TGRAM_OPT_DELETE"));
384 void on_msg_popup_back_cb(void *data, Evas_Object *obj, void *event_info)
386 appdata_s *ad = data;
388 evas_object_del(ad->msg_popup);
389 ad->msg_popup = NULL;
393 void on_messaging_menu_button_clicked(void *data, Evas_Object *obj, void *event_info)
395 appdata_s *ad = data;
396 if (ad->msg_popup || ad->current_app_state != TG_CHAT_MESSAGING_VIEW_STATE)
399 static Elm_Genlist_Item_Class itc;
400 Evas_Object *genlist;
402 Evas_Object *win = ad->win;
404 ad->msg_popup = elm_popup_add(win);
405 elm_popup_align_set(ad->msg_popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
406 eext_object_event_callback_add(ad->msg_popup, EEXT_CALLBACK_BACK, on_msg_popup_back_cb, ad);
407 evas_object_size_hint_weight_set(ad->msg_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
409 evas_object_data_set(ad->msg_popup, "app_data", ad);
411 genlist = elm_genlist_add(ad->msg_popup);
412 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
413 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
415 evas_object_data_set(genlist, "app_data", ad);
417 itc.item_style = "default";
418 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
419 if (!sel_item || !sel_item->use_data)
422 if (sel_item->use_data->peer_type == TGL_PEER_USER) {
423 itc.func.text_get = on_messaging_menu_text_get_cb;
424 } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
425 itc.func.text_get = on_messaging_menu_group_text_get_cb;
430 itc.func.content_get = NULL;
431 itc.func.state_get = NULL;
434 if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
435 for (i = 1; i < 3; i++) {
436 elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, on_messaging_menu_option_selected_cb, ad);
439 int strart_number_of_menus = 0;
440 if (get_buddy_delete_status(sel_item->use_data->peer_id))
441 strart_number_of_menus = 1;
442 for (i = strart_number_of_menus; i < 3; i++) {
443 elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, on_messaging_menu_option_selected_cb, ad);
446 evas_object_show(genlist);
448 elm_object_content_set(ad->msg_popup, genlist);
449 evas_object_show(ad->msg_popup);
453 /************************ Menu Handler ********************/
458 static Evas_Object *create_image_object_from_file(const char *icon_name, Evas_Object *parent)
460 Evas_Object *icon = elm_image_add(parent);
461 evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
462 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
463 elm_image_file_set(icon, icon_name, NULL);
464 evas_object_show(icon);
468 void on_chat_profile_pic_changed(appdata_s *ad, char *file_path)
470 if (!ad || !file_path)
473 Evas_Object *profile_image = evas_object_data_get(ad->nf, "profile_picture");
475 elm_image_file_set(profile_image, file_path, NULL);
478 void on_group_chat_info_changed(appdata_s *ad, char *type_of_change)
480 if (!ad || !type_of_change)
482 if (strstr(type_of_change, "edit_title") != NULL) {
483 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
485 tg_peer_info_s* user = sel_item->use_data;
486 char* user_name = replace(sel_item->use_data->print_name, '_', " ");
487 char temp_name[512] = {'\0'};
488 snprintf(temp_name, 512, "%s", user_name);
490 Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
491 elm_object_item_part_text_set(nf_it, "title", temp_name);
493 } else if (strstr(type_of_change, "delete_photo") != NULL) {
495 } else if (strstr(type_of_change, "add_user") != NULL || strstr(type_of_change, "delete_user") != NULL) {
496 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
498 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
504 void on_sent_media_item_clicked(void* data, Evas_Object* layout, void* event_info)
506 appdata_s* ad = evas_object_data_get(layout, "app_data");
507 char* media_type_str = evas_object_data_get(layout, "media_type");
508 char* media_file = evas_object_data_get(layout, "media_file");
510 if (!media_file || access(media_file, F_OK) == -1)
513 app_control_h app_control;
514 int ret = app_control_create(&app_control);
515 if (ret != APP_CONTROL_ERROR_NONE) {
516 LOGE("Error: Can not load image");
519 app_control_set_operation(app_control, APP_CONTROL_OPERATION_VIEW);
520 if (media_type_str && strstr(media_type_str, "video") != NULL) {
521 app_control_set_mime(app_control, "video/*");
522 } else if (media_type_str && strstr(media_type_str, "audio") != NULL) {
523 app_control_set_mime(app_control, "audio/*");
525 app_control_set_mime(app_control, "image/*");
527 app_control_set_uri(app_control, media_file);
529 app_control_send_launch_request(app_control, NULL, NULL);
530 app_control_destroy(app_control);
533 static Evas_Object *get_gif_image_from_path(const char* path, Evas_Object* parent, char *key)
535 if (!path || !parent || !key)
538 LOGD("key : %s", key);
539 Evas_Object *media_image = elm_image_add(parent);
540 elm_image_aspect_fixed_set(media_image, EINA_FALSE);
541 elm_image_file_set(media_image, path, key);
542 evas_object_size_hint_weight_set(media_image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
543 evas_object_size_hint_align_set(media_image, EVAS_HINT_FILL, EVAS_HINT_FILL);
544 evas_object_show(media_image);
548 static Evas_Object *get_image_from_path(const char* path, Evas_Object* parent)
550 if (!path || !parent)
552 Evas_Object *media_image = elm_image_add(parent);
553 elm_image_aspect_fixed_set(media_image, EINA_FALSE);
554 elm_image_file_set(media_image, path, NULL);
555 evas_object_size_hint_weight_set(media_image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
556 evas_object_size_hint_align_set(media_image, EVAS_HINT_FILL, EVAS_HINT_FILL);
557 evas_object_show(media_image);
561 int get_image_size(long long media_id)
563 Eina_List *media_sizes = get_image_sizes_from_db(media_id);
569 Eina_List *row_vals = NULL;
571 EINA_LIST_FREE(media_sizes,row_vals) {
575 int *temp_size1 = (int *)eina_list_nth(row_vals, 0);
580 int *temp_size2 = (int *)eina_list_nth(row_vals, 3);
585 int *temp_size3 = (int *)eina_list_nth(row_vals, 6);
590 int *temp_size4 = (int *)eina_list_nth(row_vals, 9);
597 EINA_LIST_FREE(row_vals, val) {
606 } else if (size2 > 0) {
608 } else if (size3 > 0) {
610 } else if (size4 > 0) {
618 void on_media_chat_item_clicked(void* data, Evas_Object *entry, void* event_info)
620 Evas_Object *button = evas_object_data_get(entry, "button_object");
622 char* img_state = evas_object_data_get(button, "image_state");
623 if (img_state && strstr(img_state, "download_in_progress") != NULL)
627 appdata_s* ad = evas_object_data_get(entry, "app_data");
628 char *temp_media_id = evas_object_data_get(entry, "media_id");
629 char *media_type_str = evas_object_data_get(entry, "media_type");
631 if (media_type_str && strstr(media_type_str, "location") != NULL) {
632 char *url = evas_object_data_get(entry, "location_url");
633 launch_app_control(ad, media_type_str, url);
637 long long media_id = atoll(temp_media_id);
638 char *media_file = get_media_path_from_db(media_id);
639 if (!media_file || access(media_file, F_OK) == -1) {
640 LOGE("Media download1");
641 Eina_Bool ret = send_request_for_media_downloading(ad, ad->service_client, ad->peer_in_cahtting_data->use_data->peer_id, media_id);
643 LOGE("Please check your network connection.");
646 LOGE("Media download2");
648 char temp_msg[256] = {0,};
649 snprintf(temp_msg, sizeof(temp_msg), "%s", "Downloading...");
650 elm_object_part_text_set(button, "size", temp_msg);
652 Evas_Object* progressbar = elm_progressbar_add(button);
653 elm_object_style_set(progressbar, "process_small");
654 evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
655 evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
656 elm_progressbar_pulse(progressbar, EINA_TRUE);
657 evas_object_show(progressbar);
659 Evas_Object* old_content = elm_object_part_content_unset(button, "download_image");
661 evas_object_del(old_content);
663 elm_object_part_content_set(button, "download_image", progressbar);
664 evas_object_data_set(button, "image_state", "download_in_progress");
667 launch_app_control(ad, media_type_str, media_file);
671 static void on_video_play_pressed(void *data, Evas_Object *obj, void *event_info)
675 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_PRESS_ICON), NULL);
678 static void on_video_play_unpressed(void *data, Evas_Object *obj, void *event_info)
682 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
685 static Evas_Object* get_video_paly_icon(Evas_Object *parent)
687 Evas_Object* play_pause_btn = elm_button_add(parent);
688 elm_object_style_set(play_pause_btn, "transparent");
689 evas_object_size_hint_align_set(play_pause_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
690 evas_object_size_hint_weight_set(play_pause_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
692 Evas_Object* play_pause_icon = elm_image_add(parent);
693 evas_object_size_hint_align_set(play_pause_icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
694 evas_object_size_hint_weight_set(play_pause_icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
696 elm_image_file_set(play_pause_icon, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
698 elm_image_resizable_set(play_pause_icon, EINA_TRUE, EINA_TRUE);
699 evas_object_show(play_pause_icon);
701 elm_object_content_set(play_pause_btn, play_pause_icon);
703 evas_object_smart_callback_add(play_pause_btn, "pressed", on_video_play_pressed, play_pause_icon);
704 evas_object_smart_callback_add(play_pause_btn, "unpressed", on_video_play_unpressed, play_pause_icon);
705 return play_pause_btn;
708 static Evas_Object *get_media_layout_with_play(char *img_path, Evas_Object *parent, Eina_Bool show_play_icon)
710 char edj_path[PATH_MAX] = {0, };
711 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
712 Evas_Object *rec_video_layout = elm_layout_add(parent);
713 elm_layout_file_set(rec_video_layout, edj_path, "bubble_video_item_layout");
714 evas_object_size_hint_weight_set(rec_video_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
715 evas_object_size_hint_align_set(rec_video_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
716 evas_object_show(rec_video_layout);
718 Evas_Object *vid_thumb_icon = get_image_from_path(img_path, parent);
719 elm_object_part_content_set(rec_video_layout, "swallow.video_thumb_item", vid_thumb_icon);
721 if (show_play_icon) {
722 /* Evas_Object* play_img = get_image_from_path(ui_utils_get_resource(MEDIA_PLAY_ICON), parent);
723 elm_object_part_content_set(rec_video_layout, "swallow.play_btn", play_img);*/
725 Evas_Object* play_pause_btn = get_video_paly_icon(parent);
726 elm_object_part_content_set(rec_video_layout, "swallow.play_btn", play_pause_btn);
729 return rec_video_layout;
732 void audio_player_progress_updated(void* handler, int current, int total, void *user_data)
734 Evas_Object *parent = user_data;
735 Evas_Object *progressbar = evas_object_data_get(parent, "progress_control");
738 int seconds = (int) (current / 1000) % 60 ;
739 int minutes = (int) ((current / (1000*60)) % 60);
741 char tot_dur[256] = {0,};
743 if (seconds < 10 && minutes < 10) {
745 } else if (seconds > 10 && minutes < 10) {
747 } else if (seconds < 10 && minutes > 10) {
753 sprintf(tot_dur, format, minutes, seconds);
754 elm_object_part_text_set(progressbar, "elm.text.bottom.right", tot_dur);
756 double current_status = (double)((double)current/(double)total);
758 elm_progressbar_value_set(progressbar, current_status);
762 void audio_player_state_changed(void* handler, TG_AUDIO_PLAYER_STATE state, void *user_data)
764 tg_player_handler *audio_payer = handler;
765 Evas_Object *parent = user_data;
767 if (!audio_payer || !parent)
770 Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(parent, "is_play_mode");
771 switch (audio_payer->state) {
772 case TG_AUDIO_PLAYER_STATE_NONE:
774 case TG_AUDIO_PLAYER_STATE_INITIALIZED:
775 evas_object_data_set(parent, "tg_audio_player", audio_payer);
776 play_audio_player(audio_payer);
778 case TG_AUDIO_PLAYER_STATE_PLAYING:
779 elm_image_file_set(parent, ui_utils_get_resource(TG_PAUSE_NORMAL_ICON), NULL);
780 is_play_mode = !is_play_mode;
781 evas_object_data_set(parent, "is_play_mode", is_play_mode);
783 case TG_AUDIO_PLAYER_STATE_INTERRUPTED:
784 elm_image_file_set(parent, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
785 is_play_mode = !is_play_mode;
786 evas_object_data_set(parent, "is_play_mode", is_play_mode);
788 case TG_AUDIO_PLAYER_STATE_PAUSE:
789 elm_image_file_set(parent, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
790 is_play_mode = !is_play_mode;
791 evas_object_data_set(parent, "is_play_mode", is_play_mode);
793 case TG_AUDIO_PLAYER_STATE_ERROR:
795 case TG_AUDIO_PLAYER_STATE_END:
796 destroy_audio_player(audio_payer);
798 is_play_mode = EINA_FALSE;
799 evas_object_data_set(parent, "is_play_mode", is_play_mode);
800 evas_object_data_set(parent, "tg_audio_player", NULL);
801 elm_image_file_set(parent, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
802 audio_player_progress_updated(NULL, 0, 1, parent);
810 static void on_message_play_pause_clicked(void *data, Evas_Object *obj, void *event_info)
815 appdata_s * ad = evas_object_data_get(data, "app_data");
816 char *audio_file = evas_object_data_get(data, "audio_file_path");
817 char *media_id = evas_object_data_get(data, "media_id");
822 if (!audio_file || strlen(audio_file) <= 0 || !media_id) {
823 //there is no file. download it.
824 Evas_Object *progressbar = evas_object_data_get(data, "progress_control");
825 Eina_Bool is_download_in_progress = (Eina_Bool)evas_object_data_get(progressbar, "is_download_in_progress");
826 if (!is_download_in_progress) {
827 elm_object_style_set(progressbar, "pending");
828 Eina_Bool ret = send_request_for_media_downloading(ad, ad->service_client, ad->peer_in_cahtting_data->use_data->peer_id, atoll(media_id));
830 show_toast(ad, "Please check your network connection.");
837 tg_player_handler *audio_payer = evas_object_data_get(data, "tg_audio_player");
839 audio_payer = init_audio_player(audio_file, &audio_player_state_changed, &audio_player_progress_updated, data);
841 show_toast(ad, "Unsupported file.");
846 if (audio_payer->state == TG_AUDIO_PLAYER_STATE_PAUSE || audio_payer->state == TG_AUDIO_PLAYER_STATE_INTERRUPTED) {
847 play_audio_player(audio_payer);
848 } else if (audio_payer->state == TG_AUDIO_PLAYER_STATE_PLAYING) {
849 pause_audio_player(audio_payer);
855 static void on_message_play_pause_pressed(void *data, Evas_Object *obj, void *event_info)
860 Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(data, "is_play_mode");
862 elm_image_file_set(data, ui_utils_get_resource(TG_PAUSE_PRESS_ICON), NULL);
864 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_PRESS_ICON), NULL);
868 static void on_message_play_pause_unpressed(void *data, Evas_Object *obj, void *event_info)
873 Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(data, "is_play_mode");
875 elm_image_file_set(data, ui_utils_get_resource(TG_PAUSE_NORMAL_ICON), NULL);
877 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
881 static void progressbar_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
887 static Evas_Object *create_audio_progressbar(Evas_Object *parent, int duration)
889 Evas_Object *progressbar;
891 progressbar = elm_progressbar_add(parent);
892 evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, 0.5);
893 evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
894 elm_progressbar_value_set(progressbar, 0.0);
895 evas_object_event_callback_add(progressbar, EVAS_CALLBACK_DEL, progressbar_del_cb, NULL);
896 evas_object_show(progressbar);
898 elm_object_part_text_set(progressbar, "elm.text.top.left", "");
899 elm_object_part_text_set(progressbar, "elm.text.top.right", "");
901 elm_object_part_text_set(progressbar, "elm.text.bottom.right", "00:00");
907 static Evas_Object *get_audio_layout_with_play(Evas_Object *parent)
909 Evas_Object* chat_scroller = parent;
910 Evas_Object *rec_video_layout = NULL;
911 tgl_media_s *media_msg = NULL;
912 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
913 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
914 int message_id = (int)evas_object_data_get(chat_scroller, "message_id");
916 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
917 int buddy_id = sel_item->use_data->peer_id;
918 char* tablename = get_table_name_from_number(buddy_id);
920 tg_message_s* msg = get_message_from_message_table(message_id, tablename);
928 Evas_Object *parent_obj = evas_object_data_get(chat_scroller, "parent_obj"); //entry
932 media_msg = get_media_details_from_db(atoll(msg->media_id));
934 char *audio_file = media_msg->file_path;
936 char edj_path[PATH_MAX] = {0, };
937 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
938 rec_video_layout = elm_layout_add(parent);
939 elm_layout_file_set(rec_video_layout, edj_path, "bubble_audio_item_layout");
940 evas_object_size_hint_weight_set(rec_video_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
941 evas_object_size_hint_align_set(rec_video_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
942 evas_object_show(rec_video_layout);
944 /**************** play icon **********************/
945 Evas_Object* play_pause_btn = elm_button_add(parent);
946 elm_object_style_set(play_pause_btn, "transparent");
947 evas_object_size_hint_align_set(play_pause_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
948 evas_object_size_hint_weight_set(play_pause_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
950 Evas_Object* play_pause_icon = elm_image_add(parent);
951 evas_object_size_hint_align_set(play_pause_icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
952 evas_object_size_hint_weight_set(play_pause_icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
953 elm_image_file_set(play_pause_icon, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
955 elm_image_resizable_set(play_pause_icon, EINA_TRUE, EINA_TRUE);
956 evas_object_show(play_pause_icon);
957 elm_object_content_set(play_pause_btn, play_pause_icon);
959 Eina_Bool is_play_mode = EINA_TRUE;
960 evas_object_data_set(play_pause_icon, "is_play_mode", is_play_mode);
963 evas_object_data_set(play_pause_icon, "audio_file_path", strdup(audio_file));
965 evas_object_data_set(play_pause_icon, "app_data", ad);
966 evas_object_data_set(play_pause_icon, "user_id", (void*)user_id);
967 evas_object_data_set(play_pause_icon, "message_id", (void*)message_id);
968 evas_object_data_set(play_pause_icon, "media_id", strdup(msg->media_id));
970 evas_object_smart_callback_add(parent_obj, "clicked", on_message_play_pause_clicked, play_pause_icon);
971 evas_object_smart_callback_add(parent_obj, "pressed", on_message_play_pause_pressed, play_pause_icon);
972 evas_object_smart_callback_add(parent_obj, "unpressed", on_message_play_pause_unpressed, play_pause_icon);
974 evas_object_smart_callback_add(play_pause_btn, "clicked", on_message_play_pause_clicked, play_pause_icon);
975 evas_object_smart_callback_add(play_pause_btn, "pressed", on_message_play_pause_pressed, play_pause_icon);
976 evas_object_smart_callback_add(play_pause_btn, "unpressed", on_message_play_pause_unpressed, play_pause_icon);
977 elm_object_part_content_set(rec_video_layout, "swallow.play_icon", play_pause_btn);
978 /**************** play icon **********************/
980 /*************** progress bar ********************/
982 int total_duration = 0;
984 metadata_extractor_h metadata;
985 metadata_extractor_create(&metadata);
986 int ret = metadata_extractor_set_path(metadata, audio_file);
988 ret = metadata_extractor_get_metadata(metadata, METADATA_DURATION, &value);
989 metadata_extractor_destroy(metadata);
992 total_duration = atoi(value);
996 total_duration = media_msg->doc_duration;
997 //convert into milli secs
998 total_duration = 1000 * total_duration;
1001 Evas_Object *progress = create_audio_progressbar(parent, total_duration);
1003 evas_object_data_set(parent_obj, "play_pause_icon", play_pause_icon);
1004 evas_object_data_set(parent_obj, "progress_bar", progress);
1006 elm_object_part_content_set(rec_video_layout, "swallow.progress_icon", progress);
1008 evas_object_data_set(play_pause_icon, "progress_control", (void*)progress);
1009 Eina_Bool is_download_in_progress = EINA_FALSE;
1010 evas_object_data_set(progress, "is_download_in_progress", (void*)is_download_in_progress);
1012 /*************** progress bar ********************/
1018 msg->message = NULL;
1020 if (msg->media_id) {
1021 free(msg->media_id);
1022 msg->media_id = NULL;
1025 free_media_details(media_msg);
1027 return rec_video_layout;
1031 static Evas_Object * item_provider(void *data, Evas_Object *entry, const char *item)
1034 if (strcmp(item, "itemprovider")) {
1037 Evas_Object *layout = NULL;
1038 Evas_Object* chat_scroller = data;
1039 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1040 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1041 int message_id = (int)evas_object_data_get(entry, "message_id");
1043 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1044 int buddy_id = sel_item->use_data->peer_id;
1046 char* tablename = get_table_name_from_number(buddy_id);
1047 tg_message_s* msg = get_message_from_message_table(message_id, tablename);
1052 Evas_Object *item_to_display = NULL;
1053 tgl_media_s *media_msg = NULL;
1054 if (msg->media_type == tgl_message_media_photo || msg->media_type == tgl_message_media_document) {
1056 Eina_Bool is_blur_image = EINA_FALSE;
1057 char* img_path = NULL;
1059 img_path = get_media_path_from_db(atoll(msg->media_id));
1060 if (access(img_path, F_OK) == -1) {
1062 tmp = ui_utils_get_resource(BLUR_BG);
1063 img_path = strdup(tmp);
1064 is_blur_image = EINA_TRUE;
1067 if (msg->media_type == tgl_message_media_document) {
1068 media_msg = get_media_details_from_db(atoll(msg->media_id));
1070 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1071 if (img_path == NULL || strlen(img_path) == 0) {
1072 img_path = strdup(ui_utils_get_resource(TG_VIDEO_ICON));
1075 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1080 img_path = strdup(ui_utils_get_resource(TG_AUDIO_ICON));
1082 char* media_file = get_media_path_from_db(atoll(msg->media_id));
1083 if (!media_file || (media_file && !strcmp(media_file, "_null_")) || (media_file && strlen(media_file) <= 0) || (media_file && access(media_file, F_OK) == -1)) {
1084 is_blur_image = EINA_TRUE;
1087 if (media_file && strstr(media_file, ".webp") != NULL) {
1088 is_blur_image = EINA_FALSE;
1094 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1096 evas_object_data_set(chat_scroller, "parent_obj", (void*)entry);
1097 item_to_display = get_audio_layout_with_play(chat_scroller);
1099 } else if (msg->out) {
1101 if (msg->media_type == tgl_message_media_photo) {
1102 item_to_display = get_image_from_path(img_path, entry);
1105 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1106 char *thumb_path = get_video_thumb_path_from_db(media_msg->media_id);
1108 thumb_path = strdup(ui_utils_get_resource(BLUR_BG));
1110 item_to_display = get_media_layout_with_play(thumb_path, entry, EINA_TRUE);
1113 item_to_display = get_image_from_path(img_path, entry);
1114 elm_image_animated_set(item_to_display, EINA_TRUE);
1115 elm_image_animated_play_set(item_to_display, EINA_TRUE);
1120 if (!is_blur_image) {
1121 if (msg->media_type == tgl_message_media_photo) {
1122 item_to_display = get_image_from_path(img_path, entry);
1123 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1125 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1127 //item_to_display = get_media_layout_with_play(img_path, entry, EINA_TRUE);
1128 char *thumb_path = get_video_thumb_path_from_db(media_msg->media_id);
1130 thumb_path = strdup(ui_utils_get_resource(BLUR_BG));
1132 item_to_display = get_media_layout_with_play(thumb_path, entry, EINA_TRUE);
1136 if (media_msg && media_msg->mime_type && strstr(media_msg->mime_type, "webp") != NULL) {
1137 char *tmp = ui_utils_get_resource(BROKEN_IMAGE);
1138 //item_to_display = get_image_from_path(img_path, entry);
1140 item_to_display = get_image_from_path(tmp, entry);
1141 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1143 item_to_display = get_image_from_path(img_path, entry);
1144 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1145 elm_image_animated_set(item_to_display, EINA_TRUE);
1146 elm_image_animated_play_set(item_to_display, EINA_TRUE);
1152 char edj_path[PATH_MAX] = {0, };
1153 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1154 Evas_Object *rec_img_layout = elm_layout_add(entry);
1155 elm_layout_file_set(rec_img_layout, edj_path, "bubble_received_media_layout");
1156 evas_object_size_hint_weight_set(rec_img_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1157 evas_object_size_hint_align_set(rec_img_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1158 evas_object_show(rec_img_layout);
1159 Evas_Object *img_item = NULL;
1162 if (msg->media_type == tgl_message_media_photo) {
1163 img_item = get_image_from_path(img_path, entry);
1165 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)) {
1166 //img_item = get_media_layout_with_play(img_path, entry, EINA_FALSE);
1167 char *thumb_path = get_video_thumb_path_from_db(media_msg->media_id);
1169 thumb_path = strdup(ui_utils_get_resource(BLUR_BG));
1171 img_item = get_media_layout_with_play(thumb_path, entry, EINA_FALSE);
1174 img_item = get_image_from_path(img_path, entry);
1177 elm_object_part_content_set(rec_img_layout, "swallow.image_item", img_item);
1180 if (msg->media_type == tgl_message_media_photo) {
1181 media_size = get_image_size(atoll(msg->media_id));
1183 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1184 media_size = get_media_size_from_db(atoll(msg->media_id));
1185 } else if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1186 media_size = get_media_size_from_db(atoll(msg->media_id));
1188 media_size = get_media_size_from_db(atoll(msg->media_id));
1192 int media_size_kbs = (media_size < (1 << 20)); //convert to kbs
1193 char media_size_str[10] = { 0, };
1194 if (media_size_kbs > 0) {
1195 sprintf(media_size_str, "%dKB", media_size_kbs);
1197 sprintf(media_size_str, "%dB", media_size);
1201 Evas_Object *size_btn = elm_layout_add(entry);
1202 elm_layout_file_set(size_btn, edj_path, "download_btn");
1203 elm_object_part_text_set(size_btn, "size", media_size_str);
1204 evas_object_size_hint_weight_set(size_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1205 evas_object_size_hint_align_set(size_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
1206 evas_object_show(size_btn);
1208 evas_object_data_set(size_btn, "image_state", "ready_to_download");
1210 Evas_Object* download_img = get_image_from_path(ui_utils_get_resource(MEDIA_DOWNLOAD_ICON), entry);
1211 elm_object_part_content_set(size_btn, "download_image", download_img);
1213 elm_object_part_content_set(rec_img_layout, "swallow.download_btn", size_btn);
1215 evas_object_data_set(entry, "image_object", (void*)img_item);
1216 evas_object_data_set(entry, "button_object", (void*)size_btn);
1217 evas_object_data_set(entry, "image_size", (void*)strdup(media_size_str));
1219 //ad->loaded_msg_list = eina_list_append(ad->loaded_msg_list, entry);
1221 item_to_display = rec_img_layout;
1229 // delete media details
1233 evas_object_data_set(entry, "chat_list", (void*)chat_scroller);
1234 evas_object_data_set(entry, "message_id", (void*)message_id);
1235 evas_object_data_set(entry, "app_data", (void*)ad);
1238 if (msg->media_type == tgl_message_media_photo) {
1239 evas_object_data_set(entry, "media_type", (void*)strdup("image"));
1240 } else if (msg->media_type == tgl_message_media_geo) {
1241 evas_object_data_set(entry, "media_type", (void*)strdup("location"));
1243 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1244 evas_object_data_set(entry, "media_type", (void*)strdup("video"));
1245 } else if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1246 evas_object_data_set(entry, "media_type", (void*)strdup("audio"));
1248 if (media_msg && media_msg->mime_type && strstr(media_msg->mime_type, "webp") != NULL) {
1249 evas_object_data_set(entry, "media_type", (void*)strdup("image"));
1251 evas_object_data_set(entry, "media_type", (void*)strdup("animated_gif"));
1255 evas_object_data_set(entry, "media_id", (void*)strdup(msg->media_id));
1256 if (item_to_display) {
1257 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1258 layout = item_to_display;
1260 char edj_path[PATH_MAX] = {0, };
1261 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1262 layout = elm_layout_add(entry);
1263 elm_layout_file_set(layout, edj_path, "chat_image_layout");
1264 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1265 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1266 evas_object_show(layout);
1268 Evas_Object *rounded_layout = elm_layout_add(entry);
1269 elm_layout_file_set(rounded_layout, edj_path, "rounded_corner_layout");
1270 evas_object_size_hint_weight_set(rounded_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1271 evas_object_size_hint_align_set(rounded_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1272 evas_object_show(rounded_layout);
1273 elm_object_part_content_set(rounded_layout, "content", item_to_display);
1275 elm_object_part_content_set(layout, "swallow.chat_image", rounded_layout);
1276 evas_object_smart_callback_add(entry, "clicked", on_media_chat_item_clicked, NULL);
1282 msg->message = NULL;
1285 if (msg->media_id) {
1286 free(msg->media_id);
1287 msg->media_id = NULL;
1291 free_media_details(media_msg);
1296 static void __resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1298 appdata_s *ad = data;
1299 Evas_Object *layout = NULL;
1300 Evas_Object *chat_scroller = NULL;
1302 layout = evas_object_data_get(ad->nf, "main_layout");
1303 chat_scroller = evas_object_data_get(ad->nf, "chat_list");
1305 int is_end_edge = 0;
1306 is_end_edge = (int)evas_object_data_get(layout, "is_end_edge");
1307 int is_end_edge_top = 0;
1308 is_end_edge_top = (int)evas_object_data_get(chat_scroller, "is_end_edge_top");
1311 ret = scroller_show_bottom_edge(chat_scroller);
1313 LOGE("Fail to show the bottom of scroller");
1316 if (is_end_edge_top)
1317 scroller_show_previous_region(chat_scroller);
1320 //static void free_data_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1325 static void set_string_data(Evas_Object *obj, const char *key, const char *data)
1330 previous_str = evas_object_data_del(obj, key);
1332 //evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, free_data_cb);
1337 new_data = strdup(data);
1343 evas_object_data_set(obj, key, new_data);
1344 //evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, free_data_cb, new_data);
1348 static void _create_image_item(tg_message_s *msg, Evas_Object *entry, char *image, int size)
1350 char* img_path = NULL;
1352 Evas_Object *img_item = NULL;
1357 img_path = get_video_thumb_path_from_db(atoll(msg->media_id));
1358 if (img_path == NULL || (img_path && strlen(img_path) == 0) || (img_path && strstr(img_path, "_null_") != NULL)) {
1359 img_path = get_media_path_from_db(atoll(msg->media_id));
1360 if (access(img_path, F_OK) == -1)
1365 if (strstr(img_path, ".webp") != NULL) {
1366 char *tmp = ui_utils_get_resource(BROKEN_IMAGE);
1367 LOGE("broken image(webp): %s", tmp);
1369 //img_item = get_image_from_path(img_path, entry);
1370 img_item = get_image_from_path(tmp, entry);
1373 if (msg->media_type == tgl_message_media_document) {
1374 char key[256] = {0, };
1375 snprintf(key, sizeof(key), "%d", msg->msg_id);
1376 img_item = get_gif_image_from_path(img_path, entry, key);
1378 img_item = get_image_from_path(img_path, entry);
1380 elm_image_object_size_get(img_item, &w, &h);
1381 entry_h = (318 * h) / w;
1388 snprintf(image, size - 1, "<item size=318x%d vsize=full href=itemprovider></item>", entry_h);
1391 Evas_Object *on_message_item_content_get_cb(void *data, Evas_Object *obj, const char *part)
1394 ERR("Invalid Parameter.");
1398 if (strcmp(part, "elm.icon.entry"))
1401 Evas_Object *entry = NULL;
1402 Evas_Object *layout = NULL;
1404 char edj_path[PATH_MAX] = {0, };
1405 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1407 tg_message_s *msg = (tg_message_s*)data;
1408 Evas_Object *chat_scroller = obj;
1409 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1411 Evas_Object *nomsg_layout = evas_object_data_get(ad->nf, "chat_list_no_msg_text");
1413 elm_object_signal_emit(nomsg_layout, "hide", "message");
1415 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1416 evas_object_data_set(chat_scroller, "message_id", msg->msg_id);
1418 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1419 int buddy_id = sel_item->use_data->peer_id;
1421 char* tablename = get_table_name_from_number(buddy_id);
1423 //Eina_Bool is_blur_image = EINA_FALSE;
1429 update_msg_into_db(msg, tablename);
1430 ad->is_last_msg_changed = EINA_TRUE;
1440 if (msg->service == 2) {
1441 layout = elm_layout_add(obj);
1442 elm_layout_file_set(layout, edj_path, "chat_date_item");
1443 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1444 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1445 evas_object_show(layout);
1447 // convert date from string to int
1448 char *date_str = msg->message;
1449 int date_num = atoi(date_str);
1451 // convert date format
1452 time_t t = date_num;
1453 char *format = NULL;
1454 format = "%a, %e %b %Y";
1457 (void) localtime_r(&t, <);
1459 if (strftime(res, sizeof(res), format, <) == 0) {
1460 (void) fprintf(stderr, "strftime(3): cannot format supplied "
1461 "date/time into buffer of size %u "
1463 sizeof(res), format);
1466 elm_object_part_text_set(layout, "elm.text", res);
1468 } else if (msg->service == 1) {
1469 layout = elm_layout_add(obj);
1470 elm_layout_file_set(layout, edj_path, "chat_service_item_box");
1471 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1472 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1473 evas_object_show(layout);
1475 elm_object_part_text_set(layout, "elm.text", msg->message);
1480 if (msg->media_type != tgl_message_media_none) {
1481 entry = elm_entry_add(obj);
1482 elm_entry_editable_set(entry, EINA_FALSE);
1483 elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
1484 elm_entry_single_line_set(entry, EINA_TRUE);
1485 elm_entry_input_panel_enabled_set(entry, EINA_FALSE);
1487 entry = elm_label_add(obj);
1490 evas_object_data_set(entry, "message_id", (void*)msg->msg_id);
1491 // evas_object_data_set(entry, "chat_list", (void*)chat_scroller);
1493 layout = elm_layout_add(obj);
1496 elm_layout_file_set(layout, edj_path, "entry,send,layout");
1497 elm_object_style_set(entry, "sentmessage1");
1498 //sender_name = replace(ad->current_user_data->print_name, '_', " ");
1500 elm_layout_file_set(layout, edj_path, "entry,receive,layout");
1501 elm_object_style_set(entry, "readmessage1");
1503 /* If you need to get the name, you need this code */
1505 char *sender_name = NULL;
1506 if (sel_item->use_data->peer_type == TGL_PEER_USER) {
1507 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1508 } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
1509 int from_id = msg->from_id;
1510 // get name of buddy
1511 char* buddy_name = get_buddy_name_from_id(from_id);
1513 sender_name = replace(buddy_name, '_', " ");
1517 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1522 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1523 elm_object_part_content_set(layout, "elm.swallow.content", entry);
1524 evas_object_show(layout);
1526 evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1527 evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
1528 evas_object_show(entry);
1529 // To be handled for group chat
1530 Eina_Strbuf *buf = eina_strbuf_new();
1531 char *caption = NULL;
1532 LOGD("entry media type is %d", msg->media_type);
1533 if (msg->media_type == tgl_message_media_none) {
1534 char *temp_msg = replace(msg->message, '\n', "<br>");
1535 elm_object_part_text_set(entry, "elm.text", temp_msg);
1536 //eina_strbuf_append(buf, temp_msg);
1537 //elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1538 eina_strbuf_free(buf);
1539 edje_object_signal_emit(elm_layout_edje_get(entry), "label,changed", "*");
1540 edje_object_message_signal_process(elm_layout_edje_get(entry));
1542 } else if (msg->media_type == tgl_message_media_photo || msg->media_type == tgl_message_media_document) {
1543 elm_entry_item_provider_append(entry, item_provider, chat_scroller);
1545 LOGD("media id[%s]", msg->media_id);
1546 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1548 LOGD("file path[%s]", media_msg->file_path);
1549 if (media_msg && media_msg->caption && strlen(media_msg->caption) > 0) {
1550 caption = strdup(media_msg->caption);
1551 LOGD("caption[%s]", caption);
1555 if (media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1556 if (ad->target_direction == TELEGRAM_TARGET_DIRECTION_PORTRAIT || ad->target_direction == TELEGRAM_TARGET_DIRECTION_PORTRAIT_INVERSE) {
1557 eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1559 eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1562 } else if (media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1563 eina_strbuf_append(buf, "<item size=318x200 vsize=full hsize=full href=itemprovider></item>");
1565 char image[256] = {0,};
1566 _create_image_item(msg, entry, image, sizeof(image));
1567 eina_strbuf_append(buf, image);
1572 if (media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1573 eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1574 } else if (media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1575 eina_strbuf_append(buf, "<item size=318x200 vsize=full hsize=full href=itemprovider></item>");
1577 char image[256] = {0,};
1578 _create_image_item(msg, entry, image, sizeof(image));
1579 eina_strbuf_append(buf, image);
1583 free_media_details(media_msg);
1584 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1585 eina_strbuf_free(buf);
1586 } else if (msg->media_type == tgl_message_media_geo) {
1588 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1590 char loc_url[4*256] = {0,};
1592 if (media_msg->caption && strlen(media_msg->caption) > 0) {
1593 caption = strdup(media_msg->caption);
1595 snprintf(loc_url, sizeof(loc_url), "https://maps.google.com/?q=%s,%s", media_msg->latitude, media_msg->longitude);
1596 char temp_msg[4*256] = {0,};
1597 snprintf(temp_msg, sizeof(temp_msg), "<font=Tizen:style=Normal|underline color=#0000FF align=left><font_size=15>%s</font_size></font>", loc_url);
1598 eina_strbuf_append(buf, temp_msg);
1599 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1600 eina_strbuf_free(buf);
1603 free_media_details(media_msg);
1604 set_string_data(entry, "media_type", "location");
1605 set_string_data(entry, "location_url", loc_url);
1606 evas_object_smart_callback_add(entry, "clicked", on_media_chat_item_clicked, NULL);
1608 } else if (msg->media_type == tgl_message_media_contact) {
1610 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1613 if (media_msg->caption && strlen(media_msg->caption) > 0) {
1614 caption = strdup(media_msg->caption);
1616 char temp_msg[4*256] = {0,};
1617 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);
1618 eina_strbuf_append(buf, temp_msg);
1619 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1620 eina_strbuf_free(buf);
1621 free_media_details(media_msg);
1624 } else if (msg->media_type == tgl_message_media_unsupported) {
1626 } else if (msg->media_type == tgl_message_media_photo_encr) {
1628 } else if (msg->media_type == tgl_message_media_document_encr) {
1633 ad->loaded_msg_list = eina_list_append(ad->loaded_msg_list, entry);
1636 LOGD("caption is (%s)", caption);
1640 time_t t = msg->date;
1641 const char *format = "%I:%M %p";
1644 (void) localtime_r(&t, <);
1646 if (strftime(res, sizeof(res), format, <) == 0) {
1647 (void) fprintf(stderr, "strftime(3): cannot format supplied "
1648 "date/time into buffer of size %u "
1650 sizeof(res), format);
1653 char time_str[20] = {0,};
1654 snprintf(time_str, sizeof(time_str) - 1, "%s", res);
1655 elm_object_part_text_set(entry, "time", time_str);
1657 Evas_Object *status_obj;
1658 status_obj = elm_icon_add(entry);
1659 evas_object_size_hint_weight_set(status_obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1660 evas_object_size_hint_align_set(status_obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
1662 if (msg->msg_state == TG_MESSAGE_STATE_SENDING) {
1663 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENDING_ICON), NULL);
1664 elm_object_signal_emit(entry, "status_on", "status");
1665 } else if (msg->msg_state == TG_MESSAGE_STATE_SENT) {
1666 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENT_ICON), NULL);
1667 elm_object_signal_emit(entry, "status_on", "status");
1668 } else if (msg->msg_state == TG_MESSAGE_STATE_DELIVERED) {
1669 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_DELIVERED_ICON), NULL);
1670 elm_object_signal_emit(entry, "status_on", "status");
1671 } else if (msg->msg_state == TG_MESSAGE_STATE_RECEIVED) {
1672 elm_object_signal_emit(entry, "status_off", "status");
1673 } else if (msg->msg_state == TG_MESSAGE_STATE_FAILED) {
1674 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_FAILED_ICON), NULL);
1675 elm_object_signal_emit(entry, "status_on", "status");
1676 } else if (msg->msg_state == TG_MESSAGE_STATE_READ) {
1677 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_READ_ICON), NULL);
1678 elm_object_signal_emit(entry, "status_on", "status");
1679 } else if (msg->msg_state == TG_MESSAGE_STATE_UNKNOWN) {
1680 elm_object_signal_emit(entry, "status_off", "status");
1683 elm_object_part_content_set(entry, "status_icon", status_obj);
1684 evas_object_show(status_obj);
1690 void on_text_message_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
1695 void on_text_message_received_from_buddy(appdata_s* ad, long long message_id, int type_of_chat)
1697 peer_with_pic_s* pic_peer_item = NULL;
1698 tg_peer_info_s* peer_item = NULL;
1699 char* tablename = NULL;
1700 tg_message_s* msg = NULL;
1701 Evas_Object* chat_scroller = NULL;
1702 Evas_Object *message = NULL;
1707 pic_peer_item = ad->peer_in_cahtting_data;
1711 peer_item = pic_peer_item->use_data;
1715 tablename = get_table_name_from_number(peer_item->peer_id);
1719 msg = get_message_from_message_table(message_id, tablename);
1721 LOGE("received msg is not found in DB");
1726 chat_scroller = evas_object_data_get(ad->nf, "chat_list");
1730 peer_item->last_msg_id = msg->msg_id;
1731 peer_item->last_msg_date = msg->date;
1732 insert_or_update_peer_into_database(peer_item);
1734 Evas_Object *layout = evas_object_data_get(ad->nf, "main_layout");
1736 int is_end_edge = (int) evas_object_data_get(layout, "is_end_edge");
1738 Evas_Object *bubble_layout = NULL;
1739 bubble_layout = elm_object_part_content_get(layout, "swallow.messagebubble");
1741 int user_id = (int) evas_object_data_get(chat_scroller, "user_id");
1742 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1743 char *sender_name = NULL;
1744 if (sel_item->use_data->peer_type == TGL_PEER_USER) {
1745 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1746 } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
1747 int from_id = msg->from_id;
1748 // get name of buddy
1749 char* buddy_name = get_buddy_name_from_id(from_id);
1751 sender_name = replace(buddy_name, '_', " ");
1755 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1758 elm_object_part_text_set(bubble_layout, "text_name", sender_name);
1759 elm_object_part_text_set(bubble_layout, "text_message", msg->message);
1760 elm_object_signal_emit(layout, "show", "bubblemessage");
1765 message = on_message_item_content_get_cb((void *)msg, chat_scroller, "elm.icon.entry");
1766 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)message_id);
1767 scroller_push_item(chat_scroller, message, 0);
1769 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1770 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1772 send_request_for_marked_as_read(ad, ad->service_client, sel_item->use_data->peer_id, sel_item->use_data->peer_type);
1773 ad->is_last_msg_changed = EINA_TRUE;
1774 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
1780 static void media_file_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1783 str = evas_object_data_del(obj, data);
1788 void on_media_download_completed(appdata_s* ad, int buddy_id, long long media_id, const char *file_path, const char *caption)
1790 LOGE("Media download17");
1795 Evas_Object* entry = NULL;
1796 LOGE("Media download18");
1797 EINA_LIST_FOREACH(ad->loaded_msg_list, l, entry) {
1798 LOGE("Media download19");
1800 LOGE("Media download20");
1804 char* media_type_str = evas_object_data_get(entry, "media_type");
1805 char* media_id_str = evas_object_data_get(entry, "media_id");
1806 char* media_size_str = evas_object_data_get(entry, "image_size");
1807 Evas_Object *img_item = evas_object_data_get(entry, "image_object");
1808 Evas_Object *size_btn = evas_object_data_get(entry, "button_object");
1810 if (!media_id_str) {
1814 long long lmedia_id = atoll(media_id_str);
1816 if (media_id != lmedia_id) {
1819 if (img_item || (media_type_str && strstr(media_type_str, "audio") != NULL)) {
1822 if (file_path && strstr(file_path, "failed_to_load") != NULL) {
1824 if (media_type_str && (strstr(media_type_str, "audio") != NULL)) {
1825 Evas_Object *play_pause_icon = evas_object_data_get(entry, "play_pause_icon");
1826 Evas_Object *progressbar = evas_object_data_get(entry, "progress_bar");
1827 evas_object_data_set(progressbar, "is_download_in_progress", (void *)EINA_FALSE);
1828 set_string_data(play_pause_icon, "audio_file_path", NULL);
1829 elm_object_style_set(progressbar, "default");
1835 Evas_Object* progress = elm_object_part_content_get(size_btn, "download_image");
1837 evas_object_del(progress);
1839 Evas_Object* download_img = get_image_from_path(ui_utils_get_resource(MEDIA_DOWNLOAD_ICON), size_btn);
1840 elm_object_part_content_set(size_btn, "download_image", download_img);
1841 evas_object_data_set(size_btn, "image_state", "ready_to_download");
1842 char temp_msg[256] = {0,};
1843 snprintf(temp_msg, sizeof(temp_msg), "<font=Tizen:style=Bold color=#008000 align=center><font_size=30>%s</font_size></font>", media_size_str);
1844 elm_object_text_set(size_btn, temp_msg);
1849 if (media_type_str && (strstr(media_type_str, "audio") != NULL)) {
1851 Evas_Object *play_pause_icon = evas_object_data_get(entry, "play_pause_icon");
1852 Evas_Object *progressbar = evas_object_data_get(entry, "progress_bar");
1853 evas_object_data_set(progressbar, "is_download_in_progress", (void *)EINA_FALSE);
1854 elm_object_style_set(progressbar, "default");
1856 set_string_data(play_pause_icon, "audio_file_path", file_path);
1858 metadata_extractor_h metadata;
1859 metadata_extractor_create(&metadata);
1860 int ret = metadata_extractor_set_path(metadata, file_path);
1862 ret = metadata_extractor_get_metadata(metadata, METADATA_DURATION, &value);
1863 metadata_extractor_destroy(metadata);
1867 duration = atoi(value);
1871 elm_object_part_text_set(progressbar, "elm.text.top.left", "");
1872 elm_object_part_text_set(progressbar, "elm.text.top.right", "");
1878 evas_object_del(size_btn);
1881 if (media_type_str && (strstr(media_type_str, "video") != NULL)) {
1882 Evas_Object* play_img = get_video_paly_icon(img_item);
1883 //Evas_Object* play_img = get_image_from_path(ui_utils_get_resource(MEDIA_PLAY_ICON), img_item);
1884 elm_object_part_content_set(img_item, "swallow.play_btn", play_img);
1885 } else if (media_type_str && strstr(media_type_str, "image") != NULL) {
1886 img_item = get_image_from_path(file_path, entry);
1888 elm_image_object_size_get(img_item, &w, &h);
1889 entry_h = (318 * h) / w;
1890 Eina_Strbuf *buf = eina_strbuf_new();
1891 char image[256] = {0,};
1892 snprintf(image, sizeof(image) - 1, "<item size=318x%d vsize=full href=itemprovider></item>", entry_h);
1893 eina_strbuf_append(buf, image);
1894 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1895 eina_strbuf_free(buf);
1897 } else if (media_type_str && strstr(media_type_str, "animated_gif") != NULL) {
1899 int msg_id = (int) evas_object_data_get(entry, "message_id");
1900 char key[256] = {0, };
1901 snprintf(key, sizeof(key), "%d", msg_id);
1903 img_item = get_gif_image_from_path(file_path, entry, key);
1904 //elm_image_animated_set(img_item, EINA_TRUE);
1905 //elm_image_animated_play_set(img_item, EINA_TRUE);
1907 elm_image_object_size_get(img_item, &w, &h);
1908 entry_h = (318 * h) / w;
1909 Eina_Strbuf *buf = eina_strbuf_new();
1910 char image[256] = {0,};
1911 snprintf(image, sizeof(image) - 1, "<item size=318x%d vsize=full href=itemprovider></item>", entry_h);
1912 eina_strbuf_append(buf, image);
1913 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1914 eina_strbuf_free(buf);
1919 LOGE("Media download36");
1922 //elm_object_part_content_set(comp_img_layout, "swallow.chat_send_image", image);
1924 void on_video_thumb_download_completed(appdata_s* ad, int buddy_id, long long media_id, const char* file_path, const char *caption)
1926 on_media_download_completed(ad, buddy_id, media_id, file_path, caption);
1929 void on_text_message_state_changed(appdata_s* ad, tg_message_s *msg, int type_of_chat)
1935 Evas_Object* entry = NULL;
1936 EINA_LIST_FOREACH(ad->loaded_msg_list, l, entry) {
1939 int message_id = (int)evas_object_data_get(entry, "message_id");
1940 if (message_id == msg->msg_id || message_id == msg->unique_id) {
1942 set_string_data(entry, "media_id", msg->media_id);
1943 evas_object_data_set(entry, "message_id", (void*)message_id);
1945 Evas_Object* status_obj = elm_object_part_content_get(entry, "status_icon");
1947 if (msg->msg_state == TG_MESSAGE_STATE_SENDING) {
1948 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENDING_ICON), NULL);
1949 elm_object_signal_emit(entry, "status_on", "status");
1950 } else if (msg->msg_state == TG_MESSAGE_STATE_SENT) {
1951 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENT_ICON), NULL);
1952 elm_object_signal_emit(entry, "status_on", "status");
1953 } else if (msg->msg_state == TG_MESSAGE_STATE_DELIVERED) {
1954 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_DELIVERED_ICON), NULL);
1955 elm_object_signal_emit(entry, "status_on", "status");
1956 } else if (msg->msg_state == TG_MESSAGE_STATE_RECEIVED) {
1957 elm_object_signal_emit(entry, "status_off", "status");
1958 } else if (msg->msg_state == TG_MESSAGE_STATE_FAILED) {
1959 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_FAILED_ICON), NULL);
1960 elm_object_signal_emit(entry, "status_on", "status");
1961 } else if (msg->msg_state == TG_MESSAGE_STATE_READ) {
1962 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_READ_ICON), NULL);
1963 elm_object_signal_emit(entry, "status_on", "status");
1964 } else if (msg->msg_state == TG_MESSAGE_STATE_UNKNOWN) {
1965 elm_object_signal_emit(entry, "status_off", "status");
1973 Eina_Bool add_date_item_to_chat(void *data)
1975 Evas_Object *chat_scroller = data;
1976 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1977 Eina_Bool ret = EINA_FALSE;
1981 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1985 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1987 char* msg_table = get_table_name_from_number(sel_item->use_data->peer_id);
1988 create_buddy_msg_table(msg_table);
1989 int msg_id = insert_current_date_to_table(msg_table);
1997 // send request to service
1998 Evas_Object *message = NULL;
1999 tg_message_s* msg = get_message_from_message_table(msg_id, msg_table);
2000 message = on_message_item_content_get_cb((void *)msg, chat_scroller, "elm.icon.entry");
2001 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)msg_id);
2002 scroller_push_item(chat_scroller, message, 0);
2004 ad->is_last_msg_changed = EINA_TRUE;
2013 static Eina_Bool on_new_text_message_send_cb(void *data)
2015 Evas_Object *chat_scroller = data;
2016 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2017 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2018 Evas_Object *text_entry = evas_object_data_get(chat_scroller, "text_entry");
2020 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2022 const char* text_to_send = elm_entry_entry_get(text_entry);
2023 if (!text_to_send || (strlen(text_to_send) == 0))
2024 return ECORE_CALLBACK_CANCEL;
2026 int unique_id = get_time_stamp_in_macro();
2027 if (unique_id < 0) {
2028 unique_id = -1 * unique_id;
2031 msg.msg_id = unique_id;
2032 msg.from_id = ad->current_user_data->user_id.id;
2033 msg.date = time(NULL);
2036 msg.fwd_from_id = 0;
2037 msg.fwd_from_id = 0;
2039 msg.message = (char *)text_to_send;
2040 msg.message_len = strlen(text_to_send);
2041 msg.media_type = tgl_message_media_none;
2045 msg.to_id = sel_item->use_data->peer_id;
2047 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2048 msg.is_marked_for_delete = 0;
2049 char* msg_table = get_table_name_from_number(msg.to_id);
2050 create_buddy_msg_table(msg_table);
2051 insert_msg_into_db(&msg, msg_table, unique_id);
2054 peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
2055 if (pic_peer_item) {
2056 tg_peer_info_s* peer_item = pic_peer_item->use_data;
2057 // update peer table
2059 peer_item->last_msg_id = msg.msg_id;
2060 peer_item->last_msg_date = msg.date;
2061 insert_or_update_peer_into_database(peer_item);
2065 // send request to service
2066 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);
2068 Evas_Object *message = NULL;
2070 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2071 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)unique_id);
2072 scroller_push_item(chat_scroller, message, 0);
2074 elm_entry_entry_set(text_entry, "");
2075 ad->is_last_msg_changed = EINA_TRUE;
2076 return ECORE_CALLBACK_CANCEL;
2079 static void on_text_message_send_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2081 Evas_Object* chat_scroller = data;
2082 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2086 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2087 Evas_Object* text_entry = evas_object_data_get(chat_scroller, "text_entry");
2090 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2091 const char* text_to_send = elm_entry_markup_to_utf8(elm_object_text_get(text_entry));
2092 if (!text_to_send || (strlen(text_to_send) == 0))
2095 if (add_date_item_to_chat(data))
2098 int unique_id = get_time_stamp_in_macro();
2100 unique_id = -1 * unique_id;
2103 msg.msg_id = unique_id;
2104 msg.from_id = ad->current_user_data->user_id.id;
2105 msg.date = time(NULL);
2108 msg.fwd_from_id = 0;
2109 msg.fwd_from_id = 0;
2111 msg.message = (char *)text_to_send;
2112 msg.message_len = strlen(text_to_send);
2113 msg.media_type = tgl_message_media_none;
2117 msg.to_id = sel_item->use_data->peer_id;
2119 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2120 msg.is_marked_for_delete = 0;
2121 char* msg_table = get_table_name_from_number(msg.to_id);
2122 create_buddy_msg_table(msg_table);
2123 insert_msg_into_db(&msg, msg_table, unique_id);
2126 peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
2127 if (pic_peer_item) {
2128 tg_peer_info_s* peer_item = pic_peer_item->use_data;
2130 peer_item->last_msg_id = msg.msg_id;
2131 peer_item->last_msg_date = msg.date;
2132 insert_or_update_peer_into_database(peer_item);
2136 // send request to service
2137 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);
2138 Evas_Object *message = NULL;
2139 Evas_Object *layout = evas_object_data_get(ad->nf, "main_layout");
2140 evas_object_data_set(layout, "is_end_edge", (void *) 1);
2142 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2143 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)unique_id);
2144 scroller_push_item(chat_scroller, message, 0);
2146 elm_entry_entry_set(text_entry, "");
2147 ad->is_last_msg_changed = EINA_TRUE;
2150 void on_user_status_changed(appdata_s* ad, char* status)
2155 Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
2156 char status_str[256] = {0,};
2157 snprintf(status_str, sizeof(status_str) - 1, "%s", status);
2158 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2161 static void compare_with_current_date(int rtime, Elm_Object_Item *nf_it)
2163 char time_str[256] = {0,};
2164 time_t local_t = time(NULL);
2170 diff_sec = local_t - rtime;
2171 diff_min = diff_sec / 60;
2172 diff_hour = diff_min / 60;
2173 diff_day = diff_hour / 24;
2174 LOGD("different : day : %d, hour = %d, min = %d, sec = %d", diff_day, diff_hour, diff_min, diff_sec);
2176 if (diff_day > 30) {
2177 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_LONG_TIME_AGO_ABB"));
2182 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_WITHIN_A_MONTH_ABB"));
2186 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_WITHIN_A_WEEK_ABB"));
2190 if (diff_hour > 1) {
2191 snprintf(time_str, sizeof(time_str) - 1, i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_PD_HOURS_AGO_ABB"), diff_hour);
2195 if (diff_hour == 1) {
2196 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_1_HOUR_AGO_ABB"));
2200 snprintf(time_str, sizeof(time_str) - 1, i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_PD_MINUTES_AGO_ABB"), diff_min);
2203 if (diff_min == 1) {
2204 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_1_MINUTE_AGO_ABB"));
2207 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_RECENTLY_ABB"));
2210 elm_object_item_part_text_set(nf_it, "subtitle", time_str);
2213 void on_user_presence_state_changed(appdata_s* ad, int buddy_id)
2217 int type_of_chat = ad->peer_in_cahtting_data->use_data->peer_type;
2218 Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
2220 if (type_of_chat == TGL_PEER_USER) {
2221 Eina_List *buddy_details_array = get_buddy_info(buddy_id);
2222 if (buddy_details_array && eina_list_count(buddy_details_array) > 0) {
2223 Eina_List *buddy_details = eina_list_nth(buddy_details_array, 0);
2224 if (buddy_details && eina_list_count(buddy_details) > 0) {
2225 int* temp_online = (int *)eina_list_nth(buddy_details, 12);
2226 int is_online = *temp_online;
2227 int* temp_last_seen = (int *)eina_list_nth(buddy_details, 13);
2228 int last_seen = *temp_last_seen;
2230 if (is_online > 0) {
2231 char status_str[256] = {0,};
2232 snprintf(status_str, sizeof(status_str) - 1, "%s", i18n_get_text("IDS_TGRAM_SBODY_ONLINE"));
2233 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2235 compare_with_current_date(last_seen, nf_it);
2239 EINA_LIST_FREE(buddy_details_array,val) {
2244 eina_list_free(buddy_details_array);
2246 } else if (type_of_chat == TGL_PEER_CHAT) {
2248 tg_chat_info_s* chat_info = get_chat_info(buddy_id);
2250 char status_str[256] = {0,};
2251 snprintf(status_str, sizeof(status_str) - 1, "Unidentified.");
2252 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2256 int user_list_size = chat_info->user_list_size;
2257 int online_members = 0;
2259 Eina_List *names_of_buddies = NULL;
2260 names_of_buddies = evas_object_data_get(ad->nf, "names_of_buddies");
2262 if (names_of_buddies != NULL){
2263 buddies_info *buddy = NULL;
2264 EINA_LIST_FREE(names_of_buddies, buddy) {
2271 names_of_buddies = NULL;
2272 evas_object_data_set(ad->nf, "names_of_buddies", NULL);
2275 for (int i = 0; i < user_list_size; i++) {
2277 int is_online = get_buddy_online_status(chat_info->chat_users[i]);
2278 if (is_online > 0) {
2282 char *buddy_full_name = NULL;
2283 int buddy_id = chat_info->chat_users[i];
2285 if (buddy_id == ad->current_user_data->user_id.id) {
2286 buddy_full_name = strdup(ad->current_user_data->print_name);
2288 buddy_full_name = get_buddy_name_from_id(buddy_id);
2291 if (buddy_full_name) {
2292 char *buddy_name = replace(buddy_full_name, '_', " ");
2294 buddies_info *buddy_info = (buddies_info*)malloc(sizeof(buddies_info));
2295 memset(buddy_info, 0, sizeof(buddies_info));
2296 buddy_info->name = buddy_name;
2297 buddy_info->id = buddy_id;
2298 names_of_buddies = eina_list_append(names_of_buddies, (void*)(buddy_info));
2300 free(buddy_full_name);
2304 evas_object_data_set(ad->nf, "names_of_buddies", (void*)names_of_buddies);
2307 if (online_members == 0) {
2308 char status_str[256] = {0,};
2309 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"));
2310 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2312 char status_str[256] = {0,};
2313 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"));
2314 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2317 char status_str[256] = {0,};
2318 snprintf(status_str, sizeof(status_str) - 1, i18n_get_text("IDS_TGRAM_BODY_PD_PARTICIPANTS"), user_list_size);
2320 char temp_status_str[512] = {0,};
2321 snprintf(temp_status_str, sizeof(temp_status_str) - 1, "%s", status_str);
2323 elm_object_item_part_text_set(nf_it, "subtitle", temp_status_str);
2327 if (chat_info->print_title) {
2328 free(chat_info->print_title);
2329 chat_info->print_title = NULL;
2331 if (chat_info->photo_path) {
2332 free(chat_info->photo_path);
2333 chat_info->photo_path = NULL;
2335 if (chat_info->title) {
2336 free(chat_info->title);
2337 chat_info->title = NULL;
2344 static Eina_Bool on_change_input_type_requested(void *data)
2346 Evas_Object* text_entry = data;
2348 LOGE("Fail to get the text_entry");
2349 return ECORE_CALLBACK_CANCEL;
2351 elm_object_focus_set(text_entry, EINA_TRUE);
2352 elm_entry_input_panel_layout_set(text_entry, ELM_INPUT_PANEL_LAYOUT_EMOTICON);
2353 elm_entry_input_panel_show(text_entry);
2355 return ECORE_CALLBACK_CANCEL;
2358 static void on_message_cancel_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2360 Evas_Object *layout = data;
2362 LOGE("Fail to get the layout");
2365 elm_object_signal_emit(layout, "hide", "bubblemessage");
2368 static void on_message_smiley_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2370 Evas_Object* text_entry = data;
2372 LOGE("Fail to get the text_entry");
2375 ecore_timer_add(0.3, on_change_input_type_requested, text_entry);
2378 static void on_message_text_entry_clicked(void *data, Evas_Object *obj, void *event_info)
2381 LOGE("Fail to get the entry");
2384 /* This Api is needed for type of keyboard: emoticon or caractor */
2385 elm_entry_input_panel_layout_set(obj, ELM_INPUT_PANEL_LAYOUT_NORMAL);
2388 static void on_message_text_entry_changed(void *data, Evas_Object *obj, void *event_info)
2390 Evas_Object *layout = data;
2393 LOGE("Fail to get the entry layout");
2396 int attach_show = (int) evas_object_data_get(layout, "is_attach_show");
2398 if (elm_entry_is_empty(obj)) {
2400 elm_object_signal_emit(layout, "show", "attach_btn");
2401 evas_object_data_set(layout, "is_attach_show", (void *) 1);
2405 elm_object_signal_emit(layout, "hide", "attach_btn");
2406 evas_object_data_set(layout, "is_attach_show", (void *) 0);
2411 Evas_Object* create_chat_genlist(Evas_Object *win)
2413 Evas_Object *genlist;
2414 Elm_Theme *theme = elm_theme_new();
2415 char edj_path[PATH_MAX] = {0, };
2416 app_get_resource(TELEGRAM_GENLIST_THEME_EDJ, edj_path, (int)PATH_MAX);
2417 elm_theme_extension_add(theme, edj_path);
2418 genlist = elm_genlist_add(win);
2419 elm_object_theme_set(genlist, theme);
2420 elm_object_style_set(genlist, "telegram/default");
2421 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2422 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
2426 void on_list_media_item_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2431 static Eina_Bool on_new_contact_message_send_cb(void *data)
2433 Evas_Object *chat_scroller = data;
2434 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2435 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2437 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2439 int unique_id = time(NULL);
2441 char unique_id_str[50];
2442 sprintf(unique_id_str, "%d", unique_id);
2445 msg.msg_id = unique_id;
2446 msg.from_id = ad->current_user_data->user_id.id;
2447 msg.date = time(NULL);
2450 msg.fwd_from_id = 0;
2451 msg.fwd_from_id = 0;
2452 msg.unique_id = unique_id;
2454 msg.message_len = 0;
2455 msg.media_type = tgl_message_media_contact;
2456 msg.media_id = strdup(unique_id_str);
2459 msg.to_id = sel_item->use_data->peer_id;
2461 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2462 msg.is_marked_for_delete = 0;
2464 char* msg_table = get_table_name_from_number(msg.to_id);
2465 create_buddy_msg_table(msg_table);
2466 insert_msg_into_db(&msg, msg_table, unique_id);
2471 char *first_name = evas_object_data_get(chat_scroller, "contact_first_name");
2472 char *last_name = evas_object_data_get(chat_scroller, "contact_last_name");
2473 char *phone_number = evas_object_data_get(chat_scroller, "contact_phone_number");
2475 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, NULL, NULL, first_name, last_name, phone_number);
2479 // send request to service
2480 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);
2482 Evas_Object *message = NULL;
2484 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2485 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2486 scroller_push_item(chat_scroller, message, 0);
2490 return ECORE_CALLBACK_CANCEL;
2494 void send_contact_message_to_buddy(void *data, char *first_name, char *last_name, char *phone_number)
2496 Evas_Object *chat_scroller = data;
2497 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2501 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2503 if (add_date_item_to_chat(data))
2506 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2508 int unique_id = get_time_stamp_in_macro();
2509 if (unique_id < 0) {
2510 unique_id = -1 * unique_id;
2512 char unique_id_str[50];
2513 sprintf(unique_id_str, "%d", unique_id);
2516 msg.msg_id = unique_id;
2517 msg.from_id = ad->current_user_data->user_id.id;
2518 msg.date = time(NULL);
2521 msg.fwd_from_id = 0;
2522 msg.fwd_from_id = 0;
2523 msg.unique_id = unique_id;
2525 msg.message_len = 0;
2526 msg.media_type = tgl_message_media_contact;
2527 msg.media_id = strdup(unique_id_str);
2530 msg.to_id = sel_item->use_data->peer_id;
2532 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2533 msg.is_marked_for_delete = 0;
2535 char* msg_table = get_table_name_from_number(msg.to_id);
2536 create_buddy_msg_table(msg_table);
2537 insert_msg_into_db(&msg, msg_table, unique_id);
2541 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, NULL, NULL, first_name, last_name, phone_number);
2545 // send request to service
2546 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);
2547 Evas_Object *message = NULL;
2548 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2549 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2550 scroller_push_item(chat_scroller, message, 0);
2554 static Eina_Bool on_new_location_message_send_cb(void *data)
2556 Evas_Object *chat_scroller = data;
2557 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2558 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2560 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2562 int unique_id = time(NULL);
2564 char unique_id_str[50];
2565 sprintf(unique_id_str, "%d", unique_id);
2568 msg.msg_id = unique_id;
2569 msg.from_id = ad->current_user_data->user_id.id;
2570 msg.date = time(NULL);
2573 msg.fwd_from_id = 0;
2574 msg.fwd_from_id = 0;
2575 msg.unique_id = unique_id;
2577 msg.message_len = 0;
2578 msg.media_type = tgl_message_media_geo;
2579 msg.media_id = strdup(unique_id_str);
2582 msg.to_id = sel_item->use_data->peer_id;
2584 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2585 msg.is_marked_for_delete = 0;
2587 char* msg_table = get_table_name_from_number(msg.to_id);
2588 create_buddy_msg_table(msg_table);
2589 insert_msg_into_db(&msg, msg_table, unique_id);
2594 char *latitude = evas_object_data_get(chat_scroller, "contact_latitude");
2595 char *longitude = evas_object_data_get(chat_scroller, "contact_longitude");
2597 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, latitude, longitude, NULL, NULL, NULL);
2601 // send request to service
2602 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);
2604 Evas_Object *message = NULL;
2606 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2607 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2608 scroller_push_item(chat_scroller, message, 0);
2611 return ECORE_CALLBACK_CANCEL;
2614 void send_location_message_to_buddy(void *data, char *latitude, char *longitude)
2616 Evas_Object *chat_scroller = data;
2617 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2621 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2623 if (add_date_item_to_chat(data))
2627 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2629 int unique_id = get_time_stamp_in_macro();
2631 unique_id = -1 * unique_id;
2633 char unique_id_str[50];
2634 sprintf(unique_id_str, "%d", unique_id);
2637 msg.msg_id = unique_id;
2638 msg.from_id = ad->current_user_data->user_id.id;
2639 msg.date = time(NULL);
2642 msg.fwd_from_id = 0;
2643 msg.fwd_from_id = 0;
2644 msg.unique_id = unique_id;
2646 msg.message_len = 0;
2647 msg.media_type = tgl_message_media_geo;
2648 msg.media_id = strdup(unique_id_str);
2651 msg.to_id = sel_item->use_data->peer_id;
2653 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2654 msg.is_marked_for_delete = 0;
2656 char* msg_table = get_table_name_from_number(msg.to_id);
2657 create_buddy_msg_table(msg_table);
2658 insert_msg_into_db(&msg, msg_table, unique_id);
2662 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, latitude, longitude, NULL, NULL, NULL);
2666 // send request to service
2667 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);
2669 Evas_Object *message = NULL;
2671 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2672 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2673 scroller_push_item(chat_scroller, message, 0);
2678 static Eina_Bool on_new_media_message_send_cb(void *data)
2680 Evas_Object *chat_scroller = data;
2681 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2682 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2684 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2686 int unique_id = time(NULL);
2688 char unique_id_str[50];
2689 sprintf(unique_id_str, "%d", unique_id);
2691 char *file_type_char = evas_object_data_get(chat_scroller, "file_type");
2692 int file_type = atoi(file_type_char);
2693 char *file_path = evas_object_data_get(chat_scroller, "file_path");
2696 msg.msg_id = unique_id;
2697 msg.from_id = ad->current_user_data->user_id.id;
2698 msg.date = time(NULL);
2701 msg.fwd_from_id = 0;
2702 msg.fwd_from_id = 0;
2703 msg.unique_id = unique_id;
2705 msg.message_len = 0;
2706 msg.media_type = file_type;
2707 msg.media_id = strdup(unique_id_str);
2710 msg.to_id = sel_item->use_data->peer_id;
2712 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2713 msg.is_marked_for_delete = 0;
2715 char* msg_table = get_table_name_from_number(msg.to_id);
2716 create_buddy_msg_table(msg_table);
2717 insert_msg_into_db(&msg, msg_table, unique_id);
2721 if (file_type == tgl_message_media_photo) {
2722 Evas_Object *img = create_image_object_from_file(file_path, chat_scroller);
2723 elm_image_object_size_get(img, &img_width, &img_height);
2725 stat(file_path, &st);
2726 media_size = st.st_size;
2727 evas_object_del(img);
2730 insert_media_info_to_db(&msg, (char *)file_path, img_width, img_height, media_size, NULL, NULL , NULL, NULL, NULL);
2732 // send request to service
2733 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);
2735 Evas_Object *message = NULL;
2736 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2737 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2738 scroller_push_item(chat_scroller, message, 0);
2741 ad->is_last_msg_changed = EINA_TRUE;
2742 return ECORE_CALLBACK_CANCEL;
2745 void send_media_message_to_buddy(void *data, const char* file_path, enum tgl_message_media_type file_type)
2747 Evas_Object *chat_scroller = data;
2748 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2752 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2753 if (add_date_item_to_chat(data))
2756 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2758 int unique_id = get_time_stamp_in_macro();
2760 unique_id = -1 * unique_id;
2762 char unique_id_str[50];
2763 sprintf(unique_id_str, "%d", unique_id);
2766 msg.msg_id = unique_id;
2767 msg.from_id = ad->current_user_data->user_id.id;
2768 msg.date = time(NULL);
2771 msg.fwd_from_id = 0;
2772 msg.fwd_from_id = 0;
2773 msg.unique_id = unique_id;
2775 msg.message_len = 0;
2776 msg.media_type = file_type;
2777 msg.media_id = strdup(unique_id_str);
2780 msg.to_id = sel_item->use_data->peer_id;
2782 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2783 msg.is_marked_for_delete = 0;
2785 char* msg_table = get_table_name_from_number(msg.to_id);
2786 create_buddy_msg_table(msg_table);
2787 insert_msg_into_db(&msg, msg_table, unique_id);
2791 if (file_type == tgl_message_media_photo) {
2792 Evas_Object* img = create_image_object_from_file(file_path, chat_scroller);
2793 elm_image_object_size_get(img, &img_width, &img_height);
2795 stat(file_path, &st);
2796 media_size = st.st_size;
2797 evas_object_del(img);
2800 insert_media_info_to_db(&msg, (char *)file_path, img_width, img_height, media_size, NULL, NULL , NULL, NULL, NULL);
2802 // send request to service
2803 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);
2804 Evas_Object *message = NULL;
2805 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2806 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2807 scroller_push_item(chat_scroller, message, 0);
2809 ad->is_last_msg_changed = EINA_TRUE;
2812 static Eina_Bool on_timer_expired(void *data)
2814 Evas_Object *scroller = data;
2816 int is_end_edge_top = 0;
2817 is_end_edge_top = (int)evas_object_data_get(scroller, "is_end_edge_top");
2820 LOGE("Cannot get the scroller");
2821 return ECORE_CALLBACK_CANCEL;
2823 //ret = scroller_show_bottom_edge(scroller);
2824 ret = scroller_show_previous_region(scroller);
2826 LOGE("Fail to show the bottom of scroller");
2829 return ECORE_CALLBACK_CANCEL;
2832 Eina_Bool load_chat_history(Evas_Object *chat_scroller)
2834 int offset_num = (int)evas_object_data_get(chat_scroller,"offset_num");
2835 if (offset_num < -TG_DBMGR_LIMITED) return EINA_FALSE;
2836 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2837 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2839 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2840 int buddy_id = sel_item->use_data->peer_id;
2841 char* tablename = get_table_name_from_number(buddy_id);
2842 Eina_List *vals = NULL;
2843 if (offset_num >= 0)
2844 vals = get_messages_from_message_table_order_by(tablename, MESSAGE_INFO_TABLE_DATE, EINA_TRUE, TG_DBMGR_LIMITED, offset_num);
2846 vals = get_messages_from_message_table_order_by(tablename, MESSAGE_INFO_TABLE_DATE, EINA_TRUE, TG_DBMGR_LIMITED + offset_num, 0);
2847 tg_message_s *message_item = NULL;
2850 // set no messages yet
2853 int row_count = eina_list_count(vals);
2854 Evas_Object *message = NULL;
2855 for (int i = row_count-1 ; i >= 0 ; i--) {
2856 message_item = eina_list_nth(vals, i);
2857 message = on_message_item_content_get_cb((void *)message_item, chat_scroller, "elm.icon.entry");
2858 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)message_item->msg_id);
2859 scroller_push_item(chat_scroller, message, 1);
2860 free_message(&message_item);
2863 // all message items are free now.
2864 eina_list_free(vals);
2868 evas_object_data_set(chat_scroller, "offset_num", (void *)(offset_num-TG_DBMGR_LIMITED));
2874 void on_gallery_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2876 if (result != APP_CONTROL_RESULT_SUCCEEDED) {
2879 Evas_Object* chat_scroller = user_data;
2880 char* file_path = NULL;
2881 char** path_arryay = NULL;
2882 int array_length = 0;
2884 char* mime_type = NULL;
2885 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2887 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
2888 if (status != APP_CONTROL_ERROR_NONE) {
2889 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay, &array_length);
2890 if (status != APP_CONTROL_ERROR_NONE) {
2892 show_toast(ad, "Unable to get the result from attach panel");
2898 status = app_control_get_mime(reply, &mime_type);
2899 if (status != APP_CONTROL_ERROR_NONE) {
2901 show_toast(ad, "Unable to get the mime type from attach panel");
2906 for (int i = 0 ; i < array_length ; i++) {
2907 file_path = strdup(path_arryay[i]);
2908 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_photo);
2914 void on_location_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2916 Evas_Object* chat_scroller = user_data;
2917 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2918 if (result != APP_CONTROL_RESULT_SUCCEEDED) {
2919 show_toast(ad, "Device does not support location feature.");
2922 char *latitude = NULL;
2923 char *longitude = NULL;
2924 app_control_get_extra_data(reply, "latitude", &latitude);
2925 app_control_get_extra_data(reply, "longitude", &longitude);
2927 if (latitude && longitude) {
2928 send_location_message_to_buddy(chat_scroller, latitude, longitude);
2930 //send_location_message_to_buddy(chat_scroller, "0.00000000000", "0.00000000000");
2931 show_toast(ad, "Unable to detect location values.");
2935 void on_video_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2937 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");
2967 for (int i = 0 ; i < array_length ; i++) {
2968 file_path = strdup(path_arryay[i]);
2969 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
2975 void on_file_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2977 if (result != APP_CONTROL_RESULT_SUCCEEDED) {
2981 Evas_Object* chat_scroller = user_data;
2982 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2983 char* file_path = NULL;
2984 char** path_arryay = NULL;
2985 int array_length = 0;
2986 app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
2988 for (int i = 0 ; i < array_length ; i++) {
2989 file_path = strdup(path_arryay[i]);
2991 // get mime type of the file
2992 char *mime_type = NULL;
2994 char *extn = strrchr(file_path, '.');
2996 extn = replace(extn, '.', "");
2999 mime_type_get_mime_type(extn, &mime_type);
3003 if (strstr(mime_type, "video") != NULL) {
3004 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3005 } else if (strstr(mime_type, "audio") != NULL) {
3006 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3007 } else if (strstr(mime_type, "image") != NULL) {
3008 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_photo);
3010 show_toast(ad, "Unsupported file.");
3013 show_toast(ad, "Unsupported file.");
3020 static void on_voice_record_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3022 if (result != APP_CONTROL_RESULT_SUCCEEDED) {
3025 Evas_Object* chat_scroller = user_data;
3027 char* file_path = NULL;
3028 char** path_arryay = NULL;
3029 int array_length = 0;
3031 char* mime_type = NULL;
3032 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3034 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
3035 if (status != APP_CONTROL_ERROR_NONE) {
3036 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay, &array_length);
3037 if (status != APP_CONTROL_ERROR_NONE) {
3039 show_toast(ad, "Unable to get the result from attach panel");
3045 status = app_control_get_mime(reply, &mime_type);
3046 if (status != APP_CONTROL_ERROR_NONE) {
3048 show_toast(ad, "Unable to get the mime type from attach panel");
3053 for (int i = 0 ; i < array_length ; i++) {
3054 file_path = strdup(path_arryay[i]);
3055 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3061 void on_contact_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3063 if (result != APP_CONTROL_RESULT_SUCCEEDED) {
3066 Evas_Object* chat_scroller = user_data;
3067 char *contact_name = NULL;
3068 char *phone_number = NULL;
3069 app_control_get_extra_data(reply, "http://tizen.org/appcontrol/data/name", &contact_name);
3070 app_control_get_extra_data(reply, "http://tizen.org/appcontrol/data/phone", &phone_number);
3073 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)
3075 switch (content_category) {
3076 case ATTACH_PANEL_CONTENT_CATEGORY_IMAGE:
3077 case ATTACH_PANEL_CONTENT_CATEGORY_CAMERA:
3078 on_gallery_app_control_reply_cb(NULL, result, result_code, user_data);
3080 case ATTACH_PANEL_CONTENT_CATEGORY_VIDEO:
3081 case ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER:
3082 on_video_app_control_reply_cb(NULL, result, result_code, user_data);
3084 case ATTACH_PANEL_CONTENT_CATEGORY_VOICE:
3085 on_voice_record_reply_cb(NULL, result, result_code, user_data);
3087 case ATTACH_PANEL_CONTENT_CATEGORY_MYFILES:
3088 case ATTACH_PANEL_CONTENT_CATEGORY_AUDIO:
3089 on_file_app_control_reply_cb(NULL, result, result_code, user_data);
3091 case ATTACH_PANEL_CONTENT_CATEGORY_CONTACT:
3092 on_contact_app_control_reply_cb(NULL, result, result_code, user_data);
3097 attach_panel_hide(attach_panel);
3100 void on_media_type_selected_cb(void *data, Evas_Object *obj, void *event_info)
3102 Evas_Object* chat_scroller = data;
3103 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3104 const char *label = elm_object_item_text_get((Elm_Object_Item *) event_info);
3105 if (strcasecmp(label, POPUP_TEXT_TAKE_GALLERY) == 0) {
3106 app_control_h app_control;
3107 int ret = app_control_create(&app_control);
3108 if (ret != APP_CONTROL_ERROR_NONE) {
3109 show_toast(ad, "Error: Can not load image picker");
3113 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3115 app_control_set_mime(app_control, "image/*");
3116 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3117 app_control_send_launch_request(app_control, &on_gallery_app_control_reply_cb, data);
3118 app_control_destroy(app_control);
3119 } else if (strcasecmp(label, POPUP_TEXT_TAKE_PHOTO) == 0) {
3120 app_control_h app_control;
3121 int ret = app_control_create(&app_control);
3122 if (ret != APP_CONTROL_ERROR_NONE) {
3123 show_toast(ad, "Error: Can not load image picker");
3126 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3127 app_control_set_mime(app_control, "image/jpg");
3128 //app_control_add_extra_data(app_control, "crop", "caller_id");
3129 app_control_send_launch_request(app_control, &on_gallery_app_control_reply_cb, data);
3130 app_control_destroy(app_control);
3131 } else if (strcasecmp(label, POPUP_TEXT_TAKE_VIDEO) == 0) {
3132 app_control_h app_control;
3133 int ret = app_control_create(&app_control);
3134 if (ret != APP_CONTROL_ERROR_NONE) {
3135 show_toast(ad, "Error: Can not load image picker");
3139 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3141 int remain_byte_size = 10485760;
3142 int request_KB_size = 0;
3144 if (remain_byte_size >= 1024) {
3145 request_KB_size = remain_byte_size / 1024;
3147 // TODO: Need to check minimum size for recording
3148 request_KB_size = 1;
3151 char recording_size[128] = {0, };
3152 snprintf(recording_size, sizeof(recording_size), "%d", request_KB_size);
3153 app_control_set_mime(app_control, "video/3gp");
3154 app_control_add_extra_data(app_control, "LIMIT", recording_size);
3155 app_control_add_extra_data(app_control, "RESOLUTION", "VGA");
3156 app_control_add_extra_data(app_control, "CALLER", "telegram");
3158 app_control_send_launch_request(app_control, &on_video_app_control_reply_cb, data);
3159 app_control_destroy(app_control);
3160 } else if (strcasecmp(label, POPUP_TEXT_TAKE_AUDIO) == 0) {
3162 app_control_h app_control;
3163 int ret = app_control_create(&app_control);
3164 if (ret != APP_CONTROL_ERROR_NONE) {
3165 show_toast(ad, "Error: Can not load image picker");
3169 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3171 int size = 10485760;
3173 int remain_byte_size = (int)size;
3174 int request_KB_size = 0;
3176 if (remain_byte_size >= 1024) {
3177 request_KB_size = remain_byte_size / 1024;
3179 // TODO: Need to check minimum size for recording
3180 request_KB_size = 1;
3183 char recording_size[128] = {0, };
3184 snprintf(recording_size, sizeof(recording_size), "%d", request_KB_size);
3185 app_control_add_extra_data(app_control, "SIZE", recording_size);
3186 app_control_set_mime(app_control, "audio/*");
3187 app_control_send_launch_request(app_control, &on_voice_record_reply_cb, data);
3188 app_control_destroy(app_control);
3190 } else if (strcasecmp(label, POPUP_TEXT_TAKE_FILE) == 0) {
3191 app_control_h app_control;
3192 int ret = app_control_create(&app_control);
3193 if (ret != APP_CONTROL_ERROR_NONE) {
3194 show_toast(ad, "Error: Can not load image picker");
3198 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3200 app_control_set_mime(app_control, "*/*");
3201 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3202 app_control_send_launch_request(app_control, &on_file_app_control_reply_cb, data);
3203 app_control_destroy(app_control);
3205 } else if (strcasecmp(label, POPUP_TEXT_TAKE_LOCATION) == 0) {
3206 app_control_h app_control;
3207 int ret = app_control_create(&app_control);
3208 if (ret != APP_CONTROL_ERROR_NONE) {
3209 show_toast(ad, "Error: Can not load location picker");
3212 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3213 //app_control_set_app_id(app_control, "com.here.tizen.maps");
3214 app_control_set_uri(app_control, "geo");
3215 app_control_send_launch_request(app_control, &on_location_app_control_reply_cb, data);
3216 app_control_destroy(app_control);
3217 } else if (strcasecmp(label, POPUP_TEXT_TAKE_CONTACT) == 0) {
3218 app_control_h app_control;
3219 int ret = app_control_create(&app_control);
3220 if (ret != APP_CONTROL_ERROR_NONE) {
3221 show_toast(ad, "Error: Can not load location picker");
3224 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3225 app_control_set_mime(app_control, "application/vnd.tizen.contact");
3226 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3227 app_control_send_launch_request(app_control, &on_contact_app_control_reply_cb, data);
3228 app_control_destroy(app_control);
3231 evas_object_del(obj);
3235 void popup_move_dropdown(Evas_Object *ctxpopup, Evas_Object *btn)
3237 Evas_Coord x, y, w , h;
3238 evas_object_geometry_get(btn, &x, &y, &w, &h);
3239 evas_object_move(ctxpopup, x + (w / 2), y + h - 50);
3242 void on_media_attach_dismissed_cb(void *data, Evas_Object *obj, void *event_info)
3244 evas_object_del(obj);
3247 static void on_media_attach_clicked(void *data, Evas_Object *obj, void *event_info)
3249 Evas_Object* chat_scroller = data;
3250 if (!chat_scroller) {
3253 appdata_s *ad = evas_object_data_get(chat_scroller, "app_data");
3257 attach_panel_h attach_panel = NULL;
3259 bool visible = false;
3261 Evas_Object* text_entry = evas_object_data_get(chat_scroller, "text_entry");
3262 elm_entry_input_panel_hide(text_entry);
3264 attach_panel = evas_object_data_get(ad->conform, "attach_panel");
3266 if (attach_panel_get_visibility(attach_panel, &visible) != ATTACH_PANEL_ERROR_NONE) {
3267 attach_panel_set_result_cb(attach_panel, _result_cb, chat_scroller);
3271 attach_panel_show(attach_panel);
3273 attach_panel_set_result_cb(attach_panel, _result_cb, chat_scroller);
3277 ret = attach_panel_create(ad->conform, &attach_panel);
3279 if (!attach_panel) {
3282 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, NULL);
3283 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA, NULL);
3284 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE, NULL);
3285 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO, NULL);
3286 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_AUDIO, NULL);
3287 //attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CONTACT, NULL);
3288 //attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_MYFILES, NULL);
3289 //attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER, NULL);
3290 attach_panel_set_result_cb(attach_panel, _result_cb, chat_scroller);
3292 attach_panel_show(attach_panel);
3293 evas_object_data_set(ad->conform, "attach_panel", attach_panel);
3298 static void on_text_message_send_pressed(void *data, Evas_Object *obj, void *event_info)
3300 elm_image_file_set(data, ui_utils_get_resource(SEND_UNPRESSED_ICON), NULL);
3303 static void on_text_message_send_unpressed(void *data, Evas_Object *obj, void *event_info)
3305 elm_image_file_set(data, ui_utils_get_resource(SEND_PRESSED_ICON), NULL);
3309 static void on_message_back_button_clicked(void *data, Evas_Object *obj, void *event_info)
3311 appdata_s *ad = data;
3315 app_nf_back_cb(data, obj, event_info);
3318 void on_user_info_button_clicked(void *data, Evas_Object *obj, void *event_info)
3320 appdata_s *ad = data;
3322 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
3323 tg_peer_info_s *user_data = sel_item->use_data;
3325 if (!sel_item || !user_data) {
3326 show_toast(ad, "Can not display user info");
3330 if (user_data->peer_type == TGL_PEER_USER) {
3331 launch_user_info_screen(ad, user_data->peer_id);
3332 } else if (user_data->peer_type == TGL_PEER_CHAT) {
3333 launch_chat_info_screen(ad, user_data->peer_id);
3339 void refresh_messaging_view(appdata_s *ad)
3344 Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
3349 Evas_Object *box_layout = NULL;
3350 Evas_Object *box = NULL;
3351 Eina_List *list = NULL;
3352 Eina_List *box_list = NULL;
3353 Evas_Object *last_item = NULL;
3355 box_layout = elm_object_content_get(scroller);
3357 LOGE("Fail to get the box into scroller");
3360 list = elm_box_children_get(box_layout);
3362 LOGE("Fail to get the list into box");
3366 box = eina_list_nth(list, 0);
3368 LOGE("Fail to get the box into box layout");
3372 box_list = elm_box_children_get(box);
3374 LOGE("Fail to get the box_list into box");
3378 last_item = eina_list_nth(box_list, eina_list_count(box_list)-1);
3380 LOGE("Fail to get the last item into box");
3385 evas_object_geometry_get(last_item, &x, &y, NULL, NULL);
3387 elm_scroller_region_show(scroller, x, y, -1, -1);
3389 eina_list_free(box_list);
3390 eina_list_free(list);
3393 static void click_user_name_cb(void *data, Evas_Object *obj, void *event_info)
3396 appdata_s *ad = evas_object_data_get(obj,"app_data");
3397 Elm_Object_Item *item = event_info;
3398 const char *clicked_name = elm_object_item_text_get(item);
3399 int peer_id = (int)elm_object_item_data_get(item);
3400 peer_with_pic_s* prev_peer_in_chatting_data = ad->peer_in_cahtting_data;
3401 user_data_with_pic_s* prev_buddy_in_chatting_data = ad->buddy_in_cahtting_data;
3403 int buddy_list_counts = eina_list_count(ad->buddy_list);
3404 for (int i = 0; i < buddy_list_counts; i++) {
3405 user_data_with_pic_s *item = eina_list_nth(ad->buddy_list, i);
3406 user_data_s* user_data = item->use_data;
3408 if (user_data->user_id.id == peer_id) {
3409 ad->buddy_in_cahtting_data = item;
3413 int peer_list_counts = eina_list_count(ad->peer_list);
3414 for (int i = 0; i < peer_list_counts; i++) {
3415 peer_with_pic_s* pic_item = eina_list_nth(ad->peer_list, i);
3416 tg_peer_info_s* item = pic_item->use_data;
3417 if (item->peer_id == peer_id) {
3418 ad->peer_in_cahtting_data = pic_item;
3423 launch_user_info_screen(ad, peer_id);
3425 ad->buddy_in_cahtting_data = prev_buddy_in_chatting_data;
3426 ad->peer_in_cahtting_data = prev_peer_in_chatting_data;
3430 static void on_expand_button_clicked(void *data, Evas_Object *obj, void *event_info)
3432 Evas_Object *expand_pic = data;
3436 appdata_s *ad = evas_object_data_get(expand_pic, "app_data");
3437 Evas_Object *parent_layout = evas_object_data_get(expand_pic, "parent_layout");
3439 Eina_Bool is_expanded = (Eina_Bool)evas_object_data_get(expand_pic, "is_expanded");
3443 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_CLOSE), NULL);
3445 Evas_Object *grp_names_bg = elm_bg_add(ad->nf);
3446 evas_object_size_hint_align_set(grp_names_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
3447 evas_object_size_hint_weight_set(grp_names_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3448 evas_object_color_set(grp_names_bg, 45, 165, 224, 229);
3449 elm_image_resizable_set(grp_names_bg, EINA_TRUE, EINA_TRUE);
3450 elm_image_fill_outside_set(grp_names_bg, EINA_TRUE);
3451 evas_object_show(grp_names_bg);
3452 elm_object_part_content_set(parent_layout, "swallow.group_detail_box,bg", grp_names_bg);
3454 Evas_Object* grp_names_lbl = elm_multibuttonentry_add(ad->nf);
3456 elm_entry_cursor_end_set(grp_names_lbl);
3457 evas_object_size_hint_weight_set(grp_names_lbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3458 evas_object_size_hint_align_set(grp_names_lbl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3459 elm_entry_single_line_set(grp_names_lbl, EINA_FALSE);
3460 elm_entry_scrollable_set(grp_names_lbl, EINA_TRUE);
3461 elm_entry_cnp_mode_set(grp_names_lbl, ELM_CNP_MODE_NO_IMAGE);
3462 elm_entry_context_menu_disabled_set(grp_names_lbl, EINA_TRUE);
3463 elm_object_focus_set(grp_names_lbl, EINA_FALSE);
3464 elm_multibuttonentry_editable_set(grp_names_lbl, EINA_FALSE);
3466 evas_object_show(grp_names_lbl);
3468 evas_object_data_set(grp_names_lbl, "app_data", ad);
3470 Eina_List *names_of_buddies = NULL;
3471 names_of_buddies = evas_object_data_get(ad->nf, "names_of_buddies");
3473 if (names_of_buddies) {
3474 int buddies_counts = eina_list_count(names_of_buddies);
3475 buddies_info *buddy_info;
3476 for(int i = 0 ; i < buddies_counts ; i++){
3477 buddy_info = (buddies_info*)eina_list_nth(names_of_buddies,i);
3478 if (buddy_info == NULL) continue;
3479 int len = strlen(buddy_info->name);
3480 char *name_str = (char *)malloc(len + 256);
3482 snprintf(name_str, len + 256, "<font=Tizen:style=Bold color=#FFFFFF align=center><font_size=40>%s</font_size></font>", buddy_info->name);
3483 Elm_Object_Item *button_item = elm_multibuttonentry_item_append(grp_names_lbl, name_str, click_user_name_cb, ad);
3484 elm_object_item_data_set(button_item, (void*)(buddy_info->id));
3490 elm_object_part_content_set(parent_layout, "swallow.group_detail_box", grp_names_lbl);
3494 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_OPEN), NULL);
3496 Evas_Object *grp_names_lbl = elm_object_part_content_get(parent_layout, "swallow.group_detail_box");
3497 if (grp_names_lbl) {
3498 evas_object_del(grp_names_lbl);
3499 grp_names_lbl = NULL;
3502 Evas_Object *grp_names_bg = elm_object_part_content_get(parent_layout, "swallow.group_detail_box,bg");
3504 evas_object_del(grp_names_bg);
3505 grp_names_bg = NULL;
3508 is_expanded = !is_expanded;
3509 evas_object_data_set(expand_pic, "is_expanded", (void *)is_expanded);
3512 static Eina_Bool _pop_cb(void *data, Elm_Object_Item *it)
3514 appdata_s *ad = data;
3515 attach_panel_h attach_panel = NULL;
3517 LOGE("Failed to get the ad");
3520 attach_panel = evas_object_data_get(ad->conform, "attach_panel");
3522 attach_panel_hide(attach_panel);
3524 Eina_List *names_of_buddies = evas_object_data_get(ad->nf, "names_of_buddies");
3526 buddies_info *buddy = NULL;
3527 EINA_LIST_FREE(names_of_buddies, buddy) {
3532 evas_object_data_set(ad->nf, "names_of_buddies", NULL);
3536 static void _edge_cb(void *data, Evas_Object *scroller, void *event_info)
3538 Evas_Object *layout = data;
3539 int is_end_edge = 0;
3540 is_end_edge = (int)evas_object_data_get(layout, "is_end_edge");
3543 elm_object_signal_emit(layout, "hide", "bubblemessage");
3544 evas_object_data_set(layout, "is_end_edge", (void *) 1);
3548 static void _edge_top_cb(void *data, Evas_Object *scroller, void *event_info)
3550 int is_end_edge_top = 0;
3551 //int offset_num = (int)evas_object_data_get(scroller, "offset_num");
3552 is_end_edge_top = (int)evas_object_data_get(scroller, "is_end_edge_top");
3554 if (!is_end_edge_top) {
3555 elm_scroller_movement_block_set(scroller,ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL );
3556 int prev_h = scroller_previous_region_get(scroller);
3557 evas_object_data_set(scroller, "previous_h",(void*)prev_h);
3558 evas_object_data_set(scroller, "is_end_edge_top",(void*)1);
3559 load_chat_history(scroller);
3560 elm_scroller_movement_block_set(scroller,ELM_SCROLLER_MOVEMENT_NO_BLOCK);
3564 static void _scroll_cb(void *data, Evas_Object *scroller, void *event_info)
3566 Evas_Object *layout = data;
3567 evas_object_data_set(layout, "is_end_edge", (void *) 0);
3568 evas_object_data_set(scroller, "is_end_edge_top", (void *) 0);
3569 // evas_object_data_set(layout, "is_end_edge_top", (void *) 0);
3572 int get_start_offset_num(char* table_name){
3573 char unknown_str[50];
3575 sprintf(unknown_str, "%d", unknown);
3577 int len_where = strlen(MESSAGE_INFO_TABLE_MARKED_FOR_DELETE) + strlen(" = ") + strlen(unknown_str) + 1;
3578 char* where_clause = (char *)malloc(len_where );
3579 snprintf(where_clause, len_where , "%s = %s", MESSAGE_INFO_TABLE_MARKED_FOR_DELETE, unknown_str);
3580 int row_counts = get_number_of_rows(table_name,where_clause);
3581 return (row_counts-TG_DBMGR_LIMITED);
3584 static Eina_Bool _load_history_cb(void *data)
3586 Evas_Object *nf = data;
3588 LOGE("Fail to get the nf");
3589 return ECORE_CALLBACK_CANCEL;
3591 Evas_Object *scroller = evas_object_data_get(nf, "chat_list");
3593 LOGE("Fail to get the scroller");
3594 return ECORE_CALLBACK_CANCEL;
3596 Evas_Object *layout = evas_object_data_get(nf, "chat_list_no_msg_text");
3598 LOGE("Fail to get the layout");
3599 return ECORE_CALLBACK_CANCEL;
3602 Eina_Bool ret = load_chat_history(scroller);
3604 LOGD("There is no message in chat room");
3606 elm_object_part_text_set(layout, "no_msg_text", i18n_get_text("IDS_TGRAM_BODY_NO_MESSAGES_HERE_YET_ING"));
3607 elm_object_signal_emit(layout, "show", "message");
3610 return ECORE_CALLBACK_CANCEL;
3613 void launch_messaging_view_cb(appdata_s* ad, int user_id)
3618 if (ad->msg_popup) {
3619 evas_object_del(ad->msg_popup);
3620 ad->msg_popup = NULL;
3623 delete_floating_button(ad);
3625 ad->current_app_state = TG_CHAT_MESSAGING_VIEW_STATE;
3626 ad->is_last_msg_changed = EINA_FALSE;
3627 send_request_for_server_connection_status(ad, ad->service_client);
3628 char edj_path[PATH_MAX] = {0, };
3629 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
3631 Evas_Object *layout = elm_layout_add(ad->nf);
3632 elm_layout_file_set(layout, edj_path, "chat_messaging_layout");
3633 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3634 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3635 evas_object_show(layout);
3637 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
3641 tg_peer_info_s* user = sel_item->use_data;
3643 /*************************** START: message list ************************************/
3645 Evas_Object* msg_box_layout = elm_layout_add(ad->nf);
3646 elm_layout_file_set(msg_box_layout, edj_path, "custom_gen_list");
3647 evas_object_size_hint_weight_set(msg_box_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3648 evas_object_size_hint_align_set(msg_box_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3649 evas_object_show(msg_box_layout);
3651 Evas_Object *list_bg = elm_image_add(msg_box_layout);
3652 evas_object_size_hint_align_set(list_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
3653 evas_object_size_hint_weight_set(list_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3654 if (ad->chat_background) {
3655 elm_image_file_set(list_bg, ad->chat_background, NULL);
3657 //elm_image_file_set(list_bg, ui_utils_get_resource(TG_CHAT_DEFAULT_BG), NULL);
3659 elm_image_resizable_set(list_bg, EINA_TRUE, EINA_TRUE);
3660 elm_image_fill_outside_set(list_bg, EINA_TRUE);
3661 evas_object_show(list_bg);
3663 elm_object_part_content_set(msg_box_layout, "swallow.gen_list.bg", list_bg);
3665 Evas_Object *chat_scroller = elm_scroller_add(ad->nf);
3666 evas_object_size_hint_weight_set(chat_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3667 evas_object_size_hint_align_set(chat_scroller, EVAS_HINT_FILL, 0.0);
3668 elm_scroller_policy_set(chat_scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
3669 evas_object_show(chat_scroller);
3670 evas_object_smart_callback_add(chat_scroller, "scroll", _scroll_cb, layout);
3672 //evas_object_smart_callback_add(chat_scroller,"scroll,drag,start", _scroll_cb, layout);
3673 evas_object_smart_callback_add(chat_scroller, "edge,bottom", _edge_cb, layout);
3675 evas_object_smart_callback_add(chat_scroller, "edge,top", _edge_top_cb, layout);
3676 evas_object_data_set(layout, "is_end_edge", (void *) 1);
3677 /*setting offset_num*/
3678 // evas_object_data_set(chat_scroller, "offset_num", (void *) 1);
3679 evas_object_data_set(chat_scroller, "prev_h", (void *) 0);
3680 /*check edge is top*/
3681 evas_object_data_set(chat_scroller, "is_end_edge_top",(void*)1);
3683 Evas_Object *align_box = elm_box_add(chat_scroller);
3685 LOGE("fail to add the box");
3689 elm_box_horizontal_set(align_box, EINA_FALSE);
3690 elm_box_align_set(align_box, 0.5, 0.0);
3691 evas_object_size_hint_weight_set(align_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3692 evas_object_size_hint_align_set(align_box, EVAS_HINT_FILL, 0.0);
3693 elm_object_content_set(chat_scroller, align_box);
3694 evas_object_show(align_box);
3696 Evas_Object *chat_box = elm_box_add(chat_scroller);
3698 LOGE("fail to add the box");
3701 elm_box_horizontal_set(chat_box, EINA_FALSE);
3702 elm_box_align_set(chat_box, 0.5, 0.0);
3703 evas_object_size_hint_weight_set(chat_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3704 evas_object_size_hint_align_set(chat_box, EVAS_HINT_FILL, 0.0);
3705 evas_object_show(chat_box);
3706 elm_box_pack_end(align_box, chat_box);
3707 evas_object_event_callback_add(chat_box, EVAS_CALLBACK_RESIZE, __resize_cb, ad);
3709 elm_object_part_content_set(msg_box_layout, "swallow.gen_list", chat_scroller);
3710 elm_object_part_content_set(layout, "swallow.chat_box", msg_box_layout);
3712 /********************** START: entry layout*******************************/
3713 Evas_Object* entry_box_layout = elm_layout_add(ad->win);
3714 if (!entry_box_layout) {
3715 LOGE("Fail to add the entry box layout");
3718 elm_layout_file_set(entry_box_layout, edj_path, "chat_entry_box");
3719 evas_object_size_hint_align_set(entry_box_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3720 evas_object_size_hint_weight_set(entry_box_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3721 evas_object_show(entry_box_layout);
3723 Evas_Object *entry_layout = elm_layout_add(entry_box_layout);
3724 if (!entry_layout) {
3725 LOGE("Fail to add the entry_layout");
3727 elm_layout_theme_set(entry_layout, "layout", "editfield", "singleline");
3729 Evas_Object* text_entry = elm_entry_add(entry_layout);
3731 LOGE("Fail to add the text_entry");
3734 elm_object_part_text_set(text_entry, "elm.guide", "Text message");
3735 elm_entry_line_wrap_set(text_entry, EINA_TRUE);
3736 elm_entry_scrollable_set(text_entry, EINA_TRUE);
3737 evas_object_size_hint_align_set(text_entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
3738 evas_object_size_hint_weight_set(text_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3739 evas_object_show(text_entry);
3740 evas_object_data_set(entry_box_layout, "is_attach_show", (void *) 1);
3742 elm_object_part_content_set(entry_layout, "elm.swallow.content", text_entry);
3743 evas_object_smart_callback_add(text_entry, "changed", on_message_text_entry_changed, entry_box_layout);
3744 evas_object_smart_callback_add(text_entry, "preedit,changed", on_message_text_entry_changed, entry_box_layout);
3745 evas_object_smart_callback_add(text_entry, "clicked", on_message_text_entry_clicked, NULL);
3746 elm_object_part_content_set(entry_box_layout, "swallow.text_entry", entry_layout);
3748 Evas_Object *attach_btn = NULL;
3749 attach_btn = elm_button_add(entry_layout);
3750 evas_object_size_hint_align_set(attach_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
3751 evas_object_size_hint_weight_set(attach_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3752 elm_object_style_set(attach_btn, "focus");
3753 evas_object_show(attach_btn);
3754 elm_object_part_content_set(entry_box_layout, "swallow,attach", attach_btn);
3755 evas_object_smart_callback_add(attach_btn, "clicked", on_media_attach_clicked, chat_scroller);
3757 /* button clicked event */
3758 elm_object_signal_callback_add(entry_box_layout, "smile", "clicked", on_message_smiley_clicked, text_entry);
3759 elm_object_signal_callback_add(entry_box_layout, "send", "clicked", on_text_message_send_clicked, chat_scroller);
3760 elm_object_part_content_set(layout, "swallow.entry", entry_box_layout);
3762 /********************** END: entry layout*******************************/
3764 /************************* START: message bubble ************************/
3766 Evas_Object* bubble_layout = elm_layout_add(ad->win);
3767 if (!bubble_layout) {
3768 LOGE("Fail to add the bubble_layout");
3771 elm_layout_file_set(bubble_layout, edj_path, "bubble_layout");
3772 evas_object_size_hint_align_set(bubble_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3773 evas_object_size_hint_weight_set(bubble_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3774 evas_object_show(bubble_layout);
3775 elm_object_signal_callback_add(bubble_layout, "cancel", "clicked", on_message_cancel_clicked, layout);
3776 elm_object_part_content_set(layout, "swallow.messagebubble", bubble_layout);
3777 evas_object_data_set(ad->nf, "main_layout", layout);
3779 /********************** END: entry message bubble*******************************/
3781 evas_object_data_set(ad->nf, "chat_list", (void*)chat_scroller);
3782 evas_object_data_set(chat_scroller, "app_data", ad);
3783 evas_object_data_set(chat_scroller, "user_id", (void*)user_id);
3784 evas_object_data_set(chat_scroller, "text_entry", (void*)text_entry);
3786 /* Set the name in title area */
3788 Elm_Object_Item *nf_it = NULL;
3791 char *temp_name = get_peer_name(sel_item->use_data);
3793 nf_it = elm_naviframe_item_push(ad->nf, temp_name, NULL, NULL, layout, NULL);
3794 evas_object_data_set(ad->nf, "navi_item", nf_it);
3798 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
3800 Evas_Object *back_btn = create_button(ad->nf, "naviframe/back_btn/default", NULL);
3801 evas_object_smart_callback_add(back_btn, "clicked", on_message_back_button_clicked, ad);
3802 elm_object_item_part_content_set(nf_it, "elm.swallow.prev_btn", back_btn);
3803 elm_naviframe_item_pop_cb_set(nf_it, _pop_cb, ad);
3805 /******************** expand ************************/
3806 if (user->peer_type == TGL_PEER_CHAT) {
3807 Evas_Object *expand_pic = NULL;
3808 expand_pic = elm_image_add(layout);
3809 evas_object_size_hint_weight_set(expand_pic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3810 evas_object_size_hint_align_set(expand_pic, EVAS_HINT_FILL, EVAS_HINT_FILL);
3811 elm_object_focus_set(expand_pic, EINA_FALSE);
3812 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_OPEN), NULL);
3813 evas_object_show(expand_pic);
3814 evas_object_data_set(expand_pic, "app_data", ad);
3815 evas_object_data_set(expand_pic, "parent_layout", layout);
3817 Eina_Bool is_expanded = EINA_FALSE;
3818 evas_object_data_set(expand_pic, "is_expanded", is_expanded);
3819 Evas_Object* expand_btn = elm_button_add(ad->layout);
3820 elm_object_style_set(expand_btn, "transparent");
3821 evas_object_smart_callback_add(expand_btn, "clicked", on_expand_button_clicked, expand_pic);
3822 elm_object_content_set(expand_btn, expand_pic);
3823 evas_object_show(expand_btn);
3824 elm_object_item_part_content_set(nf_it, "title_right_btn", expand_btn);
3827 /******************** expand ************************/
3829 Ecore_Timer *timer = NULL;
3830 timer = ecore_timer_add(0.001f, _load_history_cb, ad->nf);
3832 int buddy_id = sel_item->use_data->peer_id;
3833 char* tablename = get_table_name_from_number(buddy_id);
3834 int offset_num = get_start_offset_num(tablename);
3835 evas_object_data_set(chat_scroller, "offset_num", (void *)(offset_num));
3837 Eina_Bool res = set_all_rows_read(tablename);
3843 evas_object_data_set(ad->nf, "chat_list_no_msg_text", layout);
3845 send_request_for_marked_as_read(ad, ad->service_client, sel_item->use_data->peer_id, sel_item->use_data->peer_type);
3846 eext_object_event_callback_add(ad->nf, EEXT_CALLBACK_MORE, on_messaging_menu_button_clicked, ad);