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;
46 box_layout = elm_object_content_get(scroller);
48 LOGE("Fail to get the box into scroller");
51 list = elm_box_children_get(box_layout);
53 LOGE("Fail to get the list into box");
57 box = eina_list_nth(list, 0);
59 LOGE("Fail to get the box into box layout");
64 evas_object_geometry_get(box, NULL, NULL, NULL, &h);
65 elm_scroller_region_show(scroller, 0, h, 720, 1280);
72 static int scroller_previous_region_get(Evas_Object *scroller)
75 LOGE("Cannot get the scroller");
78 Evas_Object *box_layout = NULL;
79 Evas_Object *box = NULL;
80 Eina_List *list = NULL;
82 box_layout = elm_object_content_get(scroller);
84 LOGE("Fail to get the box into scroller");
87 list = elm_box_children_get(box_layout);
89 LOGE("Fail to get the list into box");
93 box = eina_list_nth(list, 0);
95 LOGE("Fail to get the box into box layout");
100 evas_object_geometry_get(box, NULL, NULL, NULL, &h);
102 eina_list_free(list);
107 static int scroller_show_previous_region(Evas_Object *scroller)
110 LOGE("Cannot get the scroller");
113 Evas_Object *box_layout = NULL;
114 Evas_Object *box = NULL;
115 Eina_List *list = NULL;
117 box_layout = elm_object_content_get(scroller);
119 LOGE("Fail to get the box into scroller");
122 list = elm_box_children_get(box_layout);
124 LOGE("Fail to get the list into box");
128 box = eina_list_nth(list, 0);
130 LOGE("Fail to get the box into box layout");
135 prev_h = (int)evas_object_data_get(scroller, "previous_h");
136 evas_object_geometry_get(box, NULL, NULL, NULL, &h);
137 elm_scroller_region_show(scroller, 0, (h-prev_h), 720, 1280);
139 eina_list_free(list);
144 static void scroller_push_item(Evas_Object *scroller, Evas_Object *item, int prepand)
146 Evas_Object *box_layout = NULL;
147 Evas_Object *box = NULL;
148 Eina_List *list = NULL;
150 box_layout = elm_object_content_get(scroller);
152 LOGE("Fail to get the box into scroller");
156 list = elm_box_children_get(box_layout);
158 LOGE("Fail to get the list into box");
162 box = eina_list_nth(list, 0);
164 LOGE("Fail to get the box into box layout");
168 eina_list_free(list);
171 elm_box_pack_end(box, item);
174 elm_box_pack_start(box, item);
175 //elm_box_recalculate(box);
181 /************************ Menu Handler ********************/
183 void on_messaging_menu_option_selected_cb(void *data, Evas_Object *obj, void *event_info)
185 appdata_s *ad = data;
186 Elm_Object_Item *it = event_info;
187 elm_genlist_item_selected_set(it, EINA_FALSE);
188 int id = (int)elm_object_item_data_get(it);
191 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
192 tg_peer_info_s *user_data = sel_item->use_data;
194 if (!sel_item || !user_data) {
195 show_toast(ad, "There are no messages to delete.");
197 evas_object_del(ad->msg_popup);
198 ad->msg_popup = NULL;
204 if (get_buddy_unknown_status(user_data->peer_id) && user_data->peer_type == TGL_PEER_USER) {
207 ad->is_loading_from_msg_view = EINA_TRUE;
208 on_create_new_contact(ad);
209 } else if (id == 1) {
211 // mark all the massages for deletion.
212 char* tablename = get_table_name_from_number(user_data->peer_id);
213 mark_all_records_for_deletion(tablename);
214 // delete date messages
215 delete_date_messages_from_table(tablename);
218 // clear all messages
219 Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
222 Evas_Object *box_layout = NULL;
223 Evas_Object *box = NULL;
224 Eina_List *list = NULL;
226 box_layout = elm_object_content_get(scroller);
228 LOGE("Fail to get the box into scroller");
232 list = elm_box_children_get(box_layout);
234 LOGE("Fail to get the list into box");
238 box = eina_list_nth(list, 0);
240 LOGE("Fail to get the box into box layout");
244 eina_list_free(list);
246 elm_box_recalculate(box);
249 // send request to server
250 send_delete_group_chat_request(ad, ad->service_client, user_data->peer_id);
252 if (ad->main_item_in_cahtting_data) {
253 tg_main_list_item_s* old_item = ad->main_item_in_cahtting_data;
254 if (old_item->last_message) {
255 free(old_item->last_message);
256 old_item->last_message = NULL;
258 old_item->last_message = strdup("");
261 Evas_Object *nomsg_layout = evas_object_data_get(ad->nf, "chat_list_no_msg_text");
263 elm_object_signal_emit(nomsg_layout, "show", "message");
267 char* tablename = get_table_name_from_number(user_data->peer_id);
268 delete_all_records(tablename);
271 // clear all messages
272 Evas_Object *genlist = evas_object_data_get(ad->nf, "chat_list");
273 elm_genlist_clear(genlist);
275 // remove main item from main list
276 if (ad->main_item_in_cahtting_data) {
277 tg_main_list_item_s* old_item = ad->main_item_in_cahtting_data;
278 if (old_item->peer_print_name) {
279 free(old_item->peer_print_name);
280 old_item->peer_print_name = NULL;
282 if (old_item->last_message) {
283 free(old_item->last_message);
284 old_item->last_message = NULL;
286 if (old_item->profile_pic_path) {
287 free(old_item->profile_pic_path);
288 old_item->profile_pic_path = NULL;
290 old_item->date_lbl = NULL;
291 old_item->msg_status_lbl = NULL;
292 old_item->main_item_layout = NULL;
293 old_item->profile_pic = NULL;
294 old_item->profile_pic_path = NULL;
295 old_item->status_lbl = NULL;
296 old_item->user_name_lbl = NULL;
297 ad->main_list = eina_list_remove(ad->main_list, ad->main_item_in_cahtting_data);
299 ad->main_item_in_cahtting_data = NULL;
302 ad->is_last_msg_changed = EINA_FALSE;
305 app_nf_back_cb(ad, NULL, NULL);
308 evas_object_del(ad->msg_popup);
309 ad->msg_popup = NULL;
314 if (user_data->peer_type == TGL_PEER_USER) {
316 launch_user_info_screen(ad, user_data->peer_id);
317 } else if (id == 1) {
318 // mark all the massages for deletion.
319 char* tablename = get_table_name_from_number(user_data->peer_id);
320 mark_all_records_for_deletion(tablename);
321 // delete date messages
322 delete_date_messages_from_table(tablename);
325 // clear all messages
326 Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
329 Evas_Object *box_layout = NULL;
330 Evas_Object *box = NULL;
331 Eina_List *list = NULL;
333 box_layout = elm_object_content_get(scroller);
335 LOGE("Fail to get the box into scroller");
339 list = elm_box_children_get(box_layout);
341 LOGE("Fail to get the list into box");
345 box = eina_list_nth(list, 0);
347 LOGE("Fail to get the box into box layout");
351 eina_list_free(list);
353 elm_box_recalculate(box);
355 // send request to server
356 send_delete_all_messages_request(ad, ad->service_client, user_data->peer_id, user_data->peer_type);
358 Evas_Object *nomsg_layout = evas_object_data_get(ad->nf, "chat_list_no_msg_text");
360 elm_object_signal_emit(nomsg_layout, "show", "message");
362 } else if (id == 2) {
363 show_loading_popup(ad);
364 char* tablename = get_table_name_from_number(user_data->peer_id);
365 delete_all_records(tablename);
368 elm_naviframe_item_pop(ad->nf);
369 load_registered_user_data(ad);
370 load_buddy_list_data(ad);
371 load_unknown_buddy_list_data(ad);
373 load_main_list_data(ad);
374 ecore_timer_add(1, on_load_main_view_requested, ad);
376 } else if (user_data->peer_type == TGL_PEER_CHAT) {
378 // mark all the massages for deletion.
379 char* tablename = get_table_name_from_number(user_data->peer_id);
380 mark_all_records_for_deletion(tablename);
381 // delete date messages
382 delete_date_messages_from_table(tablename);
385 // clear all messages
386 Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
389 Evas_Object *box_layout = NULL;
390 Evas_Object *box = NULL;
391 Eina_List *list = NULL;
393 box_layout = elm_object_content_get(scroller);
395 LOGE("Fail to get the box into scroller");
399 list = elm_box_children_get(box_layout);
401 LOGE("Fail to get the list into box");
405 box = eina_list_nth(list, 0);
407 LOGE("Fail to get the box into box layout");
411 eina_list_free(list);
413 elm_box_recalculate(box);
415 send_delete_all_messages_request(ad, ad->service_client, user_data->peer_id, user_data->peer_type);
417 Evas_Object *nomsg_layout = evas_object_data_get(ad->nf, "chat_list_no_msg_text");
419 elm_object_signal_emit(nomsg_layout, "show", "message");
422 } else if (id == 1) {
423 //send group chat delete request
424 show_loading_popup(ad);
425 send_delete_group_chat_request(ad, ad->service_client, user_data->peer_id);
430 evas_object_del(ad->msg_popup);
431 ad->msg_popup = NULL;
437 char* on_messaging_menu_group_text_get_cb(void *data, Evas_Object *obj, const char *part)
441 return strdup(i18n_get_text("IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3"));
443 return strdup(i18n_get_text("IDS_TGRAM_OPT_DELETE"));
447 char* on_messaging_menu_text_get_cb(void *data, Evas_Object *obj, const char *part)
450 appdata_s *ad = evas_object_data_get(obj, "app_data");
451 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
452 tg_peer_info_s *user_data = sel_item->use_data;
453 if ((user_data->peer_type == TGL_PEER_USER) && get_buddy_unknown_status(user_data->peer_id)) {
455 return strdup(i18n_get_text("IDS_TGRAM_OPT_ADD_TO_CONTACTS_ABB2"));
456 } else if (id == 1) {
457 return strdup(i18n_get_text("IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3"));
459 return strdup(i18n_get_text("IDS_TGRAM_OPT_DELETE"));
463 return strdup(i18n_get_text("IDS_TGRAM_OPT_VIEW_PROFILE_ABB"));
464 } else if (id == 1) {
465 return strdup(i18n_get_text("IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3"));
467 return strdup(i18n_get_text("IDS_TGRAM_OPT_DELETE"));
472 void on_msg_popup_back_cb(void *data, Evas_Object *obj, void *event_info)
474 appdata_s *ad = data;
476 evas_object_del(ad->msg_popup);
477 ad->msg_popup = NULL;
481 void on_messaging_menu_button_clicked(void *data, Evas_Object *obj, void *event_info)
483 appdata_s *ad = data;
484 if (ad->msg_popup || ad->current_app_state != TG_CHAT_MESSAGING_VIEW_STATE) {
488 static Elm_Genlist_Item_Class itc;
489 //Evas_Object *popup;
490 Evas_Object *genlist;
492 Evas_Object *win = ad->win;
494 ad->msg_popup = elm_popup_add(win);
495 elm_popup_align_set(ad->msg_popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
496 eext_object_event_callback_add(ad->msg_popup, EEXT_CALLBACK_BACK, on_msg_popup_back_cb, ad);
497 evas_object_size_hint_weight_set(ad->msg_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
499 evas_object_data_set(ad->msg_popup, "app_data", ad);
501 genlist = elm_genlist_add(ad->msg_popup);
502 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
503 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
505 evas_object_data_set(genlist, "app_data", ad);
507 itc.item_style = "default";
508 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
509 if (sel_item->use_data->peer_type == TGL_PEER_USER) {
510 itc.func.text_get = on_messaging_menu_text_get_cb;
511 } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
512 itc.func.text_get = on_messaging_menu_group_text_get_cb;
517 itc.func.content_get = NULL;
518 itc.func.state_get = NULL;
521 if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
522 for (i = 0; i < 2; i++) {
523 elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, on_messaging_menu_option_selected_cb, ad);
526 for (i = 0; i < 3; i++) {
527 elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, on_messaging_menu_option_selected_cb, ad);
530 evas_object_show(genlist);
532 elm_object_content_set(ad->msg_popup, genlist);
533 evas_object_show(ad->msg_popup);
537 /************************ Menu Handler ********************/
542 static Evas_Object *create_image_object_from_file(const char *icon_name, Evas_Object *parent)
544 Evas_Object *icon = elm_image_add(parent);
545 evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
546 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
547 elm_image_file_set(icon, icon_name, NULL);
548 evas_object_show(icon);
552 void on_chat_profile_pic_changed(appdata_s *ad, char *file_path)
554 if (!ad || !file_path) {
558 Evas_Object *profile_image = evas_object_data_get(ad->nf, "profile_picture");
560 elm_image_file_set(profile_image, file_path, NULL);
565 void on_group_chat_info_changed(appdata_s *ad, char *type_of_change)
567 if (!ad || !type_of_change) {
570 if (strstr(type_of_change, "edit_title") != NULL) {
571 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
573 tg_peer_info_s* user = sel_item->use_data;
574 char* user_name = replace(sel_item->use_data->print_name, '_', " ");
575 char temp_name[512] = {'\0'};
576 snprintf(temp_name, 512, "%s", user_name);
578 Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
579 elm_object_item_part_text_set(nf_it, "title", temp_name);
581 } else if (strstr(type_of_change, "delete_photo") != NULL) {
583 } else if (strstr(type_of_change, "add_user") != NULL) {
584 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
586 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
588 } else if (strstr(type_of_change, "delete_user") != NULL) {
589 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
591 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
598 void on_sent_media_item_clicked(void* data, Evas_Object* layout, void* event_info)
600 appdata_s* ad = evas_object_data_get(layout, "app_data");
601 char* media_type_str = evas_object_data_get(layout, "media_type");
602 char* media_file = evas_object_data_get(layout, "media_file");
604 if (access(media_file, F_OK) != -1) {
610 if (media_file && strlen(media_file) > 0) {
611 app_control_h app_control;
612 int ret = app_control_create(&app_control);
613 if (ret != APP_CONTROL_ERROR_NONE) {
614 show_toast(ad, "Error: Can not load image");
617 app_control_set_operation(app_control, APP_CONTROL_OPERATION_VIEW);
618 if (media_type_str && strstr(media_type_str, "video") != NULL) {
619 app_control_set_mime(app_control, "video/*");
620 } else if (media_type_str && strstr(media_type_str, "audio") != NULL) {
621 app_control_set_mime(app_control, "audio/*");
623 app_control_set_mime(app_control, "image/*");
625 app_control_set_uri(app_control, media_file);
627 app_control_send_launch_request(app_control, NULL, NULL);
628 app_control_destroy(app_control);
632 static Evas_Object *get_gif_image_from_path(const char* path, Evas_Object* parent, char *key)
634 if (!path || !parent || !key) {
637 LOGD("key : %s", key);
638 Evas_Object *media_image = elm_image_add(parent);
639 elm_image_aspect_fixed_set(media_image, EINA_FALSE);
640 elm_image_file_set(media_image, path, key);
641 evas_object_size_hint_weight_set(media_image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
642 evas_object_size_hint_align_set(media_image, EVAS_HINT_FILL, EVAS_HINT_FILL);
643 evas_object_show(media_image);
647 static Evas_Object *get_image_from_path(const char* path, Evas_Object* parent)
649 if (!path || !parent) {
652 Evas_Object *media_image = elm_image_add(parent);
653 elm_image_aspect_fixed_set(media_image, EINA_FALSE);
654 elm_image_file_set(media_image, path, NULL);
655 evas_object_size_hint_weight_set(media_image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
656 evas_object_size_hint_align_set(media_image, EVAS_HINT_FILL, EVAS_HINT_FILL);
657 evas_object_show(media_image);
661 int get_image_size(long long media_id)
663 Eina_List* media_sizes = get_image_sizes_from_db(media_id);
664 int row_count = eina_list_count(media_sizes);
670 for (int i = 0 ; i < row_count ; i++) {
671 Eina_List* row_vals = eina_list_nth(media_sizes, i);
672 int *temp_size1 = (int *)eina_list_nth(row_vals, 0);
677 int *temp_size2 = (int*)eina_list_nth(row_vals, 3);
682 int *temp_size3 = (int*)eina_list_nth(row_vals, 6);
687 int *temp_size4 = (int*)eina_list_nth(row_vals, 9);
692 eina_list_free(row_vals);
695 eina_list_free(media_sizes);
699 } else if (size2 > 0) {
701 } else if (size3 > 0) {
703 } else if (size4 > 0) {
711 void on_media_chat_item_clicked(void* data, Evas_Object *entry, void* event_info)
713 Evas_Object *button = evas_object_data_get(entry, "button_object");
715 char* img_state = evas_object_data_get(button, "image_state");
716 if (img_state && strstr(img_state, "download_in_progress") != NULL) {
721 appdata_s* ad = evas_object_data_get(entry, "app_data");
722 char *temp_media_id = evas_object_data_get(entry, "media_id");
723 char *media_type_str = evas_object_data_get(entry, "media_type");
725 if (media_type_str && strstr(media_type_str, "location") != NULL) {
726 char *url = evas_object_data_get(entry, "location_url");
727 launch_app_control(ad, media_type_str, url);
731 long long media_id = atoll(temp_media_id);
733 char *media_file = get_media_path_from_db(media_id);
735 if (access(media_file, F_OK) != -1) {
741 if (!media_file || strlen(media_file) <= 0) {
742 Eina_Bool ret = send_request_for_media_downloading(ad, ad->service_client, ad->peer_in_cahtting_data->use_data->peer_id, media_id);
744 show_toast(ad, "Please check your network connection.");
748 char temp_msg[256] = {0,};
749 snprintf(temp_msg, sizeof(temp_msg), "%s", "Downloading...");
750 elm_object_part_text_set(button, "size", temp_msg);
752 Evas_Object* progressbar = elm_progressbar_add(button);
753 elm_object_style_set(progressbar, "process_small");
754 evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
755 evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
756 elm_progressbar_pulse(progressbar, EINA_TRUE);
757 evas_object_show(progressbar);
759 Evas_Object* old_content = elm_object_part_content_unset(button, "download_image");
761 evas_object_del(old_content);
764 elm_object_part_content_set(button, "download_image", progressbar);
765 evas_object_data_set(button, "image_state", "download_in_progress");
768 launch_app_control(ad, media_type_str, media_file);
772 static void on_video_play_pressed(void *data, Evas_Object *obj, void *event_info)
776 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_PRESS_ICON), NULL);
779 static void on_video_play_unpressed(void *data, Evas_Object *obj, void *event_info)
783 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
786 static Evas_Object* get_video_paly_icon(Evas_Object *parent)
788 Evas_Object* play_pause_btn = elm_button_add(parent);
789 elm_object_style_set(play_pause_btn, "transparent");
790 evas_object_size_hint_align_set(play_pause_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
791 evas_object_size_hint_weight_set(play_pause_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
793 Evas_Object* play_pause_icon = elm_image_add(parent);
794 evas_object_size_hint_align_set(play_pause_icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
795 evas_object_size_hint_weight_set(play_pause_icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
797 elm_image_file_set(play_pause_icon, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
799 elm_image_resizable_set(play_pause_icon, EINA_TRUE, EINA_TRUE);
800 evas_object_show(play_pause_icon);
802 elm_object_content_set(play_pause_btn, play_pause_icon);
804 evas_object_smart_callback_add(play_pause_btn, "pressed", on_video_play_pressed, play_pause_icon);
805 evas_object_smart_callback_add(play_pause_btn, "unpressed", on_video_play_unpressed, play_pause_icon);
806 return play_pause_btn;
809 static Evas_Object *get_media_layout_with_play(char *img_path, Evas_Object *parent, Eina_Bool show_play_icon)
811 char edj_path[PATH_MAX] = {0, };
812 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
813 Evas_Object *rec_video_layout = elm_layout_add(parent);
814 elm_layout_file_set(rec_video_layout, edj_path, "bubble_video_item_layout");
815 evas_object_size_hint_weight_set(rec_video_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
816 evas_object_size_hint_align_set(rec_video_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
817 evas_object_show(rec_video_layout);
819 Evas_Object *vid_thumb_icon = get_image_from_path(img_path, parent);
820 elm_object_part_content_set(rec_video_layout, "swallow.video_thumb_item", vid_thumb_icon);
822 if (show_play_icon) {
823 /* Evas_Object* play_img = get_image_from_path(ui_utils_get_resource(MEDIA_PLAY_ICON), parent);
824 elm_object_part_content_set(rec_video_layout, "swallow.play_btn", play_img);*/
826 Evas_Object* play_pause_btn = get_video_paly_icon(parent);
827 elm_object_part_content_set(rec_video_layout, "swallow.play_btn", play_pause_btn);
830 return rec_video_layout;
833 void audio_player_progress_updated(void* handler, int current, int total, void *user_data)
835 Evas_Object *parent = user_data;
836 Evas_Object *progressbar = evas_object_data_get(parent, "progress_control");
839 int seconds = (int) (current / 1000) % 60 ;
840 int minutes = (int) ((current / (1000*60)) % 60);
842 char tot_dur[256] = {0,};
844 if (seconds < 10 && minutes < 10) {
846 } else if (seconds > 10 && minutes < 10) {
848 } else if (seconds < 10 && minutes > 10) {
854 sprintf(tot_dur, format, minutes, seconds);
855 elm_object_part_text_set(progressbar, "elm.text.bottom.right", tot_dur);
857 double current_status = (double)((double)current/(double)total);
859 elm_progressbar_value_set(progressbar, current_status);
863 void audio_player_state_changed(void* handler, TG_AUDIO_PLAYER_STATE state, void *user_data)
865 tg_player_handler *audio_payer = handler;
866 Evas_Object *parent = user_data;
868 if (!audio_payer || !parent) {
872 Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(parent, "is_play_mode");
873 switch (audio_payer->state) {
874 case TG_AUDIO_PLAYER_STATE_NONE:
876 case TG_AUDIO_PLAYER_STATE_INITIALIZED:
877 evas_object_data_set(parent, "tg_audio_player", audio_payer);
878 play_audio_player(audio_payer);
880 case TG_AUDIO_PLAYER_STATE_PLAYING:
881 elm_image_file_set(parent, ui_utils_get_resource(TG_PAUSE_NORMAL_ICON), NULL);
882 is_play_mode = !is_play_mode;
883 evas_object_data_set(parent, "is_play_mode", is_play_mode);
885 case TG_AUDIO_PLAYER_STATE_INTERRUPTED:
886 elm_image_file_set(parent, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
887 is_play_mode = !is_play_mode;
888 evas_object_data_set(parent, "is_play_mode", is_play_mode);
890 case TG_AUDIO_PLAYER_STATE_PAUSE:
891 elm_image_file_set(parent, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
892 is_play_mode = !is_play_mode;
893 evas_object_data_set(parent, "is_play_mode", is_play_mode);
895 case TG_AUDIO_PLAYER_STATE_ERROR:
897 case TG_AUDIO_PLAYER_STATE_END:
898 destroy_audio_player(audio_payer);
901 is_play_mode = EINA_FALSE;
902 evas_object_data_set(parent, "is_play_mode", is_play_mode);
903 evas_object_data_set(parent, "tg_audio_player", NULL);
904 elm_image_file_set(parent, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
905 audio_player_progress_updated(NULL, 0, 1, parent);
913 static void on_message_play_pause_clicked(void *data, Evas_Object *obj, void *event_info)
918 appdata_s * ad = evas_object_data_get(data, "app_data");
919 char *audio_file = evas_object_data_get(data, "audio_file_path");
920 char *media_id = evas_object_data_get(data, "media_id");
921 if (!audio_file || strlen(audio_file) <= 0 || (audio_file && strstr(audio_file, "_null_")) != NULL) {
922 //there is no file. download it.
923 Evas_Object *progressbar = evas_object_data_get(data, "progress_control");
924 Eina_Bool is_download_in_progress = (Eina_Bool)evas_object_data_get(progressbar, "is_download_in_progress");
926 if (is_download_in_progress) {
929 elm_object_style_set(progressbar, "pending");
930 Eina_Bool ret = send_request_for_media_downloading(ad, ad->service_client, ad->peer_in_cahtting_data->use_data->peer_id, atoll(media_id));
932 show_toast(ad, "Please check your network connection.");
939 tg_player_handler *audio_payer = evas_object_data_get(data, "tg_audio_player");
942 audio_payer = init_audio_player(audio_file, &audio_player_state_changed, &audio_player_progress_updated, data);
945 show_toast(ad, "Unsupported file.");
950 if (audio_payer->state == TG_AUDIO_PLAYER_STATE_PAUSE || audio_payer->state == TG_AUDIO_PLAYER_STATE_INTERRUPTED) {
952 play_audio_player(audio_payer);
954 } else if (audio_payer->state == TG_AUDIO_PLAYER_STATE_PLAYING) {
956 pause_audio_player(audio_payer);
961 static void on_message_play_pause_pressed(void *data, Evas_Object *obj, void *event_info)
966 Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(data, "is_play_mode");
968 elm_image_file_set(data, ui_utils_get_resource(TG_PAUSE_PRESS_ICON), NULL);
970 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_PRESS_ICON), NULL);
974 static void on_message_play_pause_unpressed(void *data, Evas_Object *obj, void *event_info)
979 Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(data, "is_play_mode");
982 elm_image_file_set(data, ui_utils_get_resource(TG_PAUSE_NORMAL_ICON), NULL);
984 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
988 static void progressbar_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
994 static Evas_Object *create_audio_progressbar(Evas_Object *parent, int duration)
996 Evas_Object *progressbar;
998 progressbar = elm_progressbar_add(parent);
999 evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, 0.5);
1000 evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1001 elm_progressbar_value_set(progressbar, 0.0);
1002 evas_object_event_callback_add(progressbar, EVAS_CALLBACK_DEL, progressbar_del_cb, NULL);
1003 evas_object_show(progressbar);
1005 elm_object_part_text_set(progressbar, "elm.text.top.left", "");
1006 elm_object_part_text_set(progressbar, "elm.text.top.right", "");
1008 elm_object_part_text_set(progressbar, "elm.text.bottom.right", "00:00");
1014 static Evas_Object *get_audio_layout_with_play(Evas_Object *parent)
1016 Evas_Object* chat_scroller = parent;
1017 Evas_Object *rec_video_layout = NULL;
1018 tgl_media_s *media_msg = NULL;
1019 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1020 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1021 int message_id = (int)evas_object_data_get(chat_scroller, "message_id");
1023 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1024 int buddy_id = sel_item->use_data->peer_id;
1025 char* tablename = get_table_name_from_number(buddy_id);
1027 tg_message_s* msg = get_message_from_message_table(message_id, tablename);
1035 Evas_Object *parent_obj = evas_object_data_get(chat_scroller, "parent_obj"); //entry
1039 media_msg = get_media_details_from_db(atoll(msg->media_id));
1041 char *audio_file = media_msg->file_path;
1043 char edj_path[PATH_MAX] = {0, };
1044 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1045 rec_video_layout = elm_layout_add(parent);
1046 elm_layout_file_set(rec_video_layout, edj_path, "bubble_audio_item_layout");
1047 evas_object_size_hint_weight_set(rec_video_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1048 evas_object_size_hint_align_set(rec_video_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1049 evas_object_show(rec_video_layout);
1051 /**************** play icon **********************/
1052 Evas_Object* play_pause_btn = elm_button_add(parent);
1053 elm_object_style_set(play_pause_btn, "transparent");
1054 evas_object_size_hint_align_set(play_pause_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
1055 evas_object_size_hint_weight_set(play_pause_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1057 Evas_Object* play_pause_icon = elm_image_add(parent);
1058 evas_object_size_hint_align_set(play_pause_icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
1059 evas_object_size_hint_weight_set(play_pause_icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1060 elm_image_file_set(play_pause_icon, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
1062 elm_image_resizable_set(play_pause_icon, EINA_TRUE, EINA_TRUE);
1063 evas_object_show(play_pause_icon);
1064 elm_object_content_set(play_pause_btn, play_pause_icon);
1066 Eina_Bool is_play_mode = EINA_TRUE;
1067 evas_object_data_set(play_pause_icon, "is_play_mode", is_play_mode);
1070 evas_object_data_set(play_pause_icon, "audio_file_path", strdup(audio_file));
1072 evas_object_data_set(play_pause_icon, "app_data", ad);
1073 evas_object_data_set(play_pause_icon, "user_id", (void*)user_id);
1074 evas_object_data_set(play_pause_icon, "message_id", (void*)message_id);
1075 evas_object_data_set(play_pause_icon, "media_id", strdup(msg->media_id));
1077 evas_object_smart_callback_add(parent_obj, "clicked", on_message_play_pause_clicked, play_pause_icon);
1078 evas_object_smart_callback_add(parent_obj, "pressed", on_message_play_pause_pressed, play_pause_icon);
1079 evas_object_smart_callback_add(parent_obj, "unpressed", on_message_play_pause_unpressed, play_pause_icon);
1081 evas_object_smart_callback_add(play_pause_btn, "clicked", on_message_play_pause_clicked, play_pause_icon);
1082 evas_object_smart_callback_add(play_pause_btn, "pressed", on_message_play_pause_pressed, play_pause_icon);
1083 evas_object_smart_callback_add(play_pause_btn, "unpressed", on_message_play_pause_unpressed, play_pause_icon);
1084 elm_object_part_content_set(rec_video_layout, "swallow.play_icon", play_pause_btn);
1085 /**************** play icon **********************/
1087 /*************** progress bar ********************/
1089 int total_duration = 0;
1091 metadata_extractor_h metadata;
1092 metadata_extractor_create(&metadata);
1093 int ret = metadata_extractor_set_path(metadata, audio_file);
1095 ret = metadata_extractor_get_metadata(metadata, METADATA_DURATION, &value);
1096 metadata_extractor_destroy(metadata);
1099 total_duration = atoi(value);
1103 total_duration = media_msg->doc_duration;
1104 //convert into milli secs
1105 total_duration = 1000 * total_duration;
1108 Evas_Object *progress = create_audio_progressbar(parent, total_duration);
1110 evas_object_data_set(parent_obj, "play_pause_icon", play_pause_icon);
1111 evas_object_data_set(parent_obj, "progress_bar", progress);
1113 elm_object_part_content_set(rec_video_layout, "swallow.progress_icon", progress);
1115 evas_object_data_set(play_pause_icon, "progress_control", (void*)progress);
1116 Eina_Bool is_download_in_progress = EINA_FALSE;
1117 evas_object_data_set(progress, "is_download_in_progress", (void*)is_download_in_progress);
1119 /*************** progress bar ********************/
1125 msg->message = NULL;
1127 if (msg->media_id) {
1128 free(msg->media_id);
1129 msg->media_id = NULL;
1132 free_media_details(media_msg);
1134 return rec_video_layout;
1138 static Evas_Object * item_provider(void *data, Evas_Object *entry, const char *item)
1140 Evas_Object *layout = NULL;
1141 if (!strcmp(item, "itemprovider")) {
1142 Evas_Object* chat_scroller = data;
1143 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1144 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1145 int message_id = (int)evas_object_data_get(chat_scroller, "message_id");
1147 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1148 int buddy_id = sel_item->use_data->peer_id;
1150 char* tablename = get_table_name_from_number(buddy_id);
1151 tg_message_s* msg = get_message_from_message_table(message_id, tablename);
1158 Evas_Object *item_to_display = NULL;
1159 tgl_media_s *media_msg = NULL;
1160 if (msg->media_type == tgl_message_media_photo || msg->media_type == tgl_message_media_document) {
1162 Eina_Bool is_blur_image = EINA_FALSE;
1163 char* img_path = NULL;
1164 Evas_Object *temp = NULL;
1165 temp = evas_object_data_get(entry, "img_object");
1168 tmp = ui_utils_get_resource(BLUR_BG);
1169 img_path = strdup(tmp);
1170 is_blur_image = EINA_TRUE;
1172 item_to_display = temp;
1175 if (msg->media_type == tgl_message_media_document) {
1176 media_msg = get_media_details_from_db(atoll(msg->media_id));
1178 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1179 if (img_path == NULL || strlen(img_path) == 0) {
1180 img_path = strdup(ui_utils_get_resource(TG_VIDEO_ICON));
1183 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1188 img_path = strdup(ui_utils_get_resource(TG_AUDIO_ICON));
1190 char* media_file = get_media_path_from_db(atoll(msg->media_id));
1191 if (!media_file || (media_file && !strcmp(media_file, "_null_")) || (media_file && strlen(media_file) <= 0) || (media_file && access(media_file, F_OK) == -1)) {
1192 is_blur_image = EINA_TRUE;
1195 if (media_file && strstr(media_file, ".webp") != NULL) {
1196 is_blur_image = EINA_FALSE;
1202 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1204 evas_object_data_set(chat_scroller, "parent_obj", (void*)entry);
1205 item_to_display = get_audio_layout_with_play(chat_scroller);
1207 } else if (msg->out) {
1209 if (msg->media_type == tgl_message_media_photo) {
1211 //item_to_display = get_image_from_path(img_path, entry);
1214 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1216 item_to_display = get_media_layout_with_play(img_path, entry, EINA_TRUE);
1219 //item_to_display = get_image_from_path(img_path, entry);
1220 elm_image_animated_set(item_to_display, EINA_TRUE);
1221 elm_image_animated_play_set(item_to_display, EINA_TRUE);
1226 if (!is_blur_image) {
1228 if (msg->media_type == tgl_message_media_photo) {
1230 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1233 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1235 item_to_display = get_media_layout_with_play(img_path, entry, EINA_TRUE);
1238 if (media_msg && media_msg->mime_type && strstr(media_msg->mime_type, "webp") != NULL) {
1239 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1241 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1242 elm_image_animated_set(item_to_display, EINA_TRUE);
1243 elm_image_animated_play_set(item_to_display, EINA_TRUE);
1249 char edj_path[PATH_MAX] = {0, };
1250 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1251 Evas_Object *rec_img_layout = elm_layout_add(entry);
1252 elm_layout_file_set(rec_img_layout, edj_path, "bubble_received_media_layout");
1253 evas_object_size_hint_weight_set(rec_img_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1254 evas_object_size_hint_align_set(rec_img_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1255 evas_object_show(rec_img_layout);
1256 Evas_Object *img_item = NULL;
1259 if (msg->media_type == tgl_message_media_photo) {
1260 img_item = get_image_from_path(img_path, entry);
1262 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)) {
1263 img_item = get_media_layout_with_play(img_path, entry, EINA_FALSE);
1265 img_item = get_image_from_path(img_path, entry);
1268 elm_object_part_content_set(rec_img_layout, "swallow.image_item", img_item);
1271 if (msg->media_type == tgl_message_media_photo) {
1272 media_size = get_image_size(atoll(msg->media_id));
1274 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1275 media_size = get_media_size_from_db(atoll(msg->media_id));
1276 } else if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1277 media_size = get_media_size_from_db(atoll(msg->media_id));
1279 media_size = get_media_size_from_db(atoll(msg->media_id));
1283 int media_size_kbs = (media_size < (1 << 20)); //convert to kbs
1284 char media_size_str[10] = { 0, };
1285 if (media_size_kbs > 0) {
1286 sprintf(media_size_str, "%dKB", media_size_kbs);
1288 sprintf(media_size_str, "%dB", media_size);
1292 Evas_Object *size_btn = elm_layout_add(entry);
1293 elm_layout_file_set(size_btn, edj_path, "download_btn");
1294 elm_object_part_text_set(size_btn, "size", media_size_str);
1295 evas_object_size_hint_weight_set(size_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1296 evas_object_size_hint_align_set(size_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
1297 evas_object_show(size_btn);
1299 evas_object_data_set(size_btn, "image_state", "ready_to_download");
1301 Evas_Object* download_img = get_image_from_path(ui_utils_get_resource(MEDIA_DOWNLOAD_ICON), entry);
1302 elm_object_part_content_set(size_btn, "download_image", download_img);
1304 elm_object_part_content_set(rec_img_layout, "swallow.download_btn", size_btn);
1306 evas_object_data_set(entry, "image_object", (void*)img_item);
1307 evas_object_data_set(entry, "button_object", (void*)size_btn);
1308 evas_object_data_set(entry, "image_size", (void*)strdup(media_size_str));
1310 //ad->loaded_msg_list = eina_list_append(ad->loaded_msg_list, entry);
1312 item_to_display = rec_img_layout;
1320 // delete media details
1324 evas_object_data_set(entry, "chat_list", (void*)chat_scroller);
1325 evas_object_data_set(entry, "message_id", (void*)message_id);
1326 evas_object_data_set(entry, "app_data", (void*)ad);
1329 if (msg->media_type == tgl_message_media_photo) {
1330 evas_object_data_set(entry, "media_type", (void*)strdup("image"));
1331 } else if (msg->media_type == tgl_message_media_geo) {
1332 evas_object_data_set(entry, "media_type", (void*)strdup("location"));
1334 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1335 evas_object_data_set(entry, "media_type", (void*)strdup("video"));
1336 } else if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1337 evas_object_data_set(entry, "media_type", (void*)strdup("audio"));
1339 if (media_msg && media_msg->mime_type && strstr(media_msg->mime_type, "webp") != NULL) {
1340 evas_object_data_set(entry, "media_type", (void*)strdup("image"));
1342 evas_object_data_set(entry, "media_type", (void*)strdup("animated_gif"));
1347 evas_object_data_set(entry, "media_id", (void*)strdup(msg->media_id));
1348 if (item_to_display) {
1349 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1350 layout = item_to_display;
1352 char edj_path[PATH_MAX] = {0, };
1353 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1354 layout = elm_layout_add(entry);
1355 elm_layout_file_set(layout, edj_path, "chat_image_layout");
1356 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1357 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1358 evas_object_show(layout);
1360 Evas_Object *rounded_layout = elm_layout_add(entry);
1361 elm_layout_file_set(rounded_layout, edj_path, "rounded_corner_layout");
1362 evas_object_size_hint_weight_set(rounded_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1363 evas_object_size_hint_align_set(rounded_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1364 evas_object_show(rounded_layout);
1365 elm_object_part_content_set(rounded_layout, "content", item_to_display);
1367 elm_object_part_content_set(layout, "swallow.chat_image", rounded_layout);
1368 evas_object_smart_callback_add(entry, "clicked", on_media_chat_item_clicked, NULL);
1374 msg->message = NULL;
1377 if (msg->media_id) {
1378 free(msg->media_id);
1379 msg->media_id = NULL;
1383 free_media_details(media_msg);
1389 static void __resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1391 appdata_s *ad = data;
1392 Evas_Object *layout = NULL;
1393 Evas_Object *chat_scroller = NULL;
1395 layout = evas_object_data_get(ad->nf, "main_layout");
1396 chat_scroller = evas_object_data_get(ad->nf, "chat_list");
1398 int is_end_edge = 0;
1399 is_end_edge = (int)evas_object_data_get(layout, "is_end_edge");
1400 int is_end_edge_top = 0;
1401 is_end_edge_top = (int)evas_object_data_get(chat_scroller, "is_end_edge_top");
1404 /*if(is_end_edge_top)
1405 ret = scroller_show_previous_region(chat_scroller);
1407 ret = scroller_show_bottom_edge(chat_scroller);
1409 LOGE("Fail to show the bottom of scroller");
1413 scroller_show_previous_region(chat_scroller);
1416 static void _create_image_item(tg_message_s *msg, Evas_Object *entry, char *image, int size)
1418 char* img_path = NULL;
1419 img_path = get_video_thumb_path_from_db(atoll(msg->media_id));
1420 if (img_path == NULL || (img_path && strlen(img_path) == 0) || (img_path && strstr(img_path, "_null_") != NULL)) {
1421 img_path = get_media_path_from_db(atoll(msg->media_id));
1422 if (access(img_path, F_OK) == -1) {
1428 Evas_Object *img_item = NULL;
1429 char key[256] = {0, };
1430 snprintf(key, sizeof(key), "%d", msg->msg_id);
1432 if (img_path && strstr(img_path, ".webp") != NULL) {
1433 img_item = get_image_from_path(img_path, entry);
1436 if (msg->media_type == tgl_message_media_document) {
1437 img_item = get_gif_image_from_path(img_path, entry, key);
1439 img_item = get_image_from_path(img_path, entry);
1447 evas_object_data_set(entry, "img_object", img_item);
1448 elm_image_object_size_get(img_item, &w, &h);
1451 if (img_path && strstr(img_path, ".webp") != NULL) {
1455 entry_h = (318 * h) / w;
1458 evas_object_data_set(entry, "img_object", NULL);
1461 snprintf(image, size - 1, "<item size=318x%d vsize=full href=itemprovider></item>", entry_h);
1464 Evas_Object *on_message_item_content_get_cb(void *data, Evas_Object *obj, const char *part)
1466 Evas_Object *entry = NULL;
1467 Evas_Object *layout = NULL;
1470 ERR("Invalid Parameter.");
1473 char edj_path[PATH_MAX] = {0, };
1474 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1476 if (!strcmp(part, "elm.icon.entry")) {
1478 tg_message_s *msg = (tg_message_s*)data;
1479 Evas_Object *chat_scroller = obj;
1480 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1482 Evas_Object *nomsg_layout = evas_object_data_get(ad->nf, "chat_list_no_msg_text");
1484 elm_object_signal_emit(nomsg_layout, "hide", "message");
1487 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1488 evas_object_data_set(chat_scroller, "message_id", msg->msg_id);
1490 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1491 int buddy_id = sel_item->use_data->peer_id;
1493 char* tablename = get_table_name_from_number(buddy_id);
1495 //Eina_Bool is_blur_image = EINA_FALSE;
1501 update_msg_into_db(msg, tablename);
1502 ad->is_last_msg_changed = EINA_TRUE;
1512 if (msg->service == 2) {
1513 layout = elm_layout_add(obj);
1514 elm_layout_file_set(layout, edj_path, "chat_date_item");
1515 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1516 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1517 evas_object_show(layout);
1519 // convert date from string to int
1520 char *date_str = msg->message;
1521 int date_num = atoi(date_str);
1523 // convert date format
1524 time_t t = date_num;
1525 char *format = NULL;
1526 format = "%a, %e %b %Y";
1529 (void) localtime_r(&t, <);
1531 if (strftime(res, sizeof(res), format, <) == 0) {
1532 (void) fprintf(stderr, "strftime(3): cannot format supplied "
1533 "date/time into buffer of size %u "
1535 sizeof(res), format);
1538 elm_object_part_text_set(layout, "elm.text", res);
1540 } else if (msg->service == 1) {
1541 layout = elm_layout_add(obj);
1542 elm_layout_file_set(layout, edj_path, "chat_service_item_box");
1543 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1544 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1545 evas_object_show(layout);
1547 elm_object_part_text_set(layout, "elm.text", msg->message);
1551 evas_object_data_set(entry, "chat_list", (void*)chat_scroller);
1552 evas_object_data_set(entry, "message_id", (void*)msg->msg_id);
1554 if (msg->media_type != tgl_message_media_none) {
1555 entry = elm_entry_add(obj);
1556 elm_entry_editable_set(entry, EINA_FALSE);
1557 elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
1558 elm_entry_single_line_set(entry, EINA_TRUE);
1559 elm_entry_input_panel_enabled_set(entry, EINA_FALSE);
1561 entry = elm_label_add(obj);
1563 layout = elm_layout_add(obj);
1566 elm_layout_file_set(layout, edj_path, "entry,send,layout");
1567 elm_object_style_set(entry, "sentmessage1");
1568 //sender_name = replace(ad->current_user_data->print_name, '_', " ");
1570 elm_layout_file_set(layout, edj_path, "entry,receive,layout");
1571 elm_object_style_set(entry, "readmessage1");
1573 /* If you need to get the name, you need this code */
1575 char *sender_name = NULL;
1576 if (sel_item->use_data->peer_type == TGL_PEER_USER) {
1577 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1578 } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
1579 int from_id = msg->from_id;
1580 // get name of buddy
1581 char* buddy_name = get_buddy_name_from_id(from_id);
1583 sender_name = replace(buddy_name, '_', " ");
1587 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1592 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1593 elm_object_part_content_set(layout, "elm.swallow.content", entry);
1594 evas_object_show(layout);
1596 evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1597 evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
1598 evas_object_show(entry);
1599 // To be handled for group chat
1600 Eina_Strbuf *buf = eina_strbuf_new();
1601 char *caption = NULL;
1602 LOGD("entry media type is %d", msg->media_type);
1603 if (msg->media_type == tgl_message_media_none) {
1604 char *temp_msg = replace(msg->message, '\n', "<br>");
1605 elm_object_part_text_set(entry, "elm.text", temp_msg);
1606 //eina_strbuf_append(buf, temp_msg);
1607 //elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1608 eina_strbuf_free(buf);
1610 } else if (msg->media_type == tgl_message_media_photo || msg->media_type == tgl_message_media_document) {
1611 elm_entry_item_provider_append(entry, item_provider, chat_scroller);
1613 LOGD("media id[%s]", msg->media_id);
1614 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1616 LOGD("file path[%s]", media_msg->file_path);
1617 if (media_msg && media_msg->caption && strlen(media_msg->caption) > 0) {
1618 caption = strdup(media_msg->caption);
1619 LOGD("caption[%s]", caption);
1623 if (media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1624 if (ad->target_direction == TELEGRAM_TARGET_DIRECTION_PORTRAIT || ad->target_direction == TELEGRAM_TARGET_DIRECTION_PORTRAIT_INVERSE) {
1625 eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1627 eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1630 } else if (media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1631 eina_strbuf_append(buf, "<item size=318x200 vsize=full hsize=full href=itemprovider></item>");
1633 char image[256] = {0,};
1634 _create_image_item(msg, entry, image, sizeof(image));
1635 eina_strbuf_append(buf, image);
1640 if (media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1641 eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1642 } else if (media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1643 eina_strbuf_append(buf, "<item size=318x200 vsize=full hsize=full href=itemprovider></item>");
1645 char image[256] = {0,};
1646 _create_image_item(msg, entry, image, sizeof(image));
1647 eina_strbuf_append(buf, image);
1651 free_media_details(media_msg);
1652 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1653 eina_strbuf_free(buf);
1654 } else if (msg->media_type == tgl_message_media_geo) {
1656 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1658 char loc_url[4*256] = {0,};
1660 if (media_msg->caption && strlen(media_msg->caption) > 0) {
1661 caption = strdup(media_msg->caption);
1663 snprintf(loc_url, sizeof(loc_url), "https://maps.google.com/?q=%s,%s", media_msg->latitude, media_msg->longitude);
1664 char temp_msg[4*256] = {0,};
1665 snprintf(temp_msg, sizeof(temp_msg), "<font=Tizen:style=Normal|underline color=#0000FF align=left><font_size=15>%s</font_size></font>", loc_url);
1666 eina_strbuf_append(buf, temp_msg);
1667 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1668 eina_strbuf_free(buf);
1671 free_media_details(media_msg);
1672 evas_object_data_set(entry, "media_type", (void*)strdup("location"));
1673 evas_object_data_set(entry, "location_url", (void*)strdup(loc_url));
1674 evas_object_smart_callback_add(entry, "clicked", on_media_chat_item_clicked, NULL);
1676 } else if (msg->media_type == tgl_message_media_contact) {
1678 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1681 if (media_msg->caption && strlen(media_msg->caption) > 0) {
1682 caption = strdup(media_msg->caption);
1684 char temp_msg[4*256] = {0,};
1685 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);
1686 eina_strbuf_append(buf, temp_msg);
1687 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1688 eina_strbuf_free(buf);
1689 free_media_details(media_msg);
1692 } else if (msg->media_type == tgl_message_media_unsupported) {
1694 } else if (msg->media_type == tgl_message_media_photo_encr) {
1696 } else if (msg->media_type == tgl_message_media_document_encr) {
1701 ad->loaded_msg_list = eina_list_append(ad->loaded_msg_list, entry);
1704 LOGD("caption is (%s)", caption);
1708 time_t t = msg->date;
1709 const char *format = "%I:%M %p";
1712 (void) localtime_r(&t, <);
1714 if (strftime(res, sizeof(res), format, <) == 0) {
1715 (void) fprintf(stderr, "strftime(3): cannot format supplied "
1716 "date/time into buffer of size %u "
1718 sizeof(res), format);
1721 char time_str[20] = {0,};
1722 snprintf(time_str, sizeof(time_str) - 1, "%s", res);
1723 elm_object_part_text_set(entry, "time", time_str);
1725 Evas_Object *status_obj;
1726 status_obj = elm_icon_add(entry);
1727 evas_object_size_hint_weight_set(status_obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1728 evas_object_size_hint_align_set(status_obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
1730 if (msg->msg_state == TG_MESSAGE_STATE_SENDING) {
1731 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENDING_ICON), NULL);
1732 elm_object_signal_emit(entry, "status_on", "status");
1733 } else if (msg->msg_state == TG_MESSAGE_STATE_SENT) {
1734 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENT_ICON), NULL);
1735 elm_object_signal_emit(entry, "status_on", "status");
1736 } else if (msg->msg_state == TG_MESSAGE_STATE_DELIVERED) {
1737 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_DELIVERED_ICON), NULL);
1738 elm_object_signal_emit(entry, "status_on", "status");
1739 } else if (msg->msg_state == TG_MESSAGE_STATE_RECEIVED) {
1740 elm_object_signal_emit(entry, "status_off", "status");
1741 } else if (msg->msg_state == TG_MESSAGE_STATE_FAILED) {
1742 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_FAILED_ICON), NULL);
1743 elm_object_signal_emit(entry, "status_on", "status");
1744 } else if (msg->msg_state == TG_MESSAGE_STATE_READ) {
1745 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_READ_ICON), NULL);
1746 elm_object_signal_emit(entry, "status_on", "status");
1747 } else if (msg->msg_state == TG_MESSAGE_STATE_UNKNOWN) {
1748 elm_object_signal_emit(entry, "status_off", "status");
1751 elm_object_part_content_set(entry, "status_icon", status_obj);
1752 evas_object_show(status_obj);
1756 if (chat_scroller) {
1757 int size = elm_genlist_items_count(chat_scroller);
1759 Elm_Object_Item *litem = elm_genlist_nth_item_get(chat_scroller, size -1);
1760 elm_genlist_item_show(litem, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1768 void on_text_message_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
1773 void on_text_message_received_from_buddy(appdata_s* ad, long long message_id, int type_of_chat)
1778 peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
1779 tg_peer_info_s* peer_item = pic_peer_item->use_data;
1780 char* tablename = get_table_name_from_number(peer_item->peer_id);
1781 tg_message_s* msg = get_message_from_message_table(message_id, tablename);
1783 Evas_Object* chat_scroller = evas_object_data_get(ad->nf, "chat_list");
1784 Evas_Object *message = NULL;
1787 // update peer table
1789 peer_item->last_msg_id = msg->msg_id;
1790 peer_item->last_msg_date = msg->date;
1791 insert_or_update_peer_into_database(peer_item);
1794 Evas_Object *layout = evas_object_data_get(ad->nf, "main_layout");
1796 int is_end_edge = (int) evas_object_data_get(layout, "is_end_edge");
1798 Evas_Object *bubble_layout = NULL;
1799 bubble_layout = elm_object_part_content_get(layout, "swallow.messagebubble");
1801 int user_id = (int) evas_object_data_get(chat_scroller, "user_id");
1802 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1803 char *sender_name = NULL;
1804 if (sel_item->use_data->peer_type == TGL_PEER_USER) {
1805 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1806 } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
1807 int from_id = msg->from_id;
1808 // get name of buddy
1809 char* buddy_name = get_buddy_name_from_id(from_id);
1811 sender_name = replace(buddy_name, '_', " ");
1815 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1818 elm_object_part_text_set(bubble_layout, "text_name", sender_name);
1819 elm_object_part_text_set(bubble_layout, "text_message", msg->message);
1820 elm_object_signal_emit(layout, "show", "bubblemessage");
1826 msg->message = NULL;
1829 if (msg->media_id) {
1830 free(msg->media_id);
1831 msg->media_id = NULL;
1838 message = on_message_item_content_get_cb((void *)msg, chat_scroller, "elm.icon.entry");
1839 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)message_id);
1840 scroller_push_item(chat_scroller, message, 0);
1842 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1843 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1845 send_request_for_marked_as_read(ad, ad->service_client, sel_item->use_data->peer_id, sel_item->use_data->peer_type);
1846 ad->is_last_msg_changed = EINA_TRUE;
1847 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
1851 void on_media_download_completed(appdata_s* ad, int buddy_id, long long media_id, const char *file_path, const char *caption)
1856 if (ad->loaded_msg_list && eina_list_count(ad->loaded_msg_list) > 0) {
1857 for (int i = eina_list_count(ad->loaded_msg_list) - 1 ; i >= 0; i--) {
1858 Evas_Object* entry = eina_list_nth(ad->loaded_msg_list, i);
1861 char* media_type_str = evas_object_data_get(entry, "media_type");
1862 char* media_id_str = evas_object_data_get(entry, "media_id");
1863 char* media_size_str = evas_object_data_get(entry, "image_size");
1864 Evas_Object *img_item = evas_object_data_get(entry, "image_object");
1865 Evas_Object *size_btn = evas_object_data_get(entry, "button_object");
1869 long long lmedia_id = atoll(media_id_str);
1871 if (media_id == lmedia_id) {
1872 if (img_item || (media_type_str && strstr(media_type_str, "audio") != NULL)) {
1875 if (file_path && strstr(file_path, "failed_to_load") != NULL) {
1877 if (media_type_str && (strstr(media_type_str, "audio") != NULL)) {
1878 Evas_Object *play_pause_icon = evas_object_data_get(entry, "play_pause_icon");
1879 Evas_Object *progressbar = evas_object_data_get(entry, "progress_bar");
1880 evas_object_data_set(progressbar, "is_download_in_progress", EINA_FALSE);
1881 evas_object_data_set(play_pause_icon, "audio_file_path", NULL);
1883 elm_object_style_set(progressbar, "default");
1889 Evas_Object* progress = elm_object_part_content_get(size_btn, "download_image");
1891 evas_object_del(progress);
1893 Evas_Object* download_img = get_image_from_path(ui_utils_get_resource(MEDIA_DOWNLOAD_ICON), size_btn);
1894 elm_object_part_content_set(size_btn, "download_image", download_img);
1895 evas_object_data_set(size_btn, "image_state", "ready_to_download");
1896 char temp_msg[256] = {0,};
1897 snprintf(temp_msg, sizeof(temp_msg), "<font=Tizen:style=Bold color=#008000 align=center><font_size=30>%s</font_size></font>", media_size_str);
1898 elm_object_text_set(size_btn, temp_msg);
1904 if (media_type_str && (strstr(media_type_str, "audio") != NULL)) {
1905 Evas_Object *play_pause_icon = evas_object_data_get(entry, "play_pause_icon");
1906 Evas_Object *progressbar = evas_object_data_get(entry, "progress_bar");
1907 evas_object_data_set(progressbar, "is_download_in_progress", EINA_FALSE);
1908 elm_object_style_set(progressbar, "default");
1909 evas_object_data_set(play_pause_icon, "audio_file_path", file_path);
1911 metadata_extractor_h metadata;
1912 metadata_extractor_create(&metadata);
1913 int ret = metadata_extractor_set_path(metadata, file_path);
1915 ret = metadata_extractor_get_metadata(metadata, METADATA_DURATION, &value);
1916 metadata_extractor_destroy(metadata);
1920 duration = atoi(value);
1924 elm_object_part_text_set(progressbar, "elm.text.top.left", "");
1925 elm_object_part_text_set(progressbar, "elm.text.top.right", "");
1931 evas_object_del(size_btn);
1934 if (media_type_str && (strstr(media_type_str, "video") != NULL)) {
1935 Evas_Object* play_img = get_video_paly_icon(img_item);
1936 //Evas_Object* play_img = get_image_from_path(ui_utils_get_resource(MEDIA_PLAY_ICON), img_item);
1937 elm_object_part_content_set(img_item, "swallow.play_btn", play_img);
1938 } else if (media_type_str && strstr(media_type_str, "image") != NULL) {
1940 img_item = get_image_from_path(file_path, entry);
1942 elm_image_object_size_get(img_item, &w, &h);
1943 entry_h = (318 * h) / w;
1944 Eina_Strbuf *buf = eina_strbuf_new();
1945 char image[256] = {0,};
1946 evas_object_data_set(entry, "img_object", img_item);
1947 snprintf(image, sizeof(image) - 1, "<item size=318x%d vsize=full href=itemprovider></item>", entry_h);
1948 eina_strbuf_append(buf, image);
1949 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1950 eina_strbuf_free(buf);
1952 } else if (media_type_str && strstr(media_type_str, "animated_gif") != NULL) {
1954 int msg_id = (int) evas_object_data_get(entry, "message_id");
1955 char key[256] = {0, };
1956 snprintf(key, sizeof(key), "%d", msg_id);
1958 img_item = get_gif_image_from_path(file_path, entry, key);
1959 //elm_image_animated_set(img_item, EINA_TRUE);
1960 //elm_image_animated_play_set(img_item, EINA_TRUE);
1962 elm_image_object_size_get(img_item, &w, &h);
1963 entry_h = (318 * h) / w;
1964 evas_object_data_set(entry, "img_object", img_item);
1965 Eina_Strbuf *buf = eina_strbuf_new();
1966 char image[256] = {0,};
1967 snprintf(image, sizeof(image) - 1, "<item size=318x%d vsize=full href=itemprovider></item>", entry_h);
1968 eina_strbuf_append(buf, image);
1969 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1970 eina_strbuf_free(buf);
1982 //elm_object_part_content_set(comp_img_layout, "swallow.chat_send_image", image);
1984 void on_video_thumb_download_completed(appdata_s* ad, int buddy_id, long long media_id, const char* file_path, const char *caption)
1986 on_media_download_completed(ad, buddy_id, media_id, file_path, caption);
1989 void on_text_message_state_changed(appdata_s* ad, tg_message_s *msg, int type_of_chat)
1995 peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
1996 if (pic_peer_item) {
1997 tg_peer_info_s* peer_item = pic_peer_item->use_data;
1998 // update peer table
2000 peer_item->last_msg_id = msg->msg_id;
2001 peer_item->last_msg_date = msg->date;
2002 insert_or_update_peer_into_database(peer_item);
2006 if (ad->loaded_msg_list && eina_list_count(ad->loaded_msg_list) > 0) {
2007 for (int i = eina_list_count(ad->loaded_msg_list) - 1 ; i >= 0; i--) {
2008 Evas_Object* entry = eina_list_nth(ad->loaded_msg_list, i);
2011 int message_id = (int)evas_object_data_get(entry, "message_id");
2012 if (message_id == msg->msg_id || message_id == msg->unique_id) {
2014 evas_object_data_set(entry, "media_id", (void*)strdup(msg->media_id));
2015 evas_object_data_set(entry, "message_id", (void*)message_id);
2017 Evas_Object* status_obj = elm_object_part_content_get(entry, "status_icon");
2019 if (msg->msg_state == TG_MESSAGE_STATE_SENDING) {
2020 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENDING_ICON), NULL);
2021 elm_object_signal_emit(entry, "status_on", "status");
2022 } else if (msg->msg_state == TG_MESSAGE_STATE_SENT) {
2023 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENT_ICON), NULL);
2024 elm_object_signal_emit(entry, "status_on", "status");
2025 } else if (msg->msg_state == TG_MESSAGE_STATE_DELIVERED) {
2026 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_DELIVERED_ICON), NULL);
2027 elm_object_signal_emit(entry, "status_on", "status");
2028 } else if (msg->msg_state == TG_MESSAGE_STATE_RECEIVED) {
2029 elm_object_signal_emit(entry, "status_off", "status");
2030 } else if (msg->msg_state == TG_MESSAGE_STATE_FAILED) {
2031 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_FAILED_ICON), NULL);
2032 elm_object_signal_emit(entry, "status_on", "status");
2033 } else if (msg->msg_state == TG_MESSAGE_STATE_READ) {
2034 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_READ_ICON), NULL);
2035 elm_object_signal_emit(entry, "status_on", "status");
2036 } else if (msg->msg_state == TG_MESSAGE_STATE_UNKNOWN) {
2037 elm_object_signal_emit(entry, "status_off", "status");
2047 Eina_Bool add_date_item_to_chat(void *data)
2049 Evas_Object *chat_scroller = data;
2050 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2051 Eina_Bool ret = EINA_FALSE;
2055 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2056 if (!ad->peer_list) {
2060 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2062 char* msg_table = get_table_name_from_number(sel_item->use_data->peer_id);
2063 create_buddy_msg_table(msg_table);
2064 int msg_id = insert_current_date_to_table(msg_table);
2067 // send request to service
2068 Evas_Object *message = NULL;
2069 tg_message_s* msg = get_message_from_message_table(msg_id, msg_table);
2071 message = on_message_item_content_get_cb((void *)msg, chat_scroller, "elm.icon.entry");
2072 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)msg_id);
2073 scroller_push_item(chat_scroller, message, 0);
2077 ad->is_last_msg_changed = EINA_TRUE;
2087 static Eina_Bool on_new_text_message_send_cb(void *data)
2089 Evas_Object *chat_scroller = data;
2090 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2091 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2092 Evas_Object *text_entry = evas_object_data_get(chat_scroller, "text_entry");
2094 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2096 const char* text_to_send = elm_entry_entry_get(text_entry);
2097 if (!text_to_send || (strlen(text_to_send) == 0))
2098 return ECORE_CALLBACK_CANCEL;
2100 int unique_id = get_time_stamp_in_macro();
2101 if (unique_id < 0) {
2102 unique_id = -1 * unique_id;
2105 msg.msg_id = unique_id;
2106 msg.from_id = ad->current_user_data->user_id.id;
2107 msg.date = time(NULL);
2110 msg.fwd_from_id = 0;
2111 msg.fwd_from_id = 0;
2113 msg.message = (char*)text_to_send;
2114 msg.message_len = strlen(text_to_send);
2115 msg.media_type = tgl_message_media_none;
2119 msg.to_id = sel_item->use_data->peer_id;
2121 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2122 msg.is_marked_for_delete = 0;
2123 char* msg_table = get_table_name_from_number(msg.to_id);
2124 create_buddy_msg_table(msg_table);
2125 insert_msg_into_db(&msg, msg_table, unique_id);
2128 peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
2129 if (pic_peer_item) {
2130 tg_peer_info_s* peer_item = pic_peer_item->use_data;
2131 // update peer table
2133 peer_item->last_msg_id = msg.msg_id;
2134 peer_item->last_msg_date = msg.date;
2135 insert_or_update_peer_into_database(peer_item);
2139 // send request to service
2140 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);
2142 Evas_Object *message = NULL;
2144 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2145 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)unique_id);
2146 scroller_push_item(chat_scroller, message, 0);
2148 elm_entry_entry_set(text_entry, "");
2149 ad->is_last_msg_changed = EINA_TRUE;
2150 return ECORE_CALLBACK_CANCEL;
2153 static void on_text_message_send_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2155 Evas_Object* chat_scroller = data;
2156 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2160 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2161 Evas_Object* text_entry = evas_object_data_get(chat_scroller, "text_entry");
2164 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2165 const char* text_to_send = elm_entry_markup_to_utf8(elm_object_text_get(text_entry));
2166 if (!text_to_send || (strlen(text_to_send) == 0))
2169 if (add_date_item_to_chat(data)) {
2170 //ecore_timer_add(2, on_new_text_message_send_cb, chat_scroller);
2175 int unique_id = get_time_stamp_in_macro();
2176 if (unique_id < 0) {
2177 unique_id = -1 * unique_id;
2180 msg.msg_id = unique_id;
2181 msg.from_id = ad->current_user_data->user_id.id;
2182 msg.date = time(NULL);
2185 msg.fwd_from_id = 0;
2186 msg.fwd_from_id = 0;
2188 msg.message = (char*)text_to_send;
2189 msg.message_len = strlen(text_to_send);
2190 msg.media_type = tgl_message_media_none;
2194 msg.to_id = sel_item->use_data->peer_id;
2196 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2197 msg.is_marked_for_delete = 0;
2198 char* msg_table = get_table_name_from_number(msg.to_id);
2199 create_buddy_msg_table(msg_table);
2200 insert_msg_into_db(&msg, msg_table, unique_id);
2203 peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
2204 if (pic_peer_item) {
2205 tg_peer_info_s* peer_item = pic_peer_item->use_data;
2206 // update peer table
2208 peer_item->last_msg_id = msg.msg_id;
2209 peer_item->last_msg_date = msg.date;
2210 insert_or_update_peer_into_database(peer_item);
2214 // send request to service
2215 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);
2217 Evas_Object *message = NULL;
2219 Evas_Object *layout = evas_object_data_get(ad->nf, "main_layout");
2220 evas_object_data_set(layout, "is_end_edge", (void *) 1);
2222 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2223 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)unique_id);
2224 scroller_push_item(chat_scroller, message, 0);
2226 elm_entry_entry_set(text_entry, "");
2227 ad->is_last_msg_changed = EINA_TRUE;
2230 void on_user_status_changed(appdata_s* ad, char* status)
2235 Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
2236 char status_str[256] = {0,};
2237 snprintf(status_str, sizeof(status_str) - 1, "%s", status);
2238 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2241 static void compare_with_current_date(int rtime, Elm_Object_Item *nf_it)
2243 char time_str[256] = {0,};
2244 time_t local_t = time(NULL);
2250 diff_sec = local_t - rtime;
2251 diff_min = diff_sec / 60;
2252 diff_hour = diff_min / 60;
2253 diff_day = diff_hour / 24;
2254 LOGD("different : day : %d, hour = %d, min = %d, sec = %d", diff_day, diff_hour, diff_min, diff_sec);
2257 if (diff_day > 30) {
2258 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_LONG_TIME_AGO_ABB"));
2263 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_WITHIN_A_MONTH_ABB"));
2267 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_WITHIN_A_WEEK_ABB"));
2271 if (diff_hour > 1) {
2272 snprintf(time_str, sizeof(time_str) - 1, i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_PD_HOURS_AGO_ABB"), diff_hour);
2276 if (diff_hour == 1) {
2277 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_1_HOUR_AGO_ABB"));
2281 snprintf(time_str, sizeof(time_str) - 1, i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_PD_MINUTES_AGO_ABB"), diff_min);
2284 if (diff_min == 1) {
2285 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_1_MINUTE_AGO_ABB"));
2288 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_RECENTLY_ABB"));
2291 elm_object_item_part_text_set(nf_it, "subtitle", time_str);
2294 void on_user_presence_state_changed(appdata_s* ad, int buddy_id)
2298 int type_of_chat = ad->peer_in_cahtting_data->use_data->peer_type;
2299 Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
2301 if (type_of_chat == TGL_PEER_USER) {
2303 Eina_List* buddy_details_array = get_buddy_info(buddy_id);
2304 if (buddy_details_array && eina_list_count(buddy_details_array) > 0) {
2305 Eina_List* buddy_details = eina_list_nth(buddy_details_array, 0);
2306 if (buddy_details && eina_list_count(buddy_details) > 0) {
2307 int* temp_online = (int*)eina_list_nth(buddy_details, 12);
2308 int is_online = *temp_online;
2309 int* temp_last_seen = (int*)eina_list_nth(buddy_details, 13);
2310 int last_seen = *temp_last_seen;
2312 if (is_online > 0) {
2313 char status_str[256] = {0,};
2314 snprintf(status_str, sizeof(status_str) - 1, "%s", i18n_get_text("IDS_TGRAM_SBODY_ONLINE"));
2315 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2317 compare_with_current_date(last_seen, nf_it);
2320 for (int i = 0 ; i < eina_list_count(buddy_details_array); i++) {
2321 void* val = eina_list_nth(buddy_details, i);
2324 eina_list_free(buddy_details);
2326 eina_list_free(buddy_details_array);
2329 } else if (type_of_chat == TGL_PEER_CHAT) {
2331 tg_chat_info_s* chat_info = get_chat_info(buddy_id);
2333 char status_str[256] = {0,};
2334 snprintf(status_str, sizeof(status_str) - 1, "Unidentified.");
2335 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2339 int user_list_size = chat_info->user_list_size;
2340 int online_members = 0;
2342 Eina_List *names_of_buddies = NULL;
2344 for (int i = 0; i < user_list_size; i++) {
2346 int is_online = get_buddy_online_status(chat_info->chat_users[i]);
2347 if (is_online > 0) {
2351 char *buddy_full_name = NULL;
2352 int buddy_id = chat_info->chat_users[i];
2354 if (buddy_id == ad->current_user_data->user_id.id) {
2355 buddy_full_name = strdup(ad->current_user_data->print_name);
2357 buddy_full_name = get_buddy_name_from_id(buddy_id);
2360 if (buddy_full_name) {
2361 char *buddy_name = replace(buddy_full_name, '_', " ");
2363 buddies_info *buddy_info = (buddies_info*)malloc(sizeof(buddies_info));
2364 buddy_info->name = buddy_name;
2365 buddy_info->id = buddy_id;
2366 names_of_buddies = eina_list_append(names_of_buddies, (void*)(buddy_info));
2368 free(buddy_full_name);
2372 evas_object_data_set(ad->nf, "names_of_buddies", (void*)names_of_buddies);
2375 if (online_members == 0) {
2376 char status_str[256] = {0,};
2377 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"));
2378 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2380 char status_str[256] = {0,};
2381 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"));
2382 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2385 char status_str[256] = {0,};
2386 snprintf(status_str, sizeof(status_str) - 1, i18n_get_text("IDS_TGRAM_BODY_PD_PARTICIPANTS"), user_list_size);
2388 char temp_status_str[512] = {0,};
2389 snprintf(temp_status_str, sizeof(temp_status_str) - 1, "%s", status_str);
2391 elm_object_item_part_text_set(nf_it, "subtitle", temp_status_str);
2395 if (chat_info->print_title) {
2396 free(chat_info->print_title);
2397 chat_info->print_title = NULL;
2399 if (chat_info->photo_path) {
2400 free(chat_info->photo_path);
2401 chat_info->photo_path = NULL;
2403 if (chat_info->title) {
2404 free(chat_info->title);
2405 chat_info->title = NULL;
2412 static Eina_Bool on_change_input_type_requested(void *data)
2414 Evas_Object* text_entry = data;
2416 LOGE("Fail to get the text_entry");
2417 return ECORE_CALLBACK_CANCEL;
2419 elm_object_focus_set(text_entry, EINA_TRUE);
2420 elm_entry_input_panel_layout_set(text_entry, ELM_INPUT_PANEL_LAYOUT_EMOTICON);
2421 elm_entry_input_panel_show(text_entry);
2423 return ECORE_CALLBACK_CANCEL;
2426 static void on_message_cancel_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2428 Evas_Object *layout = data;
2430 LOGE("Fail to get the layout");
2433 elm_object_signal_emit(layout, "hide", "bubblemessage");
2436 static void on_message_smiley_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2438 Evas_Object* text_entry = data;
2440 LOGE("Fail to get the text_entry");
2443 ecore_timer_add(0.3, on_change_input_type_requested, text_entry);
2446 static void on_message_text_entry_clicked(void *data, Evas_Object *obj, void *event_info)
2449 LOGE("Fail to get the entry");
2452 /* This Api is needed for type of keyboard: emoticon or caractor */
2453 elm_entry_input_panel_layout_set(obj, ELM_INPUT_PANEL_LAYOUT_NORMAL);
2456 static void on_message_text_entry_changed(void *data, Evas_Object *obj, void *event_info)
2458 Evas_Object *layout = data;
2461 LOGE("Fail to get the entry layout");
2464 int attach_show = (int) evas_object_data_get(layout, "is_attach_show");
2466 if (elm_entry_is_empty(obj)) {
2468 elm_object_signal_emit(layout, "show", "attach_btn");
2469 evas_object_data_set(layout, "is_attach_show", (void *) 1);
2473 elm_object_signal_emit(layout, "hide", "attach_btn");
2474 evas_object_data_set(layout, "is_attach_show", (void *) 0);
2479 Evas_Object* create_chat_genlist(Evas_Object *win)
2481 Evas_Object *genlist;
2482 Elm_Theme *theme = elm_theme_new();
2483 char edj_path[PATH_MAX] = {0, };
2484 app_get_resource(TELEGRAM_GENLIST_THEME_EDJ, edj_path, (int)PATH_MAX);
2485 elm_theme_extension_add(theme, edj_path);
2486 genlist = elm_genlist_add(win);
2487 elm_object_theme_set(genlist, theme);
2488 elm_object_style_set(genlist, "telegram/default");
2489 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2490 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
2494 void on_list_media_item_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2499 static Eina_Bool on_new_contact_message_send_cb(void *data)
2501 Evas_Object *chat_scroller = data;
2502 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2503 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2505 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2507 int unique_id = time(NULL);
2509 char unique_id_str[50];
2510 sprintf(unique_id_str, "%d", unique_id);
2513 msg.msg_id = unique_id;
2514 msg.from_id = ad->current_user_data->user_id.id;
2515 msg.date = time(NULL);
2518 msg.fwd_from_id = 0;
2519 msg.fwd_from_id = 0;
2520 msg.unique_id = unique_id;
2522 msg.message_len = 0;
2523 msg.media_type = tgl_message_media_contact;
2524 msg.media_id = strdup(unique_id_str);
2527 msg.to_id = sel_item->use_data->peer_id;
2529 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2530 msg.is_marked_for_delete = 0;
2532 char* msg_table = get_table_name_from_number(msg.to_id);
2533 create_buddy_msg_table(msg_table);
2534 insert_msg_into_db(&msg, msg_table, unique_id);
2539 char *first_name = evas_object_data_get(chat_scroller, "contact_first_name");
2540 char *last_name = evas_object_data_get(chat_scroller, "contact_last_name");
2541 char *phone_number = evas_object_data_get(chat_scroller, "contact_phone_number");
2543 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, NULL, NULL, first_name, last_name, phone_number);
2547 // send request to service
2548 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);
2550 Evas_Object *message = NULL;
2552 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2553 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2554 scroller_push_item(chat_scroller, message, 0);
2558 return ECORE_CALLBACK_CANCEL;
2562 void send_contact_message_to_buddy(void *data, char *first_name, char *last_name, char *phone_number)
2564 Evas_Object *chat_scroller = data;
2565 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2569 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2571 if (add_date_item_to_chat(data)) {
2572 /* evas_object_data_set(chat_scroller, "contact_first_name", strdup(first_name));
2573 evas_object_data_set(chat_scroller, "contact_last_name", strdup(last_name));
2574 evas_object_data_set(chat_scroller, "contact_phone_number", strdup(phone_number));
2576 ecore_timer_add(2, on_new_contact_message_send_cb, chat_scroller);
2581 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2583 int unique_id = get_time_stamp_in_macro();
2584 if (unique_id < 0) {
2585 unique_id = -1 * unique_id;
2587 char unique_id_str[50];
2588 sprintf(unique_id_str, "%d", unique_id);
2591 msg.msg_id = unique_id;
2592 msg.from_id = ad->current_user_data->user_id.id;
2593 msg.date = time(NULL);
2596 msg.fwd_from_id = 0;
2597 msg.fwd_from_id = 0;
2598 msg.unique_id = unique_id;
2600 msg.message_len = 0;
2601 msg.media_type = tgl_message_media_contact;
2602 msg.media_id = strdup(unique_id_str);
2605 msg.to_id = sel_item->use_data->peer_id;
2607 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2608 msg.is_marked_for_delete = 0;
2610 char* msg_table = get_table_name_from_number(msg.to_id);
2611 create_buddy_msg_table(msg_table);
2612 insert_msg_into_db(&msg, msg_table, unique_id);
2616 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, NULL, NULL, first_name, last_name, phone_number);
2620 // send request to service
2621 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);
2623 Evas_Object *message = NULL;
2625 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2626 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2627 scroller_push_item(chat_scroller, message, 0);
2631 static Eina_Bool on_new_location_message_send_cb(void *data)
2633 Evas_Object *chat_scroller = data;
2634 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2635 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2637 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2639 int unique_id = time(NULL);
2641 char unique_id_str[50];
2642 sprintf(unique_id_str, "%d", unique_id);
2645 msg.msg_id = unique_id;
2646 msg.from_id = ad->current_user_data->user_id.id;
2647 msg.date = time(NULL);
2650 msg.fwd_from_id = 0;
2651 msg.fwd_from_id = 0;
2652 msg.unique_id = unique_id;
2654 msg.message_len = 0;
2655 msg.media_type = tgl_message_media_geo;
2656 msg.media_id = strdup(unique_id_str);
2659 msg.to_id = sel_item->use_data->peer_id;
2661 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2662 msg.is_marked_for_delete = 0;
2664 char* msg_table = get_table_name_from_number(msg.to_id);
2665 create_buddy_msg_table(msg_table);
2666 insert_msg_into_db(&msg, msg_table, unique_id);
2671 char *latitude = evas_object_data_get(chat_scroller, "contact_latitude");
2672 char *longitude = evas_object_data_get(chat_scroller, "contact_longitude");
2674 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, latitude, longitude, NULL, NULL, NULL);
2678 // send request to service
2679 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);
2681 Evas_Object *message = NULL;
2683 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2684 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2685 scroller_push_item(chat_scroller, message, 0);
2688 return ECORE_CALLBACK_CANCEL;
2691 void send_location_message_to_buddy(void *data, char *latitude, char *longitude)
2693 Evas_Object *chat_scroller = data;
2694 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2698 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2700 if (add_date_item_to_chat(data)) {
2701 /* evas_object_data_set(chat_scroller, "contact_latitude", strdup(latitude));
2702 evas_object_data_set(chat_scroller, "contact_longitude", strdup(longitude));
2703 ecore_timer_add(2, on_new_location_message_send_cb, chat_scroller);
2708 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2710 int unique_id = get_time_stamp_in_macro();
2711 if (unique_id < 0) {
2712 unique_id = -1 * unique_id;
2714 char unique_id_str[50];
2715 sprintf(unique_id_str, "%d", unique_id);
2718 msg.msg_id = unique_id;
2719 msg.from_id = ad->current_user_data->user_id.id;
2720 msg.date = time(NULL);
2723 msg.fwd_from_id = 0;
2724 msg.fwd_from_id = 0;
2725 msg.unique_id = unique_id;
2727 msg.message_len = 0;
2728 msg.media_type = tgl_message_media_geo;
2729 msg.media_id = strdup(unique_id_str);
2732 msg.to_id = sel_item->use_data->peer_id;
2734 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2735 msg.is_marked_for_delete = 0;
2737 char* msg_table = get_table_name_from_number(msg.to_id);
2738 create_buddy_msg_table(msg_table);
2739 insert_msg_into_db(&msg, msg_table, unique_id);
2743 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, latitude, longitude, NULL, NULL, NULL);
2747 // send request to service
2748 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);
2750 Evas_Object *message = NULL;
2752 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2753 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2754 scroller_push_item(chat_scroller, message, 0);
2759 static Eina_Bool on_new_media_message_send_cb(void *data)
2761 Evas_Object *chat_scroller = data;
2762 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2763 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2765 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2767 int unique_id = time(NULL);
2769 char unique_id_str[50];
2770 sprintf(unique_id_str, "%d", unique_id);
2772 char *file_type_char = evas_object_data_get(chat_scroller, "file_type");
2773 int file_type = atoi(file_type_char);
2774 char *file_path = evas_object_data_get(chat_scroller, "file_path");
2777 msg.msg_id = unique_id;
2778 msg.from_id = ad->current_user_data->user_id.id;
2779 msg.date = time(NULL);
2782 msg.fwd_from_id = 0;
2783 msg.fwd_from_id = 0;
2784 msg.unique_id = unique_id;
2786 msg.message_len = 0;
2787 msg.media_type = file_type;
2788 msg.media_id = strdup(unique_id_str);
2791 msg.to_id = sel_item->use_data->peer_id;
2793 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2794 msg.is_marked_for_delete = 0;
2796 char* msg_table = get_table_name_from_number(msg.to_id);
2797 create_buddy_msg_table(msg_table);
2798 insert_msg_into_db(&msg, msg_table, unique_id);
2802 if (file_type == tgl_message_media_photo) {
2803 Evas_Object *img = create_image_object_from_file(file_path, chat_scroller);
2804 elm_image_object_size_get(img, &img_width, &img_height);
2806 stat(file_path, &st);
2807 media_size = st.st_size;
2808 evas_object_del(img);
2811 insert_media_info_to_db(&msg, (char*)file_path, img_width, img_height, media_size, NULL, NULL , NULL, NULL, NULL);
2815 // send request to service
2816 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);
2818 Evas_Object *message = NULL;
2820 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2821 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2822 scroller_push_item(chat_scroller, message, 0);
2825 ad->is_last_msg_changed = EINA_TRUE;
2826 return ECORE_CALLBACK_CANCEL;
2829 void send_media_message_to_buddy(void *data, const char* file_path, enum tgl_message_media_type file_type)
2831 Evas_Object *chat_scroller = data;
2832 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2836 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2837 if (add_date_item_to_chat(data)) {
2838 /* int temp_file_type = file_type;
2839 char file_type_char[10]= {0, };
2840 sprintf(file_type_char, "%d", temp_file_type);
2841 evas_object_data_set(chat_scroller, "file_type", strdup(file_type_char));
2842 evas_object_data_set(chat_scroller, "file_path", strdup(file_path));
2844 ecore_timer_add(2, on_new_media_message_send_cb, chat_scroller);
2848 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2850 int unique_id = get_time_stamp_in_macro();
2851 if (unique_id < 0) {
2852 unique_id = -1 * unique_id;
2854 char unique_id_str[50];
2855 sprintf(unique_id_str, "%d", unique_id);
2858 msg.msg_id = unique_id;
2859 msg.from_id = ad->current_user_data->user_id.id;
2860 msg.date = time(NULL);
2863 msg.fwd_from_id = 0;
2864 msg.fwd_from_id = 0;
2865 msg.unique_id = unique_id;
2867 msg.message_len = 0;
2868 msg.media_type = file_type;
2869 msg.media_id = strdup(unique_id_str);
2872 msg.to_id = sel_item->use_data->peer_id;
2874 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2875 msg.is_marked_for_delete = 0;
2877 char* msg_table = get_table_name_from_number(msg.to_id);
2878 create_buddy_msg_table(msg_table);
2879 insert_msg_into_db(&msg, msg_table, unique_id);
2883 if (file_type == tgl_message_media_photo) {
2884 Evas_Object* img = create_image_object_from_file(file_path, chat_scroller);
2885 elm_image_object_size_get(img, &img_width, &img_height);
2887 stat(file_path, &st);
2888 media_size = st.st_size;
2889 evas_object_del(img);
2892 insert_media_info_to_db(&msg, (char*)file_path, img_width, img_height, media_size, NULL, NULL , NULL, NULL, NULL);
2896 // send request to service
2897 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);
2899 Evas_Object *message = NULL;
2901 message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2902 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2903 scroller_push_item(chat_scroller, message, 0);
2906 ad->is_last_msg_changed = EINA_TRUE;
2909 static Eina_Bool on_timer_expired(void *data)
2911 Evas_Object *scroller = data;
2913 int is_end_edge_top = 0;
2914 is_end_edge_top = (int)evas_object_data_get(scroller, "is_end_edge_top");
2917 LOGE("Cannot get the scroller");
2918 return ECORE_CALLBACK_CANCEL;
2920 //ret = scroller_show_bottom_edge(scroller);
2921 ret = scroller_show_previous_region(scroller);
2923 LOGE("Fail to show the bottom of scroller");
2926 return ECORE_CALLBACK_CANCEL;
2929 Eina_Bool load_chat_history(Evas_Object *chat_scroller)
2931 int offset_num = (int)evas_object_data_get(chat_scroller,"offset_num");
2932 if(offset_num < -TG_DBMGR_LIMITED) return EINA_FALSE;
2933 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2934 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2936 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2937 int buddy_id = sel_item->use_data->peer_id;
2938 char* tablename = get_table_name_from_number(buddy_id);
2939 Eina_List *vals = NULL;
2941 vals = get_messages_from_message_table_order_by(tablename, MESSAGE_INFO_TABLE_DATE, EINA_TRUE, TG_DBMGR_LIMITED, offset_num);
2943 vals = get_messages_from_message_table_order_by(tablename, MESSAGE_INFO_TABLE_DATE, EINA_TRUE, TG_DBMGR_LIMITED + offset_num, 0);
2944 tg_message_s *message_item = NULL;
2947 // set no messages yet
2950 int row_count = eina_list_count(vals);
2952 for (int i = row_count-1 ; i >= 0 ; i--) {
2953 Evas_Object *message = NULL;
2955 message_item = eina_list_nth(vals, i);
2956 message = on_message_item_content_get_cb((void *)message_item, chat_scroller, "elm.icon.entry");
2957 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)message_item->msg_id);
2958 scroller_push_item(chat_scroller, message, 1);
2959 free_message(&message_item);
2961 eina_list_free(vals);
2964 // Ecore_Timer *timer = NULL;
2965 // timer = ecore_timer_add(0.1, on_timer_expired, chat_scroller);
2968 evas_object_data_set(chat_scroller, "offset_num", (void *)(offset_num-TG_DBMGR_LIMITED));
2974 void on_gallery_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2976 if (result == APP_CONTROL_RESULT_SUCCEEDED) {
2977 Evas_Object* chat_scroller = user_data;
2978 char* file_path = NULL;
2979 char** path_arryay = NULL;
2980 int array_length = 0;
2982 char* mime_type = NULL;
2983 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2985 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
2986 if (status != APP_CONTROL_ERROR_NONE) {
2987 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay, &array_length);
2988 if (status != APP_CONTROL_ERROR_NONE) {
2990 show_toast(ad, "Unable to get the result from attach panel");
2996 status = app_control_get_mime(reply, &mime_type);
2997 if (status != APP_CONTROL_ERROR_NONE) {
2999 show_toast(ad, "Unable to get the mime type from attach panel");
3004 for (int i = 0 ; i < array_length ; i++) {
3005 file_path = strdup(path_arryay[i]);
3006 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_photo);
3013 void on_location_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3015 Evas_Object* chat_scroller = user_data;
3016 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3017 if (result == APP_CONTROL_RESULT_SUCCEEDED) {
3018 char *latitude = NULL;
3019 char *longitude = NULL;
3020 app_control_get_extra_data(reply, "latitude", &latitude);
3021 app_control_get_extra_data(reply, "longitude", &longitude);
3023 if (latitude && longitude) {
3024 send_location_message_to_buddy(chat_scroller, latitude, longitude);
3026 //send_location_message_to_buddy(chat_scroller, "0.00000000000", "0.00000000000");
3027 show_toast(ad, "Unable to detect location values.");
3030 show_toast(ad, "Device does not support location feature.");
3034 void on_video_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3036 if (result == APP_CONTROL_RESULT_SUCCEEDED) {
3038 Evas_Object* chat_scroller = user_data;
3039 char* file_path = NULL;
3040 char** path_arryay = NULL;
3041 int array_length = 0;
3043 char* mime_type = NULL;
3044 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3046 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
3047 if (status != APP_CONTROL_ERROR_NONE) {
3048 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay, &array_length);
3049 if (status != APP_CONTROL_ERROR_NONE) {
3051 show_toast(ad, "Unable to get the result from attach panel");
3057 status = app_control_get_mime(reply, &mime_type);
3058 if (status != APP_CONTROL_ERROR_NONE) {
3060 show_toast(ad, "Unable to get the mime type from attach panel");
3064 for (int i = 0 ; i < array_length ; i++) {
3065 file_path = strdup(path_arryay[i]);
3066 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3073 void on_file_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3075 if (result == APP_CONTROL_RESULT_SUCCEEDED) {
3077 Evas_Object* chat_scroller = user_data;
3078 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3079 char* file_path = NULL;
3080 char** path_arryay = NULL;
3081 int array_length = 0;
3082 app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
3084 for (int i = 0 ; i < array_length ; i++) {
3085 file_path = strdup(path_arryay[i]);
3087 // get mime type of the file
3089 char *mime_type = NULL;
3091 char *extn = strrchr(file_path, '.');
3093 extn = replace(extn, '.', "");
3096 mime_type_get_mime_type(extn, &mime_type);
3100 if (strstr(mime_type, "video") != NULL) {
3101 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3102 } else if (strstr(mime_type, "audio") != NULL) {
3103 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3104 } else if (strstr(mime_type, "image") != NULL) {
3105 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_photo);
3107 show_toast(ad, "Unsupported file.");
3110 show_toast(ad, "Unsupported file.");
3118 static void on_voice_record_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3120 if (result == APP_CONTROL_RESULT_SUCCEEDED) {
3121 Evas_Object* chat_scroller = user_data;
3123 char* file_path = NULL;
3124 char** path_arryay = NULL;
3125 int array_length = 0;
3127 char* mime_type = NULL;
3128 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3130 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
3131 if (status != APP_CONTROL_ERROR_NONE) {
3132 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay, &array_length);
3133 if (status != APP_CONTROL_ERROR_NONE) {
3135 show_toast(ad, "Unable to get the result from attach panel");
3141 status = app_control_get_mime(reply, &mime_type);
3142 if (status != APP_CONTROL_ERROR_NONE) {
3144 show_toast(ad, "Unable to get the mime type from attach panel");
3149 for (int i = 0 ; i < array_length ; i++) {
3150 file_path = strdup(path_arryay[i]);
3151 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3158 void on_contact_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3160 if (result == APP_CONTROL_RESULT_SUCCEEDED) {
3162 Evas_Object* chat_scroller = user_data;
3163 char *contact_name = NULL;
3164 char *phone_number = NULL;
3165 app_control_get_extra_data(reply, "http://tizen.org/appcontrol/data/name", &contact_name);
3166 app_control_get_extra_data(reply, "http://tizen.org/appcontrol/data/phone", &phone_number);
3171 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)
3173 switch (content_category) {
3174 case ATTACH_PANEL_CONTENT_CATEGORY_IMAGE:
3175 case ATTACH_PANEL_CONTENT_CATEGORY_CAMERA:
3176 on_gallery_app_control_reply_cb(NULL, result, result_code, user_data);
3178 case ATTACH_PANEL_CONTENT_CATEGORY_VIDEO:
3179 case ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER:
3180 on_video_app_control_reply_cb(NULL, result, result_code, user_data);
3182 case ATTACH_PANEL_CONTENT_CATEGORY_VOICE:
3183 on_voice_record_reply_cb(NULL, result, result_code, user_data);
3185 case ATTACH_PANEL_CONTENT_CATEGORY_MYFILES:
3186 case ATTACH_PANEL_CONTENT_CATEGORY_AUDIO:
3187 on_file_app_control_reply_cb(NULL, result, result_code, user_data);
3189 case ATTACH_PANEL_CONTENT_CATEGORY_CONTACT:
3190 on_contact_app_control_reply_cb(NULL, result, result_code, user_data);
3195 attach_panel_hide(attach_panel);
3198 void on_media_type_selected_cb(void *data, Evas_Object *obj, void *event_info)
3200 Evas_Object* chat_scroller = data;
3201 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3202 const char *label = elm_object_item_text_get((Elm_Object_Item *) event_info);
3203 if (strcasecmp(label, POPUP_TEXT_TAKE_GALLERY) == 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 image picker");
3211 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3213 app_control_set_mime(app_control, "image/*");
3214 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3215 app_control_send_launch_request(app_control, &on_gallery_app_control_reply_cb, data);
3216 app_control_destroy(app_control);
3217 } else if (strcasecmp(label, POPUP_TEXT_TAKE_PHOTO) == 0) {
3218 app_control_h app_control;
3219 int ret = app_control_create(&app_control);
3220 if (ret != APP_CONTROL_ERROR_NONE) {
3221 show_toast(ad, "Error: Can not load image picker");
3224 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3225 app_control_set_mime(app_control, "image/jpg");
3226 //app_control_add_extra_data(app_control, "crop", "caller_id");
3227 app_control_send_launch_request(app_control, &on_gallery_app_control_reply_cb, data);
3228 app_control_destroy(app_control);
3229 } else if (strcasecmp(label, POPUP_TEXT_TAKE_VIDEO) == 0) {
3230 app_control_h app_control;
3231 int ret = app_control_create(&app_control);
3232 if (ret != APP_CONTROL_ERROR_NONE) {
3233 show_toast(ad, "Error: Can not load image picker");
3237 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3239 int remain_byte_size = 10485760;
3240 int request_KB_size = 0;
3242 if (remain_byte_size >= 1024) {
3243 request_KB_size = remain_byte_size / 1024;
3245 // TODO: Need to check minimum size for recording
3246 request_KB_size = 1;
3249 char recording_size[128] = {0, };
3250 snprintf(recording_size, sizeof(recording_size), "%d", request_KB_size);
3251 app_control_set_mime(app_control, "video/3gp");
3252 app_control_add_extra_data(app_control, "LIMIT", recording_size);
3253 app_control_add_extra_data(app_control, "RESOLUTION", "VGA");
3254 app_control_add_extra_data(app_control, "CALLER", "telegram");
3256 app_control_send_launch_request(app_control, &on_video_app_control_reply_cb, data);
3257 app_control_destroy(app_control);
3258 } else if (strcasecmp(label, POPUP_TEXT_TAKE_AUDIO) == 0) {
3260 app_control_h app_control;
3261 int ret = app_control_create(&app_control);
3262 if (ret != APP_CONTROL_ERROR_NONE) {
3263 show_toast(ad, "Error: Can not load image picker");
3267 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3269 int size = 10485760;
3271 int remain_byte_size = (int)size;
3272 int request_KB_size = 0;
3274 if (remain_byte_size >= 1024) {
3275 request_KB_size = remain_byte_size / 1024;
3277 // TODO: Need to check minimum size for recording
3278 request_KB_size = 1;
3281 char recording_size[128] = {0, };
3282 snprintf(recording_size, sizeof(recording_size), "%d", request_KB_size);
3283 app_control_add_extra_data(app_control, "SIZE", recording_size);
3284 app_control_set_mime(app_control, "audio/*");
3285 app_control_send_launch_request(app_control, &on_voice_record_reply_cb, data);
3286 app_control_destroy(app_control);
3288 } else if (strcasecmp(label, POPUP_TEXT_TAKE_FILE) == 0) {
3289 app_control_h app_control;
3290 int ret = app_control_create(&app_control);
3291 if (ret != APP_CONTROL_ERROR_NONE) {
3292 show_toast(ad, "Error: Can not load image picker");
3296 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3298 app_control_set_mime(app_control, "*/*");
3299 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3300 app_control_send_launch_request(app_control, &on_file_app_control_reply_cb, data);
3301 app_control_destroy(app_control);
3303 } else if (strcasecmp(label, POPUP_TEXT_TAKE_LOCATION) == 0) {
3304 app_control_h app_control;
3305 int ret = app_control_create(&app_control);
3306 if (ret != APP_CONTROL_ERROR_NONE) {
3307 show_toast(ad, "Error: Can not load location picker");
3310 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3311 //app_control_set_app_id(app_control, "com.here.tizen.maps");
3312 app_control_set_uri(app_control, "geo");
3313 app_control_send_launch_request(app_control, &on_location_app_control_reply_cb, data);
3314 app_control_destroy(app_control);
3315 } else if (strcasecmp(label, POPUP_TEXT_TAKE_CONTACT) == 0) {
3316 app_control_h app_control;
3317 int ret = app_control_create(&app_control);
3318 if (ret != APP_CONTROL_ERROR_NONE) {
3319 show_toast(ad, "Error: Can not load location picker");
3322 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3323 app_control_set_mime(app_control, "application/vnd.tizen.contact");
3324 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3325 app_control_send_launch_request(app_control, &on_contact_app_control_reply_cb, data);
3326 app_control_destroy(app_control);
3329 evas_object_del(obj);
3333 void popup_move_dropdown(Evas_Object *ctxpopup, Evas_Object *btn)
3335 Evas_Coord x, y, w , h;
3336 evas_object_geometry_get(btn, &x, &y, &w, &h);
3337 evas_object_move(ctxpopup, x + (w / 2), y + h - 50);
3340 void on_media_attach_dismissed_cb(void *data, Evas_Object *obj, void *event_info)
3342 evas_object_del(obj);
3345 static void on_media_attach_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
3347 Evas_Object* chat_scroller = data;
3348 if (!chat_scroller) {
3351 appdata_s *ad = evas_object_data_get(chat_scroller, "app_data");
3355 attach_panel_h attach_panel = NULL;
3357 bool visible = false;
3359 attach_panel = evas_object_data_get(ad->conform, "attach_panel");
3361 if (attach_panel_get_visibility(attach_panel, &visible) != ATTACH_PANEL_ERROR_NONE) {
3362 attach_panel_set_result_cb(attach_panel, _result_cb, chat_scroller);
3366 attach_panel_show(attach_panel);
3368 attach_panel_set_result_cb(attach_panel, _result_cb, chat_scroller);
3372 ret = attach_panel_create(ad->conform, &attach_panel);
3374 if (!attach_panel) {
3377 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, NULL);
3378 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA, NULL);
3379 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE, NULL);
3380 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO, NULL);
3381 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_AUDIO, NULL);
3382 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CONTACT, NULL);
3383 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_MYFILES, NULL);
3384 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER, NULL);
3385 attach_panel_set_result_cb(attach_panel, _result_cb, chat_scroller);
3387 attach_panel_show(attach_panel);
3388 evas_object_data_set(ad->conform, "attach_panel", attach_panel);
3393 static void on_text_message_send_pressed(void *data, Evas_Object *obj, void *event_info)
3395 elm_image_file_set(data, ui_utils_get_resource(SEND_UNPRESSED_ICON), NULL);
3398 static void on_text_message_send_unpressed(void *data, Evas_Object *obj, void *event_info)
3400 elm_image_file_set(data, ui_utils_get_resource(SEND_PRESSED_ICON), NULL);
3404 void on_message_back_button_clicked(void *data, Evas_Object *obj, void *event_info)
3406 appdata_s *ad = data;
3410 app_nf_back_cb(data, obj, event_info);
3413 void on_user_info_button_clicked(void *data, Evas_Object *obj, void *event_info)
3415 appdata_s *ad = data;
3417 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
3418 tg_peer_info_s *user_data = sel_item->use_data;
3420 if (!sel_item || !user_data) {
3421 show_toast(ad, "Can not display user info");
3425 if (user_data->peer_type == TGL_PEER_USER) {
3426 launch_user_info_screen(ad, user_data->peer_id);
3427 } else if (user_data->peer_type == TGL_PEER_CHAT) {
3428 launch_chat_info_screen(ad, user_data->peer_id);
3434 void refresh_messaging_view(appdata_s *ad)
3439 Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
3442 Evas_Object *box_layout = NULL;
3443 Evas_Object *box = NULL;
3444 Eina_List *list = NULL;
3445 Eina_List *box_list = NULL;
3446 Evas_Object *last_item = NULL;
3448 box_layout = elm_object_content_get(scroller);
3450 LOGE("Fail to get the box into scroller");
3453 list = elm_box_children_get(box_layout);
3455 LOGE("Fail to get the list into box");
3459 box = eina_list_nth(list, 0);
3461 LOGE("Fail to get the box into box layout");
3465 box_list = elm_box_children_get(box);
3467 LOGE("Fail to get the box_list into box");
3471 last_item = eina_list_nth(box_list, eina_list_count(box_list)-1);
3473 LOGE("Fail to get the last item into box");
3478 evas_object_geometry_get(last_item, &x, &y, NULL, NULL);
3480 elm_scroller_region_show(scroller, x, y, -1, -1);
3482 eina_list_free(box_list);
3483 eina_list_free(list);
3487 static void click_user_name_cb(void *data, Evas_Object *obj, void *event_info)
3489 appdata_s *ad = evas_object_data_get(obj,"app_data");
3490 Elm_Object_Item *item = event_info;
3491 const char *clicked_name = elm_object_item_text_get(item);
3492 int peer_id = (int)elm_object_item_data_get(item);
3493 peer_with_pic_s* prev_peer_in_chatting_data = ad->peer_in_cahtting_data;
3494 user_data_with_pic_s* prev_buddy_in_chatting_data = ad->buddy_in_cahtting_data;
3496 int buddy_list_counts = eina_list_count(ad->buddy_list);
3497 for (int i = 0; i < buddy_list_counts; i++) {
3498 user_data_with_pic_s *item = eina_list_nth(ad->buddy_list, i);
3499 user_data_s* user_data = item->use_data;
3501 if (user_data->user_id.id == peer_id) {
3502 ad->buddy_in_cahtting_data = item;
3506 int peer_list_counts = eina_list_count(ad->peer_list);
3507 for (int i = 0; i < peer_list_counts; i++) {
3508 peer_with_pic_s* pic_item = eina_list_nth(ad->peer_list, i);
3509 tg_peer_info_s* item = pic_item->use_data;
3510 if (item->peer_id == peer_id) {
3511 ad->peer_in_cahtting_data = pic_item;
3516 launch_user_info_screen(ad, peer_id);
3518 ad->buddy_in_cahtting_data = prev_buddy_in_chatting_data;
3519 ad->peer_in_cahtting_data = prev_peer_in_chatting_data;
3522 static void on_expand_button_clicked(void *data, Evas_Object *obj, void *event_info)
3524 Evas_Object *expand_pic = data;
3528 appdata_s *ad = evas_object_data_get(expand_pic, "app_data");
3529 Evas_Object *parent_layout = evas_object_data_get(expand_pic, "parent_layout");
3531 Eina_Bool is_expanded = (Eina_Bool)evas_object_data_get(expand_pic, "is_expanded");
3535 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_CLOSE), NULL);
3537 Evas_Object *grp_names_bg = elm_bg_add(ad->nf);
3538 evas_object_size_hint_align_set(grp_names_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
3539 evas_object_size_hint_weight_set(grp_names_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3540 evas_object_color_set(grp_names_bg, 255, 255, 255, 255);
3541 elm_image_resizable_set(grp_names_bg, EINA_TRUE, EINA_TRUE);
3542 elm_image_fill_outside_set(grp_names_bg, EINA_TRUE);
3543 evas_object_show(grp_names_bg);
3544 elm_object_part_content_set(parent_layout, "swallow.group_detail_box,bg", grp_names_bg);
3546 Evas_Object* grp_names_lbl = elm_multibuttonentry_add(ad->nf);
3548 elm_entry_cursor_end_set(grp_names_lbl);
3549 evas_object_size_hint_weight_set(grp_names_lbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3550 evas_object_size_hint_align_set(grp_names_lbl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3551 elm_entry_single_line_set(grp_names_lbl, EINA_FALSE);
3552 elm_entry_scrollable_set(grp_names_lbl, EINA_TRUE);
3553 elm_entry_cnp_mode_set(grp_names_lbl, ELM_CNP_MODE_NO_IMAGE);
3554 elm_entry_context_menu_disabled_set(grp_names_lbl, EINA_TRUE);
3555 elm_object_focus_set(grp_names_lbl, EINA_FALSE);
3556 elm_multibuttonentry_editable_set(grp_names_lbl, EINA_FALSE);
3558 evas_object_show(grp_names_lbl);
3560 evas_object_data_set(grp_names_lbl, "app_data", ad);
3562 Eina_List *names_of_buddies = NULL;
3563 names_of_buddies = evas_object_data_get(ad->nf, "names_of_buddies");
3565 if (names_of_buddies) {
3566 int buddies_counts = eina_list_count(names_of_buddies);
3567 buddies_info *buddy_info;
3568 for(int i = 0 ; i < buddies_counts ; i++){
3569 buddy_info = (buddies_info*)eina_list_nth(names_of_buddies,i);
3570 if(buddy_info == NULL) continue;
3571 int len = strlen(buddy_info->name);
3572 char *name_str = (char*)malloc(len + 256);
3574 sprintf(name_str, "<font=Tizen:style=Bold align=center><font_size=40>%s</font_size></font>", buddy_info->name);
3575 Elm_Object_Item *button_item = elm_multibuttonentry_item_append(grp_names_lbl, name_str, click_user_name_cb, ad);
3576 elm_object_item_data_set(button_item, (void*)(buddy_info->id));
3582 elm_object_part_content_set(parent_layout, "swallow.group_detail_box", grp_names_lbl);
3586 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_OPEN), NULL);
3588 Evas_Object *grp_names_lbl = elm_object_part_content_get(parent_layout, "swallow.group_detail_box");
3589 if (grp_names_lbl) {
3590 evas_object_del(grp_names_lbl);
3591 grp_names_lbl = NULL;
3594 Evas_Object *grp_names_bg = elm_object_part_content_get(parent_layout, "swallow.group_detail_box,bg");
3596 evas_object_del(grp_names_bg);
3597 grp_names_bg = NULL;
3600 is_expanded = !is_expanded;
3601 evas_object_data_set(expand_pic, "is_expanded", (void *)is_expanded);
3604 static Eina_Bool _pop_cb(void *data, Elm_Object_Item *it)
3606 appdata_s *ad = data;
3607 attach_panel_h attach_panel = NULL;
3609 LOGE("Failed to get the ad");
3612 attach_panel = evas_object_data_get(ad->conform, "attach_panel");
3614 attach_panel_hide(attach_panel);
3616 Eina_List *names_of_buddies = evas_object_data_get(ad->nf, "names_of_buddies");
3618 if(names_of_buddies != NULL){
3619 buddies_info *buddy = NULL;
3620 EINA_LIST_FREE(names_of_buddies, buddy) {
3622 if(buddy->name) free(buddy->name);
3625 names_of_buddies = NULL;
3631 static void _edge_cb(void *data, Evas_Object *scroller, void *event_info)
3633 Evas_Object *layout = data;
3634 int is_end_edge = 0;
3635 is_end_edge = (int)evas_object_data_get(layout, "is_end_edge");
3638 elm_object_signal_emit(layout, "hide", "bubblemessage");
3639 evas_object_data_set(layout, "is_end_edge", (void *) 1);
3643 static void _edge_top_cb(void *data, Evas_Object *scroller, void *event_info)
3645 int is_end_edge_top = 0;
3646 //int offset_num = (int)evas_object_data_get(scroller, "offset_num");
3647 is_end_edge_top = (int)evas_object_data_get(scroller, "is_end_edge_top");
3649 if (!is_end_edge_top) {
3650 elm_scroller_movement_block_set(scroller,ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL );
3651 int prev_h = scroller_previous_region_get(scroller);
3652 evas_object_data_set(scroller, "previous_h",(void*)prev_h);
3653 evas_object_data_set(scroller, "is_end_edge_top",(void*)1);
3654 load_chat_history(scroller);
3655 elm_scroller_movement_block_set(scroller,ELM_SCROLLER_MOVEMENT_NO_BLOCK);
3659 static void _scroll_cb(void *data, Evas_Object *scroller, void *event_info)
3661 Evas_Object *layout = data;
3662 evas_object_data_set(layout, "is_end_edge", (void *) 0);
3663 evas_object_data_set(scroller, "is_end_edge_top", (void *) 0);
3664 // evas_object_data_set(layout, "is_end_edge_top", (void *) 0);
3667 int get_start_offset_num(char* table_name){
3668 char unknown_str[50];
3670 sprintf(unknown_str, "%d", unknown);
3672 char* where_clause = (char*)malloc(strlen(MESSAGE_INFO_TABLE_MARKED_FOR_DELETE) + strlen(" = ") + strlen(unknown_str) + 1);
3673 sprintf(where_clause, "%s = %s", MESSAGE_INFO_TABLE_MARKED_FOR_DELETE, unknown_str);
3674 /* strcpy(where_clause, MESSAGE_INFO_TABLE_MARKED_FOR_DELETE);
3675 strcat(where_clause, " = ");
3676 strcat(where_clause, unknown_str);*/
3677 int row_counts = get_number_of_rows(table_name,where_clause);
3678 return (row_counts-TG_DBMGR_LIMITED);
3681 static Eina_Bool _load_history_cb(void *data)
3683 Evas_Object *nf = data;
3685 LOGE("Fail to get the nf");
3686 return ECORE_CALLBACK_CANCEL;
3688 Evas_Object *scroller = evas_object_data_get(nf, "chat_list");
3690 LOGE("Fail to get the scroller");
3691 return ECORE_CALLBACK_CANCEL;
3693 Evas_Object *layout = evas_object_data_get(nf, "chat_list_no_msg_text");
3695 LOGE("Fail to get the layout");
3696 return ECORE_CALLBACK_CANCEL;
3699 Eina_Bool ret = load_chat_history(scroller);
3701 LOGD("There is no message in chat room");
3703 elm_object_part_text_set(layout, "no_msg_text", i18n_get_text("IDS_TGRAM_BODY_NO_MESSAGES_HERE_YET_ING"));
3704 elm_object_signal_emit(layout, "show", "message");
3707 return ECORE_CALLBACK_CANCEL;
3710 void launch_messaging_view_cb(appdata_s* ad, int user_id)
3715 if (ad->msg_popup) {
3716 evas_object_del(ad->msg_popup);
3717 ad->msg_popup = NULL;
3720 delete_floating_button(ad);
3722 ad->current_app_state = TG_CHAT_MESSAGING_VIEW_STATE;
3723 ad->is_last_msg_changed = EINA_FALSE;
3724 send_request_for_server_connection_status(ad, ad->service_client);
3725 char edj_path[PATH_MAX] = {0, };
3726 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
3728 Evas_Object *layout = elm_layout_add(ad->nf);
3729 elm_layout_file_set(layout, edj_path, "chat_messaging_layout");
3730 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3731 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3732 evas_object_show(layout);
3734 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
3735 tg_peer_info_s* user = sel_item->use_data;
3737 /*************************** START: message list ************************************/
3739 Evas_Object* msg_box_layout = elm_layout_add(ad->nf);
3740 elm_layout_file_set(msg_box_layout, edj_path, "custom_gen_list");
3741 evas_object_size_hint_weight_set(msg_box_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3742 evas_object_size_hint_align_set(msg_box_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3743 evas_object_show(msg_box_layout);
3745 Evas_Object *list_bg = elm_image_add(msg_box_layout);
3746 evas_object_size_hint_align_set(list_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
3747 evas_object_size_hint_weight_set(list_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3748 if (ad->chat_background) {
3749 elm_image_file_set(list_bg, ad->chat_background, NULL);
3751 //elm_image_file_set(list_bg, ui_utils_get_resource(TG_CHAT_DEFAULT_BG), NULL);
3753 elm_image_resizable_set(list_bg, EINA_TRUE, EINA_TRUE);
3754 elm_image_fill_outside_set(list_bg, EINA_TRUE);
3755 evas_object_show(list_bg);
3757 elm_object_part_content_set(msg_box_layout, "swallow.gen_list.bg", list_bg);
3759 Evas_Object *chat_scroller = elm_scroller_add(ad->nf);
3760 evas_object_size_hint_weight_set(chat_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3761 evas_object_size_hint_align_set(chat_scroller, EVAS_HINT_FILL, 0.0);
3762 elm_scroller_policy_set(chat_scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
3763 evas_object_show(chat_scroller);
3764 evas_object_smart_callback_add(chat_scroller, "scroll", _scroll_cb, layout);
3766 //evas_object_smart_callback_add(chat_scroller,"scroll,drag,start", _scroll_cb, layout);
3767 evas_object_smart_callback_add(chat_scroller, "edge,bottom", _edge_cb, layout);
3769 evas_object_smart_callback_add(chat_scroller, "edge,top", _edge_top_cb, layout);
3770 evas_object_data_set(layout, "is_end_edge", (void *) 1);
3771 /*setting offset_num*/
3772 // evas_object_data_set(chat_scroller, "offset_num", (void *) 1);
3773 evas_object_data_set(chat_scroller, "prev_h", (void *) 0);
3774 /*check edge is top*/
3775 evas_object_data_set(chat_scroller, "is_end_edge_top",(void*)1);
3777 Evas_Object *align_box = elm_box_add(chat_scroller);
3779 LOGE("fail to add the box");
3783 elm_box_horizontal_set(align_box, EINA_FALSE);
3784 elm_box_align_set(align_box, 0.5, 0.0);
3785 evas_object_size_hint_weight_set(align_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3786 evas_object_size_hint_align_set(align_box, EVAS_HINT_FILL, 0.0);
3787 elm_object_content_set(chat_scroller, align_box);
3788 evas_object_show(align_box);
3790 Evas_Object *chat_box = elm_box_add(chat_scroller);
3792 LOGE("fail to add the box");
3795 elm_box_horizontal_set(chat_box, EINA_FALSE);
3796 elm_box_align_set(chat_box, 0.5, 0.0);
3797 evas_object_size_hint_weight_set(chat_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3798 evas_object_size_hint_align_set(chat_box, EVAS_HINT_FILL, 0.0);
3799 evas_object_show(chat_box);
3800 elm_box_pack_end(align_box, chat_box);
3801 evas_object_event_callback_add(chat_box, EVAS_CALLBACK_RESIZE, __resize_cb, ad);
3803 elm_object_part_content_set(msg_box_layout, "swallow.gen_list", chat_scroller);
3804 elm_object_part_content_set(layout, "swallow.chat_box", msg_box_layout);
3806 /********************** START: entry layout*******************************/
3807 Evas_Object* entry_box_layout = elm_layout_add(ad->win);
3808 if (!entry_box_layout) {
3809 LOGE("Fail to add the entry box layout");
3812 elm_layout_file_set(entry_box_layout, edj_path, "chat_entry_box");
3813 evas_object_size_hint_align_set(entry_box_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3814 evas_object_size_hint_weight_set(entry_box_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3815 evas_object_show(entry_box_layout);
3817 Evas_Object *entry_layout = elm_layout_add(entry_box_layout);
3818 if (!entry_layout) {
3819 LOGE("Fail to add the entry_layout");
3821 elm_layout_theme_set(entry_layout, "layout", "editfield", "singleline");
3823 Evas_Object* text_entry = elm_entry_add(entry_layout);
3825 LOGE("Fail to add the text_entry");
3828 elm_object_part_text_set(text_entry, "elm.guide", "Text message");
3829 elm_entry_line_wrap_set(text_entry, EINA_TRUE);
3830 elm_entry_scrollable_set(text_entry, EINA_TRUE);
3831 evas_object_size_hint_align_set(text_entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
3832 evas_object_size_hint_weight_set(text_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3833 evas_object_show(text_entry);
3834 evas_object_data_set(entry_box_layout, "is_attach_show", (void *) 1);
3836 elm_object_part_content_set(entry_layout, "elm.swallow.content", text_entry);
3837 evas_object_smart_callback_add(text_entry, "changed", on_message_text_entry_changed, entry_box_layout);
3838 evas_object_smart_callback_add(text_entry, "preedit,changed", on_message_text_entry_changed, entry_box_layout);
3839 evas_object_smart_callback_add(text_entry, "clicked", on_message_text_entry_clicked, NULL);
3840 elm_object_part_content_set(entry_box_layout, "swallow.text_entry", entry_layout);
3842 /* button clicked event */
3843 elm_object_signal_callback_add(entry_box_layout, "smile", "clicked", on_message_smiley_clicked, text_entry);
3844 elm_object_signal_callback_add(entry_box_layout, "attach", "clicked", on_media_attach_clicked, chat_scroller);
3845 elm_object_signal_callback_add(entry_box_layout, "send", "clicked", on_text_message_send_clicked, chat_scroller);
3846 elm_object_part_content_set(layout, "swallow.entry", entry_box_layout);
3848 /********************** END: entry layout*******************************/
3850 /************************* START: message bubble ************************/
3852 Evas_Object* bubble_layout = elm_layout_add(ad->win);
3853 if (!bubble_layout) {
3854 LOGE("Fail to add the bubble_layout");
3857 elm_layout_file_set(bubble_layout, edj_path, "bubble_layout");
3858 evas_object_size_hint_align_set(bubble_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3859 evas_object_size_hint_weight_set(bubble_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3860 evas_object_show(bubble_layout);
3861 elm_object_signal_callback_add(bubble_layout, "cancel", "clicked", on_message_cancel_clicked, layout);
3862 elm_object_part_content_set(layout, "swallow.messagebubble", bubble_layout);
3863 evas_object_data_set(ad->nf, "main_layout", layout);
3865 /********************** END: entry message bubble*******************************/
3867 evas_object_data_set(ad->nf, "chat_list", (void*)chat_scroller);
3868 evas_object_data_set(chat_scroller, "app_data", ad);
3869 evas_object_data_set(chat_scroller, "user_id", (void*)user_id);
3870 evas_object_data_set(chat_scroller, "text_entry", (void*)text_entry);
3872 /* Set the name in title area */
3874 char temp_name[512] = {'\0'};
3876 if ((user->peer_type == TGL_PEER_USER) && get_buddy_unknown_status(user->peer_id)) {
3877 //snprintf(temp_name, 512, "%s", get_buddy_phone_num_from_id(sel_item->use_data->peer_id));
3879 char *phone_num = get_buddy_phone_num_from_id(sel_item->use_data->peer_id);
3881 if (phone_num == NULL || (phone_num && strcmp(phone_num, "+") == 0)) {
3883 char *user_name = NULL;
3884 char *first_name = NULL;
3885 char *last_name = NULL;
3886 char *phone_num = NULL;
3887 get_buddy_contact_details_from_db(sel_item->use_data->peer_id, &first_name, &last_name, &phone_num);
3889 if (!first_name || strstr(first_name, "null") != 0) {
3893 if (!first_name && !last_name && phone_num) {
3894 first_name = phone_num;
3897 if (!last_name || strstr(last_name, "null") != 0) {
3900 user_name = (char*)malloc(strlen(first_name) + strlen(" ") + strlen(last_name) + 1);
3901 strcpy(user_name, first_name);
3902 strcat(user_name, " ");
3903 strcat(user_name, last_name);
3904 snprintf(temp_name, 512, "%s", user_name);
3907 if (sel_item->use_data->print_name) {
3908 snprintf(temp_name, 512, "%s", sel_item->use_data->print_name);
3910 snprintf(temp_name, 512, "%s", "unknown");
3913 snprintf(temp_name, 512, "%s", get_buddy_phone_num_from_id(sel_item->use_data->peer_id));
3919 char* user_name = replace(sel_item->use_data->print_name, '_', " ");
3920 snprintf(temp_name, 512, "%s", user_name);
3924 Elm_Object_Item *nf_it = elm_naviframe_item_push(ad->nf, temp_name, NULL, NULL, layout, NULL);
3925 evas_object_data_set(ad->nf, "navi_item", nf_it);
3927 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
3929 Evas_Object *back_btn = create_button(ad->nf, "naviframe/back_btn/default", NULL);
3930 evas_object_smart_callback_add(back_btn, "clicked", on_message_back_button_clicked, ad);
3931 elm_object_item_part_content_set(nf_it, "elm.swallow.prev_btn", back_btn);
3932 elm_naviframe_item_pop_cb_set(nf_it, _pop_cb, ad);
3934 /******************** expand ************************/
3935 if (user->peer_type == TGL_PEER_CHAT) {
3936 Evas_Object *expand_pic = NULL;
3937 expand_pic = elm_image_add(layout);
3938 evas_object_size_hint_weight_set(expand_pic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3939 evas_object_size_hint_align_set(expand_pic, EVAS_HINT_FILL, EVAS_HINT_FILL);
3940 elm_object_focus_set(expand_pic, EINA_FALSE);
3941 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_OPEN), NULL);
3942 evas_object_show(expand_pic);
3943 evas_object_data_set(expand_pic, "app_data", ad);
3944 evas_object_data_set(expand_pic, "parent_layout", layout);
3946 Eina_Bool is_expanded = EINA_FALSE;
3947 evas_object_data_set(expand_pic, "is_expanded", is_expanded);
3948 Evas_Object* expand_btn = elm_button_add(ad->layout);
3949 elm_object_style_set(expand_btn, "transparent");
3950 evas_object_smart_callback_add(expand_btn, "clicked", on_expand_button_clicked, expand_pic);
3951 elm_object_content_set(expand_btn, expand_pic);
3952 evas_object_show(expand_btn);
3953 elm_object_item_part_content_set(nf_it, "title_right_btn", expand_btn);
3956 /******************** expand ************************/
3958 Ecore_Timer *timer = NULL;
3959 timer = ecore_timer_add(0.001f, _load_history_cb, ad->nf);
3961 int buddy_id = sel_item->use_data->peer_id;
3962 char* tablename = get_table_name_from_number(buddy_id);
3963 int offset_num = get_start_offset_num(tablename);
3964 evas_object_data_set(chat_scroller, "offset_num", (void *)(offset_num));
3966 Eina_Bool res = set_all_rows_read(tablename);
3972 evas_object_data_set(ad->nf, "chat_list_no_msg_text", layout);
3974 send_request_for_marked_as_read(ad, ad->service_client, sel_item->use_data->peer_id, sel_item->use_data->peer_type);
3975 eext_object_event_callback_add(ad->nf, EEXT_CALLBACK_MORE, on_messaging_menu_button_clicked, ad);