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);
168 //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 send_delete_all_messages_request(ad, ad->service_client, user_data->peer_id, user_data->peer_type);
214 if (ad->main_item_in_cahtting_data) {
215 tg_main_list_item_s* old_item = ad->main_item_in_cahtting_data;
216 if (old_item->last_message) {
217 free(old_item->last_message);
218 old_item->last_message = NULL;
220 old_item->last_message = strdup("");
223 Evas_Object *nomsg_layout = evas_object_data_get(ad->nf, "chat_list_no_msg_text");
225 elm_object_signal_emit(nomsg_layout, "show", "message");
230 * [1] IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3
231 * [2] IDS_TGRAM_OPT_DELETE
236 * [0] IDS_TGRAM_OPT_VIEW_PROFILE_ABB
237 * [1] IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3
238 * [2] IDS_TGRAM_OPT_DELETE
241 * [0] IDS_TGRAM_OPT_ADD_TO_CONTACTS_ABB2
242 * [1] IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3
243 * [2] IDS_TGRAM_OPT_DELETE
246 * [1] IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3
247 * [2] IDS_TGRAM_OPT_DELETE
250 void on_messaging_menu_option_selected_cb(void *data, Evas_Object *obj, void *event_info)
252 appdata_s *ad = data;
253 Elm_Object_Item *it = event_info;
254 elm_genlist_item_selected_set(it, EINA_FALSE);
255 int id = (int)elm_object_item_data_get(it);
257 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
258 tg_peer_info_s *user_data = sel_item->use_data;
260 if (!sel_item || !user_data) {
262 evas_object_del(ad->msg_popup);
263 ad->msg_popup = NULL;
272 if (user_data->peer_type == TGL_PEER_USER) {
273 if (get_buddy_delete_status(user_data->peer_id)) {
276 } else if (get_buddy_unknown_status(user_data->peer_id)) {
278 ad->is_loading_from_msg_view = EINA_TRUE;
279 on_create_new_contact(ad);
281 launch_user_info_screen(ad, user_data->peer_id);
286 clear_history_in_gui(ad, user_data, user_data->peer_type, user_data->peer_id);
289 show_loading_popup(ad);
290 clear_history_in_gui(ad, user_data, user_data->peer_type, user_data->peer_id);
291 if (ad->main_item_in_cahtting_data) {
292 tg_main_list_item_s* old_item = ad->main_item_in_cahtting_data;
293 if (old_item->peer_print_name)
294 free(old_item->peer_print_name);
295 old_item->peer_print_name = NULL;
297 if (old_item->last_message)
298 free(old_item->last_message);
299 old_item->last_message = NULL;
301 if (old_item->profile_pic_path)
302 free(old_item->profile_pic_path);
303 old_item->profile_pic_path = NULL;
305 old_item->date_lbl = NULL;
306 old_item->msg_status_lbl = NULL;
307 old_item->main_item_layout = NULL;
308 old_item->profile_pic = NULL;
309 old_item->profile_pic_path = NULL;
310 old_item->status_lbl = NULL;
311 old_item->user_name_lbl = NULL;
313 ad->main_list = eina_list_remove(ad->main_list, ad->main_item_in_cahtting_data);
314 ad->main_item_in_cahtting_data = NULL;
315 ad->is_last_msg_changed = EINA_FALSE;
318 if (user_data->peer_type == TGL_PEER_USER) {
320 } else if (user_data->peer_type == TGL_PEER_CHAT) {
321 send_delete_group_chat_request(ad, ad->service_client, user_data->peer_id);
323 elm_naviframe_item_pop(ad->nf);
324 load_registered_user_data(ad);
325 load_buddy_list_data(ad);
326 load_unknown_buddy_list_data(ad);
328 load_main_list_data(ad);
329 ecore_timer_add(1, on_load_main_view_requested, ad);
333 evas_object_del(ad->msg_popup);
334 ad->msg_popup = NULL;
340 char* on_messaging_menu_group_text_get_cb(void *data, Evas_Object *obj, const char *part)
346 return strdup(i18n_get_text("IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3"));
349 return strdup(i18n_get_text("IDS_TGRAM_OPT_DELETE"));
353 char* on_messaging_menu_text_get_cb(void *data, Evas_Object *obj, const char *part)
356 appdata_s *ad = evas_object_data_get(obj, "app_data");
357 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
358 tg_peer_info_s *user_data = sel_item->use_data;
360 if(user_data->peer_type != TGL_PEER_USER)
366 if (get_buddy_delete_status(user_data->peer_id))
368 else if (get_buddy_unknown_status(user_data->peer_id))
369 return strdup(i18n_get_text("IDS_TGRAM_OPT_ADD_TO_CONTACTS_ABB2"));
371 return strdup(i18n_get_text("IDS_TGRAM_OPT_VIEW_PROFILE_ABB"));
373 return strdup(i18n_get_text("IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3"));
376 return strdup(i18n_get_text("IDS_TGRAM_OPT_DELETE"));
380 void on_msg_popup_back_cb(void *data, Evas_Object *obj, void *event_info)
382 appdata_s *ad = data;
384 evas_object_del(ad->msg_popup);
385 ad->msg_popup = NULL;
389 void on_messaging_menu_button_clicked(void *data, Evas_Object *obj, void *event_info)
391 appdata_s *ad = data;
392 if (ad->msg_popup || ad->current_app_state != TG_CHAT_MESSAGING_VIEW_STATE)
395 static Elm_Genlist_Item_Class itc;
396 Evas_Object *genlist;
398 Evas_Object *win = ad->win;
400 ad->msg_popup = elm_popup_add(win);
401 elm_popup_align_set(ad->msg_popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
402 eext_object_event_callback_add(ad->msg_popup, EEXT_CALLBACK_BACK, on_msg_popup_back_cb, ad);
403 evas_object_size_hint_weight_set(ad->msg_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
405 evas_object_data_set(ad->msg_popup, "app_data", ad);
407 genlist = elm_genlist_add(ad->msg_popup);
408 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
409 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
411 evas_object_data_set(genlist, "app_data", ad);
413 itc.item_style = "default";
414 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
415 if (sel_item->use_data->peer_type == TGL_PEER_USER) {
416 itc.func.text_get = on_messaging_menu_text_get_cb;
417 } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
418 itc.func.text_get = on_messaging_menu_group_text_get_cb;
423 itc.func.content_get = NULL;
424 itc.func.state_get = NULL;
427 if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
428 for (i = 1; i < 3; i++) {
429 elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, on_messaging_menu_option_selected_cb, ad);
432 int strart_number_of_menus = 0;
433 if(get_buddy_delete_status(sel_item->use_data->peer_id))
434 strart_number_of_menus = 1;
435 for (i = strart_number_of_menus; 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 evas_object_show(genlist);
441 elm_object_content_set(ad->msg_popup, genlist);
442 evas_object_show(ad->msg_popup);
446 /************************ Menu Handler ********************/
451 static Evas_Object *create_image_object_from_file(const char *icon_name, Evas_Object *parent)
453 Evas_Object *icon = elm_image_add(parent);
454 evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
455 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
456 elm_image_file_set(icon, icon_name, NULL);
457 evas_object_show(icon);
461 void on_chat_profile_pic_changed(appdata_s *ad, char *file_path)
463 if (!ad || !file_path)
466 Evas_Object *profile_image = evas_object_data_get(ad->nf, "profile_picture");
468 elm_image_file_set(profile_image, file_path, NULL);
471 void on_group_chat_info_changed(appdata_s *ad, char *type_of_change)
473 if (!ad || !type_of_change)
475 if (strstr(type_of_change, "edit_title") != NULL) {
476 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
478 tg_peer_info_s* user = sel_item->use_data;
479 char* user_name = replace(sel_item->use_data->print_name, '_', " ");
480 char temp_name[512] = {'\0'};
481 snprintf(temp_name, 512, "%s", user_name);
483 Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
484 elm_object_item_part_text_set(nf_it, "title", temp_name);
486 } else if (strstr(type_of_change, "delete_photo") != NULL) {
488 } else if (strstr(type_of_change, "add_user") != NULL || strstr(type_of_change, "delete_user") != NULL) {
489 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
491 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
497 void on_sent_media_item_clicked(void* data, Evas_Object* layout, void* event_info)
499 appdata_s* ad = evas_object_data_get(layout, "app_data");
500 char* media_type_str = evas_object_data_get(layout, "media_type");
501 char* media_file = evas_object_data_get(layout, "media_file");
503 if (!media_file || access(media_file, F_OK) == -1)
506 app_control_h app_control;
507 int ret = app_control_create(&app_control);
508 if (ret != APP_CONTROL_ERROR_NONE) {
509 LOGE("Error: Can not load image");
512 app_control_set_operation(app_control, APP_CONTROL_OPERATION_VIEW);
513 if (media_type_str && strstr(media_type_str, "video") != NULL) {
514 app_control_set_mime(app_control, "video/*");
515 } else if (media_type_str && strstr(media_type_str, "audio") != NULL) {
516 app_control_set_mime(app_control, "audio/*");
518 app_control_set_mime(app_control, "image/*");
520 app_control_set_uri(app_control, media_file);
522 app_control_send_launch_request(app_control, NULL, NULL);
523 app_control_destroy(app_control);
526 static Evas_Object *get_gif_image_from_path(const char* path, Evas_Object* parent, char *key)
528 if (!path || !parent || !key)
531 LOGD("key : %s", key);
532 Evas_Object *media_image = elm_image_add(parent);
533 elm_image_aspect_fixed_set(media_image, EINA_FALSE);
534 elm_image_file_set(media_image, path, key);
535 evas_object_size_hint_weight_set(media_image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
536 evas_object_size_hint_align_set(media_image, EVAS_HINT_FILL, EVAS_HINT_FILL);
537 evas_object_show(media_image);
541 static Evas_Object *get_image_from_path(const char* path, Evas_Object* parent)
543 if (!path || !parent)
545 Evas_Object *media_image = elm_image_add(parent);
546 elm_image_aspect_fixed_set(media_image, EINA_FALSE);
547 elm_image_file_set(media_image, path, NULL);
548 evas_object_size_hint_weight_set(media_image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
549 evas_object_size_hint_align_set(media_image, EVAS_HINT_FILL, EVAS_HINT_FILL);
550 evas_object_show(media_image);
554 int get_image_size(long long media_id)
556 Eina_List *media_sizes = get_image_sizes_from_db(media_id);
562 Eina_List *row_vals = NULL;
564 EINA_LIST_FREE(media_sizes,row_vals) {
568 int *temp_size1 = (int *)eina_list_nth(row_vals, 0);
573 int *temp_size2 = (int *)eina_list_nth(row_vals, 3);
578 int *temp_size3 = (int *)eina_list_nth(row_vals, 6);
583 int *temp_size4 = (int *)eina_list_nth(row_vals, 9);
590 EINA_LIST_FREE(row_vals, val) {
599 } else if (size2 > 0) {
601 } else if (size3 > 0) {
603 } else if (size4 > 0) {
611 void on_media_chat_item_clicked(void* data, Evas_Object *entry, void* event_info)
613 Evas_Object *button = evas_object_data_get(entry, "button_object");
615 char* img_state = evas_object_data_get(button, "image_state");
616 if (img_state && strstr(img_state, "download_in_progress") != NULL)
620 appdata_s* ad = evas_object_data_get(entry, "app_data");
621 char *temp_media_id = evas_object_data_get(entry, "media_id");
622 char *media_type_str = evas_object_data_get(entry, "media_type");
624 if (media_type_str && strstr(media_type_str, "location") != NULL) {
625 char *url = evas_object_data_get(entry, "location_url");
626 launch_app_control(ad, media_type_str, url);
630 long long media_id = atoll(temp_media_id);
631 char *media_file = get_media_path_from_db(media_id);
632 if (!media_file || access(media_file, F_OK) == -1) {
633 LOGE("Media download1");
634 Eina_Bool ret = send_request_for_media_downloading(ad, ad->service_client, ad->peer_in_cahtting_data->use_data->peer_id, media_id);
636 LOGE("Please check your network connection.");
639 LOGE("Media download2");
641 char temp_msg[256] = {0,};
642 snprintf(temp_msg, sizeof(temp_msg), "%s", "Downloading...");
643 elm_object_part_text_set(button, "size", temp_msg);
645 Evas_Object* progressbar = elm_progressbar_add(button);
646 elm_object_style_set(progressbar, "process_small");
647 evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
648 evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
649 elm_progressbar_pulse(progressbar, EINA_TRUE);
650 evas_object_show(progressbar);
652 Evas_Object* old_content = elm_object_part_content_unset(button, "download_image");
654 evas_object_del(old_content);
656 elm_object_part_content_set(button, "download_image", progressbar);
657 evas_object_data_set(button, "image_state", "download_in_progress");
660 launch_app_control(ad, media_type_str, media_file);
664 static void on_video_play_pressed(void *data, Evas_Object *obj, void *event_info)
668 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_PRESS_ICON), NULL);
671 static void on_video_play_unpressed(void *data, Evas_Object *obj, void *event_info)
675 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
678 static Evas_Object* get_video_paly_icon(Evas_Object *parent)
680 Evas_Object* play_pause_btn = elm_button_add(parent);
681 elm_object_style_set(play_pause_btn, "transparent");
682 evas_object_size_hint_align_set(play_pause_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
683 evas_object_size_hint_weight_set(play_pause_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
685 Evas_Object* play_pause_icon = elm_image_add(parent);
686 evas_object_size_hint_align_set(play_pause_icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
687 evas_object_size_hint_weight_set(play_pause_icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
689 elm_image_file_set(play_pause_icon, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
691 elm_image_resizable_set(play_pause_icon, EINA_TRUE, EINA_TRUE);
692 evas_object_show(play_pause_icon);
694 elm_object_content_set(play_pause_btn, play_pause_icon);
696 evas_object_smart_callback_add(play_pause_btn, "pressed", on_video_play_pressed, play_pause_icon);
697 evas_object_smart_callback_add(play_pause_btn, "unpressed", on_video_play_unpressed, play_pause_icon);
698 return play_pause_btn;
701 static Evas_Object *get_media_layout_with_play(char *img_path, Evas_Object *parent, Eina_Bool show_play_icon)
703 char edj_path[PATH_MAX] = {0, };
704 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
705 Evas_Object *rec_video_layout = elm_layout_add(parent);
706 elm_layout_file_set(rec_video_layout, edj_path, "bubble_video_item_layout");
707 evas_object_size_hint_weight_set(rec_video_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
708 evas_object_size_hint_align_set(rec_video_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
709 evas_object_show(rec_video_layout);
711 Evas_Object *vid_thumb_icon = get_image_from_path(img_path, parent);
712 elm_object_part_content_set(rec_video_layout, "swallow.video_thumb_item", vid_thumb_icon);
714 if (show_play_icon) {
715 /* Evas_Object* play_img = get_image_from_path(ui_utils_get_resource(MEDIA_PLAY_ICON), parent);
716 elm_object_part_content_set(rec_video_layout, "swallow.play_btn", play_img);*/
718 Evas_Object* play_pause_btn = get_video_paly_icon(parent);
719 elm_object_part_content_set(rec_video_layout, "swallow.play_btn", play_pause_btn);
722 return rec_video_layout;
725 void audio_player_progress_updated(void* handler, int current, int total, void *user_data)
727 Evas_Object *parent = user_data;
728 Evas_Object *progressbar = evas_object_data_get(parent, "progress_control");
731 int seconds = (int) (current / 1000) % 60 ;
732 int minutes = (int) ((current / (1000*60)) % 60);
734 char tot_dur[256] = {0,};
736 if (seconds < 10 && minutes < 10) {
738 } else if (seconds > 10 && minutes < 10) {
740 } else if (seconds < 10 && minutes > 10) {
746 sprintf(tot_dur, format, minutes, seconds);
747 elm_object_part_text_set(progressbar, "elm.text.bottom.right", tot_dur);
749 double current_status = (double)((double)current/(double)total);
751 elm_progressbar_value_set(progressbar, current_status);
755 void audio_player_state_changed(void* handler, TG_AUDIO_PLAYER_STATE state, void *user_data)
757 tg_player_handler *audio_payer = handler;
758 Evas_Object *parent = user_data;
760 if (!audio_payer || !parent)
763 Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(parent, "is_play_mode");
764 switch (audio_payer->state) {
765 case TG_AUDIO_PLAYER_STATE_NONE:
767 case TG_AUDIO_PLAYER_STATE_INITIALIZED:
768 evas_object_data_set(parent, "tg_audio_player", audio_payer);
769 play_audio_player(audio_payer);
771 case TG_AUDIO_PLAYER_STATE_PLAYING:
772 elm_image_file_set(parent, ui_utils_get_resource(TG_PAUSE_NORMAL_ICON), NULL);
773 is_play_mode = !is_play_mode;
774 evas_object_data_set(parent, "is_play_mode", is_play_mode);
776 case TG_AUDIO_PLAYER_STATE_INTERRUPTED:
777 elm_image_file_set(parent, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
778 is_play_mode = !is_play_mode;
779 evas_object_data_set(parent, "is_play_mode", is_play_mode);
781 case TG_AUDIO_PLAYER_STATE_PAUSE:
782 elm_image_file_set(parent, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
783 is_play_mode = !is_play_mode;
784 evas_object_data_set(parent, "is_play_mode", is_play_mode);
786 case TG_AUDIO_PLAYER_STATE_ERROR:
788 case TG_AUDIO_PLAYER_STATE_END:
789 destroy_audio_player(audio_payer);
791 is_play_mode = EINA_FALSE;
792 evas_object_data_set(parent, "is_play_mode", is_play_mode);
793 evas_object_data_set(parent, "tg_audio_player", NULL);
794 elm_image_file_set(parent, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
795 audio_player_progress_updated(NULL, 0, 1, parent);
803 static void on_message_play_pause_clicked(void *data, Evas_Object *obj, void *event_info)
808 appdata_s * ad = evas_object_data_get(data, "app_data");
809 char *audio_file = evas_object_data_get(data, "audio_file_path");
810 char *media_id = evas_object_data_get(data, "media_id");
811 if (!audio_file || strlen(audio_file) <= 0 || (audio_file && strstr(audio_file, "_null_")) != NULL) {
812 //there is no file. download it.
813 Evas_Object *progressbar = evas_object_data_get(data, "progress_control");
814 Eina_Bool is_download_in_progress = (Eina_Bool)evas_object_data_get(progressbar, "is_download_in_progress");
815 if (!is_download_in_progress) {
816 elm_object_style_set(progressbar, "pending");
817 Eina_Bool ret = send_request_for_media_downloading(ad, ad->service_client, ad->peer_in_cahtting_data->use_data->peer_id, atoll(media_id));
819 show_toast(ad, "Please check your network connection.");
826 tg_player_handler *audio_payer = evas_object_data_get(data, "tg_audio_player");
828 audio_payer = init_audio_player(audio_file, &audio_player_state_changed, &audio_player_progress_updated, data);
830 show_toast(ad, "Unsupported file.");
835 if (audio_payer->state == TG_AUDIO_PLAYER_STATE_PAUSE || audio_payer->state == TG_AUDIO_PLAYER_STATE_INTERRUPTED) {
836 play_audio_player(audio_payer);
837 } else if (audio_payer->state == TG_AUDIO_PLAYER_STATE_PLAYING) {
838 pause_audio_player(audio_payer);
844 static void on_message_play_pause_pressed(void *data, Evas_Object *obj, void *event_info)
849 Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(data, "is_play_mode");
851 elm_image_file_set(data, ui_utils_get_resource(TG_PAUSE_PRESS_ICON), NULL);
853 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_PRESS_ICON), NULL);
857 static void on_message_play_pause_unpressed(void *data, Evas_Object *obj, void *event_info)
862 Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(data, "is_play_mode");
864 elm_image_file_set(data, ui_utils_get_resource(TG_PAUSE_NORMAL_ICON), NULL);
866 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
870 static void progressbar_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
876 static Evas_Object *create_audio_progressbar(Evas_Object *parent, int duration)
878 Evas_Object *progressbar;
880 progressbar = elm_progressbar_add(parent);
881 evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, 0.5);
882 evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
883 elm_progressbar_value_set(progressbar, 0.0);
884 evas_object_event_callback_add(progressbar, EVAS_CALLBACK_DEL, progressbar_del_cb, NULL);
885 evas_object_show(progressbar);
887 elm_object_part_text_set(progressbar, "elm.text.top.left", "");
888 elm_object_part_text_set(progressbar, "elm.text.top.right", "");
890 elm_object_part_text_set(progressbar, "elm.text.bottom.right", "00:00");
896 static Evas_Object *get_audio_layout_with_play(Evas_Object *parent)
898 Evas_Object* chat_scroller = parent;
899 Evas_Object *rec_video_layout = NULL;
900 tgl_media_s *media_msg = NULL;
901 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
902 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
903 int message_id = (int)evas_object_data_get(chat_scroller, "message_id");
905 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
906 int buddy_id = sel_item->use_data->peer_id;
907 char* tablename = get_table_name_from_number(buddy_id);
909 tg_message_s* msg = get_message_from_message_table(message_id, tablename);
917 Evas_Object *parent_obj = evas_object_data_get(chat_scroller, "parent_obj"); //entry
921 media_msg = get_media_details_from_db(atoll(msg->media_id));
923 char *audio_file = media_msg->file_path;
925 char edj_path[PATH_MAX] = {0, };
926 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
927 rec_video_layout = elm_layout_add(parent);
928 elm_layout_file_set(rec_video_layout, edj_path, "bubble_audio_item_layout");
929 evas_object_size_hint_weight_set(rec_video_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
930 evas_object_size_hint_align_set(rec_video_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
931 evas_object_show(rec_video_layout);
933 /**************** play icon **********************/
934 Evas_Object* play_pause_btn = elm_button_add(parent);
935 elm_object_style_set(play_pause_btn, "transparent");
936 evas_object_size_hint_align_set(play_pause_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
937 evas_object_size_hint_weight_set(play_pause_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
939 Evas_Object* play_pause_icon = elm_image_add(parent);
940 evas_object_size_hint_align_set(play_pause_icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
941 evas_object_size_hint_weight_set(play_pause_icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
942 elm_image_file_set(play_pause_icon, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
944 elm_image_resizable_set(play_pause_icon, EINA_TRUE, EINA_TRUE);
945 evas_object_show(play_pause_icon);
946 elm_object_content_set(play_pause_btn, play_pause_icon);
948 Eina_Bool is_play_mode = EINA_TRUE;
949 evas_object_data_set(play_pause_icon, "is_play_mode", is_play_mode);
952 evas_object_data_set(play_pause_icon, "audio_file_path", strdup(audio_file));
954 evas_object_data_set(play_pause_icon, "app_data", ad);
955 evas_object_data_set(play_pause_icon, "user_id", (void*)user_id);
956 evas_object_data_set(play_pause_icon, "message_id", (void*)message_id);
957 evas_object_data_set(play_pause_icon, "media_id", strdup(msg->media_id));
959 evas_object_smart_callback_add(parent_obj, "clicked", on_message_play_pause_clicked, play_pause_icon);
960 evas_object_smart_callback_add(parent_obj, "pressed", on_message_play_pause_pressed, play_pause_icon);
961 evas_object_smart_callback_add(parent_obj, "unpressed", on_message_play_pause_unpressed, play_pause_icon);
963 evas_object_smart_callback_add(play_pause_btn, "clicked", on_message_play_pause_clicked, play_pause_icon);
964 evas_object_smart_callback_add(play_pause_btn, "pressed", on_message_play_pause_pressed, play_pause_icon);
965 evas_object_smart_callback_add(play_pause_btn, "unpressed", on_message_play_pause_unpressed, play_pause_icon);
966 elm_object_part_content_set(rec_video_layout, "swallow.play_icon", play_pause_btn);
967 /**************** play icon **********************/
969 /*************** progress bar ********************/
971 int total_duration = 0;
973 metadata_extractor_h metadata;
974 metadata_extractor_create(&metadata);
975 int ret = metadata_extractor_set_path(metadata, audio_file);
977 ret = metadata_extractor_get_metadata(metadata, METADATA_DURATION, &value);
978 metadata_extractor_destroy(metadata);
981 total_duration = atoi(value);
985 total_duration = media_msg->doc_duration;
986 //convert into milli secs
987 total_duration = 1000 * total_duration;
990 Evas_Object *progress = create_audio_progressbar(parent, total_duration);
992 evas_object_data_set(parent_obj, "play_pause_icon", play_pause_icon);
993 evas_object_data_set(parent_obj, "progress_bar", progress);
995 elm_object_part_content_set(rec_video_layout, "swallow.progress_icon", progress);
997 evas_object_data_set(play_pause_icon, "progress_control", (void*)progress);
998 Eina_Bool is_download_in_progress = EINA_FALSE;
999 evas_object_data_set(progress, "is_download_in_progress", (void*)is_download_in_progress);
1001 /*************** progress bar ********************/
1007 msg->message = NULL;
1009 if (msg->media_id) {
1010 free(msg->media_id);
1011 msg->media_id = NULL;
1014 free_media_details(media_msg);
1016 return rec_video_layout;
1020 static Evas_Object * item_provider(void *data, Evas_Object *entry, const char *item)
1023 if (strcmp(item, "itemprovider")) {
1026 Evas_Object *layout = NULL;
1027 Evas_Object* chat_scroller = data;
1028 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1029 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1030 int message_id = (int)evas_object_data_get(entry, "message_id");
1032 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1033 int buddy_id = sel_item->use_data->peer_id;
1035 char* tablename = get_table_name_from_number(buddy_id);
1036 tg_message_s* msg = get_message_from_message_table(message_id, tablename);
1041 Evas_Object *item_to_display = NULL;
1042 tgl_media_s *media_msg = NULL;
1043 if (msg->media_type == tgl_message_media_photo || msg->media_type == tgl_message_media_document) {
1045 Eina_Bool is_blur_image = EINA_FALSE;
1046 char* img_path = NULL;
1048 img_path = get_media_path_from_db(atoll(msg->media_id));
1049 if (access(img_path, F_OK) == -1) {
1051 tmp = ui_utils_get_resource(BLUR_BG);
1052 img_path = strdup(tmp);
1053 is_blur_image = EINA_TRUE;
1056 if (msg->media_type == tgl_message_media_document) {
1057 media_msg = get_media_details_from_db(atoll(msg->media_id));
1059 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1060 if (img_path == NULL || strlen(img_path) == 0) {
1061 img_path = strdup(ui_utils_get_resource(TG_VIDEO_ICON));
1064 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1069 img_path = strdup(ui_utils_get_resource(TG_AUDIO_ICON));
1071 char* media_file = get_media_path_from_db(atoll(msg->media_id));
1072 if (!media_file || (media_file && !strcmp(media_file, "_null_")) || (media_file && strlen(media_file) <= 0) || (media_file && access(media_file, F_OK) == -1)) {
1073 is_blur_image = EINA_TRUE;
1076 if (media_file && strstr(media_file, ".webp") != NULL) {
1077 is_blur_image = EINA_FALSE;
1083 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1085 evas_object_data_set(chat_scroller, "parent_obj", (void*)entry);
1086 item_to_display = get_audio_layout_with_play(chat_scroller);
1088 } else if (msg->out) {
1090 if (msg->media_type == tgl_message_media_photo) {
1091 item_to_display = get_image_from_path(img_path, entry);
1094 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1095 char *thumb_path = get_video_thumb_path_from_db(media_msg->media_id);
1097 thumb_path = strdup(ui_utils_get_resource(BLUR_BG));
1099 item_to_display = get_media_layout_with_play(thumb_path, entry, EINA_TRUE);
1102 item_to_display = get_image_from_path(img_path, entry);
1103 elm_image_animated_set(item_to_display, EINA_TRUE);
1104 elm_image_animated_play_set(item_to_display, EINA_TRUE);
1109 if (!is_blur_image) {
1110 if (msg->media_type == tgl_message_media_photo) {
1111 item_to_display = get_image_from_path(img_path, entry);
1112 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1114 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1116 //item_to_display = get_media_layout_with_play(img_path, entry, EINA_TRUE);
1117 char *thumb_path = get_video_thumb_path_from_db(media_msg->media_id);
1119 thumb_path = strdup(ui_utils_get_resource(BLUR_BG));
1121 item_to_display = get_media_layout_with_play(thumb_path, entry, EINA_TRUE);
1125 if (media_msg && media_msg->mime_type && strstr(media_msg->mime_type, "webp") != NULL) {
1126 char *tmp = ui_utils_get_resource(BROKEN_IMAGE);
1127 //item_to_display = get_image_from_path(img_path, entry);
1129 item_to_display = get_image_from_path(tmp, entry);
1130 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1132 item_to_display = get_image_from_path(img_path, entry);
1133 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1134 elm_image_animated_set(item_to_display, EINA_TRUE);
1135 elm_image_animated_play_set(item_to_display, EINA_TRUE);
1141 char edj_path[PATH_MAX] = {0, };
1142 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1143 Evas_Object *rec_img_layout = elm_layout_add(entry);
1144 elm_layout_file_set(rec_img_layout, edj_path, "bubble_received_media_layout");
1145 evas_object_size_hint_weight_set(rec_img_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1146 evas_object_size_hint_align_set(rec_img_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1147 evas_object_show(rec_img_layout);
1148 Evas_Object *img_item = NULL;
1151 if (msg->media_type == tgl_message_media_photo) {
1152 img_item = get_image_from_path(img_path, entry);
1154 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)) {
1155 //img_item = get_media_layout_with_play(img_path, entry, EINA_FALSE);
1156 char *thumb_path = get_video_thumb_path_from_db(media_msg->media_id);
1158 thumb_path = strdup(ui_utils_get_resource(BLUR_BG));
1160 img_item = get_media_layout_with_play(thumb_path, entry, EINA_FALSE);
1163 img_item = get_image_from_path(img_path, entry);
1166 elm_object_part_content_set(rec_img_layout, "swallow.image_item", img_item);
1169 if (msg->media_type == tgl_message_media_photo) {
1170 media_size = get_image_size(atoll(msg->media_id));
1172 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1173 media_size = get_media_size_from_db(atoll(msg->media_id));
1174 } else if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1175 media_size = get_media_size_from_db(atoll(msg->media_id));
1177 media_size = get_media_size_from_db(atoll(msg->media_id));
1181 int media_size_kbs = (media_size < (1 << 20)); //convert to kbs
1182 char media_size_str[10] = { 0, };
1183 if (media_size_kbs > 0) {
1184 sprintf(media_size_str, "%dKB", media_size_kbs);
1186 sprintf(media_size_str, "%dB", media_size);
1190 Evas_Object *size_btn = elm_layout_add(entry);
1191 elm_layout_file_set(size_btn, edj_path, "download_btn");
1192 elm_object_part_text_set(size_btn, "size", media_size_str);
1193 evas_object_size_hint_weight_set(size_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1194 evas_object_size_hint_align_set(size_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
1195 evas_object_show(size_btn);
1197 evas_object_data_set(size_btn, "image_state", "ready_to_download");
1199 Evas_Object* download_img = get_image_from_path(ui_utils_get_resource(MEDIA_DOWNLOAD_ICON), entry);
1200 elm_object_part_content_set(size_btn, "download_image", download_img);
1202 elm_object_part_content_set(rec_img_layout, "swallow.download_btn", size_btn);
1204 evas_object_data_set(entry, "image_object", (void*)img_item);
1205 evas_object_data_set(entry, "button_object", (void*)size_btn);
1206 evas_object_data_set(entry, "image_size", (void*)strdup(media_size_str));
1208 //ad->loaded_msg_list = eina_list_append(ad->loaded_msg_list, entry);
1210 item_to_display = rec_img_layout;
1218 // delete media details
1222 evas_object_data_set(entry, "chat_list", (void*)chat_scroller);
1223 evas_object_data_set(entry, "message_id", (void*)message_id);
1224 evas_object_data_set(entry, "app_data", (void*)ad);
1227 if (msg->media_type == tgl_message_media_photo) {
1228 evas_object_data_set(entry, "media_type", (void*)strdup("image"));
1229 } else if (msg->media_type == tgl_message_media_geo) {
1230 evas_object_data_set(entry, "media_type", (void*)strdup("location"));
1232 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1233 evas_object_data_set(entry, "media_type", (void*)strdup("video"));
1234 } else if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1235 evas_object_data_set(entry, "media_type", (void*)strdup("audio"));
1237 if (media_msg && media_msg->mime_type && strstr(media_msg->mime_type, "webp") != NULL) {
1238 evas_object_data_set(entry, "media_type", (void*)strdup("image"));
1240 evas_object_data_set(entry, "media_type", (void*)strdup("animated_gif"));
1244 evas_object_data_set(entry, "media_id", (void*)strdup(msg->media_id));
1245 if (item_to_display) {
1246 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1247 layout = item_to_display;
1249 char edj_path[PATH_MAX] = {0, };
1250 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1251 layout = elm_layout_add(entry);
1252 elm_layout_file_set(layout, edj_path, "chat_image_layout");
1253 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1254 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1255 evas_object_show(layout);
1257 Evas_Object *rounded_layout = elm_layout_add(entry);
1258 elm_layout_file_set(rounded_layout, edj_path, "rounded_corner_layout");
1259 evas_object_size_hint_weight_set(rounded_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1260 evas_object_size_hint_align_set(rounded_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1261 evas_object_show(rounded_layout);
1262 elm_object_part_content_set(rounded_layout, "content", item_to_display);
1264 elm_object_part_content_set(layout, "swallow.chat_image", rounded_layout);
1265 evas_object_smart_callback_add(entry, "clicked", on_media_chat_item_clicked, NULL);
1271 msg->message = NULL;
1274 if (msg->media_id) {
1275 free(msg->media_id);
1276 msg->media_id = NULL;
1280 free_media_details(media_msg);
1285 static void __resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1287 appdata_s *ad = data;
1288 Evas_Object *layout = NULL;
1289 Evas_Object *chat_scroller = NULL;
1291 layout = evas_object_data_get(ad->nf, "main_layout");
1292 chat_scroller = evas_object_data_get(ad->nf, "chat_list");
1294 int is_end_edge = 0;
1295 is_end_edge = (int)evas_object_data_get(layout, "is_end_edge");
1296 int is_end_edge_top = 0;
1297 is_end_edge_top = (int)evas_object_data_get(chat_scroller, "is_end_edge_top");
1300 ret = scroller_show_bottom_edge(chat_scroller);
1302 LOGE("Fail to show the bottom of scroller");
1306 scroller_show_previous_region(chat_scroller);
1309 //static void free_data_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1314 static void set_string_data(Evas_Object *obj, const char *key, const char *data)
1319 previous_str = evas_object_data_del(obj, key);
1321 //evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, free_data_cb);
1326 new_data = strdup(data);
1332 evas_object_data_set(obj, key, new_data);
1333 //evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, free_data_cb, new_data);
1337 static void _create_image_item(tg_message_s *msg, Evas_Object *entry, char *image, int size)
1339 char* img_path = NULL;
1341 Evas_Object *img_item = NULL;
1346 img_path = get_video_thumb_path_from_db(atoll(msg->media_id));
1347 if (img_path == NULL || (img_path && strlen(img_path) == 0) || (img_path && strstr(img_path, "_null_") != NULL)) {
1348 img_path = get_media_path_from_db(atoll(msg->media_id));
1349 if (access(img_path, F_OK) == -1)
1354 if (strstr(img_path, ".webp") != NULL) {
1355 char *tmp = ui_utils_get_resource(BROKEN_IMAGE);
1356 LOGE("broken image(webp): %s", tmp);
1358 //img_item = get_image_from_path(img_path, entry);
1359 img_item = get_image_from_path(tmp, entry);
1362 if (msg->media_type == tgl_message_media_document) {
1363 char key[256] = {0, };
1364 snprintf(key, sizeof(key), "%d", msg->msg_id);
1365 img_item = get_gif_image_from_path(img_path, entry, key);
1367 img_item = get_image_from_path(img_path, entry);
1369 elm_image_object_size_get(img_item, &w, &h);
1370 entry_h = (318 * h) / w;
1377 snprintf(image, size - 1, "<item size=318x%d vsize=full href=itemprovider></item>", entry_h);
1380 Evas_Object *on_message_item_content_get_cb(void *data, Evas_Object *obj, const char *part)
1383 ERR("Invalid Parameter.");
1387 if (strcmp(part, "elm.icon.entry"))
1390 Evas_Object *entry = NULL;
1391 Evas_Object *layout = NULL;
1393 char edj_path[PATH_MAX] = {0, };
1394 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1396 tg_message_s *msg = (tg_message_s*)data;
1397 Evas_Object *chat_scroller = obj;
1398 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1400 Evas_Object *nomsg_layout = evas_object_data_get(ad->nf, "chat_list_no_msg_text");
1402 elm_object_signal_emit(nomsg_layout, "hide", "message");
1404 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1405 evas_object_data_set(chat_scroller, "message_id", msg->msg_id);
1407 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1408 int buddy_id = sel_item->use_data->peer_id;
1410 char* tablename = get_table_name_from_number(buddy_id);
1412 //Eina_Bool is_blur_image = EINA_FALSE;
1418 update_msg_into_db(msg, tablename);
1419 ad->is_last_msg_changed = EINA_TRUE;
1429 if (msg->service == 2) {
1430 layout = elm_layout_add(obj);
1431 elm_layout_file_set(layout, edj_path, "chat_date_item");
1432 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1433 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1434 evas_object_show(layout);
1436 // convert date from string to int
1437 char *date_str = msg->message;
1438 int date_num = atoi(date_str);
1440 // convert date format
1441 time_t t = date_num;
1442 char *format = NULL;
1443 format = "%a, %e %b %Y";
1446 (void) localtime_r(&t, <);
1448 if (strftime(res, sizeof(res), format, <) == 0) {
1449 (void) fprintf(stderr, "strftime(3): cannot format supplied "
1450 "date/time into buffer of size %u "
1452 sizeof(res), format);
1455 elm_object_part_text_set(layout, "elm.text", res);
1457 } else if (msg->service == 1) {
1458 layout = elm_layout_add(obj);
1459 elm_layout_file_set(layout, edj_path, "chat_service_item_box");
1460 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1461 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1462 evas_object_show(layout);
1464 elm_object_part_text_set(layout, "elm.text", msg->message);
1469 if (msg->media_type != tgl_message_media_none) {
1470 entry = elm_entry_add(obj);
1471 elm_entry_editable_set(entry, EINA_FALSE);
1472 elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
1473 elm_entry_single_line_set(entry, EINA_TRUE);
1474 elm_entry_input_panel_enabled_set(entry, EINA_FALSE);
1476 entry = elm_label_add(obj);
1479 evas_object_data_set(entry, "message_id", (void*)msg->msg_id);
1480 // evas_object_data_set(entry, "chat_list", (void*)chat_scroller);
1482 layout = elm_layout_add(obj);
1485 elm_layout_file_set(layout, edj_path, "entry,send,layout");
1486 elm_object_style_set(entry, "sentmessage1");
1487 //sender_name = replace(ad->current_user_data->print_name, '_', " ");
1489 elm_layout_file_set(layout, edj_path, "entry,receive,layout");
1490 elm_object_style_set(entry, "readmessage1");
1492 /* If you need to get the name, you need this code */
1494 char *sender_name = NULL;
1495 if (sel_item->use_data->peer_type == TGL_PEER_USER) {
1496 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1497 } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
1498 int from_id = msg->from_id;
1499 // get name of buddy
1500 char* buddy_name = get_buddy_name_from_id(from_id);
1502 sender_name = replace(buddy_name, '_', " ");
1506 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1511 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1512 elm_object_part_content_set(layout, "elm.swallow.content", entry);
1513 evas_object_show(layout);
1515 evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1516 evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
1517 evas_object_show(entry);
1518 // To be handled for group chat
1519 Eina_Strbuf *buf = eina_strbuf_new();
1520 char *caption = NULL;
1521 LOGD("entry media type is %d", msg->media_type);
1522 if (msg->media_type == tgl_message_media_none) {
1523 char *temp_msg = replace(msg->message, '\n', "<br>");
1524 elm_object_part_text_set(entry, "elm.text", temp_msg);
1525 //eina_strbuf_append(buf, temp_msg);
1526 //elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1527 eina_strbuf_free(buf);
1529 } else if (msg->media_type == tgl_message_media_photo || msg->media_type == tgl_message_media_document) {
1530 elm_entry_item_provider_append(entry, item_provider, chat_scroller);
1532 LOGD("media id[%s]", msg->media_id);
1533 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1535 LOGD("file path[%s]", media_msg->file_path);
1536 if (media_msg && media_msg->caption && strlen(media_msg->caption) > 0) {
1537 caption = strdup(media_msg->caption);
1538 LOGD("caption[%s]", caption);
1542 if (media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1543 if (ad->target_direction == TELEGRAM_TARGET_DIRECTION_PORTRAIT || ad->target_direction == TELEGRAM_TARGET_DIRECTION_PORTRAIT_INVERSE) {
1544 eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1546 eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1549 } else if (media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1550 eina_strbuf_append(buf, "<item size=318x200 vsize=full hsize=full href=itemprovider></item>");
1552 char image[256] = {0,};
1553 _create_image_item(msg, entry, image, sizeof(image));
1554 eina_strbuf_append(buf, image);
1559 if (media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1560 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);
1570 free_media_details(media_msg);
1571 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1572 eina_strbuf_free(buf);
1573 } else if (msg->media_type == tgl_message_media_geo) {
1575 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1577 char loc_url[4*256] = {0,};
1579 if (media_msg->caption && strlen(media_msg->caption) > 0) {
1580 caption = strdup(media_msg->caption);
1582 snprintf(loc_url, sizeof(loc_url), "https://maps.google.com/?q=%s,%s", media_msg->latitude, media_msg->longitude);
1583 char temp_msg[4*256] = {0,};
1584 snprintf(temp_msg, sizeof(temp_msg), "<font=Tizen:style=Normal|underline color=#0000FF align=left><font_size=15>%s</font_size></font>", loc_url);
1585 eina_strbuf_append(buf, temp_msg);
1586 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1587 eina_strbuf_free(buf);
1590 free_media_details(media_msg);
1591 set_string_data(entry, "media_type", "location");
1592 set_string_data(entry, "location_url", loc_url);
1593 evas_object_smart_callback_add(entry, "clicked", on_media_chat_item_clicked, NULL);
1595 } else if (msg->media_type == tgl_message_media_contact) {
1597 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1600 if (media_msg->caption && strlen(media_msg->caption) > 0) {
1601 caption = strdup(media_msg->caption);
1603 char temp_msg[4*256] = {0,};
1604 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);
1605 eina_strbuf_append(buf, temp_msg);
1606 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1607 eina_strbuf_free(buf);
1608 free_media_details(media_msg);
1611 } else if (msg->media_type == tgl_message_media_unsupported) {
1613 } else if (msg->media_type == tgl_message_media_photo_encr) {
1615 } else if (msg->media_type == tgl_message_media_document_encr) {
1620 ad->loaded_msg_list = eina_list_append(ad->loaded_msg_list, entry);
1623 LOGD("caption is (%s)", caption);
1627 time_t t = msg->date;
1628 const char *format = "%I:%M %p";
1631 (void) localtime_r(&t, <);
1633 if (strftime(res, sizeof(res), format, <) == 0) {
1634 (void) fprintf(stderr, "strftime(3): cannot format supplied "
1635 "date/time into buffer of size %u "
1637 sizeof(res), format);
1640 char time_str[20] = {0,};
1641 snprintf(time_str, sizeof(time_str) - 1, "%s", res);
1642 elm_object_part_text_set(entry, "time", time_str);
1644 Evas_Object *status_obj;
1645 status_obj = elm_icon_add(entry);
1646 evas_object_size_hint_weight_set(status_obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1647 evas_object_size_hint_align_set(status_obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
1649 if (msg->msg_state == TG_MESSAGE_STATE_SENDING) {
1650 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENDING_ICON), NULL);
1651 elm_object_signal_emit(entry, "status_on", "status");
1652 } else if (msg->msg_state == TG_MESSAGE_STATE_SENT) {
1653 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENT_ICON), NULL);
1654 elm_object_signal_emit(entry, "status_on", "status");
1655 } else if (msg->msg_state == TG_MESSAGE_STATE_DELIVERED) {
1656 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_DELIVERED_ICON), NULL);
1657 elm_object_signal_emit(entry, "status_on", "status");
1658 } else if (msg->msg_state == TG_MESSAGE_STATE_RECEIVED) {
1659 elm_object_signal_emit(entry, "status_off", "status");
1660 } else if (msg->msg_state == TG_MESSAGE_STATE_FAILED) {
1661 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_FAILED_ICON), NULL);
1662 elm_object_signal_emit(entry, "status_on", "status");
1663 } else if (msg->msg_state == TG_MESSAGE_STATE_READ) {
1664 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_READ_ICON), NULL);
1665 elm_object_signal_emit(entry, "status_on", "status");
1666 } else if (msg->msg_state == TG_MESSAGE_STATE_UNKNOWN) {
1667 elm_object_signal_emit(entry, "status_off", "status");
1670 elm_object_part_content_set(entry, "status_icon", status_obj);
1671 evas_object_show(status_obj);
1677 void on_text_message_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
1682 void on_text_message_received_from_buddy(appdata_s* ad, long long message_id, int type_of_chat)
1684 peer_with_pic_s* pic_peer_item = NULL;
1685 tg_peer_info_s* peer_item = NULL;
1686 char* tablename = NULL;
1687 tg_message_s* msg = NULL;
1688 Evas_Object* chat_scroller = NULL;
1689 Evas_Object *message = NULL;
1694 pic_peer_item = ad->peer_in_cahtting_data;
1698 peer_item = pic_peer_item->use_data;
1702 tablename = get_table_name_from_number(peer_item->peer_id);
1706 msg = get_message_from_message_table(message_id, tablename);
1708 LOGE("received msg is not found in DB");
1713 chat_scroller = evas_object_data_get(ad->nf, "chat_list");
1717 peer_item->last_msg_id = msg->msg_id;
1718 peer_item->last_msg_date = msg->date;
1719 insert_or_update_peer_into_database(peer_item);
1721 Evas_Object *layout = evas_object_data_get(ad->nf, "main_layout");
1723 int is_end_edge = (int) evas_object_data_get(layout, "is_end_edge");
1725 Evas_Object *bubble_layout = NULL;
1726 bubble_layout = elm_object_part_content_get(layout, "swallow.messagebubble");
1728 int user_id = (int) evas_object_data_get(chat_scroller, "user_id");
1729 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1730 char *sender_name = NULL;
1731 if (sel_item->use_data->peer_type == TGL_PEER_USER) {
1732 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1733 } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
1734 int from_id = msg->from_id;
1735 // get name of buddy
1736 char* buddy_name = get_buddy_name_from_id(from_id);
1738 sender_name = replace(buddy_name, '_', " ");
1742 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1745 elm_object_part_text_set(bubble_layout, "text_name", sender_name);
1746 elm_object_part_text_set(bubble_layout, "text_message", msg->message);
1747 elm_object_signal_emit(layout, "show", "bubblemessage");
1752 message = on_message_item_content_get_cb((void *)msg, chat_scroller, "elm.icon.entry");
1753 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)message_id);
1754 scroller_push_item(chat_scroller, message, 0);
1756 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1757 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1759 send_request_for_marked_as_read(ad, ad->service_client, sel_item->use_data->peer_id, sel_item->use_data->peer_type);
1760 ad->is_last_msg_changed = EINA_TRUE;
1761 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
1767 static void media_file_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1770 str = evas_object_data_del(obj, data);
1775 void on_media_download_completed(appdata_s* ad, int buddy_id, long long media_id, const char *file_path, const char *caption)
1777 LOGE("Media download17");
1782 Evas_Object* entry = NULL;
1783 LOGE("Media download18");
1784 EINA_LIST_FOREACH(ad->loaded_msg_list, l, entry) {
1785 LOGE("Media download19");
1787 LOGE("Media download20");
1791 char* media_type_str = evas_object_data_get(entry, "media_type");
1792 char* media_id_str = evas_object_data_get(entry, "media_id");
1793 char* media_size_str = evas_object_data_get(entry, "image_size");
1794 Evas_Object *img_item = evas_object_data_get(entry, "image_object");
1795 Evas_Object *size_btn = evas_object_data_get(entry, "button_object");
1797 if (!media_id_str) {
1801 long long lmedia_id = atoll(media_id_str);
1803 if (media_id != lmedia_id) {
1806 if (img_item || (media_type_str && strstr(media_type_str, "audio") != NULL)) {
1809 if (file_path && strstr(file_path, "failed_to_load") != NULL) {
1811 if (media_type_str && (strstr(media_type_str, "audio") != NULL)) {
1812 Evas_Object *play_pause_icon = evas_object_data_get(entry, "play_pause_icon");
1813 Evas_Object *progressbar = evas_object_data_get(entry, "progress_bar");
1814 evas_object_data_set(progressbar, "is_download_in_progress", (void *)EINA_FALSE);
1815 set_string_data(play_pause_icon, "audio_file_path", NULL);
1816 elm_object_style_set(progressbar, "default");
1822 Evas_Object* progress = elm_object_part_content_get(size_btn, "download_image");
1824 evas_object_del(progress);
1826 Evas_Object* download_img = get_image_from_path(ui_utils_get_resource(MEDIA_DOWNLOAD_ICON), size_btn);
1827 elm_object_part_content_set(size_btn, "download_image", download_img);
1828 evas_object_data_set(size_btn, "image_state", "ready_to_download");
1829 char temp_msg[256] = {0,};
1830 snprintf(temp_msg, sizeof(temp_msg), "<font=Tizen:style=Bold color=#008000 align=center><font_size=30>%s</font_size></font>", media_size_str);
1831 elm_object_text_set(size_btn, temp_msg);
1836 if (media_type_str && (strstr(media_type_str, "audio") != NULL)) {
1838 Evas_Object *play_pause_icon = evas_object_data_get(entry, "play_pause_icon");
1839 Evas_Object *progressbar = evas_object_data_get(entry, "progress_bar");
1840 evas_object_data_set(progressbar, "is_download_in_progress", (void *)EINA_FALSE);
1841 elm_object_style_set(progressbar, "default");
1843 set_string_data(play_pause_icon, "audio_file_path", file_path);
1845 metadata_extractor_h metadata;
1846 metadata_extractor_create(&metadata);
1847 int ret = metadata_extractor_set_path(metadata, file_path);
1849 ret = metadata_extractor_get_metadata(metadata, METADATA_DURATION, &value);
1850 metadata_extractor_destroy(metadata);
1854 duration = atoi(value);
1858 elm_object_part_text_set(progressbar, "elm.text.top.left", "");
1859 elm_object_part_text_set(progressbar, "elm.text.top.right", "");
1865 evas_object_del(size_btn);
1868 if (media_type_str && (strstr(media_type_str, "video") != NULL)) {
1869 Evas_Object* play_img = get_video_paly_icon(img_item);
1870 //Evas_Object* play_img = get_image_from_path(ui_utils_get_resource(MEDIA_PLAY_ICON), img_item);
1871 elm_object_part_content_set(img_item, "swallow.play_btn", play_img);
1872 } else if (media_type_str && strstr(media_type_str, "image") != NULL) {
1873 img_item = get_image_from_path(file_path, entry);
1875 elm_image_object_size_get(img_item, &w, &h);
1876 entry_h = (318 * h) / w;
1877 Eina_Strbuf *buf = eina_strbuf_new();
1878 char image[256] = {0,};
1879 snprintf(image, sizeof(image) - 1, "<item size=318x%d vsize=full href=itemprovider></item>", entry_h);
1880 eina_strbuf_append(buf, image);
1881 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1882 eina_strbuf_free(buf);
1884 } else if (media_type_str && strstr(media_type_str, "animated_gif") != NULL) {
1886 int msg_id = (int) evas_object_data_get(entry, "message_id");
1887 char key[256] = {0, };
1888 snprintf(key, sizeof(key), "%d", msg_id);
1890 img_item = get_gif_image_from_path(file_path, entry, key);
1891 //elm_image_animated_set(img_item, EINA_TRUE);
1892 //elm_image_animated_play_set(img_item, EINA_TRUE);
1894 elm_image_object_size_get(img_item, &w, &h);
1895 entry_h = (318 * h) / w;
1896 Eina_Strbuf *buf = eina_strbuf_new();
1897 char image[256] = {0,};
1898 snprintf(image, sizeof(image) - 1, "<item size=318x%d vsize=full href=itemprovider></item>", entry_h);
1899 eina_strbuf_append(buf, image);
1900 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1901 eina_strbuf_free(buf);
1906 LOGE("Media download36");
1909 //elm_object_part_content_set(comp_img_layout, "swallow.chat_send_image", image);
1911 void on_video_thumb_download_completed(appdata_s* ad, int buddy_id, long long media_id, const char* file_path, const char *caption)
1913 on_media_download_completed(ad, buddy_id, media_id, file_path, caption);
1916 void on_text_message_state_changed(appdata_s* ad, tg_message_s *msg, int type_of_chat)
1922 Evas_Object* entry = NULL;
1923 EINA_LIST_FOREACH(ad->loaded_msg_list, l, entry) {
1926 int message_id = (int)evas_object_data_get(entry, "message_id");
1927 if (message_id == msg->msg_id || message_id == msg->unique_id) {
1929 set_string_data(entry, "media_id", msg->media_id);
1930 evas_object_data_set(entry, "message_id", (void*)message_id);
1932 Evas_Object* status_obj = elm_object_part_content_get(entry, "status_icon");
1934 if (msg->msg_state == TG_MESSAGE_STATE_SENDING) {
1935 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENDING_ICON), NULL);
1936 elm_object_signal_emit(entry, "status_on", "status");
1937 } else if (msg->msg_state == TG_MESSAGE_STATE_SENT) {
1938 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENT_ICON), NULL);
1939 elm_object_signal_emit(entry, "status_on", "status");
1940 } else if (msg->msg_state == TG_MESSAGE_STATE_DELIVERED) {
1941 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_DELIVERED_ICON), NULL);
1942 elm_object_signal_emit(entry, "status_on", "status");
1943 } else if (msg->msg_state == TG_MESSAGE_STATE_RECEIVED) {
1944 elm_object_signal_emit(entry, "status_off", "status");
1945 } else if (msg->msg_state == TG_MESSAGE_STATE_FAILED) {
1946 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_FAILED_ICON), NULL);
1947 elm_object_signal_emit(entry, "status_on", "status");
1948 } else if (msg->msg_state == TG_MESSAGE_STATE_READ) {
1949 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_READ_ICON), NULL);
1950 elm_object_signal_emit(entry, "status_on", "status");
1951 } else if (msg->msg_state == TG_MESSAGE_STATE_UNKNOWN) {
1952 elm_object_signal_emit(entry, "status_off", "status");
1960 Eina_Bool add_date_item_to_chat(void *data)
1962 Evas_Object *chat_scroller = data;
1963 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1964 Eina_Bool ret = EINA_FALSE;
1968 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1972 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1974 char* msg_table = get_table_name_from_number(sel_item->use_data->peer_id);
1975 create_buddy_msg_table(msg_table);
1976 int msg_id = insert_current_date_to_table(msg_table);
1984 // send request to service
1985 Evas_Object *message = NULL;
1986 tg_message_s* msg = get_message_from_message_table(msg_id, msg_table);
1987 message = on_message_item_content_get_cb((void *)msg, chat_scroller, "elm.icon.entry");
1988 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)msg_id);
1989 scroller_push_item(chat_scroller, message, 0);
1991 ad->is_last_msg_changed = EINA_TRUE;
2000 static Eina_Bool on_new_text_message_send_cb(void *data)
2002 Evas_Object *chat_scroller = data;
2003 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2004 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2005 Evas_Object *text_entry = evas_object_data_get(chat_scroller, "text_entry");
2007 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2009 const char* text_to_send = elm_entry_entry_get(text_entry);
2010 if (!text_to_send || (strlen(text_to_send) == 0))
2011 return ECORE_CALLBACK_CANCEL;
2013 int unique_id = get_time_stamp_in_macro();
2014 if (unique_id < 0) {
2015 unique_id = -1 * unique_id;
2018 msg.msg_id = unique_id;
2019 msg.from_id = ad->current_user_data->user_id.id;
2020 msg.date = time(NULL);
2023 msg.fwd_from_id = 0;
2024 msg.fwd_from_id = 0;
2026 msg.message = (char *)text_to_send;
2027 msg.message_len = strlen(text_to_send);
2028 msg.media_type = tgl_message_media_none;
2032 msg.to_id = sel_item->use_data->peer_id;
2034 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2035 msg.is_marked_for_delete = 0;
2036 char* msg_table = get_table_name_from_number(msg.to_id);
2037 create_buddy_msg_table(msg_table);
2038 insert_msg_into_db(&msg, msg_table, unique_id);
2041 peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
2042 if (pic_peer_item) {
2043 tg_peer_info_s* peer_item = pic_peer_item->use_data;
2044 // update peer table
2046 peer_item->last_msg_id = msg.msg_id;
2047 peer_item->last_msg_date = msg.date;
2048 insert_or_update_peer_into_database(peer_item);
2052 // send request to service
2053 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);
2055 Evas_Object *message = NULL;
2057 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2058 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)unique_id);
2059 scroller_push_item(chat_scroller, message, 0);
2061 elm_entry_entry_set(text_entry, "");
2062 ad->is_last_msg_changed = EINA_TRUE;
2063 return ECORE_CALLBACK_CANCEL;
2066 static void on_text_message_send_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2068 Evas_Object* chat_scroller = data;
2069 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2073 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2074 Evas_Object* text_entry = evas_object_data_get(chat_scroller, "text_entry");
2077 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2078 const char* text_to_send = elm_entry_markup_to_utf8(elm_object_text_get(text_entry));
2079 if (!text_to_send || (strlen(text_to_send) == 0))
2082 if (add_date_item_to_chat(data))
2085 int unique_id = get_time_stamp_in_macro();
2087 unique_id = -1 * unique_id;
2090 msg.msg_id = unique_id;
2091 msg.from_id = ad->current_user_data->user_id.id;
2092 msg.date = time(NULL);
2095 msg.fwd_from_id = 0;
2096 msg.fwd_from_id = 0;
2098 msg.message = (char *)text_to_send;
2099 msg.message_len = strlen(text_to_send);
2100 msg.media_type = tgl_message_media_none;
2104 msg.to_id = sel_item->use_data->peer_id;
2106 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2107 msg.is_marked_for_delete = 0;
2108 char* msg_table = get_table_name_from_number(msg.to_id);
2109 create_buddy_msg_table(msg_table);
2110 insert_msg_into_db(&msg, msg_table, unique_id);
2113 peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
2114 if (pic_peer_item) {
2115 tg_peer_info_s* peer_item = pic_peer_item->use_data;
2117 peer_item->last_msg_id = msg.msg_id;
2118 peer_item->last_msg_date = msg.date;
2119 insert_or_update_peer_into_database(peer_item);
2123 // send request to service
2124 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);
2125 Evas_Object *message = NULL;
2126 Evas_Object *layout = evas_object_data_get(ad->nf, "main_layout");
2127 evas_object_data_set(layout, "is_end_edge", (void *) 1);
2129 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2130 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)unique_id);
2131 scroller_push_item(chat_scroller, message, 0);
2133 elm_entry_entry_set(text_entry, "");
2134 ad->is_last_msg_changed = EINA_TRUE;
2137 void on_user_status_changed(appdata_s* ad, char* status)
2142 Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
2143 char status_str[256] = {0,};
2144 snprintf(status_str, sizeof(status_str) - 1, "%s", status);
2145 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2148 static void compare_with_current_date(int rtime, Elm_Object_Item *nf_it)
2150 char time_str[256] = {0,};
2151 time_t local_t = time(NULL);
2157 diff_sec = local_t - rtime;
2158 diff_min = diff_sec / 60;
2159 diff_hour = diff_min / 60;
2160 diff_day = diff_hour / 24;
2161 LOGD("different : day : %d, hour = %d, min = %d, sec = %d", diff_day, diff_hour, diff_min, diff_sec);
2163 if (diff_day > 30) {
2164 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_LONG_TIME_AGO_ABB"));
2169 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_WITHIN_A_MONTH_ABB"));
2173 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_WITHIN_A_WEEK_ABB"));
2177 if (diff_hour > 1) {
2178 snprintf(time_str, sizeof(time_str) - 1, i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_PD_HOURS_AGO_ABB"), diff_hour);
2182 if (diff_hour == 1) {
2183 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_1_HOUR_AGO_ABB"));
2187 snprintf(time_str, sizeof(time_str) - 1, i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_PD_MINUTES_AGO_ABB"), diff_min);
2190 if (diff_min == 1) {
2191 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_1_MINUTE_AGO_ABB"));
2194 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_RECENTLY_ABB"));
2197 elm_object_item_part_text_set(nf_it, "subtitle", time_str);
2200 void on_user_presence_state_changed(appdata_s* ad, int buddy_id)
2204 int type_of_chat = ad->peer_in_cahtting_data->use_data->peer_type;
2205 Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
2207 if (type_of_chat == TGL_PEER_USER) {
2208 Eina_List *buddy_details_array = get_buddy_info(buddy_id);
2209 if (buddy_details_array && eina_list_count(buddy_details_array) > 0) {
2210 Eina_List *buddy_details = eina_list_nth(buddy_details_array, 0);
2211 if (buddy_details && eina_list_count(buddy_details) > 0) {
2212 int* temp_online = (int *)eina_list_nth(buddy_details, 12);
2213 int is_online = *temp_online;
2214 int* temp_last_seen = (int *)eina_list_nth(buddy_details, 13);
2215 int last_seen = *temp_last_seen;
2217 if (is_online > 0) {
2218 char status_str[256] = {0,};
2219 snprintf(status_str, sizeof(status_str) - 1, "%s", i18n_get_text("IDS_TGRAM_SBODY_ONLINE"));
2220 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2222 compare_with_current_date(last_seen, nf_it);
2226 EINA_LIST_FREE(buddy_details_array,val) {
2231 eina_list_free(buddy_details_array);
2233 } else if (type_of_chat == TGL_PEER_CHAT) {
2235 tg_chat_info_s* chat_info = get_chat_info(buddy_id);
2237 char status_str[256] = {0,};
2238 snprintf(status_str, sizeof(status_str) - 1, "Unidentified.");
2239 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2243 int user_list_size = chat_info->user_list_size;
2244 int online_members = 0;
2246 Eina_List *names_of_buddies = NULL;
2247 names_of_buddies = evas_object_data_get(ad->nf, "names_of_buddies");
2249 if(names_of_buddies != NULL){
2250 buddies_info *buddy = NULL;
2251 EINA_LIST_FREE(names_of_buddies, buddy) {
2258 names_of_buddies = NULL;
2259 evas_object_data_set(ad->nf, "names_of_buddies", NULL);
2262 for (int i = 0; i < user_list_size; i++) {
2264 int is_online = get_buddy_online_status(chat_info->chat_users[i]);
2265 if (is_online > 0) {
2269 char *buddy_full_name = NULL;
2270 int buddy_id = chat_info->chat_users[i];
2272 if (buddy_id == ad->current_user_data->user_id.id) {
2273 buddy_full_name = strdup(ad->current_user_data->print_name);
2275 buddy_full_name = get_buddy_name_from_id(buddy_id);
2278 if (buddy_full_name) {
2279 char *buddy_name = replace(buddy_full_name, '_', " ");
2281 buddies_info *buddy_info = (buddies_info*)malloc(sizeof(buddies_info));
2282 buddy_info->name = buddy_name;
2283 buddy_info->id = buddy_id;
2284 names_of_buddies = eina_list_append(names_of_buddies, (void*)(buddy_info));
2286 free(buddy_full_name);
2290 evas_object_data_set(ad->nf, "names_of_buddies", (void*)names_of_buddies);
2293 if (online_members == 0) {
2294 char status_str[256] = {0,};
2295 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"));
2296 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2298 char status_str[256] = {0,};
2299 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"));
2300 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2303 char status_str[256] = {0,};
2304 snprintf(status_str, sizeof(status_str) - 1, i18n_get_text("IDS_TGRAM_BODY_PD_PARTICIPANTS"), user_list_size);
2306 char temp_status_str[512] = {0,};
2307 snprintf(temp_status_str, sizeof(temp_status_str) - 1, "%s", status_str);
2309 elm_object_item_part_text_set(nf_it, "subtitle", temp_status_str);
2313 if (chat_info->print_title) {
2314 free(chat_info->print_title);
2315 chat_info->print_title = NULL;
2317 if (chat_info->photo_path) {
2318 free(chat_info->photo_path);
2319 chat_info->photo_path = NULL;
2321 if (chat_info->title) {
2322 free(chat_info->title);
2323 chat_info->title = NULL;
2330 static Eina_Bool on_change_input_type_requested(void *data)
2332 Evas_Object* text_entry = data;
2334 LOGE("Fail to get the text_entry");
2335 return ECORE_CALLBACK_CANCEL;
2337 elm_object_focus_set(text_entry, EINA_TRUE);
2338 elm_entry_input_panel_layout_set(text_entry, ELM_INPUT_PANEL_LAYOUT_EMOTICON);
2339 elm_entry_input_panel_show(text_entry);
2341 return ECORE_CALLBACK_CANCEL;
2344 static void on_message_cancel_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2346 Evas_Object *layout = data;
2348 LOGE("Fail to get the layout");
2351 elm_object_signal_emit(layout, "hide", "bubblemessage");
2354 static void on_message_smiley_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2356 Evas_Object* text_entry = data;
2358 LOGE("Fail to get the text_entry");
2361 ecore_timer_add(0.3, on_change_input_type_requested, text_entry);
2364 static void on_message_text_entry_clicked(void *data, Evas_Object *obj, void *event_info)
2367 LOGE("Fail to get the entry");
2370 /* This Api is needed for type of keyboard: emoticon or caractor */
2371 elm_entry_input_panel_layout_set(obj, ELM_INPUT_PANEL_LAYOUT_NORMAL);
2374 static void on_message_text_entry_changed(void *data, Evas_Object *obj, void *event_info)
2376 Evas_Object *layout = data;
2379 LOGE("Fail to get the entry layout");
2382 int attach_show = (int) evas_object_data_get(layout, "is_attach_show");
2384 if (elm_entry_is_empty(obj)) {
2386 elm_object_signal_emit(layout, "show", "attach_btn");
2387 evas_object_data_set(layout, "is_attach_show", (void *) 1);
2391 elm_object_signal_emit(layout, "hide", "attach_btn");
2392 evas_object_data_set(layout, "is_attach_show", (void *) 0);
2397 Evas_Object* create_chat_genlist(Evas_Object *win)
2399 Evas_Object *genlist;
2400 Elm_Theme *theme = elm_theme_new();
2401 char edj_path[PATH_MAX] = {0, };
2402 app_get_resource(TELEGRAM_GENLIST_THEME_EDJ, edj_path, (int)PATH_MAX);
2403 elm_theme_extension_add(theme, edj_path);
2404 genlist = elm_genlist_add(win);
2405 elm_object_theme_set(genlist, theme);
2406 elm_object_style_set(genlist, "telegram/default");
2407 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2408 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
2412 void on_list_media_item_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2417 static Eina_Bool on_new_contact_message_send_cb(void *data)
2419 Evas_Object *chat_scroller = data;
2420 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2421 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2423 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2425 int unique_id = time(NULL);
2427 char unique_id_str[50];
2428 sprintf(unique_id_str, "%d", unique_id);
2431 msg.msg_id = unique_id;
2432 msg.from_id = ad->current_user_data->user_id.id;
2433 msg.date = time(NULL);
2436 msg.fwd_from_id = 0;
2437 msg.fwd_from_id = 0;
2438 msg.unique_id = unique_id;
2440 msg.message_len = 0;
2441 msg.media_type = tgl_message_media_contact;
2442 msg.media_id = strdup(unique_id_str);
2445 msg.to_id = sel_item->use_data->peer_id;
2447 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2448 msg.is_marked_for_delete = 0;
2450 char* msg_table = get_table_name_from_number(msg.to_id);
2451 create_buddy_msg_table(msg_table);
2452 insert_msg_into_db(&msg, msg_table, unique_id);
2457 char *first_name = evas_object_data_get(chat_scroller, "contact_first_name");
2458 char *last_name = evas_object_data_get(chat_scroller, "contact_last_name");
2459 char *phone_number = evas_object_data_get(chat_scroller, "contact_phone_number");
2461 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, NULL, NULL, first_name, last_name, phone_number);
2465 // send request to service
2466 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);
2468 Evas_Object *message = NULL;
2470 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2471 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2472 scroller_push_item(chat_scroller, message, 0);
2476 return ECORE_CALLBACK_CANCEL;
2480 void send_contact_message_to_buddy(void *data, char *first_name, char *last_name, char *phone_number)
2482 Evas_Object *chat_scroller = data;
2483 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2487 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2489 if (add_date_item_to_chat(data))
2492 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2494 int unique_id = get_time_stamp_in_macro();
2495 if (unique_id < 0) {
2496 unique_id = -1 * unique_id;
2498 char unique_id_str[50];
2499 sprintf(unique_id_str, "%d", unique_id);
2502 msg.msg_id = unique_id;
2503 msg.from_id = ad->current_user_data->user_id.id;
2504 msg.date = time(NULL);
2507 msg.fwd_from_id = 0;
2508 msg.fwd_from_id = 0;
2509 msg.unique_id = unique_id;
2511 msg.message_len = 0;
2512 msg.media_type = tgl_message_media_contact;
2513 msg.media_id = strdup(unique_id_str);
2516 msg.to_id = sel_item->use_data->peer_id;
2518 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2519 msg.is_marked_for_delete = 0;
2521 char* msg_table = get_table_name_from_number(msg.to_id);
2522 create_buddy_msg_table(msg_table);
2523 insert_msg_into_db(&msg, msg_table, unique_id);
2527 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, NULL, NULL, first_name, last_name, phone_number);
2531 // send request to service
2532 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);
2533 Evas_Object *message = NULL;
2534 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2535 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2536 scroller_push_item(chat_scroller, message, 0);
2540 static Eina_Bool on_new_location_message_send_cb(void *data)
2542 Evas_Object *chat_scroller = data;
2543 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2544 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2546 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2548 int unique_id = time(NULL);
2550 char unique_id_str[50];
2551 sprintf(unique_id_str, "%d", unique_id);
2554 msg.msg_id = unique_id;
2555 msg.from_id = ad->current_user_data->user_id.id;
2556 msg.date = time(NULL);
2559 msg.fwd_from_id = 0;
2560 msg.fwd_from_id = 0;
2561 msg.unique_id = unique_id;
2563 msg.message_len = 0;
2564 msg.media_type = tgl_message_media_geo;
2565 msg.media_id = strdup(unique_id_str);
2568 msg.to_id = sel_item->use_data->peer_id;
2570 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2571 msg.is_marked_for_delete = 0;
2573 char* msg_table = get_table_name_from_number(msg.to_id);
2574 create_buddy_msg_table(msg_table);
2575 insert_msg_into_db(&msg, msg_table, unique_id);
2580 char *latitude = evas_object_data_get(chat_scroller, "contact_latitude");
2581 char *longitude = evas_object_data_get(chat_scroller, "contact_longitude");
2583 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, latitude, longitude, NULL, NULL, NULL);
2587 // send request to service
2588 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);
2590 Evas_Object *message = NULL;
2592 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2593 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2594 scroller_push_item(chat_scroller, message, 0);
2597 return ECORE_CALLBACK_CANCEL;
2600 void send_location_message_to_buddy(void *data, char *latitude, char *longitude)
2602 Evas_Object *chat_scroller = data;
2603 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2607 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2609 if (add_date_item_to_chat(data))
2613 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2615 int unique_id = get_time_stamp_in_macro();
2617 unique_id = -1 * unique_id;
2619 char unique_id_str[50];
2620 sprintf(unique_id_str, "%d", unique_id);
2623 msg.msg_id = unique_id;
2624 msg.from_id = ad->current_user_data->user_id.id;
2625 msg.date = time(NULL);
2628 msg.fwd_from_id = 0;
2629 msg.fwd_from_id = 0;
2630 msg.unique_id = unique_id;
2632 msg.message_len = 0;
2633 msg.media_type = tgl_message_media_geo;
2634 msg.media_id = strdup(unique_id_str);
2637 msg.to_id = sel_item->use_data->peer_id;
2639 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2640 msg.is_marked_for_delete = 0;
2642 char* msg_table = get_table_name_from_number(msg.to_id);
2643 create_buddy_msg_table(msg_table);
2644 insert_msg_into_db(&msg, msg_table, unique_id);
2648 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, latitude, longitude, NULL, NULL, NULL);
2652 // send request to service
2653 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);
2655 Evas_Object *message = NULL;
2657 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2658 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2659 scroller_push_item(chat_scroller, message, 0);
2664 static Eina_Bool on_new_media_message_send_cb(void *data)
2666 Evas_Object *chat_scroller = data;
2667 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2668 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2670 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2672 int unique_id = time(NULL);
2674 char unique_id_str[50];
2675 sprintf(unique_id_str, "%d", unique_id);
2677 char *file_type_char = evas_object_data_get(chat_scroller, "file_type");
2678 int file_type = atoi(file_type_char);
2679 char *file_path = evas_object_data_get(chat_scroller, "file_path");
2682 msg.msg_id = unique_id;
2683 msg.from_id = ad->current_user_data->user_id.id;
2684 msg.date = time(NULL);
2687 msg.fwd_from_id = 0;
2688 msg.fwd_from_id = 0;
2689 msg.unique_id = unique_id;
2691 msg.message_len = 0;
2692 msg.media_type = file_type;
2693 msg.media_id = strdup(unique_id_str);
2696 msg.to_id = sel_item->use_data->peer_id;
2698 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2699 msg.is_marked_for_delete = 0;
2701 char* msg_table = get_table_name_from_number(msg.to_id);
2702 create_buddy_msg_table(msg_table);
2703 insert_msg_into_db(&msg, msg_table, unique_id);
2707 if (file_type == tgl_message_media_photo) {
2708 Evas_Object *img = create_image_object_from_file(file_path, chat_scroller);
2709 elm_image_object_size_get(img, &img_width, &img_height);
2711 stat(file_path, &st);
2712 media_size = st.st_size;
2713 evas_object_del(img);
2716 insert_media_info_to_db(&msg, (char *)file_path, img_width, img_height, media_size, NULL, NULL , NULL, NULL, NULL);
2718 // send request to service
2719 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);
2721 Evas_Object *message = NULL;
2722 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2723 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2724 scroller_push_item(chat_scroller, message, 0);
2727 ad->is_last_msg_changed = EINA_TRUE;
2728 return ECORE_CALLBACK_CANCEL;
2731 void send_media_message_to_buddy(void *data, const char* file_path, enum tgl_message_media_type file_type)
2733 Evas_Object *chat_scroller = data;
2734 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2738 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2739 if (add_date_item_to_chat(data))
2742 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2744 int unique_id = get_time_stamp_in_macro();
2746 unique_id = -1 * unique_id;
2748 char unique_id_str[50];
2749 sprintf(unique_id_str, "%d", unique_id);
2752 msg.msg_id = unique_id;
2753 msg.from_id = ad->current_user_data->user_id.id;
2754 msg.date = time(NULL);
2757 msg.fwd_from_id = 0;
2758 msg.fwd_from_id = 0;
2759 msg.unique_id = unique_id;
2761 msg.message_len = 0;
2762 msg.media_type = file_type;
2763 msg.media_id = strdup(unique_id_str);
2766 msg.to_id = sel_item->use_data->peer_id;
2768 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2769 msg.is_marked_for_delete = 0;
2771 char* msg_table = get_table_name_from_number(msg.to_id);
2772 create_buddy_msg_table(msg_table);
2773 insert_msg_into_db(&msg, msg_table, unique_id);
2777 if (file_type == tgl_message_media_photo) {
2778 Evas_Object* img = create_image_object_from_file(file_path, chat_scroller);
2779 elm_image_object_size_get(img, &img_width, &img_height);
2781 stat(file_path, &st);
2782 media_size = st.st_size;
2783 evas_object_del(img);
2786 insert_media_info_to_db(&msg, (char *)file_path, img_width, img_height, media_size, NULL, NULL , NULL, NULL, NULL);
2788 // send request to service
2789 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);
2790 Evas_Object *message = NULL;
2791 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2792 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2793 scroller_push_item(chat_scroller, message, 0);
2795 ad->is_last_msg_changed = EINA_TRUE;
2798 static Eina_Bool on_timer_expired(void *data)
2800 Evas_Object *scroller = data;
2802 int is_end_edge_top = 0;
2803 is_end_edge_top = (int)evas_object_data_get(scroller, "is_end_edge_top");
2806 LOGE("Cannot get the scroller");
2807 return ECORE_CALLBACK_CANCEL;
2809 //ret = scroller_show_bottom_edge(scroller);
2810 ret = scroller_show_previous_region(scroller);
2812 LOGE("Fail to show the bottom of scroller");
2815 return ECORE_CALLBACK_CANCEL;
2818 Eina_Bool load_chat_history(Evas_Object *chat_scroller)
2820 int offset_num = (int)evas_object_data_get(chat_scroller,"offset_num");
2821 if(offset_num < -TG_DBMGR_LIMITED) return EINA_FALSE;
2822 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2823 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2825 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2826 int buddy_id = sel_item->use_data->peer_id;
2827 char* tablename = get_table_name_from_number(buddy_id);
2828 Eina_List *vals = NULL;
2830 vals = get_messages_from_message_table_order_by(tablename, MESSAGE_INFO_TABLE_DATE, EINA_TRUE, TG_DBMGR_LIMITED, offset_num);
2832 vals = get_messages_from_message_table_order_by(tablename, MESSAGE_INFO_TABLE_DATE, EINA_TRUE, TG_DBMGR_LIMITED + offset_num, 0);
2833 tg_message_s *message_item = NULL;
2836 // set no messages yet
2839 int row_count = eina_list_count(vals);
2840 Evas_Object *message = NULL;
2841 for (int i = row_count-1 ; i >= 0 ; i--) {
2842 message_item = eina_list_nth(vals, i);
2843 message = on_message_item_content_get_cb((void *)message_item, chat_scroller, "elm.icon.entry");
2844 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)message_item->msg_id);
2845 scroller_push_item(chat_scroller, message, 1);
2846 free_message(&message_item);
2849 // all message items are free now.
2850 eina_list_free(vals);
2854 evas_object_data_set(chat_scroller, "offset_num", (void *)(offset_num-TG_DBMGR_LIMITED));
2860 void on_gallery_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2862 if (result != APP_CONTROL_RESULT_SUCCEEDED) {
2865 Evas_Object* chat_scroller = user_data;
2866 char* file_path = NULL;
2867 char** path_arryay = NULL;
2868 int array_length = 0;
2870 char* mime_type = NULL;
2871 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2873 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
2874 if (status != APP_CONTROL_ERROR_NONE) {
2875 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay, &array_length);
2876 if (status != APP_CONTROL_ERROR_NONE) {
2878 show_toast(ad, "Unable to get the result from attach panel");
2884 status = app_control_get_mime(reply, &mime_type);
2885 if (status != APP_CONTROL_ERROR_NONE) {
2887 show_toast(ad, "Unable to get the mime type from attach panel");
2892 for (int i = 0 ; i < array_length ; i++) {
2893 file_path = strdup(path_arryay[i]);
2894 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_photo);
2900 void on_location_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2902 Evas_Object* chat_scroller = user_data;
2903 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2904 if (result != APP_CONTROL_RESULT_SUCCEEDED) {
2905 show_toast(ad, "Device does not support location feature.");
2908 char *latitude = NULL;
2909 char *longitude = NULL;
2910 app_control_get_extra_data(reply, "latitude", &latitude);
2911 app_control_get_extra_data(reply, "longitude", &longitude);
2913 if (latitude && longitude) {
2914 send_location_message_to_buddy(chat_scroller, latitude, longitude);
2916 //send_location_message_to_buddy(chat_scroller, "0.00000000000", "0.00000000000");
2917 show_toast(ad, "Unable to detect location values.");
2921 void on_video_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2923 if (result != APP_CONTROL_RESULT_SUCCEEDED) {
2927 Evas_Object* chat_scroller = user_data;
2928 char* file_path = NULL;
2929 char** path_arryay = NULL;
2930 int array_length = 0;
2932 char* mime_type = NULL;
2933 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2935 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
2936 if (status != APP_CONTROL_ERROR_NONE) {
2937 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay, &array_length);
2938 if (status != APP_CONTROL_ERROR_NONE) {
2940 show_toast(ad, "Unable to get the result from attach panel");
2946 status = app_control_get_mime(reply, &mime_type);
2947 if (status != APP_CONTROL_ERROR_NONE) {
2949 show_toast(ad, "Unable to get the mime type from attach panel");
2953 for (int i = 0 ; i < array_length ; i++) {
2954 file_path = strdup(path_arryay[i]);
2955 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
2961 void on_file_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2963 if (result != APP_CONTROL_RESULT_SUCCEEDED) {
2967 Evas_Object* chat_scroller = user_data;
2968 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2969 char* file_path = NULL;
2970 char** path_arryay = NULL;
2971 int array_length = 0;
2972 app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
2974 for (int i = 0 ; i < array_length ; i++) {
2975 file_path = strdup(path_arryay[i]);
2977 // get mime type of the file
2978 char *mime_type = NULL;
2980 char *extn = strrchr(file_path, '.');
2982 extn = replace(extn, '.', "");
2985 mime_type_get_mime_type(extn, &mime_type);
2989 if (strstr(mime_type, "video") != NULL) {
2990 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
2991 } else if (strstr(mime_type, "audio") != NULL) {
2992 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
2993 } else if (strstr(mime_type, "image") != NULL) {
2994 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_photo);
2996 show_toast(ad, "Unsupported file.");
2999 show_toast(ad, "Unsupported file.");
3006 static void on_voice_record_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3008 if (result != APP_CONTROL_RESULT_SUCCEEDED) {
3011 Evas_Object* chat_scroller = user_data;
3013 char* file_path = NULL;
3014 char** path_arryay = NULL;
3015 int array_length = 0;
3017 char* mime_type = NULL;
3018 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3020 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
3021 if (status != APP_CONTROL_ERROR_NONE) {
3022 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay, &array_length);
3023 if (status != APP_CONTROL_ERROR_NONE) {
3025 show_toast(ad, "Unable to get the result from attach panel");
3031 status = app_control_get_mime(reply, &mime_type);
3032 if (status != APP_CONTROL_ERROR_NONE) {
3034 show_toast(ad, "Unable to get the mime type from attach panel");
3039 for (int i = 0 ; i < array_length ; i++) {
3040 file_path = strdup(path_arryay[i]);
3041 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3047 void on_contact_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3049 if (result != APP_CONTROL_RESULT_SUCCEEDED) {
3052 Evas_Object* chat_scroller = user_data;
3053 char *contact_name = NULL;
3054 char *phone_number = NULL;
3055 app_control_get_extra_data(reply, "http://tizen.org/appcontrol/data/name", &contact_name);
3056 app_control_get_extra_data(reply, "http://tizen.org/appcontrol/data/phone", &phone_number);
3059 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)
3061 switch (content_category) {
3062 case ATTACH_PANEL_CONTENT_CATEGORY_IMAGE:
3063 case ATTACH_PANEL_CONTENT_CATEGORY_CAMERA:
3064 on_gallery_app_control_reply_cb(NULL, result, result_code, user_data);
3066 case ATTACH_PANEL_CONTENT_CATEGORY_VIDEO:
3067 case ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER:
3068 on_video_app_control_reply_cb(NULL, result, result_code, user_data);
3070 case ATTACH_PANEL_CONTENT_CATEGORY_VOICE:
3071 on_voice_record_reply_cb(NULL, result, result_code, user_data);
3073 case ATTACH_PANEL_CONTENT_CATEGORY_MYFILES:
3074 case ATTACH_PANEL_CONTENT_CATEGORY_AUDIO:
3075 on_file_app_control_reply_cb(NULL, result, result_code, user_data);
3077 case ATTACH_PANEL_CONTENT_CATEGORY_CONTACT:
3078 on_contact_app_control_reply_cb(NULL, result, result_code, user_data);
3083 attach_panel_hide(attach_panel);
3086 void on_media_type_selected_cb(void *data, Evas_Object *obj, void *event_info)
3088 Evas_Object* chat_scroller = data;
3089 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3090 const char *label = elm_object_item_text_get((Elm_Object_Item *) event_info);
3091 if (strcasecmp(label, POPUP_TEXT_TAKE_GALLERY) == 0) {
3092 app_control_h app_control;
3093 int ret = app_control_create(&app_control);
3094 if (ret != APP_CONTROL_ERROR_NONE) {
3095 show_toast(ad, "Error: Can not load image picker");
3099 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3101 app_control_set_mime(app_control, "image/*");
3102 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3103 app_control_send_launch_request(app_control, &on_gallery_app_control_reply_cb, data);
3104 app_control_destroy(app_control);
3105 } else if (strcasecmp(label, POPUP_TEXT_TAKE_PHOTO) == 0) {
3106 app_control_h app_control;
3107 int ret = app_control_create(&app_control);
3108 if (ret != APP_CONTROL_ERROR_NONE) {
3109 show_toast(ad, "Error: Can not load image picker");
3112 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3113 app_control_set_mime(app_control, "image/jpg");
3114 //app_control_add_extra_data(app_control, "crop", "caller_id");
3115 app_control_send_launch_request(app_control, &on_gallery_app_control_reply_cb, data);
3116 app_control_destroy(app_control);
3117 } else if (strcasecmp(label, POPUP_TEXT_TAKE_VIDEO) == 0) {
3118 app_control_h app_control;
3119 int ret = app_control_create(&app_control);
3120 if (ret != APP_CONTROL_ERROR_NONE) {
3121 show_toast(ad, "Error: Can not load image picker");
3125 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3127 int remain_byte_size = 10485760;
3128 int request_KB_size = 0;
3130 if (remain_byte_size >= 1024) {
3131 request_KB_size = remain_byte_size / 1024;
3133 // TODO: Need to check minimum size for recording
3134 request_KB_size = 1;
3137 char recording_size[128] = {0, };
3138 snprintf(recording_size, sizeof(recording_size), "%d", request_KB_size);
3139 app_control_set_mime(app_control, "video/3gp");
3140 app_control_add_extra_data(app_control, "LIMIT", recording_size);
3141 app_control_add_extra_data(app_control, "RESOLUTION", "VGA");
3142 app_control_add_extra_data(app_control, "CALLER", "telegram");
3144 app_control_send_launch_request(app_control, &on_video_app_control_reply_cb, data);
3145 app_control_destroy(app_control);
3146 } else if (strcasecmp(label, POPUP_TEXT_TAKE_AUDIO) == 0) {
3148 app_control_h app_control;
3149 int ret = app_control_create(&app_control);
3150 if (ret != APP_CONTROL_ERROR_NONE) {
3151 show_toast(ad, "Error: Can not load image picker");
3155 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3157 int size = 10485760;
3159 int remain_byte_size = (int)size;
3160 int request_KB_size = 0;
3162 if (remain_byte_size >= 1024) {
3163 request_KB_size = remain_byte_size / 1024;
3165 // TODO: Need to check minimum size for recording
3166 request_KB_size = 1;
3169 char recording_size[128] = {0, };
3170 snprintf(recording_size, sizeof(recording_size), "%d", request_KB_size);
3171 app_control_add_extra_data(app_control, "SIZE", recording_size);
3172 app_control_set_mime(app_control, "audio/*");
3173 app_control_send_launch_request(app_control, &on_voice_record_reply_cb, data);
3174 app_control_destroy(app_control);
3176 } else if (strcasecmp(label, POPUP_TEXT_TAKE_FILE) == 0) {
3177 app_control_h app_control;
3178 int ret = app_control_create(&app_control);
3179 if (ret != APP_CONTROL_ERROR_NONE) {
3180 show_toast(ad, "Error: Can not load image picker");
3184 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3186 app_control_set_mime(app_control, "*/*");
3187 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3188 app_control_send_launch_request(app_control, &on_file_app_control_reply_cb, data);
3189 app_control_destroy(app_control);
3191 } else if (strcasecmp(label, POPUP_TEXT_TAKE_LOCATION) == 0) {
3192 app_control_h app_control;
3193 int ret = app_control_create(&app_control);
3194 if (ret != APP_CONTROL_ERROR_NONE) {
3195 show_toast(ad, "Error: Can not load location picker");
3198 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3199 //app_control_set_app_id(app_control, "com.here.tizen.maps");
3200 app_control_set_uri(app_control, "geo");
3201 app_control_send_launch_request(app_control, &on_location_app_control_reply_cb, data);
3202 app_control_destroy(app_control);
3203 } else if (strcasecmp(label, POPUP_TEXT_TAKE_CONTACT) == 0) {
3204 app_control_h app_control;
3205 int ret = app_control_create(&app_control);
3206 if (ret != APP_CONTROL_ERROR_NONE) {
3207 show_toast(ad, "Error: Can not load location picker");
3210 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3211 app_control_set_mime(app_control, "application/vnd.tizen.contact");
3212 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3213 app_control_send_launch_request(app_control, &on_contact_app_control_reply_cb, data);
3214 app_control_destroy(app_control);
3217 evas_object_del(obj);
3221 void popup_move_dropdown(Evas_Object *ctxpopup, Evas_Object *btn)
3223 Evas_Coord x, y, w , h;
3224 evas_object_geometry_get(btn, &x, &y, &w, &h);
3225 evas_object_move(ctxpopup, x + (w / 2), y + h - 50);
3228 void on_media_attach_dismissed_cb(void *data, Evas_Object *obj, void *event_info)
3230 evas_object_del(obj);
3233 static void on_media_attach_clicked(void *data, Evas_Object *obj, void *event_info)
3235 Evas_Object* chat_scroller = data;
3236 if (!chat_scroller) {
3239 appdata_s *ad = evas_object_data_get(chat_scroller, "app_data");
3243 attach_panel_h attach_panel = NULL;
3245 bool visible = false;
3247 Evas_Object* text_entry = evas_object_data_get(chat_scroller, "text_entry");
3248 elm_entry_input_panel_hide(text_entry);
3250 attach_panel = evas_object_data_get(ad->conform, "attach_panel");
3252 if (attach_panel_get_visibility(attach_panel, &visible) != ATTACH_PANEL_ERROR_NONE) {
3253 attach_panel_set_result_cb(attach_panel, _result_cb, chat_scroller);
3257 attach_panel_show(attach_panel);
3259 attach_panel_set_result_cb(attach_panel, _result_cb, chat_scroller);
3263 ret = attach_panel_create(ad->conform, &attach_panel);
3265 if (!attach_panel) {
3268 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, NULL);
3269 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA, NULL);
3270 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE, NULL);
3271 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO, NULL);
3272 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_AUDIO, NULL);
3273 //attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CONTACT, NULL);
3274 //attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_MYFILES, NULL);
3275 //attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER, NULL);
3276 attach_panel_set_result_cb(attach_panel, _result_cb, chat_scroller);
3278 attach_panel_show(attach_panel);
3279 evas_object_data_set(ad->conform, "attach_panel", attach_panel);
3284 static void on_text_message_send_pressed(void *data, Evas_Object *obj, void *event_info)
3286 elm_image_file_set(data, ui_utils_get_resource(SEND_UNPRESSED_ICON), NULL);
3289 static void on_text_message_send_unpressed(void *data, Evas_Object *obj, void *event_info)
3291 elm_image_file_set(data, ui_utils_get_resource(SEND_PRESSED_ICON), NULL);
3295 static void on_message_back_button_clicked(void *data, Evas_Object *obj, void *event_info)
3297 appdata_s *ad = data;
3301 app_nf_back_cb(data, obj, event_info);
3304 void on_user_info_button_clicked(void *data, Evas_Object *obj, void *event_info)
3306 appdata_s *ad = data;
3308 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
3309 tg_peer_info_s *user_data = sel_item->use_data;
3311 if (!sel_item || !user_data) {
3312 show_toast(ad, "Can not display user info");
3316 if (user_data->peer_type == TGL_PEER_USER) {
3317 launch_user_info_screen(ad, user_data->peer_id);
3318 } else if (user_data->peer_type == TGL_PEER_CHAT) {
3319 launch_chat_info_screen(ad, user_data->peer_id);
3325 void refresh_messaging_view(appdata_s *ad)
3330 Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
3335 Evas_Object *box_layout = NULL;
3336 Evas_Object *box = NULL;
3337 Eina_List *list = NULL;
3338 Eina_List *box_list = NULL;
3339 Evas_Object *last_item = NULL;
3341 box_layout = elm_object_content_get(scroller);
3343 LOGE("Fail to get the box into scroller");
3346 list = elm_box_children_get(box_layout);
3348 LOGE("Fail to get the list into box");
3352 box = eina_list_nth(list, 0);
3354 LOGE("Fail to get the box into box layout");
3358 box_list = elm_box_children_get(box);
3360 LOGE("Fail to get the box_list into box");
3364 last_item = eina_list_nth(box_list, eina_list_count(box_list)-1);
3366 LOGE("Fail to get the last item into box");
3371 evas_object_geometry_get(last_item, &x, &y, NULL, NULL);
3373 elm_scroller_region_show(scroller, x, y, -1, -1);
3375 eina_list_free(box_list);
3376 eina_list_free(list);
3379 static void click_user_name_cb(void *data, Evas_Object *obj, void *event_info)
3381 appdata_s *ad = evas_object_data_get(obj,"app_data");
3382 Elm_Object_Item *item = event_info;
3383 const char *clicked_name = elm_object_item_text_get(item);
3384 int peer_id = (int)elm_object_item_data_get(item);
3385 peer_with_pic_s* prev_peer_in_chatting_data = ad->peer_in_cahtting_data;
3386 user_data_with_pic_s* prev_buddy_in_chatting_data = ad->buddy_in_cahtting_data;
3388 int buddy_list_counts = eina_list_count(ad->buddy_list);
3389 for (int i = 0; i < buddy_list_counts; i++) {
3390 user_data_with_pic_s *item = eina_list_nth(ad->buddy_list, i);
3391 user_data_s* user_data = item->use_data;
3393 if (user_data->user_id.id == peer_id) {
3394 ad->buddy_in_cahtting_data = item;
3398 int peer_list_counts = eina_list_count(ad->peer_list);
3399 for (int i = 0; i < peer_list_counts; i++) {
3400 peer_with_pic_s* pic_item = eina_list_nth(ad->peer_list, i);
3401 tg_peer_info_s* item = pic_item->use_data;
3402 if (item->peer_id == peer_id) {
3403 ad->peer_in_cahtting_data = pic_item;
3408 launch_user_info_screen(ad, peer_id);
3410 ad->buddy_in_cahtting_data = prev_buddy_in_chatting_data;
3411 ad->peer_in_cahtting_data = prev_peer_in_chatting_data;
3414 static void on_expand_button_clicked(void *data, Evas_Object *obj, void *event_info)
3416 Evas_Object *expand_pic = data;
3420 appdata_s *ad = evas_object_data_get(expand_pic, "app_data");
3421 Evas_Object *parent_layout = evas_object_data_get(expand_pic, "parent_layout");
3423 Eina_Bool is_expanded = (Eina_Bool)evas_object_data_get(expand_pic, "is_expanded");
3427 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_CLOSE), NULL);
3429 Evas_Object *grp_names_bg = elm_bg_add(ad->nf);
3430 evas_object_size_hint_align_set(grp_names_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
3431 evas_object_size_hint_weight_set(grp_names_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3432 evas_object_color_set(grp_names_bg, 45, 165, 224, 229);
3433 elm_image_resizable_set(grp_names_bg, EINA_TRUE, EINA_TRUE);
3434 elm_image_fill_outside_set(grp_names_bg, EINA_TRUE);
3435 evas_object_show(grp_names_bg);
3436 elm_object_part_content_set(parent_layout, "swallow.group_detail_box,bg", grp_names_bg);
3438 Evas_Object* grp_names_lbl = elm_multibuttonentry_add(ad->nf);
3440 elm_entry_cursor_end_set(grp_names_lbl);
3441 evas_object_size_hint_weight_set(grp_names_lbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3442 evas_object_size_hint_align_set(grp_names_lbl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3443 elm_entry_single_line_set(grp_names_lbl, EINA_FALSE);
3444 elm_entry_scrollable_set(grp_names_lbl, EINA_TRUE);
3445 elm_entry_cnp_mode_set(grp_names_lbl, ELM_CNP_MODE_NO_IMAGE);
3446 elm_entry_context_menu_disabled_set(grp_names_lbl, EINA_TRUE);
3447 elm_object_focus_set(grp_names_lbl, EINA_FALSE);
3448 elm_multibuttonentry_editable_set(grp_names_lbl, EINA_FALSE);
3450 evas_object_show(grp_names_lbl);
3452 evas_object_data_set(grp_names_lbl, "app_data", ad);
3454 Eina_List *names_of_buddies = NULL;
3455 names_of_buddies = evas_object_data_get(ad->nf, "names_of_buddies");
3457 if (names_of_buddies) {
3458 int buddies_counts = eina_list_count(names_of_buddies);
3459 buddies_info *buddy_info;
3460 for(int i = 0 ; i < buddies_counts ; i++){
3461 buddy_info = (buddies_info*)eina_list_nth(names_of_buddies,i);
3462 if(buddy_info == NULL) continue;
3463 int len = strlen(buddy_info->name);
3464 char *name_str = (char *)malloc(len + 256);
3466 sprintf(name_str, "<font=Tizen:style=Bold color=#FFFFFF align=center><font_size=40>%s</font_size></font>", buddy_info->name);
3467 Elm_Object_Item *button_item = elm_multibuttonentry_item_append(grp_names_lbl, name_str, click_user_name_cb, ad);
3468 elm_object_item_data_set(button_item, (void*)(buddy_info->id));
3474 elm_object_part_content_set(parent_layout, "swallow.group_detail_box", grp_names_lbl);
3478 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_OPEN), NULL);
3480 Evas_Object *grp_names_lbl = elm_object_part_content_get(parent_layout, "swallow.group_detail_box");
3481 if (grp_names_lbl) {
3482 evas_object_del(grp_names_lbl);
3483 grp_names_lbl = NULL;
3486 Evas_Object *grp_names_bg = elm_object_part_content_get(parent_layout, "swallow.group_detail_box,bg");
3488 evas_object_del(grp_names_bg);
3489 grp_names_bg = NULL;
3492 is_expanded = !is_expanded;
3493 evas_object_data_set(expand_pic, "is_expanded", (void *)is_expanded);
3496 static Eina_Bool _pop_cb(void *data, Elm_Object_Item *it)
3498 appdata_s *ad = data;
3499 attach_panel_h attach_panel = NULL;
3501 LOGE("Failed to get the ad");
3504 attach_panel = evas_object_data_get(ad->conform, "attach_panel");
3506 attach_panel_hide(attach_panel);
3508 Eina_List *names_of_buddies = evas_object_data_get(ad->nf, "names_of_buddies");
3510 buddies_info *buddy = NULL;
3511 EINA_LIST_FREE(names_of_buddies, buddy) {
3516 evas_object_data_set(ad->nf, "names_of_buddies", NULL);
3520 static void _edge_cb(void *data, Evas_Object *scroller, void *event_info)
3522 Evas_Object *layout = data;
3523 int is_end_edge = 0;
3524 is_end_edge = (int)evas_object_data_get(layout, "is_end_edge");
3527 elm_object_signal_emit(layout, "hide", "bubblemessage");
3528 evas_object_data_set(layout, "is_end_edge", (void *) 1);
3532 static void _edge_top_cb(void *data, Evas_Object *scroller, void *event_info)
3534 int is_end_edge_top = 0;
3535 //int offset_num = (int)evas_object_data_get(scroller, "offset_num");
3536 is_end_edge_top = (int)evas_object_data_get(scroller, "is_end_edge_top");
3538 if (!is_end_edge_top) {
3539 elm_scroller_movement_block_set(scroller,ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL );
3540 int prev_h = scroller_previous_region_get(scroller);
3541 evas_object_data_set(scroller, "previous_h",(void*)prev_h);
3542 evas_object_data_set(scroller, "is_end_edge_top",(void*)1);
3543 load_chat_history(scroller);
3544 elm_scroller_movement_block_set(scroller,ELM_SCROLLER_MOVEMENT_NO_BLOCK);
3548 static void _scroll_cb(void *data, Evas_Object *scroller, void *event_info)
3550 Evas_Object *layout = data;
3551 evas_object_data_set(layout, "is_end_edge", (void *) 0);
3552 evas_object_data_set(scroller, "is_end_edge_top", (void *) 0);
3553 // evas_object_data_set(layout, "is_end_edge_top", (void *) 0);
3556 int get_start_offset_num(char* table_name){
3557 char unknown_str[50];
3559 sprintf(unknown_str, "%d", unknown);
3561 char* where_clause = (char *)malloc(strlen(MESSAGE_INFO_TABLE_MARKED_FOR_DELETE) + strlen(" = ") + strlen(unknown_str) + 1);
3562 sprintf(where_clause, "%s = %s", MESSAGE_INFO_TABLE_MARKED_FOR_DELETE, unknown_str);
3563 int row_counts = get_number_of_rows(table_name,where_clause);
3564 return (row_counts-TG_DBMGR_LIMITED);
3567 static Eina_Bool _load_history_cb(void *data)
3569 Evas_Object *nf = data;
3571 LOGE("Fail to get the nf");
3572 return ECORE_CALLBACK_CANCEL;
3574 Evas_Object *scroller = evas_object_data_get(nf, "chat_list");
3576 LOGE("Fail to get the scroller");
3577 return ECORE_CALLBACK_CANCEL;
3579 Evas_Object *layout = evas_object_data_get(nf, "chat_list_no_msg_text");
3581 LOGE("Fail to get the layout");
3582 return ECORE_CALLBACK_CANCEL;
3585 Eina_Bool ret = load_chat_history(scroller);
3587 LOGD("There is no message in chat room");
3589 elm_object_part_text_set(layout, "no_msg_text", i18n_get_text("IDS_TGRAM_BODY_NO_MESSAGES_HERE_YET_ING"));
3590 elm_object_signal_emit(layout, "show", "message");
3593 return ECORE_CALLBACK_CANCEL;
3596 void launch_messaging_view_cb(appdata_s* ad, int user_id)
3601 if (ad->msg_popup) {
3602 evas_object_del(ad->msg_popup);
3603 ad->msg_popup = NULL;
3606 delete_floating_button(ad);
3608 ad->current_app_state = TG_CHAT_MESSAGING_VIEW_STATE;
3609 ad->is_last_msg_changed = EINA_FALSE;
3610 send_request_for_server_connection_status(ad, ad->service_client);
3611 char edj_path[PATH_MAX] = {0, };
3612 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
3614 Evas_Object *layout = elm_layout_add(ad->nf);
3615 elm_layout_file_set(layout, edj_path, "chat_messaging_layout");
3616 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3617 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3618 evas_object_show(layout);
3620 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
3624 tg_peer_info_s* user = sel_item->use_data;
3626 /*************************** START: message list ************************************/
3628 Evas_Object* msg_box_layout = elm_layout_add(ad->nf);
3629 elm_layout_file_set(msg_box_layout, edj_path, "custom_gen_list");
3630 evas_object_size_hint_weight_set(msg_box_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3631 evas_object_size_hint_align_set(msg_box_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3632 evas_object_show(msg_box_layout);
3634 Evas_Object *list_bg = elm_image_add(msg_box_layout);
3635 evas_object_size_hint_align_set(list_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
3636 evas_object_size_hint_weight_set(list_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3637 if (ad->chat_background) {
3638 elm_image_file_set(list_bg, ad->chat_background, NULL);
3640 //elm_image_file_set(list_bg, ui_utils_get_resource(TG_CHAT_DEFAULT_BG), NULL);
3642 elm_image_resizable_set(list_bg, EINA_TRUE, EINA_TRUE);
3643 elm_image_fill_outside_set(list_bg, EINA_TRUE);
3644 evas_object_show(list_bg);
3646 elm_object_part_content_set(msg_box_layout, "swallow.gen_list.bg", list_bg);
3648 Evas_Object *chat_scroller = elm_scroller_add(ad->nf);
3649 evas_object_size_hint_weight_set(chat_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3650 evas_object_size_hint_align_set(chat_scroller, EVAS_HINT_FILL, 0.0);
3651 elm_scroller_policy_set(chat_scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
3652 evas_object_show(chat_scroller);
3653 evas_object_smart_callback_add(chat_scroller, "scroll", _scroll_cb, layout);
3655 //evas_object_smart_callback_add(chat_scroller,"scroll,drag,start", _scroll_cb, layout);
3656 evas_object_smart_callback_add(chat_scroller, "edge,bottom", _edge_cb, layout);
3658 evas_object_smart_callback_add(chat_scroller, "edge,top", _edge_top_cb, layout);
3659 evas_object_data_set(layout, "is_end_edge", (void *) 1);
3660 /*setting offset_num*/
3661 // evas_object_data_set(chat_scroller, "offset_num", (void *) 1);
3662 evas_object_data_set(chat_scroller, "prev_h", (void *) 0);
3663 /*check edge is top*/
3664 evas_object_data_set(chat_scroller, "is_end_edge_top",(void*)1);
3666 Evas_Object *align_box = elm_box_add(chat_scroller);
3668 LOGE("fail to add the box");
3672 elm_box_horizontal_set(align_box, EINA_FALSE);
3673 elm_box_align_set(align_box, 0.5, 0.0);
3674 evas_object_size_hint_weight_set(align_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3675 evas_object_size_hint_align_set(align_box, EVAS_HINT_FILL, 0.0);
3676 elm_object_content_set(chat_scroller, align_box);
3677 evas_object_show(align_box);
3679 Evas_Object *chat_box = elm_box_add(chat_scroller);
3681 LOGE("fail to add the box");
3684 elm_box_horizontal_set(chat_box, EINA_FALSE);
3685 elm_box_align_set(chat_box, 0.5, 0.0);
3686 evas_object_size_hint_weight_set(chat_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3687 evas_object_size_hint_align_set(chat_box, EVAS_HINT_FILL, 0.0);
3688 evas_object_show(chat_box);
3689 elm_box_pack_end(align_box, chat_box);
3690 evas_object_event_callback_add(chat_box, EVAS_CALLBACK_RESIZE, __resize_cb, ad);
3692 elm_object_part_content_set(msg_box_layout, "swallow.gen_list", chat_scroller);
3693 elm_object_part_content_set(layout, "swallow.chat_box", msg_box_layout);
3695 /********************** START: entry layout*******************************/
3696 Evas_Object* entry_box_layout = elm_layout_add(ad->win);
3697 if (!entry_box_layout) {
3698 LOGE("Fail to add the entry box layout");
3701 elm_layout_file_set(entry_box_layout, edj_path, "chat_entry_box");
3702 evas_object_size_hint_align_set(entry_box_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3703 evas_object_size_hint_weight_set(entry_box_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3704 evas_object_show(entry_box_layout);
3706 Evas_Object *entry_layout = elm_layout_add(entry_box_layout);
3707 if (!entry_layout) {
3708 LOGE("Fail to add the entry_layout");
3710 elm_layout_theme_set(entry_layout, "layout", "editfield", "singleline");
3712 Evas_Object* text_entry = elm_entry_add(entry_layout);
3714 LOGE("Fail to add the text_entry");
3717 elm_object_part_text_set(text_entry, "elm.guide", "Text message");
3718 elm_entry_line_wrap_set(text_entry, EINA_TRUE);
3719 elm_entry_scrollable_set(text_entry, EINA_TRUE);
3720 evas_object_size_hint_align_set(text_entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
3721 evas_object_size_hint_weight_set(text_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3722 evas_object_show(text_entry);
3723 evas_object_data_set(entry_box_layout, "is_attach_show", (void *) 1);
3725 elm_object_part_content_set(entry_layout, "elm.swallow.content", text_entry);
3726 evas_object_smart_callback_add(text_entry, "changed", on_message_text_entry_changed, entry_box_layout);
3727 evas_object_smart_callback_add(text_entry, "preedit,changed", on_message_text_entry_changed, entry_box_layout);
3728 evas_object_smart_callback_add(text_entry, "clicked", on_message_text_entry_clicked, NULL);
3729 elm_object_part_content_set(entry_box_layout, "swallow.text_entry", entry_layout);
3731 Evas_Object *attach_btn = NULL;
3732 attach_btn = elm_button_add(entry_layout);
3733 evas_object_size_hint_align_set(attach_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
3734 evas_object_size_hint_weight_set(attach_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3735 elm_object_style_set(attach_btn, "focus");
3736 evas_object_show(attach_btn);
3737 elm_object_part_content_set(entry_box_layout, "swallow,attach", attach_btn);
3738 evas_object_smart_callback_add(attach_btn, "clicked", on_media_attach_clicked, chat_scroller);
3740 /* button clicked event */
3741 elm_object_signal_callback_add(entry_box_layout, "smile", "clicked", on_message_smiley_clicked, text_entry);
3742 elm_object_signal_callback_add(entry_box_layout, "send", "clicked", on_text_message_send_clicked, chat_scroller);
3743 elm_object_part_content_set(layout, "swallow.entry", entry_box_layout);
3745 /********************** END: entry layout*******************************/
3747 /************************* START: message bubble ************************/
3749 Evas_Object* bubble_layout = elm_layout_add(ad->win);
3750 if (!bubble_layout) {
3751 LOGE("Fail to add the bubble_layout");
3754 elm_layout_file_set(bubble_layout, edj_path, "bubble_layout");
3755 evas_object_size_hint_align_set(bubble_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3756 evas_object_size_hint_weight_set(bubble_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3757 evas_object_show(bubble_layout);
3758 elm_object_signal_callback_add(bubble_layout, "cancel", "clicked", on_message_cancel_clicked, layout);
3759 elm_object_part_content_set(layout, "swallow.messagebubble", bubble_layout);
3760 evas_object_data_set(ad->nf, "main_layout", layout);
3762 /********************** END: entry message bubble*******************************/
3764 evas_object_data_set(ad->nf, "chat_list", (void*)chat_scroller);
3765 evas_object_data_set(chat_scroller, "app_data", ad);
3766 evas_object_data_set(chat_scroller, "user_id", (void*)user_id);
3767 evas_object_data_set(chat_scroller, "text_entry", (void*)text_entry);
3769 /* Set the name in title area */
3771 Elm_Object_Item *nf_it = NULL;
3774 char *temp_name = get_peer_name(sel_item->use_data);
3776 nf_it = elm_naviframe_item_push(ad->nf, temp_name, NULL, NULL, layout, NULL);
3777 evas_object_data_set(ad->nf, "navi_item", nf_it);
3781 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
3783 Evas_Object *back_btn = create_button(ad->nf, "naviframe/back_btn/default", NULL);
3784 evas_object_smart_callback_add(back_btn, "clicked", on_message_back_button_clicked, ad);
3785 elm_object_item_part_content_set(nf_it, "elm.swallow.prev_btn", back_btn);
3786 elm_naviframe_item_pop_cb_set(nf_it, _pop_cb, ad);
3788 /******************** expand ************************/
3789 if (user->peer_type == TGL_PEER_CHAT) {
3790 Evas_Object *expand_pic = NULL;
3791 expand_pic = elm_image_add(layout);
3792 evas_object_size_hint_weight_set(expand_pic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3793 evas_object_size_hint_align_set(expand_pic, EVAS_HINT_FILL, EVAS_HINT_FILL);
3794 elm_object_focus_set(expand_pic, EINA_FALSE);
3795 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_OPEN), NULL);
3796 evas_object_show(expand_pic);
3797 evas_object_data_set(expand_pic, "app_data", ad);
3798 evas_object_data_set(expand_pic, "parent_layout", layout);
3800 Eina_Bool is_expanded = EINA_FALSE;
3801 evas_object_data_set(expand_pic, "is_expanded", is_expanded);
3802 Evas_Object* expand_btn = elm_button_add(ad->layout);
3803 elm_object_style_set(expand_btn, "transparent");
3804 evas_object_smart_callback_add(expand_btn, "clicked", on_expand_button_clicked, expand_pic);
3805 elm_object_content_set(expand_btn, expand_pic);
3806 evas_object_show(expand_btn);
3807 elm_object_item_part_content_set(nf_it, "title_right_btn", expand_btn);
3810 /******************** expand ************************/
3812 Ecore_Timer *timer = NULL;
3813 timer = ecore_timer_add(0.001f, _load_history_cb, ad->nf);
3815 int buddy_id = sel_item->use_data->peer_id;
3816 char* tablename = get_table_name_from_number(buddy_id);
3817 int offset_num = get_start_offset_num(tablename);
3818 evas_object_data_set(chat_scroller, "offset_num", (void *)(offset_num));
3820 Eina_Bool res = set_all_rows_read(tablename);
3826 evas_object_data_set(ad->nf, "chat_list_no_msg_text", layout);
3828 send_request_for_marked_as_read(ad, ad->service_client, sel_item->use_data->peer_id, sel_item->use_data->peer_type);
3829 eext_object_event_callback_add(ad->nf, EEXT_CALLBACK_MORE, on_messaging_menu_button_clicked, ad);