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");
821 if (!audio_file || strlen(audio_file) <= 0 || (audio_file && strstr(audio_file, "_null_")) != NULL) {
822 Evas_Object *progressbar = evas_object_data_get(data, "progress_control");
823 Eina_Bool is_download_in_progress = (Eina_Bool)evas_object_data_get(progressbar, "is_download_in_progress");
824 char *media_id = evas_object_data_get(data, "media_id");
825 if (!is_download_in_progress && media_id) {
826 elm_object_style_set(progressbar, "pending");
827 Eina_Bool ret = send_request_for_media_downloading(ad, ad->service_client, ad->peer_in_cahtting_data->use_data->peer_id, atoll(media_id));
829 show_toast(ad, "Please check your network connection.");
836 tg_player_handler *audio_payer = evas_object_data_get(data, "tg_audio_player");
838 audio_payer = init_audio_player(audio_file, &audio_player_state_changed, &audio_player_progress_updated, data);
840 show_toast(ad, "Unsupported file.");
845 if (audio_payer->state == TG_AUDIO_PLAYER_STATE_PAUSE || audio_payer->state == TG_AUDIO_PLAYER_STATE_INTERRUPTED) {
846 play_audio_player(audio_payer);
847 } else if (audio_payer->state == TG_AUDIO_PLAYER_STATE_PLAYING) {
848 pause_audio_player(audio_payer);
854 static void on_message_play_pause_pressed(void *data, Evas_Object *obj, void *event_info)
859 Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(data, "is_play_mode");
861 elm_image_file_set(data, ui_utils_get_resource(TG_PAUSE_PRESS_ICON), NULL);
863 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_PRESS_ICON), NULL);
867 static void on_message_play_pause_unpressed(void *data, Evas_Object *obj, void *event_info)
872 Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(data, "is_play_mode");
874 elm_image_file_set(data, ui_utils_get_resource(TG_PAUSE_NORMAL_ICON), NULL);
876 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
880 static void progressbar_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
886 static Evas_Object *create_audio_progressbar(Evas_Object *parent, int duration)
888 Evas_Object *progressbar;
890 progressbar = elm_progressbar_add(parent);
891 evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, 0.5);
892 evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
893 elm_progressbar_value_set(progressbar, 0.0);
894 evas_object_event_callback_add(progressbar, EVAS_CALLBACK_DEL, progressbar_del_cb, NULL);
895 evas_object_show(progressbar);
897 elm_object_part_text_set(progressbar, "elm.text.top.left", "");
898 elm_object_part_text_set(progressbar, "elm.text.top.right", "");
900 elm_object_part_text_set(progressbar, "elm.text.bottom.right", "00:00");
906 static Evas_Object *get_audio_layout_with_play(Evas_Object *parent)
908 Evas_Object* chat_scroller = parent;
909 Evas_Object *rec_video_layout = NULL;
910 tgl_media_s *media_msg = NULL;
911 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
912 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
913 int message_id = (int)evas_object_data_get(chat_scroller, "message_id");
915 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
916 int buddy_id = sel_item->use_data->peer_id;
917 char* tablename = get_table_name_from_number(buddy_id);
919 tg_message_s* msg = get_message_from_message_table(message_id, tablename);
927 Evas_Object *parent_obj = evas_object_data_get(chat_scroller, "parent_obj"); //entry
931 media_msg = get_media_details_from_db(atoll(msg->media_id));
933 char *audio_file = media_msg->file_path;
935 char edj_path[PATH_MAX] = {0, };
936 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
937 rec_video_layout = elm_layout_add(parent);
938 elm_layout_file_set(rec_video_layout, edj_path, "bubble_audio_item_layout");
939 evas_object_size_hint_weight_set(rec_video_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
940 evas_object_size_hint_align_set(rec_video_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
941 evas_object_show(rec_video_layout);
943 /**************** play icon **********************/
944 Evas_Object* play_pause_btn = elm_button_add(parent);
945 elm_object_style_set(play_pause_btn, "transparent");
946 evas_object_size_hint_align_set(play_pause_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
947 evas_object_size_hint_weight_set(play_pause_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
949 Evas_Object* play_pause_icon = elm_image_add(parent);
950 evas_object_size_hint_align_set(play_pause_icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
951 evas_object_size_hint_weight_set(play_pause_icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
952 elm_image_file_set(play_pause_icon, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
954 elm_image_resizable_set(play_pause_icon, EINA_TRUE, EINA_TRUE);
955 evas_object_show(play_pause_icon);
956 elm_object_content_set(play_pause_btn, play_pause_icon);
958 Eina_Bool is_play_mode = EINA_TRUE;
959 evas_object_data_set(play_pause_icon, "is_play_mode", is_play_mode);
962 evas_object_data_set(play_pause_icon, "audio_file_path", strdup(audio_file));
964 evas_object_data_set(play_pause_icon, "app_data", ad);
965 evas_object_data_set(play_pause_icon, "user_id", (void*)user_id);
966 evas_object_data_set(play_pause_icon, "message_id", (void*)message_id);
967 evas_object_data_set(play_pause_icon, "media_id", strdup(msg->media_id));
969 evas_object_smart_callback_add(parent_obj, "clicked", on_message_play_pause_clicked, play_pause_icon);
970 evas_object_smart_callback_add(parent_obj, "pressed", on_message_play_pause_pressed, play_pause_icon);
971 evas_object_smart_callback_add(parent_obj, "unpressed", on_message_play_pause_unpressed, play_pause_icon);
973 evas_object_smart_callback_add(play_pause_btn, "clicked", on_message_play_pause_clicked, play_pause_icon);
974 evas_object_smart_callback_add(play_pause_btn, "pressed", on_message_play_pause_pressed, play_pause_icon);
975 evas_object_smart_callback_add(play_pause_btn, "unpressed", on_message_play_pause_unpressed, play_pause_icon);
976 elm_object_part_content_set(rec_video_layout, "swallow.play_icon", play_pause_btn);
977 /**************** play icon **********************/
979 /*************** progress bar ********************/
981 int total_duration = 0;
983 metadata_extractor_h metadata;
984 metadata_extractor_create(&metadata);
985 int ret = metadata_extractor_set_path(metadata, audio_file);
987 ret = metadata_extractor_get_metadata(metadata, METADATA_DURATION, &value);
988 metadata_extractor_destroy(metadata);
991 total_duration = atoi(value);
995 total_duration = media_msg->doc_duration;
996 //convert into milli secs
997 total_duration = 1000 * total_duration;
1000 Evas_Object *progress = create_audio_progressbar(parent, total_duration);
1002 evas_object_data_set(parent_obj, "play_pause_icon", play_pause_icon);
1003 evas_object_data_set(parent_obj, "progress_bar", progress);
1005 elm_object_part_content_set(rec_video_layout, "swallow.progress_icon", progress);
1007 evas_object_data_set(play_pause_icon, "progress_control", (void*)progress);
1008 Eina_Bool is_download_in_progress = EINA_FALSE;
1009 evas_object_data_set(progress, "is_download_in_progress", (void*)is_download_in_progress);
1011 /*************** progress bar ********************/
1017 msg->message = NULL;
1019 if (msg->media_id) {
1020 free(msg->media_id);
1021 msg->media_id = NULL;
1024 free_media_details(media_msg);
1026 return rec_video_layout;
1030 static Evas_Object * item_provider(void *data, Evas_Object *entry, const char *item)
1033 if (strcmp(item, "itemprovider")) {
1036 Evas_Object *layout = NULL;
1037 Evas_Object* chat_scroller = data;
1038 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1039 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1040 int message_id = (int)evas_object_data_get(entry, "message_id");
1042 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1043 int buddy_id = sel_item->use_data->peer_id;
1045 char* tablename = get_table_name_from_number(buddy_id);
1046 tg_message_s* msg = get_message_from_message_table(message_id, tablename);
1051 Evas_Object *item_to_display = NULL;
1052 tgl_media_s *media_msg = NULL;
1053 if (msg->media_type == tgl_message_media_photo || msg->media_type == tgl_message_media_document) {
1055 Eina_Bool is_blur_image = EINA_FALSE;
1056 char* img_path = NULL;
1058 img_path = get_media_path_from_db(atoll(msg->media_id));
1059 if (access(img_path, F_OK) == -1) {
1061 tmp = ui_utils_get_resource(BLUR_BG);
1062 img_path = strdup(tmp);
1063 is_blur_image = EINA_TRUE;
1066 if (msg->media_type == tgl_message_media_document) {
1067 media_msg = get_media_details_from_db(atoll(msg->media_id));
1069 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1070 if (img_path == NULL || strlen(img_path) == 0) {
1071 img_path = strdup(ui_utils_get_resource(TG_VIDEO_ICON));
1074 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1079 img_path = strdup(ui_utils_get_resource(TG_AUDIO_ICON));
1081 char* media_file = get_media_path_from_db(atoll(msg->media_id));
1082 if (!media_file || (media_file && !strcmp(media_file, "_null_")) || (media_file && strlen(media_file) <= 0) || (media_file && access(media_file, F_OK) == -1)) {
1083 is_blur_image = EINA_TRUE;
1086 if (media_file && strstr(media_file, ".webp") != NULL) {
1087 is_blur_image = EINA_FALSE;
1093 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1095 evas_object_data_set(chat_scroller, "parent_obj", (void*)entry);
1096 item_to_display = get_audio_layout_with_play(chat_scroller);
1098 } else if (msg->out) {
1100 if (msg->media_type == tgl_message_media_photo) {
1101 item_to_display = get_image_from_path(img_path, entry);
1104 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1105 char *thumb_path = get_video_thumb_path_from_db(media_msg->media_id);
1107 thumb_path = strdup(ui_utils_get_resource(BLUR_BG));
1109 item_to_display = get_media_layout_with_play(thumb_path, entry, EINA_TRUE);
1112 item_to_display = get_image_from_path(img_path, entry);
1113 elm_image_animated_set(item_to_display, EINA_TRUE);
1114 elm_image_animated_play_set(item_to_display, EINA_TRUE);
1119 if (!is_blur_image) {
1120 if (msg->media_type == tgl_message_media_photo) {
1121 item_to_display = get_image_from_path(img_path, entry);
1122 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1124 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1126 //item_to_display = get_media_layout_with_play(img_path, entry, EINA_TRUE);
1127 char *thumb_path = get_video_thumb_path_from_db(media_msg->media_id);
1129 thumb_path = strdup(ui_utils_get_resource(BLUR_BG));
1131 item_to_display = get_media_layout_with_play(thumb_path, entry, EINA_TRUE);
1135 if (media_msg && media_msg->mime_type && strstr(media_msg->mime_type, "webp") != NULL) {
1136 char *tmp = ui_utils_get_resource(BROKEN_IMAGE);
1137 //item_to_display = get_image_from_path(img_path, entry);
1139 item_to_display = get_image_from_path(tmp, entry);
1140 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1142 item_to_display = get_image_from_path(img_path, entry);
1143 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1144 elm_image_animated_set(item_to_display, EINA_TRUE);
1145 elm_image_animated_play_set(item_to_display, EINA_TRUE);
1151 char edj_path[PATH_MAX] = {0, };
1152 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1153 Evas_Object *rec_img_layout = elm_layout_add(entry);
1154 elm_layout_file_set(rec_img_layout, edj_path, "bubble_received_media_layout");
1155 evas_object_size_hint_weight_set(rec_img_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1156 evas_object_size_hint_align_set(rec_img_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1157 evas_object_show(rec_img_layout);
1158 Evas_Object *img_item = NULL;
1161 if (msg->media_type == tgl_message_media_photo) {
1162 img_item = get_image_from_path(img_path, entry);
1164 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)) {
1165 //img_item = get_media_layout_with_play(img_path, entry, EINA_FALSE);
1166 char *thumb_path = get_video_thumb_path_from_db(media_msg->media_id);
1168 thumb_path = strdup(ui_utils_get_resource(BLUR_BG));
1170 img_item = get_media_layout_with_play(thumb_path, entry, EINA_FALSE);
1173 img_item = get_image_from_path(img_path, entry);
1176 elm_object_part_content_set(rec_img_layout, "swallow.image_item", img_item);
1179 if (msg->media_type == tgl_message_media_photo) {
1180 media_size = get_image_size(atoll(msg->media_id));
1182 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1183 media_size = get_media_size_from_db(atoll(msg->media_id));
1184 } else if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1185 media_size = get_media_size_from_db(atoll(msg->media_id));
1187 media_size = get_media_size_from_db(atoll(msg->media_id));
1191 int media_size_kbs = (media_size < (1 << 20)); //convert to kbs
1192 char media_size_str[10] = { 0, };
1193 if (media_size_kbs > 0) {
1194 sprintf(media_size_str, "%dKB", media_size_kbs);
1196 sprintf(media_size_str, "%dB", media_size);
1200 Evas_Object *size_btn = elm_layout_add(entry);
1201 elm_layout_file_set(size_btn, edj_path, "download_btn");
1202 elm_object_part_text_set(size_btn, "size", media_size_str);
1203 evas_object_size_hint_weight_set(size_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1204 evas_object_size_hint_align_set(size_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
1205 evas_object_show(size_btn);
1207 evas_object_data_set(size_btn, "image_state", "ready_to_download");
1209 Evas_Object* download_img = get_image_from_path(ui_utils_get_resource(MEDIA_DOWNLOAD_ICON), entry);
1210 elm_object_part_content_set(size_btn, "download_image", download_img);
1212 elm_object_part_content_set(rec_img_layout, "swallow.download_btn", size_btn);
1214 evas_object_data_set(entry, "image_object", (void*)img_item);
1215 evas_object_data_set(entry, "button_object", (void*)size_btn);
1216 evas_object_data_set(entry, "image_size", (void*)strdup(media_size_str));
1218 //ad->loaded_msg_list = eina_list_append(ad->loaded_msg_list, entry);
1220 item_to_display = rec_img_layout;
1228 // delete media details
1232 evas_object_data_set(entry, "chat_list", (void*)chat_scroller);
1233 evas_object_data_set(entry, "message_id", (void*)message_id);
1234 evas_object_data_set(entry, "app_data", (void*)ad);
1237 if (msg->media_type == tgl_message_media_photo) {
1238 evas_object_data_set(entry, "media_type", (void*)strdup("image"));
1239 } else if (msg->media_type == tgl_message_media_geo) {
1240 evas_object_data_set(entry, "media_type", (void*)strdup("location"));
1242 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1243 evas_object_data_set(entry, "media_type", (void*)strdup("video"));
1244 } else if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1245 evas_object_data_set(entry, "media_type", (void*)strdup("audio"));
1247 if (media_msg && media_msg->mime_type && strstr(media_msg->mime_type, "webp") != NULL) {
1248 evas_object_data_set(entry, "media_type", (void*)strdup("image"));
1250 evas_object_data_set(entry, "media_type", (void*)strdup("animated_gif"));
1254 evas_object_data_set(entry, "media_id", (void*)strdup(msg->media_id));
1255 if (item_to_display) {
1256 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1257 layout = item_to_display;
1259 char edj_path[PATH_MAX] = {0, };
1260 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1261 layout = elm_layout_add(entry);
1262 elm_layout_file_set(layout, edj_path, "chat_image_layout");
1263 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1264 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1265 evas_object_show(layout);
1267 Evas_Object *rounded_layout = elm_layout_add(entry);
1268 elm_layout_file_set(rounded_layout, edj_path, "rounded_corner_layout");
1269 evas_object_size_hint_weight_set(rounded_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1270 evas_object_size_hint_align_set(rounded_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1271 evas_object_show(rounded_layout);
1272 elm_object_part_content_set(rounded_layout, "content", item_to_display);
1274 elm_object_part_content_set(layout, "swallow.chat_image", rounded_layout);
1275 evas_object_smart_callback_add(entry, "clicked", on_media_chat_item_clicked, NULL);
1281 msg->message = NULL;
1284 if (msg->media_id) {
1285 free(msg->media_id);
1286 msg->media_id = NULL;
1290 free_media_details(media_msg);
1295 static void __resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1297 appdata_s *ad = data;
1298 Evas_Object *layout = NULL;
1299 Evas_Object *chat_scroller = NULL;
1301 layout = evas_object_data_get(ad->nf, "main_layout");
1302 chat_scroller = evas_object_data_get(ad->nf, "chat_list");
1304 int is_end_edge = 0;
1305 is_end_edge = (int)evas_object_data_get(layout, "is_end_edge");
1306 int is_end_edge_top = 0;
1307 is_end_edge_top = (int)evas_object_data_get(chat_scroller, "is_end_edge_top");
1310 ret = scroller_show_bottom_edge(chat_scroller);
1312 LOGE("Fail to show the bottom of scroller");
1315 if (is_end_edge_top)
1316 scroller_show_previous_region(chat_scroller);
1319 //static void free_data_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1324 static void set_string_data(Evas_Object *obj, const char *key, const char *data)
1329 previous_str = evas_object_data_del(obj, key);
1331 //evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, free_data_cb);
1336 new_data = strdup(data);
1342 evas_object_data_set(obj, key, new_data);
1343 //evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, free_data_cb, new_data);
1347 static void _create_image_item(tg_message_s *msg, Evas_Object *entry, char *image, int size)
1349 char* img_path = NULL;
1351 Evas_Object *img_item = NULL;
1356 img_path = get_video_thumb_path_from_db(atoll(msg->media_id));
1357 if (img_path == NULL || (img_path && strlen(img_path) == 0) || (img_path && strstr(img_path, "_null_") != NULL)) {
1358 img_path = get_media_path_from_db(atoll(msg->media_id));
1359 if (access(img_path, F_OK) == -1)
1364 if (strstr(img_path, ".webp") != NULL) {
1365 char *tmp = ui_utils_get_resource(BROKEN_IMAGE);
1366 LOGE("broken image(webp): %s", tmp);
1368 //img_item = get_image_from_path(img_path, entry);
1369 img_item = get_image_from_path(tmp, entry);
1372 if (msg->media_type == tgl_message_media_document) {
1373 char key[256] = {0, };
1374 snprintf(key, sizeof(key), "%d", msg->msg_id);
1375 img_item = get_gif_image_from_path(img_path, entry, key);
1377 img_item = get_image_from_path(img_path, entry);
1379 elm_image_object_size_get(img_item, &w, &h);
1380 entry_h = (318 * h) / w;
1387 snprintf(image, size - 1, "<item size=318x%d vsize=full href=itemprovider></item>", entry_h);
1390 Evas_Object *on_message_item_content_get_cb(void *data, Evas_Object *obj, const char *part)
1393 ERR("Invalid Parameter.");
1397 if (strcmp(part, "elm.icon.entry"))
1400 Evas_Object *entry = NULL;
1401 Evas_Object *layout = NULL;
1403 char edj_path[PATH_MAX] = {0, };
1404 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1406 tg_message_s *msg = (tg_message_s*)data;
1407 Evas_Object *chat_scroller = obj;
1408 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1410 Evas_Object *nomsg_layout = evas_object_data_get(ad->nf, "chat_list_no_msg_text");
1412 elm_object_signal_emit(nomsg_layout, "hide", "message");
1414 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1415 evas_object_data_set(chat_scroller, "message_id", msg->msg_id);
1417 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1418 int buddy_id = sel_item->use_data->peer_id;
1420 char* tablename = get_table_name_from_number(buddy_id);
1422 //Eina_Bool is_blur_image = EINA_FALSE;
1428 update_msg_into_db(msg, tablename);
1429 ad->is_last_msg_changed = EINA_TRUE;
1439 if (msg->service == 2) {
1440 layout = elm_layout_add(obj);
1441 elm_layout_file_set(layout, edj_path, "chat_date_item");
1442 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1443 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1444 evas_object_show(layout);
1446 // convert date from string to int
1447 char *date_str = msg->message;
1448 int date_num = atoi(date_str);
1450 // convert date format
1451 time_t t = date_num;
1452 char *format = NULL;
1453 format = "%a, %e %b %Y";
1456 (void) localtime_r(&t, <);
1458 if (strftime(res, sizeof(res), format, <) == 0) {
1459 (void) fprintf(stderr, "strftime(3): cannot format supplied "
1460 "date/time into buffer of size %u "
1462 sizeof(res), format);
1465 elm_object_part_text_set(layout, "elm.text", res);
1467 } else if (msg->service == 1) {
1468 layout = elm_layout_add(obj);
1469 elm_layout_file_set(layout, edj_path, "chat_service_item_box");
1470 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1471 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1472 evas_object_show(layout);
1474 elm_object_part_text_set(layout, "elm.text", msg->message);
1479 if (msg->media_type != tgl_message_media_none) {
1480 entry = elm_entry_add(obj);
1481 elm_entry_editable_set(entry, EINA_FALSE);
1482 elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
1483 elm_entry_single_line_set(entry, EINA_TRUE);
1484 elm_entry_input_panel_enabled_set(entry, EINA_FALSE);
1486 entry = elm_label_add(obj);
1489 evas_object_data_set(entry, "message_id", (void*)msg->msg_id);
1490 // evas_object_data_set(entry, "chat_list", (void*)chat_scroller);
1492 layout = elm_layout_add(obj);
1495 elm_layout_file_set(layout, edj_path, "entry,send,layout");
1496 elm_object_style_set(entry, "sentmessage1");
1497 //sender_name = replace(ad->current_user_data->print_name, '_', " ");
1499 elm_layout_file_set(layout, edj_path, "entry,receive,layout");
1500 elm_object_style_set(entry, "readmessage1");
1502 /* If you need to get the name, you need this code */
1504 char *sender_name = NULL;
1505 if (sel_item->use_data->peer_type == TGL_PEER_USER) {
1506 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1507 } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
1508 int from_id = msg->from_id;
1509 // get name of buddy
1510 char* buddy_name = get_buddy_name_from_id(from_id);
1512 sender_name = replace(buddy_name, '_', " ");
1516 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1521 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1522 elm_object_part_content_set(layout, "elm.swallow.content", entry);
1523 evas_object_show(layout);
1525 evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1526 evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
1527 evas_object_show(entry);
1528 // To be handled for group chat
1529 Eina_Strbuf *buf = eina_strbuf_new();
1530 char *caption = NULL;
1531 LOGD("entry media type is %d", msg->media_type);
1532 if (msg->media_type == tgl_message_media_none) {
1533 char *temp_msg = replace(msg->message, '\n', "<br>");
1534 elm_object_part_text_set(entry, "elm.text", temp_msg);
1535 //eina_strbuf_append(buf, temp_msg);
1536 //elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1537 eina_strbuf_free(buf);
1538 edje_object_signal_emit(elm_layout_edje_get(entry), "label,changed", "*");
1539 edje_object_message_signal_process(elm_layout_edje_get(entry));
1541 } else if (msg->media_type == tgl_message_media_photo || msg->media_type == tgl_message_media_document) {
1542 elm_entry_item_provider_append(entry, item_provider, chat_scroller);
1544 LOGD("media id[%s]", msg->media_id);
1545 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1547 LOGD("file path[%s]", media_msg->file_path);
1548 if (media_msg && media_msg->caption && strlen(media_msg->caption) > 0) {
1549 caption = strdup(media_msg->caption);
1550 LOGD("caption[%s]", caption);
1554 if (media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1555 if (ad->target_direction == TELEGRAM_TARGET_DIRECTION_PORTRAIT || ad->target_direction == TELEGRAM_TARGET_DIRECTION_PORTRAIT_INVERSE) {
1556 eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1558 eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1561 } else if (media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1562 eina_strbuf_append(buf, "<item size=318x200 vsize=full hsize=full href=itemprovider></item>");
1564 char image[256] = {0,};
1565 _create_image_item(msg, entry, image, sizeof(image));
1566 eina_strbuf_append(buf, image);
1571 if (media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1572 eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1573 } else if (media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1574 eina_strbuf_append(buf, "<item size=318x200 vsize=full hsize=full href=itemprovider></item>");
1576 char image[256] = {0,};
1577 _create_image_item(msg, entry, image, sizeof(image));
1578 eina_strbuf_append(buf, image);
1582 free_media_details(media_msg);
1583 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1584 eina_strbuf_free(buf);
1585 } else if (msg->media_type == tgl_message_media_geo) {
1587 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1589 char loc_url[4*256] = {0,};
1591 if (media_msg->caption && strlen(media_msg->caption) > 0) {
1592 caption = strdup(media_msg->caption);
1594 snprintf(loc_url, sizeof(loc_url), "https://maps.google.com/?q=%s,%s", media_msg->latitude, media_msg->longitude);
1595 char temp_msg[4*256] = {0,};
1596 snprintf(temp_msg, sizeof(temp_msg), "<font=Tizen:style=Normal|underline color=#0000FF align=left><font_size=15>%s</font_size></font>", loc_url);
1597 eina_strbuf_append(buf, temp_msg);
1598 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1599 eina_strbuf_free(buf);
1602 free_media_details(media_msg);
1603 set_string_data(entry, "media_type", "location");
1604 set_string_data(entry, "location_url", loc_url);
1605 evas_object_smart_callback_add(entry, "clicked", on_media_chat_item_clicked, NULL);
1607 } else if (msg->media_type == tgl_message_media_contact) {
1609 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1612 if (media_msg->caption && strlen(media_msg->caption) > 0) {
1613 caption = strdup(media_msg->caption);
1615 char temp_msg[4*256] = {0,};
1616 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);
1617 eina_strbuf_append(buf, temp_msg);
1618 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1619 eina_strbuf_free(buf);
1620 free_media_details(media_msg);
1623 } else if (msg->media_type == tgl_message_media_unsupported) {
1625 } else if (msg->media_type == tgl_message_media_photo_encr) {
1627 } else if (msg->media_type == tgl_message_media_document_encr) {
1632 ad->loaded_msg_list = eina_list_append(ad->loaded_msg_list, entry);
1635 LOGD("caption is (%s)", caption);
1639 time_t t = msg->date;
1640 const char *format = "%I:%M %p";
1643 (void) localtime_r(&t, <);
1645 if (strftime(res, sizeof(res), format, <) == 0) {
1646 (void) fprintf(stderr, "strftime(3): cannot format supplied "
1647 "date/time into buffer of size %u "
1649 sizeof(res), format);
1652 char time_str[20] = {0,};
1653 snprintf(time_str, sizeof(time_str) - 1, "%s", res);
1654 elm_object_part_text_set(entry, "time", time_str);
1656 Evas_Object *status_obj;
1657 status_obj = elm_icon_add(entry);
1658 evas_object_size_hint_weight_set(status_obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1659 evas_object_size_hint_align_set(status_obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
1661 if (msg->msg_state == TG_MESSAGE_STATE_SENDING) {
1662 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENDING_ICON), NULL);
1663 elm_object_signal_emit(entry, "status_on", "status");
1664 } else if (msg->msg_state == TG_MESSAGE_STATE_SENT) {
1665 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENT_ICON), NULL);
1666 elm_object_signal_emit(entry, "status_on", "status");
1667 } else if (msg->msg_state == TG_MESSAGE_STATE_DELIVERED) {
1668 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_DELIVERED_ICON), NULL);
1669 elm_object_signal_emit(entry, "status_on", "status");
1670 } else if (msg->msg_state == TG_MESSAGE_STATE_RECEIVED) {
1671 elm_object_signal_emit(entry, "status_off", "status");
1672 } else if (msg->msg_state == TG_MESSAGE_STATE_FAILED) {
1673 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_FAILED_ICON), NULL);
1674 elm_object_signal_emit(entry, "status_on", "status");
1675 } else if (msg->msg_state == TG_MESSAGE_STATE_READ) {
1676 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_READ_ICON), NULL);
1677 elm_object_signal_emit(entry, "status_on", "status");
1678 } else if (msg->msg_state == TG_MESSAGE_STATE_UNKNOWN) {
1679 elm_object_signal_emit(entry, "status_off", "status");
1682 elm_object_part_content_set(entry, "status_icon", status_obj);
1683 evas_object_show(status_obj);
1689 void on_text_message_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
1694 void on_text_message_received_from_buddy(appdata_s* ad, long long message_id, int type_of_chat)
1696 peer_with_pic_s* pic_peer_item = NULL;
1697 tg_peer_info_s* peer_item = NULL;
1698 char* tablename = NULL;
1699 tg_message_s* msg = NULL;
1700 Evas_Object* chat_scroller = NULL;
1701 Evas_Object *message = NULL;
1706 pic_peer_item = ad->peer_in_cahtting_data;
1710 peer_item = pic_peer_item->use_data;
1714 tablename = get_table_name_from_number(peer_item->peer_id);
1718 msg = get_message_from_message_table(message_id, tablename);
1720 LOGE("received msg is not found in DB");
1725 chat_scroller = evas_object_data_get(ad->nf, "chat_list");
1729 peer_item->last_msg_id = msg->msg_id;
1730 peer_item->last_msg_date = msg->date;
1731 insert_or_update_peer_into_database(peer_item);
1733 Evas_Object *layout = evas_object_data_get(ad->nf, "main_layout");
1735 int is_end_edge = (int) evas_object_data_get(layout, "is_end_edge");
1737 Evas_Object *bubble_layout = NULL;
1738 bubble_layout = elm_object_part_content_get(layout, "swallow.messagebubble");
1740 int user_id = (int) evas_object_data_get(chat_scroller, "user_id");
1741 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1742 char *sender_name = NULL;
1743 if (sel_item->use_data->peer_type == TGL_PEER_USER) {
1744 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1745 } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
1746 int from_id = msg->from_id;
1747 // get name of buddy
1748 char* buddy_name = get_buddy_name_from_id(from_id);
1750 sender_name = replace(buddy_name, '_', " ");
1754 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1757 elm_object_part_text_set(bubble_layout, "text_name", sender_name);
1758 elm_object_part_text_set(bubble_layout, "text_message", msg->message);
1759 elm_object_signal_emit(layout, "show", "bubblemessage");
1764 message = on_message_item_content_get_cb((void *)msg, chat_scroller, "elm.icon.entry");
1765 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)message_id);
1766 scroller_push_item(chat_scroller, message, 0);
1768 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1769 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1771 send_request_for_marked_as_read(ad, ad->service_client, sel_item->use_data->peer_id, sel_item->use_data->peer_type);
1772 ad->is_last_msg_changed = EINA_TRUE;
1773 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
1779 static void media_file_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1782 str = evas_object_data_del(obj, data);
1787 void on_media_download_completed(appdata_s* ad, int buddy_id, long long media_id, const char *file_path, const char *caption)
1789 LOGE("Media download17");
1794 Evas_Object* entry = NULL;
1795 LOGE("Media download18");
1796 EINA_LIST_FOREACH(ad->loaded_msg_list, l, entry) {
1797 LOGE("Media download19");
1799 LOGE("Media download20");
1803 char* media_type_str = evas_object_data_get(entry, "media_type");
1804 char* media_id_str = evas_object_data_get(entry, "media_id");
1805 char* media_size_str = evas_object_data_get(entry, "image_size");
1806 Evas_Object *img_item = evas_object_data_get(entry, "image_object");
1807 Evas_Object *size_btn = evas_object_data_get(entry, "button_object");
1809 if (!media_id_str) {
1813 long long lmedia_id = atoll(media_id_str);
1815 if (media_id != lmedia_id) {
1818 if (img_item || (media_type_str && strstr(media_type_str, "audio") != NULL)) {
1821 if (file_path && strstr(file_path, "failed_to_load") != NULL) {
1823 if (media_type_str && (strstr(media_type_str, "audio") != NULL)) {
1824 Evas_Object *play_pause_icon = evas_object_data_get(entry, "play_pause_icon");
1825 Evas_Object *progressbar = evas_object_data_get(entry, "progress_bar");
1826 evas_object_data_set(progressbar, "is_download_in_progress", (void *)EINA_FALSE);
1827 set_string_data(play_pause_icon, "audio_file_path", NULL);
1828 elm_object_style_set(progressbar, "default");
1834 Evas_Object* progress = elm_object_part_content_get(size_btn, "download_image");
1836 evas_object_del(progress);
1838 Evas_Object* download_img = get_image_from_path(ui_utils_get_resource(MEDIA_DOWNLOAD_ICON), size_btn);
1839 elm_object_part_content_set(size_btn, "download_image", download_img);
1840 evas_object_data_set(size_btn, "image_state", "ready_to_download");
1841 char temp_msg[256] = {0,};
1842 snprintf(temp_msg, sizeof(temp_msg), "<font=Tizen:style=Bold color=#008000 align=center><font_size=30>%s</font_size></font>", media_size_str);
1843 elm_object_text_set(size_btn, temp_msg);
1848 if (media_type_str && (strstr(media_type_str, "audio") != NULL)) {
1850 Evas_Object *play_pause_icon = evas_object_data_get(entry, "play_pause_icon");
1851 Evas_Object *progressbar = evas_object_data_get(entry, "progress_bar");
1852 evas_object_data_set(progressbar, "is_download_in_progress", (void *)EINA_FALSE);
1853 elm_object_style_set(progressbar, "default");
1855 set_string_data(play_pause_icon, "audio_file_path", file_path);
1857 metadata_extractor_h metadata;
1858 metadata_extractor_create(&metadata);
1859 int ret = metadata_extractor_set_path(metadata, file_path);
1861 ret = metadata_extractor_get_metadata(metadata, METADATA_DURATION, &value);
1862 metadata_extractor_destroy(metadata);
1866 duration = atoi(value);
1870 elm_object_part_text_set(progressbar, "elm.text.top.left", "");
1871 elm_object_part_text_set(progressbar, "elm.text.top.right", "");
1877 evas_object_del(size_btn);
1880 if (media_type_str && (strstr(media_type_str, "video") != NULL)) {
1881 Evas_Object* play_img = get_video_paly_icon(img_item);
1882 //Evas_Object* play_img = get_image_from_path(ui_utils_get_resource(MEDIA_PLAY_ICON), img_item);
1883 elm_object_part_content_set(img_item, "swallow.play_btn", play_img);
1884 } else if (media_type_str && strstr(media_type_str, "image") != NULL) {
1885 img_item = get_image_from_path(file_path, entry);
1887 elm_image_object_size_get(img_item, &w, &h);
1888 entry_h = (318 * h) / w;
1889 Eina_Strbuf *buf = eina_strbuf_new();
1890 char image[256] = {0,};
1891 snprintf(image, sizeof(image) - 1, "<item size=318x%d vsize=full href=itemprovider></item>", entry_h);
1892 eina_strbuf_append(buf, image);
1893 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1894 eina_strbuf_free(buf);
1896 } else if (media_type_str && strstr(media_type_str, "animated_gif") != NULL) {
1898 int msg_id = (int) evas_object_data_get(entry, "message_id");
1899 char key[256] = {0, };
1900 snprintf(key, sizeof(key), "%d", msg_id);
1902 img_item = get_gif_image_from_path(file_path, entry, key);
1903 //elm_image_animated_set(img_item, EINA_TRUE);
1904 //elm_image_animated_play_set(img_item, EINA_TRUE);
1906 elm_image_object_size_get(img_item, &w, &h);
1907 entry_h = (318 * h) / w;
1908 Eina_Strbuf *buf = eina_strbuf_new();
1909 char image[256] = {0,};
1910 snprintf(image, sizeof(image) - 1, "<item size=318x%d vsize=full href=itemprovider></item>", entry_h);
1911 eina_strbuf_append(buf, image);
1912 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1913 eina_strbuf_free(buf);
1918 LOGE("Media download36");
1921 //elm_object_part_content_set(comp_img_layout, "swallow.chat_send_image", image);
1923 void on_video_thumb_download_completed(appdata_s* ad, int buddy_id, long long media_id, const char* file_path, const char *caption)
1925 on_media_download_completed(ad, buddy_id, media_id, file_path, caption);
1928 void on_text_message_state_changed(appdata_s* ad, tg_message_s *msg, int type_of_chat)
1934 Evas_Object* entry = NULL;
1935 EINA_LIST_FOREACH(ad->loaded_msg_list, l, entry) {
1938 int message_id = (int)evas_object_data_get(entry, "message_id");
1939 if (message_id == msg->msg_id || message_id == msg->unique_id) {
1941 set_string_data(entry, "media_id", msg->media_id);
1942 evas_object_data_set(entry, "message_id", (void*)message_id);
1944 Evas_Object* status_obj = elm_object_part_content_get(entry, "status_icon");
1946 if (msg->msg_state == TG_MESSAGE_STATE_SENDING) {
1947 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENDING_ICON), NULL);
1948 elm_object_signal_emit(entry, "status_on", "status");
1949 } else if (msg->msg_state == TG_MESSAGE_STATE_SENT) {
1950 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENT_ICON), NULL);
1951 elm_object_signal_emit(entry, "status_on", "status");
1952 } else if (msg->msg_state == TG_MESSAGE_STATE_DELIVERED) {
1953 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_DELIVERED_ICON), NULL);
1954 elm_object_signal_emit(entry, "status_on", "status");
1955 } else if (msg->msg_state == TG_MESSAGE_STATE_RECEIVED) {
1956 elm_object_signal_emit(entry, "status_off", "status");
1957 } else if (msg->msg_state == TG_MESSAGE_STATE_FAILED) {
1958 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_FAILED_ICON), NULL);
1959 elm_object_signal_emit(entry, "status_on", "status");
1960 } else if (msg->msg_state == TG_MESSAGE_STATE_READ) {
1961 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_READ_ICON), NULL);
1962 elm_object_signal_emit(entry, "status_on", "status");
1963 } else if (msg->msg_state == TG_MESSAGE_STATE_UNKNOWN) {
1964 elm_object_signal_emit(entry, "status_off", "status");
1972 Eina_Bool add_date_item_to_chat(void *data)
1974 Evas_Object *chat_scroller = data;
1975 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1976 Eina_Bool ret = EINA_FALSE;
1980 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1984 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1986 char* msg_table = get_table_name_from_number(sel_item->use_data->peer_id);
1987 create_buddy_msg_table(msg_table);
1988 int msg_id = insert_current_date_to_table(msg_table);
1996 // send request to service
1997 Evas_Object *message = NULL;
1998 tg_message_s* msg = get_message_from_message_table(msg_id, msg_table);
1999 message = on_message_item_content_get_cb((void *)msg, chat_scroller, "elm.icon.entry");
2000 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)msg_id);
2001 scroller_push_item(chat_scroller, message, 0);
2003 ad->is_last_msg_changed = EINA_TRUE;
2012 static Eina_Bool on_new_text_message_send_cb(void *data)
2014 Evas_Object *chat_scroller = data;
2015 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2016 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2017 Evas_Object *text_entry = evas_object_data_get(chat_scroller, "text_entry");
2019 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2021 const char* text_to_send = elm_entry_entry_get(text_entry);
2022 if (!text_to_send || (strlen(text_to_send) == 0))
2023 return ECORE_CALLBACK_CANCEL;
2025 int unique_id = get_time_stamp_in_macro();
2026 if (unique_id < 0) {
2027 unique_id = -1 * unique_id;
2030 msg.msg_id = unique_id;
2031 msg.from_id = ad->current_user_data->user_id.id;
2032 msg.date = time(NULL);
2035 msg.fwd_from_id = 0;
2036 msg.fwd_from_id = 0;
2038 msg.message = (char *)text_to_send;
2039 msg.message_len = strlen(text_to_send);
2040 msg.media_type = tgl_message_media_none;
2044 msg.to_id = sel_item->use_data->peer_id;
2046 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2047 msg.is_marked_for_delete = 0;
2048 char* msg_table = get_table_name_from_number(msg.to_id);
2049 create_buddy_msg_table(msg_table);
2050 insert_msg_into_db(&msg, msg_table, unique_id);
2053 peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
2054 if (pic_peer_item) {
2055 tg_peer_info_s* peer_item = pic_peer_item->use_data;
2056 // update peer table
2058 peer_item->last_msg_id = msg.msg_id;
2059 peer_item->last_msg_date = msg.date;
2060 insert_or_update_peer_into_database(peer_item);
2064 // send request to service
2065 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);
2067 Evas_Object *message = NULL;
2069 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2070 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)unique_id);
2071 scroller_push_item(chat_scroller, message, 0);
2073 elm_entry_entry_set(text_entry, "");
2074 ad->is_last_msg_changed = EINA_TRUE;
2075 return ECORE_CALLBACK_CANCEL;
2078 static void on_text_message_send_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2080 Evas_Object* chat_scroller = data;
2081 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2085 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2086 Evas_Object* text_entry = evas_object_data_get(chat_scroller, "text_entry");
2089 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2090 const char* text_to_send = elm_entry_markup_to_utf8(elm_object_text_get(text_entry));
2091 if (!text_to_send || (strlen(text_to_send) == 0))
2094 if (add_date_item_to_chat(data))
2097 int unique_id = get_time_stamp_in_macro();
2099 unique_id = -1 * unique_id;
2102 msg.msg_id = unique_id;
2103 msg.from_id = ad->current_user_data->user_id.id;
2104 msg.date = time(NULL);
2107 msg.fwd_from_id = 0;
2108 msg.fwd_from_id = 0;
2110 msg.message = (char *)text_to_send;
2111 msg.message_len = strlen(text_to_send);
2112 msg.media_type = tgl_message_media_none;
2116 msg.to_id = sel_item->use_data->peer_id;
2118 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2119 msg.is_marked_for_delete = 0;
2120 char* msg_table = get_table_name_from_number(msg.to_id);
2121 create_buddy_msg_table(msg_table);
2122 insert_msg_into_db(&msg, msg_table, unique_id);
2125 peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
2126 if (pic_peer_item) {
2127 tg_peer_info_s* peer_item = pic_peer_item->use_data;
2129 peer_item->last_msg_id = msg.msg_id;
2130 peer_item->last_msg_date = msg.date;
2131 insert_or_update_peer_into_database(peer_item);
2135 // send request to service
2136 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);
2137 Evas_Object *message = NULL;
2138 Evas_Object *layout = evas_object_data_get(ad->nf, "main_layout");
2139 evas_object_data_set(layout, "is_end_edge", (void *) 1);
2141 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2142 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)unique_id);
2143 scroller_push_item(chat_scroller, message, 0);
2145 elm_entry_entry_set(text_entry, "");
2146 ad->is_last_msg_changed = EINA_TRUE;
2149 void on_user_status_changed(appdata_s* ad, char* status)
2154 Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
2155 char status_str[256] = {0,};
2156 snprintf(status_str, sizeof(status_str) - 1, "%s", status);
2157 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2160 static void compare_with_current_date(int rtime, Elm_Object_Item *nf_it)
2162 char time_str[256] = {0,};
2163 time_t local_t = time(NULL);
2169 diff_sec = local_t - rtime;
2170 diff_min = diff_sec / 60;
2171 diff_hour = diff_min / 60;
2172 diff_day = diff_hour / 24;
2173 LOGD("different : day : %d, hour = %d, min = %d, sec = %d", diff_day, diff_hour, diff_min, diff_sec);
2175 if (diff_day > 30) {
2176 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_LONG_TIME_AGO_ABB"));
2181 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_WITHIN_A_MONTH_ABB"));
2185 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_WITHIN_A_WEEK_ABB"));
2189 if (diff_hour > 1) {
2190 snprintf(time_str, sizeof(time_str) - 1, i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_PD_HOURS_AGO_ABB"), diff_hour);
2194 if (diff_hour == 1) {
2195 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_1_HOUR_AGO_ABB"));
2199 snprintf(time_str, sizeof(time_str) - 1, i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_PD_MINUTES_AGO_ABB"), diff_min);
2202 if (diff_min == 1) {
2203 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_1_MINUTE_AGO_ABB"));
2206 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_RECENTLY_ABB"));
2209 elm_object_item_part_text_set(nf_it, "subtitle", time_str);
2212 void on_user_presence_state_changed(appdata_s* ad, int buddy_id)
2216 int type_of_chat = ad->peer_in_cahtting_data->use_data->peer_type;
2217 Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
2219 if (type_of_chat == TGL_PEER_USER) {
2220 Eina_List *buddy_details_array = get_buddy_info(buddy_id);
2221 if (buddy_details_array && eina_list_count(buddy_details_array) > 0) {
2222 Eina_List *buddy_details = eina_list_nth(buddy_details_array, 0);
2223 if (buddy_details && eina_list_count(buddy_details) > 0) {
2224 int* temp_online = (int *)eina_list_nth(buddy_details, 12);
2225 int is_online = *temp_online;
2226 int* temp_last_seen = (int *)eina_list_nth(buddy_details, 13);
2227 int last_seen = *temp_last_seen;
2229 if (is_online > 0) {
2230 char status_str[256] = {0,};
2231 snprintf(status_str, sizeof(status_str) - 1, "%s", i18n_get_text("IDS_TGRAM_SBODY_ONLINE"));
2232 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2234 compare_with_current_date(last_seen, nf_it);
2238 EINA_LIST_FREE(buddy_details_array,val) {
2243 eina_list_free(buddy_details_array);
2245 } else if (type_of_chat == TGL_PEER_CHAT) {
2247 tg_chat_info_s* chat_info = get_chat_info(buddy_id);
2249 char status_str[256] = {0,};
2250 snprintf(status_str, sizeof(status_str) - 1, "Unidentified.");
2251 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2255 int user_list_size = chat_info->user_list_size;
2256 int online_members = 0;
2258 Eina_List *names_of_buddies = NULL;
2259 names_of_buddies = evas_object_data_get(ad->nf, "names_of_buddies");
2261 if (names_of_buddies != NULL){
2262 buddies_info *buddy = NULL;
2263 EINA_LIST_FREE(names_of_buddies, buddy) {
2270 names_of_buddies = NULL;
2271 evas_object_data_set(ad->nf, "names_of_buddies", NULL);
2274 for (int i = 0; i < user_list_size; i++) {
2276 int is_online = get_buddy_online_status(chat_info->chat_users[i]);
2277 if (is_online > 0) {
2281 char *buddy_full_name = NULL;
2282 int buddy_id = chat_info->chat_users[i];
2284 if (buddy_id == ad->current_user_data->user_id.id) {
2285 buddy_full_name = strdup(ad->current_user_data->print_name);
2287 buddy_full_name = get_buddy_name_from_id(buddy_id);
2290 if (buddy_full_name) {
2291 char *buddy_name = replace(buddy_full_name, '_', " ");
2293 buddies_info *buddy_info = (buddies_info*)malloc(sizeof(buddies_info));
2294 memset(buddy_info, 0, sizeof(buddies_info));
2295 buddy_info->name = buddy_name;
2296 buddy_info->id = buddy_id;
2297 names_of_buddies = eina_list_append(names_of_buddies, (void*)(buddy_info));
2299 free(buddy_full_name);
2303 evas_object_data_set(ad->nf, "names_of_buddies", (void*)names_of_buddies);
2306 if (online_members == 0) {
2307 char status_str[256] = {0,};
2308 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"));
2309 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2311 char status_str[256] = {0,};
2312 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"));
2313 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2316 char status_str[256] = {0,};
2317 snprintf(status_str, sizeof(status_str) - 1, i18n_get_text("IDS_TGRAM_BODY_PD_PARTICIPANTS"), user_list_size);
2319 char temp_status_str[512] = {0,};
2320 snprintf(temp_status_str, sizeof(temp_status_str) - 1, "%s", status_str);
2322 elm_object_item_part_text_set(nf_it, "subtitle", temp_status_str);
2326 if (chat_info->print_title) {
2327 free(chat_info->print_title);
2328 chat_info->print_title = NULL;
2330 if (chat_info->photo_path) {
2331 free(chat_info->photo_path);
2332 chat_info->photo_path = NULL;
2334 if (chat_info->title) {
2335 free(chat_info->title);
2336 chat_info->title = NULL;
2343 static Eina_Bool on_change_input_type_requested(void *data)
2345 Evas_Object* text_entry = data;
2347 LOGE("Fail to get the text_entry");
2348 return ECORE_CALLBACK_CANCEL;
2350 elm_object_focus_set(text_entry, EINA_TRUE);
2351 elm_entry_input_panel_layout_set(text_entry, ELM_INPUT_PANEL_LAYOUT_EMOTICON);
2352 elm_entry_input_panel_show(text_entry);
2354 return ECORE_CALLBACK_CANCEL;
2357 static void on_message_cancel_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2359 Evas_Object *layout = data;
2361 LOGE("Fail to get the layout");
2364 elm_object_signal_emit(layout, "hide", "bubblemessage");
2367 static void on_message_smiley_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2369 Evas_Object* text_entry = data;
2371 LOGE("Fail to get the text_entry");
2374 ecore_timer_add(0.3, on_change_input_type_requested, text_entry);
2377 static void on_message_text_entry_clicked(void *data, Evas_Object *obj, void *event_info)
2380 LOGE("Fail to get the entry");
2383 /* This Api is needed for type of keyboard: emoticon or caractor */
2384 elm_entry_input_panel_layout_set(obj, ELM_INPUT_PANEL_LAYOUT_NORMAL);
2387 static void on_message_text_entry_changed(void *data, Evas_Object *obj, void *event_info)
2389 Evas_Object *layout = data;
2392 LOGE("Fail to get the entry layout");
2395 int attach_show = (int) evas_object_data_get(layout, "is_attach_show");
2397 if (elm_entry_is_empty(obj)) {
2399 elm_object_signal_emit(layout, "show", "attach_btn");
2400 evas_object_data_set(layout, "is_attach_show", (void *) 1);
2404 elm_object_signal_emit(layout, "hide", "attach_btn");
2405 evas_object_data_set(layout, "is_attach_show", (void *) 0);
2410 Evas_Object* create_chat_genlist(Evas_Object *win)
2412 Evas_Object *genlist;
2413 Elm_Theme *theme = elm_theme_new();
2414 char edj_path[PATH_MAX] = {0, };
2415 app_get_resource(TELEGRAM_GENLIST_THEME_EDJ, edj_path, (int)PATH_MAX);
2416 elm_theme_extension_add(theme, edj_path);
2417 genlist = elm_genlist_add(win);
2418 elm_object_theme_set(genlist, theme);
2419 elm_object_style_set(genlist, "telegram/default");
2420 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2421 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
2425 void on_list_media_item_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2430 static Eina_Bool on_new_contact_message_send_cb(void *data)
2432 Evas_Object *chat_scroller = data;
2433 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2434 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2436 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2438 int unique_id = time(NULL);
2440 char unique_id_str[50];
2441 sprintf(unique_id_str, "%d", unique_id);
2444 msg.msg_id = unique_id;
2445 msg.from_id = ad->current_user_data->user_id.id;
2446 msg.date = time(NULL);
2449 msg.fwd_from_id = 0;
2450 msg.fwd_from_id = 0;
2451 msg.unique_id = unique_id;
2453 msg.message_len = 0;
2454 msg.media_type = tgl_message_media_contact;
2455 msg.media_id = strdup(unique_id_str);
2458 msg.to_id = sel_item->use_data->peer_id;
2460 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2461 msg.is_marked_for_delete = 0;
2463 char* msg_table = get_table_name_from_number(msg.to_id);
2464 create_buddy_msg_table(msg_table);
2465 insert_msg_into_db(&msg, msg_table, unique_id);
2470 char *first_name = evas_object_data_get(chat_scroller, "contact_first_name");
2471 char *last_name = evas_object_data_get(chat_scroller, "contact_last_name");
2472 char *phone_number = evas_object_data_get(chat_scroller, "contact_phone_number");
2474 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, NULL, NULL, first_name, last_name, phone_number);
2478 // send request to service
2479 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);
2481 Evas_Object *message = NULL;
2483 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2484 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2485 scroller_push_item(chat_scroller, message, 0);
2489 return ECORE_CALLBACK_CANCEL;
2493 void send_contact_message_to_buddy(void *data, char *first_name, char *last_name, char *phone_number)
2495 Evas_Object *chat_scroller = data;
2496 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2500 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2502 if (add_date_item_to_chat(data))
2505 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2507 int unique_id = get_time_stamp_in_macro();
2508 if (unique_id < 0) {
2509 unique_id = -1 * unique_id;
2511 char unique_id_str[50];
2512 sprintf(unique_id_str, "%d", unique_id);
2515 msg.msg_id = unique_id;
2516 msg.from_id = ad->current_user_data->user_id.id;
2517 msg.date = time(NULL);
2520 msg.fwd_from_id = 0;
2521 msg.fwd_from_id = 0;
2522 msg.unique_id = unique_id;
2524 msg.message_len = 0;
2525 msg.media_type = tgl_message_media_contact;
2526 msg.media_id = strdup(unique_id_str);
2529 msg.to_id = sel_item->use_data->peer_id;
2531 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2532 msg.is_marked_for_delete = 0;
2534 char* msg_table = get_table_name_from_number(msg.to_id);
2535 create_buddy_msg_table(msg_table);
2536 insert_msg_into_db(&msg, msg_table, unique_id);
2540 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, NULL, NULL, first_name, last_name, phone_number);
2544 // send request to service
2545 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);
2546 Evas_Object *message = NULL;
2547 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2548 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2549 scroller_push_item(chat_scroller, message, 0);
2553 static Eina_Bool on_new_location_message_send_cb(void *data)
2555 Evas_Object *chat_scroller = data;
2556 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2557 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2559 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2561 int unique_id = time(NULL);
2563 char unique_id_str[50];
2564 sprintf(unique_id_str, "%d", unique_id);
2567 msg.msg_id = unique_id;
2568 msg.from_id = ad->current_user_data->user_id.id;
2569 msg.date = time(NULL);
2572 msg.fwd_from_id = 0;
2573 msg.fwd_from_id = 0;
2574 msg.unique_id = unique_id;
2576 msg.message_len = 0;
2577 msg.media_type = tgl_message_media_geo;
2578 msg.media_id = strdup(unique_id_str);
2581 msg.to_id = sel_item->use_data->peer_id;
2583 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2584 msg.is_marked_for_delete = 0;
2586 char* msg_table = get_table_name_from_number(msg.to_id);
2587 create_buddy_msg_table(msg_table);
2588 insert_msg_into_db(&msg, msg_table, unique_id);
2593 char *latitude = evas_object_data_get(chat_scroller, "contact_latitude");
2594 char *longitude = evas_object_data_get(chat_scroller, "contact_longitude");
2596 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, latitude, longitude, NULL, NULL, NULL);
2600 // send request to service
2601 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);
2603 Evas_Object *message = NULL;
2605 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2606 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2607 scroller_push_item(chat_scroller, message, 0);
2610 return ECORE_CALLBACK_CANCEL;
2613 void send_location_message_to_buddy(void *data, char *latitude, char *longitude)
2615 Evas_Object *chat_scroller = data;
2616 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2620 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2622 if (add_date_item_to_chat(data))
2626 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2628 int unique_id = get_time_stamp_in_macro();
2630 unique_id = -1 * unique_id;
2632 char unique_id_str[50];
2633 sprintf(unique_id_str, "%d", unique_id);
2636 msg.msg_id = unique_id;
2637 msg.from_id = ad->current_user_data->user_id.id;
2638 msg.date = time(NULL);
2641 msg.fwd_from_id = 0;
2642 msg.fwd_from_id = 0;
2643 msg.unique_id = unique_id;
2645 msg.message_len = 0;
2646 msg.media_type = tgl_message_media_geo;
2647 msg.media_id = strdup(unique_id_str);
2650 msg.to_id = sel_item->use_data->peer_id;
2652 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2653 msg.is_marked_for_delete = 0;
2655 char* msg_table = get_table_name_from_number(msg.to_id);
2656 create_buddy_msg_table(msg_table);
2657 insert_msg_into_db(&msg, msg_table, unique_id);
2661 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, latitude, longitude, NULL, NULL, NULL);
2665 // send request to service
2666 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);
2668 Evas_Object *message = NULL;
2670 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2671 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2672 scroller_push_item(chat_scroller, message, 0);
2677 static Eina_Bool on_new_media_message_send_cb(void *data)
2679 Evas_Object *chat_scroller = data;
2680 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2681 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2683 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2685 int unique_id = time(NULL);
2687 char unique_id_str[50];
2688 sprintf(unique_id_str, "%d", unique_id);
2690 char *file_type_char = evas_object_data_get(chat_scroller, "file_type");
2691 int file_type = atoi(file_type_char);
2692 char *file_path = evas_object_data_get(chat_scroller, "file_path");
2695 msg.msg_id = unique_id;
2696 msg.from_id = ad->current_user_data->user_id.id;
2697 msg.date = time(NULL);
2700 msg.fwd_from_id = 0;
2701 msg.fwd_from_id = 0;
2702 msg.unique_id = unique_id;
2704 msg.message_len = 0;
2705 msg.media_type = file_type;
2706 msg.media_id = strdup(unique_id_str);
2709 msg.to_id = sel_item->use_data->peer_id;
2711 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2712 msg.is_marked_for_delete = 0;
2714 char* msg_table = get_table_name_from_number(msg.to_id);
2715 create_buddy_msg_table(msg_table);
2716 insert_msg_into_db(&msg, msg_table, unique_id);
2720 if (file_type == tgl_message_media_photo) {
2721 Evas_Object *img = create_image_object_from_file(file_path, chat_scroller);
2722 elm_image_object_size_get(img, &img_width, &img_height);
2724 stat(file_path, &st);
2725 media_size = st.st_size;
2726 evas_object_del(img);
2729 insert_media_info_to_db(&msg, (char *)file_path, img_width, img_height, media_size, NULL, NULL , NULL, NULL, NULL);
2731 // send request to service
2732 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);
2734 Evas_Object *message = NULL;
2735 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2736 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2737 scroller_push_item(chat_scroller, message, 0);
2740 ad->is_last_msg_changed = EINA_TRUE;
2741 return ECORE_CALLBACK_CANCEL;
2744 void send_media_message_to_buddy(void *data, const char* file_path, enum tgl_message_media_type file_type)
2746 Evas_Object *chat_scroller = data;
2747 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2751 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2752 if (add_date_item_to_chat(data))
2755 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2757 int unique_id = get_time_stamp_in_macro();
2759 unique_id = -1 * unique_id;
2761 char unique_id_str[50];
2762 sprintf(unique_id_str, "%d", unique_id);
2765 msg.msg_id = unique_id;
2766 msg.from_id = ad->current_user_data->user_id.id;
2767 msg.date = time(NULL);
2770 msg.fwd_from_id = 0;
2771 msg.fwd_from_id = 0;
2772 msg.unique_id = unique_id;
2774 msg.message_len = 0;
2775 msg.media_type = file_type;
2776 msg.media_id = strdup(unique_id_str);
2779 msg.to_id = sel_item->use_data->peer_id;
2781 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2782 msg.is_marked_for_delete = 0;
2784 char* msg_table = get_table_name_from_number(msg.to_id);
2785 create_buddy_msg_table(msg_table);
2786 insert_msg_into_db(&msg, msg_table, unique_id);
2790 if (file_type == tgl_message_media_photo) {
2791 Evas_Object* img = create_image_object_from_file(file_path, chat_scroller);
2792 elm_image_object_size_get(img, &img_width, &img_height);
2794 stat(file_path, &st);
2795 media_size = st.st_size;
2796 evas_object_del(img);
2799 insert_media_info_to_db(&msg, (char *)file_path, img_width, img_height, media_size, NULL, NULL , NULL, NULL, NULL);
2801 // send request to service
2802 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);
2803 Evas_Object *message = NULL;
2804 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2805 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2806 scroller_push_item(chat_scroller, message, 0);
2808 ad->is_last_msg_changed = EINA_TRUE;
2811 static Eina_Bool on_timer_expired(void *data)
2813 Evas_Object *scroller = data;
2815 int is_end_edge_top = 0;
2816 is_end_edge_top = (int)evas_object_data_get(scroller, "is_end_edge_top");
2819 LOGE("Cannot get the scroller");
2820 return ECORE_CALLBACK_CANCEL;
2822 //ret = scroller_show_bottom_edge(scroller);
2823 ret = scroller_show_previous_region(scroller);
2825 LOGE("Fail to show the bottom of scroller");
2828 return ECORE_CALLBACK_CANCEL;
2831 Eina_Bool load_chat_history(Evas_Object *chat_scroller)
2833 int offset_num = (int)evas_object_data_get(chat_scroller,"offset_num");
2834 if (offset_num < -TG_DBMGR_LIMITED) return EINA_FALSE;
2835 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2836 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2838 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2839 int buddy_id = sel_item->use_data->peer_id;
2840 char* tablename = get_table_name_from_number(buddy_id);
2841 Eina_List *vals = NULL;
2842 if (offset_num >= 0)
2843 vals = get_messages_from_message_table_order_by(tablename, MESSAGE_INFO_TABLE_DATE, EINA_TRUE, TG_DBMGR_LIMITED, offset_num);
2845 vals = get_messages_from_message_table_order_by(tablename, MESSAGE_INFO_TABLE_DATE, EINA_TRUE, TG_DBMGR_LIMITED + offset_num, 0);
2846 tg_message_s *message_item = NULL;
2849 // set no messages yet
2852 int row_count = eina_list_count(vals);
2853 Evas_Object *message = NULL;
2854 for (int i = row_count-1 ; i >= 0 ; i--) {
2855 message_item = eina_list_nth(vals, i);
2856 message = on_message_item_content_get_cb((void *)message_item, chat_scroller, "elm.icon.entry");
2857 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)message_item->msg_id);
2858 scroller_push_item(chat_scroller, message, 1);
2859 free_message(&message_item);
2862 // all message items are free now.
2863 eina_list_free(vals);
2867 evas_object_data_set(chat_scroller, "offset_num", (void *)(offset_num-TG_DBMGR_LIMITED));
2873 void on_gallery_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2875 if (result != APP_CONTROL_RESULT_SUCCEEDED) {
2878 Evas_Object* chat_scroller = user_data;
2879 char* file_path = NULL;
2880 char** path_arryay = NULL;
2881 int array_length = 0;
2883 char* mime_type = NULL;
2884 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2886 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
2887 if (status != APP_CONTROL_ERROR_NONE) {
2888 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay, &array_length);
2889 if (status != APP_CONTROL_ERROR_NONE) {
2891 show_toast(ad, "Unable to get the result from attach panel");
2897 status = app_control_get_mime(reply, &mime_type);
2898 if (status != APP_CONTROL_ERROR_NONE) {
2900 show_toast(ad, "Unable to get the mime type from attach panel");
2905 for (int i = 0 ; i < array_length ; i++) {
2906 file_path = strdup(path_arryay[i]);
2907 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_photo);
2913 void on_location_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2915 Evas_Object* chat_scroller = user_data;
2916 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2917 if (result != APP_CONTROL_RESULT_SUCCEEDED) {
2918 show_toast(ad, "Device does not support location feature.");
2921 char *latitude = NULL;
2922 char *longitude = NULL;
2923 app_control_get_extra_data(reply, "latitude", &latitude);
2924 app_control_get_extra_data(reply, "longitude", &longitude);
2926 if (latitude && longitude) {
2927 send_location_message_to_buddy(chat_scroller, latitude, longitude);
2929 //send_location_message_to_buddy(chat_scroller, "0.00000000000", "0.00000000000");
2930 show_toast(ad, "Unable to detect location values.");
2934 void on_video_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2936 if (result != APP_CONTROL_RESULT_SUCCEEDED) {
2940 Evas_Object* chat_scroller = user_data;
2941 char* file_path = NULL;
2942 char** path_arryay = NULL;
2943 int array_length = 0;
2945 char* mime_type = NULL;
2946 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2948 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
2949 if (status != APP_CONTROL_ERROR_NONE) {
2950 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay, &array_length);
2951 if (status != APP_CONTROL_ERROR_NONE) {
2953 show_toast(ad, "Unable to get the result from attach panel");
2959 status = app_control_get_mime(reply, &mime_type);
2960 if (status != APP_CONTROL_ERROR_NONE) {
2962 show_toast(ad, "Unable to get the mime type from attach panel");
2966 for (int i = 0 ; i < array_length ; i++) {
2967 file_path = strdup(path_arryay[i]);
2968 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
2974 void on_file_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2976 if (result != APP_CONTROL_RESULT_SUCCEEDED) {
2980 Evas_Object* chat_scroller = user_data;
2981 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2982 char* file_path = NULL;
2983 char** path_arryay = NULL;
2984 int array_length = 0;
2985 app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
2987 for (int i = 0 ; i < array_length ; i++) {
2988 file_path = strdup(path_arryay[i]);
2990 // get mime type of the file
2991 char *mime_type = NULL;
2993 char *extn = strrchr(file_path, '.');
2995 extn = replace(extn, '.', "");
2998 mime_type_get_mime_type(extn, &mime_type);
3002 if (strstr(mime_type, "video") != NULL) {
3003 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3004 } else if (strstr(mime_type, "audio") != NULL) {
3005 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3006 } else if (strstr(mime_type, "image") != NULL) {
3007 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_photo);
3009 show_toast(ad, "Unsupported file.");
3012 show_toast(ad, "Unsupported file.");
3019 static void on_voice_record_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3021 if (result != APP_CONTROL_RESULT_SUCCEEDED) {
3024 Evas_Object* chat_scroller = user_data;
3026 char* file_path = NULL;
3027 char** path_arryay = NULL;
3028 int array_length = 0;
3030 char* mime_type = NULL;
3031 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3033 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
3034 if (status != APP_CONTROL_ERROR_NONE) {
3035 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay, &array_length);
3036 if (status != APP_CONTROL_ERROR_NONE) {
3038 show_toast(ad, "Unable to get the result from attach panel");
3044 status = app_control_get_mime(reply, &mime_type);
3045 if (status != APP_CONTROL_ERROR_NONE) {
3047 show_toast(ad, "Unable to get the mime type from attach panel");
3052 for (int i = 0 ; i < array_length ; i++) {
3053 file_path = strdup(path_arryay[i]);
3054 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3060 void on_contact_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3062 if (result != APP_CONTROL_RESULT_SUCCEEDED) {
3065 Evas_Object* chat_scroller = user_data;
3066 char *contact_name = NULL;
3067 char *phone_number = NULL;
3068 app_control_get_extra_data(reply, "http://tizen.org/appcontrol/data/name", &contact_name);
3069 app_control_get_extra_data(reply, "http://tizen.org/appcontrol/data/phone", &phone_number);
3072 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)
3074 switch (content_category) {
3075 case ATTACH_PANEL_CONTENT_CATEGORY_IMAGE:
3076 case ATTACH_PANEL_CONTENT_CATEGORY_CAMERA:
3077 on_gallery_app_control_reply_cb(NULL, result, result_code, user_data);
3079 case ATTACH_PANEL_CONTENT_CATEGORY_VIDEO:
3080 case ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER:
3081 on_video_app_control_reply_cb(NULL, result, result_code, user_data);
3083 case ATTACH_PANEL_CONTENT_CATEGORY_VOICE:
3084 on_voice_record_reply_cb(NULL, result, result_code, user_data);
3086 case ATTACH_PANEL_CONTENT_CATEGORY_MYFILES:
3087 case ATTACH_PANEL_CONTENT_CATEGORY_AUDIO:
3088 on_file_app_control_reply_cb(NULL, result, result_code, user_data);
3090 case ATTACH_PANEL_CONTENT_CATEGORY_CONTACT:
3091 on_contact_app_control_reply_cb(NULL, result, result_code, user_data);
3096 attach_panel_hide(attach_panel);
3099 void on_media_type_selected_cb(void *data, Evas_Object *obj, void *event_info)
3101 Evas_Object* chat_scroller = data;
3102 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3103 const char *label = elm_object_item_text_get((Elm_Object_Item *) event_info);
3104 if (strcasecmp(label, POPUP_TEXT_TAKE_GALLERY) == 0) {
3105 app_control_h app_control;
3106 int ret = app_control_create(&app_control);
3107 if (ret != APP_CONTROL_ERROR_NONE) {
3108 show_toast(ad, "Error: Can not load image picker");
3112 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3114 app_control_set_mime(app_control, "image/*");
3115 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3116 app_control_send_launch_request(app_control, &on_gallery_app_control_reply_cb, data);
3117 app_control_destroy(app_control);
3118 } else if (strcasecmp(label, POPUP_TEXT_TAKE_PHOTO) == 0) {
3119 app_control_h app_control;
3120 int ret = app_control_create(&app_control);
3121 if (ret != APP_CONTROL_ERROR_NONE) {
3122 show_toast(ad, "Error: Can not load image picker");
3125 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3126 app_control_set_mime(app_control, "image/jpg");
3127 //app_control_add_extra_data(app_control, "crop", "caller_id");
3128 app_control_send_launch_request(app_control, &on_gallery_app_control_reply_cb, data);
3129 app_control_destroy(app_control);
3130 } else if (strcasecmp(label, POPUP_TEXT_TAKE_VIDEO) == 0) {
3131 app_control_h app_control;
3132 int ret = app_control_create(&app_control);
3133 if (ret != APP_CONTROL_ERROR_NONE) {
3134 show_toast(ad, "Error: Can not load image picker");
3138 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3140 int remain_byte_size = 10485760;
3141 int request_KB_size = 0;
3143 if (remain_byte_size >= 1024) {
3144 request_KB_size = remain_byte_size / 1024;
3146 // TODO: Need to check minimum size for recording
3147 request_KB_size = 1;
3150 char recording_size[128] = {0, };
3151 snprintf(recording_size, sizeof(recording_size), "%d", request_KB_size);
3152 app_control_set_mime(app_control, "video/3gp");
3153 app_control_add_extra_data(app_control, "LIMIT", recording_size);
3154 app_control_add_extra_data(app_control, "RESOLUTION", "VGA");
3155 app_control_add_extra_data(app_control, "CALLER", "telegram");
3157 app_control_send_launch_request(app_control, &on_video_app_control_reply_cb, data);
3158 app_control_destroy(app_control);
3159 } else if (strcasecmp(label, POPUP_TEXT_TAKE_AUDIO) == 0) {
3161 app_control_h app_control;
3162 int ret = app_control_create(&app_control);
3163 if (ret != APP_CONTROL_ERROR_NONE) {
3164 show_toast(ad, "Error: Can not load image picker");
3168 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3170 int size = 10485760;
3172 int remain_byte_size = (int)size;
3173 int request_KB_size = 0;
3175 if (remain_byte_size >= 1024) {
3176 request_KB_size = remain_byte_size / 1024;
3178 // TODO: Need to check minimum size for recording
3179 request_KB_size = 1;
3182 char recording_size[128] = {0, };
3183 snprintf(recording_size, sizeof(recording_size), "%d", request_KB_size);
3184 app_control_add_extra_data(app_control, "SIZE", recording_size);
3185 app_control_set_mime(app_control, "audio/*");
3186 app_control_send_launch_request(app_control, &on_voice_record_reply_cb, data);
3187 app_control_destroy(app_control);
3189 } else if (strcasecmp(label, POPUP_TEXT_TAKE_FILE) == 0) {
3190 app_control_h app_control;
3191 int ret = app_control_create(&app_control);
3192 if (ret != APP_CONTROL_ERROR_NONE) {
3193 show_toast(ad, "Error: Can not load image picker");
3197 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3199 app_control_set_mime(app_control, "*/*");
3200 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3201 app_control_send_launch_request(app_control, &on_file_app_control_reply_cb, data);
3202 app_control_destroy(app_control);
3204 } else if (strcasecmp(label, POPUP_TEXT_TAKE_LOCATION) == 0) {
3205 app_control_h app_control;
3206 int ret = app_control_create(&app_control);
3207 if (ret != APP_CONTROL_ERROR_NONE) {
3208 show_toast(ad, "Error: Can not load location picker");
3211 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3212 //app_control_set_app_id(app_control, "com.here.tizen.maps");
3213 app_control_set_uri(app_control, "geo");
3214 app_control_send_launch_request(app_control, &on_location_app_control_reply_cb, data);
3215 app_control_destroy(app_control);
3216 } else if (strcasecmp(label, POPUP_TEXT_TAKE_CONTACT) == 0) {
3217 app_control_h app_control;
3218 int ret = app_control_create(&app_control);
3219 if (ret != APP_CONTROL_ERROR_NONE) {
3220 show_toast(ad, "Error: Can not load location picker");
3223 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3224 app_control_set_mime(app_control, "application/vnd.tizen.contact");
3225 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3226 app_control_send_launch_request(app_control, &on_contact_app_control_reply_cb, data);
3227 app_control_destroy(app_control);
3230 evas_object_del(obj);
3234 void popup_move_dropdown(Evas_Object *ctxpopup, Evas_Object *btn)
3236 Evas_Coord x, y, w , h;
3237 evas_object_geometry_get(btn, &x, &y, &w, &h);
3238 evas_object_move(ctxpopup, x + (w / 2), y + h - 50);
3241 void on_media_attach_dismissed_cb(void *data, Evas_Object *obj, void *event_info)
3243 evas_object_del(obj);
3246 static void on_media_attach_clicked(void *data, Evas_Object *obj, void *event_info)
3248 Evas_Object* chat_scroller = data;
3249 if (!chat_scroller) {
3252 appdata_s *ad = evas_object_data_get(chat_scroller, "app_data");
3256 attach_panel_h attach_panel = NULL;
3258 bool visible = false;
3260 Evas_Object* text_entry = evas_object_data_get(chat_scroller, "text_entry");
3261 elm_entry_input_panel_hide(text_entry);
3263 attach_panel = evas_object_data_get(ad->conform, "attach_panel");
3265 if (attach_panel_get_visibility(attach_panel, &visible) != ATTACH_PANEL_ERROR_NONE) {
3266 attach_panel_set_result_cb(attach_panel, _result_cb, chat_scroller);
3270 attach_panel_show(attach_panel);
3272 attach_panel_set_result_cb(attach_panel, _result_cb, chat_scroller);
3276 ret = attach_panel_create(ad->conform, &attach_panel);
3278 if (!attach_panel) {
3281 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, NULL);
3282 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA, NULL);
3283 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE, NULL);
3284 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO, NULL);
3285 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_AUDIO, NULL);
3286 //attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CONTACT, NULL);
3287 //attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_MYFILES, NULL);
3288 //attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER, NULL);
3289 attach_panel_set_result_cb(attach_panel, _result_cb, chat_scroller);
3291 attach_panel_show(attach_panel);
3292 evas_object_data_set(ad->conform, "attach_panel", attach_panel);
3297 static void on_text_message_send_pressed(void *data, Evas_Object *obj, void *event_info)
3299 elm_image_file_set(data, ui_utils_get_resource(SEND_UNPRESSED_ICON), NULL);
3302 static void on_text_message_send_unpressed(void *data, Evas_Object *obj, void *event_info)
3304 elm_image_file_set(data, ui_utils_get_resource(SEND_PRESSED_ICON), NULL);
3308 static void on_message_back_button_clicked(void *data, Evas_Object *obj, void *event_info)
3310 appdata_s *ad = data;
3314 app_nf_back_cb(data, obj, event_info);
3317 void on_user_info_button_clicked(void *data, Evas_Object *obj, void *event_info)
3319 appdata_s *ad = data;
3321 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
3322 tg_peer_info_s *user_data = sel_item->use_data;
3324 if (!sel_item || !user_data) {
3325 show_toast(ad, "Can not display user info");
3329 if (user_data->peer_type == TGL_PEER_USER) {
3330 launch_user_info_screen(ad, user_data->peer_id);
3331 } else if (user_data->peer_type == TGL_PEER_CHAT) {
3332 launch_chat_info_screen(ad, user_data->peer_id);
3338 void refresh_messaging_view(appdata_s *ad)
3343 Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
3348 Evas_Object *box_layout = NULL;
3349 Evas_Object *box = NULL;
3350 Eina_List *list = NULL;
3351 Eina_List *box_list = NULL;
3352 Evas_Object *last_item = NULL;
3354 box_layout = elm_object_content_get(scroller);
3356 LOGE("Fail to get the box into scroller");
3359 list = elm_box_children_get(box_layout);
3361 LOGE("Fail to get the list into box");
3365 box = eina_list_nth(list, 0);
3367 LOGE("Fail to get the box into box layout");
3371 box_list = elm_box_children_get(box);
3373 LOGE("Fail to get the box_list into box");
3377 last_item = eina_list_nth(box_list, eina_list_count(box_list)-1);
3379 LOGE("Fail to get the last item into box");
3384 evas_object_geometry_get(last_item, &x, &y, NULL, NULL);
3386 elm_scroller_region_show(scroller, x, y, -1, -1);
3388 eina_list_free(box_list);
3389 eina_list_free(list);
3392 static void click_user_name_cb(void *data, Evas_Object *obj, void *event_info)
3395 appdata_s *ad = evas_object_data_get(obj,"app_data");
3396 Elm_Object_Item *item = event_info;
3397 const char *clicked_name = elm_object_item_text_get(item);
3398 int peer_id = (int)elm_object_item_data_get(item);
3399 peer_with_pic_s* prev_peer_in_chatting_data = ad->peer_in_cahtting_data;
3400 user_data_with_pic_s* prev_buddy_in_chatting_data = ad->buddy_in_cahtting_data;
3402 int buddy_list_counts = eina_list_count(ad->buddy_list);
3403 for (int i = 0; i < buddy_list_counts; i++) {
3404 user_data_with_pic_s *item = eina_list_nth(ad->buddy_list, i);
3405 user_data_s* user_data = item->use_data;
3407 if (user_data->user_id.id == peer_id) {
3408 ad->buddy_in_cahtting_data = item;
3412 int peer_list_counts = eina_list_count(ad->peer_list);
3413 for (int i = 0; i < peer_list_counts; i++) {
3414 peer_with_pic_s* pic_item = eina_list_nth(ad->peer_list, i);
3415 tg_peer_info_s* item = pic_item->use_data;
3416 if (item->peer_id == peer_id) {
3417 ad->peer_in_cahtting_data = pic_item;
3422 launch_user_info_screen(ad, peer_id);
3424 ad->buddy_in_cahtting_data = prev_buddy_in_chatting_data;
3425 ad->peer_in_cahtting_data = prev_peer_in_chatting_data;
3429 static void on_expand_button_clicked(void *data, Evas_Object *obj, void *event_info)
3431 Evas_Object *expand_pic = data;
3435 appdata_s *ad = evas_object_data_get(expand_pic, "app_data");
3436 Evas_Object *parent_layout = evas_object_data_get(expand_pic, "parent_layout");
3438 Eina_Bool is_expanded = (Eina_Bool)evas_object_data_get(expand_pic, "is_expanded");
3442 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_CLOSE), NULL);
3444 Evas_Object *grp_names_bg = elm_bg_add(ad->nf);
3445 evas_object_size_hint_align_set(grp_names_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
3446 evas_object_size_hint_weight_set(grp_names_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3447 evas_object_color_set(grp_names_bg, 45, 165, 224, 229);
3448 elm_image_resizable_set(grp_names_bg, EINA_TRUE, EINA_TRUE);
3449 elm_image_fill_outside_set(grp_names_bg, EINA_TRUE);
3450 evas_object_show(grp_names_bg);
3451 elm_object_part_content_set(parent_layout, "swallow.group_detail_box,bg", grp_names_bg);
3453 Evas_Object* grp_names_lbl = elm_multibuttonentry_add(ad->nf);
3455 elm_entry_cursor_end_set(grp_names_lbl);
3456 evas_object_size_hint_weight_set(grp_names_lbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3457 evas_object_size_hint_align_set(grp_names_lbl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3458 elm_entry_single_line_set(grp_names_lbl, EINA_FALSE);
3459 elm_entry_scrollable_set(grp_names_lbl, EINA_TRUE);
3460 elm_entry_cnp_mode_set(grp_names_lbl, ELM_CNP_MODE_NO_IMAGE);
3461 elm_entry_context_menu_disabled_set(grp_names_lbl, EINA_TRUE);
3462 elm_object_focus_set(grp_names_lbl, EINA_FALSE);
3463 elm_multibuttonentry_editable_set(grp_names_lbl, EINA_FALSE);
3465 evas_object_show(grp_names_lbl);
3467 evas_object_data_set(grp_names_lbl, "app_data", ad);
3469 Eina_List *names_of_buddies = NULL;
3470 names_of_buddies = evas_object_data_get(ad->nf, "names_of_buddies");
3472 if (names_of_buddies) {
3473 int buddies_counts = eina_list_count(names_of_buddies);
3474 buddies_info *buddy_info;
3475 for(int i = 0 ; i < buddies_counts ; i++){
3476 buddy_info = (buddies_info*)eina_list_nth(names_of_buddies,i);
3477 if (buddy_info == NULL) continue;
3478 int len = strlen(buddy_info->name);
3479 char *name_str = (char *)malloc(len + 256);
3481 snprintf(name_str, len + 256, "<font=Tizen:style=Bold color=#FFFFFF align=center><font_size=40>%s</font_size></font>", buddy_info->name);
3482 Elm_Object_Item *button_item = elm_multibuttonentry_item_append(grp_names_lbl, name_str, click_user_name_cb, ad);
3483 elm_object_item_data_set(button_item, (void*)(buddy_info->id));
3489 elm_object_part_content_set(parent_layout, "swallow.group_detail_box", grp_names_lbl);
3493 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_OPEN), NULL);
3495 Evas_Object *grp_names_lbl = elm_object_part_content_get(parent_layout, "swallow.group_detail_box");
3496 if (grp_names_lbl) {
3497 evas_object_del(grp_names_lbl);
3498 grp_names_lbl = NULL;
3501 Evas_Object *grp_names_bg = elm_object_part_content_get(parent_layout, "swallow.group_detail_box,bg");
3503 evas_object_del(grp_names_bg);
3504 grp_names_bg = NULL;
3507 is_expanded = !is_expanded;
3508 evas_object_data_set(expand_pic, "is_expanded", (void *)is_expanded);
3511 static Eina_Bool _pop_cb(void *data, Elm_Object_Item *it)
3513 appdata_s *ad = data;
3514 attach_panel_h attach_panel = NULL;
3516 LOGE("Failed to get the ad");
3519 attach_panel = evas_object_data_get(ad->conform, "attach_panel");
3521 attach_panel_hide(attach_panel);
3523 Eina_List *names_of_buddies = evas_object_data_get(ad->nf, "names_of_buddies");
3525 buddies_info *buddy = NULL;
3526 EINA_LIST_FREE(names_of_buddies, buddy) {
3531 evas_object_data_set(ad->nf, "names_of_buddies", NULL);
3535 static void _edge_cb(void *data, Evas_Object *scroller, void *event_info)
3537 Evas_Object *layout = data;
3538 int is_end_edge = 0;
3539 is_end_edge = (int)evas_object_data_get(layout, "is_end_edge");
3542 elm_object_signal_emit(layout, "hide", "bubblemessage");
3543 evas_object_data_set(layout, "is_end_edge", (void *) 1);
3547 static void _edge_top_cb(void *data, Evas_Object *scroller, void *event_info)
3549 int is_end_edge_top = 0;
3550 //int offset_num = (int)evas_object_data_get(scroller, "offset_num");
3551 is_end_edge_top = (int)evas_object_data_get(scroller, "is_end_edge_top");
3553 if (!is_end_edge_top) {
3554 elm_scroller_movement_block_set(scroller,ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL );
3555 int prev_h = scroller_previous_region_get(scroller);
3556 evas_object_data_set(scroller, "previous_h",(void*)prev_h);
3557 evas_object_data_set(scroller, "is_end_edge_top",(void*)1);
3558 load_chat_history(scroller);
3559 elm_scroller_movement_block_set(scroller,ELM_SCROLLER_MOVEMENT_NO_BLOCK);
3563 static void _scroll_cb(void *data, Evas_Object *scroller, void *event_info)
3565 Evas_Object *layout = data;
3566 evas_object_data_set(layout, "is_end_edge", (void *) 0);
3567 evas_object_data_set(scroller, "is_end_edge_top", (void *) 0);
3568 // evas_object_data_set(layout, "is_end_edge_top", (void *) 0);
3571 int get_start_offset_num(char* table_name){
3572 char unknown_str[50];
3574 sprintf(unknown_str, "%d", unknown);
3576 int len_where = strlen(MESSAGE_INFO_TABLE_MARKED_FOR_DELETE) + strlen(" = ") + strlen(unknown_str) + 1;
3577 char* where_clause = (char *)malloc(len_where );
3578 snprintf(where_clause, len_where , "%s = %s", MESSAGE_INFO_TABLE_MARKED_FOR_DELETE, unknown_str);
3579 int row_counts = get_number_of_rows(table_name,where_clause);
3580 return (row_counts-TG_DBMGR_LIMITED);
3583 static Eina_Bool _load_history_cb(void *data)
3585 Evas_Object *nf = data;
3587 LOGE("Fail to get the nf");
3588 return ECORE_CALLBACK_CANCEL;
3590 Evas_Object *scroller = evas_object_data_get(nf, "chat_list");
3592 LOGE("Fail to get the scroller");
3593 return ECORE_CALLBACK_CANCEL;
3595 Evas_Object *layout = evas_object_data_get(nf, "chat_list_no_msg_text");
3597 LOGE("Fail to get the layout");
3598 return ECORE_CALLBACK_CANCEL;
3601 Eina_Bool ret = load_chat_history(scroller);
3603 LOGD("There is no message in chat room");
3605 elm_object_part_text_set(layout, "no_msg_text", i18n_get_text("IDS_TGRAM_BODY_NO_MESSAGES_HERE_YET_ING"));
3606 elm_object_signal_emit(layout, "show", "message");
3609 return ECORE_CALLBACK_CANCEL;
3612 void launch_messaging_view_cb(appdata_s* ad, int user_id)
3617 if (ad->msg_popup) {
3618 evas_object_del(ad->msg_popup);
3619 ad->msg_popup = NULL;
3622 delete_floating_button(ad);
3624 ad->current_app_state = TG_CHAT_MESSAGING_VIEW_STATE;
3625 ad->is_last_msg_changed = EINA_FALSE;
3626 send_request_for_server_connection_status(ad, ad->service_client);
3627 char edj_path[PATH_MAX] = {0, };
3628 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
3630 Evas_Object *layout = elm_layout_add(ad->nf);
3631 elm_layout_file_set(layout, edj_path, "chat_messaging_layout");
3632 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3633 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3634 evas_object_show(layout);
3636 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
3640 tg_peer_info_s* user = sel_item->use_data;
3642 /*************************** START: message list ************************************/
3644 Evas_Object* msg_box_layout = elm_layout_add(ad->nf);
3645 elm_layout_file_set(msg_box_layout, edj_path, "custom_gen_list");
3646 evas_object_size_hint_weight_set(msg_box_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3647 evas_object_size_hint_align_set(msg_box_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3648 evas_object_show(msg_box_layout);
3650 Evas_Object *list_bg = elm_image_add(msg_box_layout);
3651 evas_object_size_hint_align_set(list_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
3652 evas_object_size_hint_weight_set(list_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3653 if (ad->chat_background) {
3654 elm_image_file_set(list_bg, ad->chat_background, NULL);
3656 //elm_image_file_set(list_bg, ui_utils_get_resource(TG_CHAT_DEFAULT_BG), NULL);
3658 elm_image_resizable_set(list_bg, EINA_TRUE, EINA_TRUE);
3659 elm_image_fill_outside_set(list_bg, EINA_TRUE);
3660 evas_object_show(list_bg);
3662 elm_object_part_content_set(msg_box_layout, "swallow.gen_list.bg", list_bg);
3664 Evas_Object *chat_scroller = elm_scroller_add(ad->nf);
3665 evas_object_size_hint_weight_set(chat_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3666 evas_object_size_hint_align_set(chat_scroller, EVAS_HINT_FILL, 0.0);
3667 elm_scroller_policy_set(chat_scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
3668 evas_object_show(chat_scroller);
3669 evas_object_smart_callback_add(chat_scroller, "scroll", _scroll_cb, layout);
3671 //evas_object_smart_callback_add(chat_scroller,"scroll,drag,start", _scroll_cb, layout);
3672 evas_object_smart_callback_add(chat_scroller, "edge,bottom", _edge_cb, layout);
3674 evas_object_smart_callback_add(chat_scroller, "edge,top", _edge_top_cb, layout);
3675 evas_object_data_set(layout, "is_end_edge", (void *) 1);
3676 /*setting offset_num*/
3677 // evas_object_data_set(chat_scroller, "offset_num", (void *) 1);
3678 evas_object_data_set(chat_scroller, "prev_h", (void *) 0);
3679 /*check edge is top*/
3680 evas_object_data_set(chat_scroller, "is_end_edge_top",(void*)1);
3682 Evas_Object *align_box = elm_box_add(chat_scroller);
3684 LOGE("fail to add the box");
3688 elm_box_horizontal_set(align_box, EINA_FALSE);
3689 elm_box_align_set(align_box, 0.5, 0.0);
3690 evas_object_size_hint_weight_set(align_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3691 evas_object_size_hint_align_set(align_box, EVAS_HINT_FILL, 0.0);
3692 elm_object_content_set(chat_scroller, align_box);
3693 evas_object_show(align_box);
3695 Evas_Object *chat_box = elm_box_add(chat_scroller);
3697 LOGE("fail to add the box");
3700 elm_box_horizontal_set(chat_box, EINA_FALSE);
3701 elm_box_align_set(chat_box, 0.5, 0.0);
3702 evas_object_size_hint_weight_set(chat_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3703 evas_object_size_hint_align_set(chat_box, EVAS_HINT_FILL, 0.0);
3704 evas_object_show(chat_box);
3705 elm_box_pack_end(align_box, chat_box);
3706 evas_object_event_callback_add(chat_box, EVAS_CALLBACK_RESIZE, __resize_cb, ad);
3708 elm_object_part_content_set(msg_box_layout, "swallow.gen_list", chat_scroller);
3709 elm_object_part_content_set(layout, "swallow.chat_box", msg_box_layout);
3711 /********************** START: entry layout*******************************/
3712 Evas_Object* entry_box_layout = elm_layout_add(ad->win);
3713 if (!entry_box_layout) {
3714 LOGE("Fail to add the entry box layout");
3717 elm_layout_file_set(entry_box_layout, edj_path, "chat_entry_box");
3718 evas_object_size_hint_align_set(entry_box_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3719 evas_object_size_hint_weight_set(entry_box_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3720 evas_object_show(entry_box_layout);
3722 Evas_Object *entry_layout = elm_layout_add(entry_box_layout);
3723 if (!entry_layout) {
3724 LOGE("Fail to add the entry_layout");
3726 elm_layout_theme_set(entry_layout, "layout", "editfield", "singleline");
3728 Evas_Object* text_entry = elm_entry_add(entry_layout);
3730 LOGE("Fail to add the text_entry");
3733 elm_object_part_text_set(text_entry, "elm.guide", "Text message");
3734 elm_entry_line_wrap_set(text_entry, EINA_TRUE);
3735 elm_entry_scrollable_set(text_entry, EINA_TRUE);
3736 evas_object_size_hint_align_set(text_entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
3737 evas_object_size_hint_weight_set(text_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3738 evas_object_show(text_entry);
3739 evas_object_data_set(entry_box_layout, "is_attach_show", (void *) 1);
3741 elm_object_part_content_set(entry_layout, "elm.swallow.content", text_entry);
3742 evas_object_smart_callback_add(text_entry, "changed", on_message_text_entry_changed, entry_box_layout);
3743 evas_object_smart_callback_add(text_entry, "preedit,changed", on_message_text_entry_changed, entry_box_layout);
3744 evas_object_smart_callback_add(text_entry, "clicked", on_message_text_entry_clicked, NULL);
3745 elm_object_part_content_set(entry_box_layout, "swallow.text_entry", entry_layout);
3747 Evas_Object *attach_btn = NULL;
3748 attach_btn = elm_button_add(entry_layout);
3749 evas_object_size_hint_align_set(attach_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
3750 evas_object_size_hint_weight_set(attach_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3751 elm_object_style_set(attach_btn, "focus");
3752 evas_object_show(attach_btn);
3753 elm_object_part_content_set(entry_box_layout, "swallow,attach", attach_btn);
3754 evas_object_smart_callback_add(attach_btn, "clicked", on_media_attach_clicked, chat_scroller);
3756 /* button clicked event */
3757 elm_object_signal_callback_add(entry_box_layout, "smile", "clicked", on_message_smiley_clicked, text_entry);
3758 elm_object_signal_callback_add(entry_box_layout, "send", "clicked", on_text_message_send_clicked, chat_scroller);
3759 elm_object_part_content_set(layout, "swallow.entry", entry_box_layout);
3761 /********************** END: entry layout*******************************/
3763 /************************* START: message bubble ************************/
3765 Evas_Object* bubble_layout = elm_layout_add(ad->win);
3766 if (!bubble_layout) {
3767 LOGE("Fail to add the bubble_layout");
3770 elm_layout_file_set(bubble_layout, edj_path, "bubble_layout");
3771 evas_object_size_hint_align_set(bubble_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3772 evas_object_size_hint_weight_set(bubble_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3773 evas_object_show(bubble_layout);
3774 elm_object_signal_callback_add(bubble_layout, "cancel", "clicked", on_message_cancel_clicked, layout);
3775 elm_object_part_content_set(layout, "swallow.messagebubble", bubble_layout);
3776 evas_object_data_set(ad->nf, "main_layout", layout);
3778 /********************** END: entry message bubble*******************************/
3780 evas_object_data_set(ad->nf, "chat_list", (void*)chat_scroller);
3781 evas_object_data_set(chat_scroller, "app_data", ad);
3782 evas_object_data_set(chat_scroller, "user_id", (void*)user_id);
3783 evas_object_data_set(chat_scroller, "text_entry", (void*)text_entry);
3785 /* Set the name in title area */
3787 Elm_Object_Item *nf_it = NULL;
3790 char *temp_name = get_peer_name(sel_item->use_data);
3792 nf_it = elm_naviframe_item_push(ad->nf, temp_name, NULL, NULL, layout, NULL);
3793 evas_object_data_set(ad->nf, "navi_item", nf_it);
3797 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
3799 Evas_Object *back_btn = create_button(ad->nf, "naviframe/back_btn/default", NULL);
3800 evas_object_smart_callback_add(back_btn, "clicked", on_message_back_button_clicked, ad);
3801 elm_object_item_part_content_set(nf_it, "elm.swallow.prev_btn", back_btn);
3802 elm_naviframe_item_pop_cb_set(nf_it, _pop_cb, ad);
3804 /******************** expand ************************/
3805 if (user->peer_type == TGL_PEER_CHAT) {
3806 Evas_Object *expand_pic = NULL;
3807 expand_pic = elm_image_add(layout);
3808 evas_object_size_hint_weight_set(expand_pic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3809 evas_object_size_hint_align_set(expand_pic, EVAS_HINT_FILL, EVAS_HINT_FILL);
3810 elm_object_focus_set(expand_pic, EINA_FALSE);
3811 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_OPEN), NULL);
3812 evas_object_show(expand_pic);
3813 evas_object_data_set(expand_pic, "app_data", ad);
3814 evas_object_data_set(expand_pic, "parent_layout", layout);
3816 Eina_Bool is_expanded = EINA_FALSE;
3817 evas_object_data_set(expand_pic, "is_expanded", is_expanded);
3818 Evas_Object* expand_btn = elm_button_add(ad->layout);
3819 elm_object_style_set(expand_btn, "transparent");
3820 evas_object_smart_callback_add(expand_btn, "clicked", on_expand_button_clicked, expand_pic);
3821 elm_object_content_set(expand_btn, expand_pic);
3822 evas_object_show(expand_btn);
3823 elm_object_item_part_content_set(nf_it, "title_right_btn", expand_btn);
3826 /******************** expand ************************/
3828 Ecore_Timer *timer = NULL;
3829 timer = ecore_timer_add(0.001f, _load_history_cb, ad->nf);
3831 int buddy_id = sel_item->use_data->peer_id;
3832 char* tablename = get_table_name_from_number(buddy_id);
3833 int offset_num = get_start_offset_num(tablename);
3834 evas_object_data_set(chat_scroller, "offset_num", (void *)(offset_num));
3836 Eina_Bool res = set_all_rows_read(tablename);
3842 evas_object_data_set(ad->nf, "chat_list_no_msg_text", layout);
3844 send_request_for_marked_as_read(ad, ad->service_client, sel_item->use_data->peer_id, sel_item->use_data->peer_type);
3845 eext_object_event_callback_add(ad->nf, EEXT_CALLBACK_MORE, on_messaging_menu_button_clicked, ad);