4 * Created on: Aug 22, 2015
8 #include "tg_messaging_view.h"
9 #include "tg_db_wrapper.h"
10 #include "server_requests.h"
11 #include <attach_panel.h>
12 #include <mime_type.h>
13 #include <Elementary.h>
14 #include "tg_user_info_view.h"
15 #include "tg_chat_info_view.h"
16 #include "tg_audio_player.h"
17 #include <metadata_extractor.h>
18 #include "tg_search_peer_view.h"
20 static int scroller_show_bottom_edge(Evas_Object *scroller)
23 LOGE("Cannot get the scroller");
26 Evas_Object *box_layout = NULL;
27 Evas_Object *box = NULL;
28 Eina_List *list = NULL;
30 box_layout = elm_object_content_get(scroller);
32 LOGE("Fail to get the box into scroller");
35 list = elm_box_children_get(box_layout);
37 LOGE("Fail to get the list into box");
41 box = eina_list_nth(list, 0);
43 LOGE("Fail to get the box into box layout");
48 evas_object_geometry_get(box, NULL, NULL, NULL, &h);
49 elm_scroller_region_show(scroller, 0, h, 720, 1280);
56 static void scroller_push_item(Evas_Object *scroller, Evas_Object *item)
58 Evas_Object *box_layout = NULL;
59 Evas_Object *box = NULL;
60 Eina_List *list = NULL;
62 box_layout = elm_object_content_get(scroller);
64 LOGE("Fail to get the box into scroller");
68 list = elm_box_children_get(box_layout);
70 LOGE("Fail to get the list into box");
74 box = eina_list_nth(list, 0);
76 LOGE("Fail to get the box into box layout");
82 elm_box_pack_end(box, item);
83 //elm_box_recalculate(box);
88 /************************ Menu Handler ********************/
90 void on_messaging_menu_option_selected_cb(void *data, Evas_Object *obj, void *event_info)
93 Elm_Object_Item *it = event_info;
94 elm_genlist_item_selected_set(it, EINA_FALSE);
95 int id = (int)elm_object_item_data_get(it);
98 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
99 tg_peer_info_s *user_data = sel_item->use_data;
101 if (!sel_item || !user_data) {
102 show_toast(ad, "There are no messages to delete.");
104 evas_object_del(ad->msg_popup);
105 ad->msg_popup = NULL;
111 if (get_buddy_unknown_status(user_data->peer_id) && user_data->peer_type == TGL_PEER_USER) {
114 ad->is_loading_from_msg_view = EINA_TRUE;
115 on_create_new_contact(ad);
116 } else if (id == 1) {
118 char* tablename = get_table_name_from_number(user_data->peer_id);
119 delete_all_records(tablename);
122 // clear all messages
123 Evas_Object *genlist = evas_object_data_get(ad->nf, "chat_list");
124 elm_genlist_clear(genlist);
126 // remove main item from main list
127 if (ad->main_item_in_cahtting_data) {
128 tg_main_list_item_s* old_item = ad->main_item_in_cahtting_data;
129 if (old_item->peer_print_name) {
130 free(old_item->peer_print_name);
131 old_item->peer_print_name = NULL;
133 if (old_item->last_message) {
134 free(old_item->last_message);
135 old_item->last_message = NULL;
137 if (old_item->profile_pic_path) {
138 free(old_item->profile_pic_path);
139 old_item->profile_pic_path = NULL;
141 old_item->date_lbl = NULL;
142 old_item->msg_status_lbl = NULL;
143 old_item->main_item_layout = NULL;
144 old_item->profile_pic = NULL;
145 old_item->profile_pic_path = NULL;
146 old_item->status_lbl = NULL;
147 old_item->user_name_lbl = NULL;
148 ad->main_list = eina_list_remove(ad->main_list, ad->main_item_in_cahtting_data);
150 ad->main_item_in_cahtting_data = NULL;
152 ad->is_last_msg_changed = EINA_FALSE;
154 // mark all the massages for deletion.
155 char* tablename = get_table_name_from_number(user_data->peer_id);
156 mark_all_records_for_deletion(tablename);
157 // delete date messages
158 delete_date_messages_from_table(tablename);
161 // clear all messages
162 Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
165 Evas_Object *box_layout = NULL;
166 Evas_Object *box = NULL;
167 Eina_List *list = NULL;
169 box_layout = elm_object_content_get(scroller);
171 LOGE("Fail to get the box into scroller");
175 list = elm_box_children_get(box_layout);
177 LOGE("Fail to get the list into box");
181 box = eina_list_nth(list, 0);
183 LOGE("Fail to get the box into box layout");
187 eina_list_free(list);
189 elm_box_recalculate(box);
192 // send request to server
193 send_delete_group_chat_request(ad, ad->service_client, user_data->peer_id);
195 if (ad->main_item_in_cahtting_data) {
196 tg_main_list_item_s* old_item = ad->main_item_in_cahtting_data;
197 if (old_item->last_message) {
198 free(old_item->last_message);
199 old_item->last_message = NULL;
201 old_item->last_message = strdup("");
204 Evas_Object *nomsg_layout = evas_object_data_del(ad->nf, "chat_list_no_msg_text");
206 elm_object_signal_emit(nomsg_layout, "show", "message");
210 char* tablename = get_table_name_from_number(user_data->peer_id);
211 delete_all_records(tablename);
214 // clear all messages
215 Evas_Object *genlist = evas_object_data_get(ad->nf, "chat_list");
216 elm_genlist_clear(genlist);
218 // remove main item from main list
219 if (ad->main_item_in_cahtting_data) {
220 tg_main_list_item_s* old_item = ad->main_item_in_cahtting_data;
221 if (old_item->peer_print_name) {
222 free(old_item->peer_print_name);
223 old_item->peer_print_name = NULL;
225 if (old_item->last_message) {
226 free(old_item->last_message);
227 old_item->last_message = NULL;
229 if (old_item->profile_pic_path) {
230 free(old_item->profile_pic_path);
231 old_item->profile_pic_path = NULL;
233 old_item->date_lbl = NULL;
234 old_item->msg_status_lbl = NULL;
235 old_item->main_item_layout = NULL;
236 old_item->profile_pic = NULL;
237 old_item->profile_pic_path = NULL;
238 old_item->status_lbl = NULL;
239 old_item->user_name_lbl = NULL;
240 ad->main_list = eina_list_remove(ad->main_list, ad->main_item_in_cahtting_data);
242 ad->main_item_in_cahtting_data = NULL;
245 ad->is_last_msg_changed = EINA_FALSE;
248 app_nf_back_cb(ad, NULL, NULL);
251 evas_object_del(ad->msg_popup);
252 ad->msg_popup = NULL;
258 if (id == 1) { // Clear history
259 if (user_data->peer_type == TGL_PEER_USER || user_data->peer_type == TGL_PEER_CHAT) {
262 char* tablename = get_table_name_from_number(user_data->peer_id);
263 delete_all_records(tablename);
266 // clear all messages
267 Evas_Object *genlist = evas_object_data_get(ad->nf, "chat_list");
268 elm_genlist_clear(genlist);
270 // remove main item from main list
271 if (ad->main_item_in_cahtting_data) {
272 tg_main_list_item_s* old_item = ad->main_item_in_cahtting_data;
273 if (old_item->peer_print_name) {
274 free(old_item->peer_print_name);
275 old_item->peer_print_name = NULL;
277 if (old_item->last_message) {
278 free(old_item->last_message);
279 old_item->last_message = NULL;
281 if (old_item->profile_pic_path) {
282 free(old_item->profile_pic_path);
283 old_item->profile_pic_path = NULL;
285 old_item->date_lbl = NULL;
286 old_item->msg_status_lbl = NULL;
287 old_item->main_item_layout = NULL;
288 old_item->profile_pic = NULL;
289 old_item->profile_pic_path = NULL;
290 old_item->status_lbl = NULL;
291 old_item->user_name_lbl = NULL;
292 ad->main_list = eina_list_remove(ad->main_list, ad->main_item_in_cahtting_data);
294 ad->main_item_in_cahtting_data = NULL;
297 ad->is_last_msg_changed = EINA_FALSE;
299 // mark all the massages for deletion.
300 char* tablename = get_table_name_from_number(user_data->peer_id);
301 mark_all_records_for_deletion(tablename);
302 // delete date messages
303 delete_date_messages_from_table(tablename);
306 // clear all messages
307 Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
310 Evas_Object *box_layout = NULL;
311 Evas_Object *box = NULL;
312 Eina_List *list = NULL;
314 box_layout = elm_object_content_get(scroller);
316 LOGE("Fail to get the box into scroller");
320 list = elm_box_children_get(box_layout);
322 LOGE("Fail to get the list into box");
326 box = eina_list_nth(list, 0);
328 LOGE("Fail to get the box into box layout");
332 eina_list_free(list);
334 elm_box_recalculate(box);
337 // send request to server
338 send_delete_group_chat_request(ad, ad->service_client, user_data->peer_id);
340 if (ad->main_item_in_cahtting_data) {
341 tg_main_list_item_s* old_item = ad->main_item_in_cahtting_data;
342 if (old_item->last_message) {
343 free(old_item->last_message);
344 old_item->last_message = NULL;
346 old_item->last_message = strdup("");
349 Evas_Object *nomsg_layout = evas_object_data_del(ad->nf, "chat_list_no_msg_text");
351 elm_object_signal_emit(nomsg_layout, "show", "message");
359 } else if (id == 2) { //Delete
360 if (user_data->peer_type == TGL_PEER_USER) {
361 show_loading_popup(ad);
362 char* tablename = get_table_name_from_number(user_data->peer_id);
363 delete_all_records(tablename);
367 // clear all messages
368 Evas_Object *genlist = evas_object_data_get(ad->nf, "chat_list");
369 elm_genlist_clear(genlist);
371 // remove main item from main list
372 if (ad->main_item_in_cahtting_data) {
373 tg_main_list_item_s* old_item = ad->main_item_in_cahtting_data;
374 if (old_item->peer_print_name) {
375 free(old_item->peer_print_name);
376 old_item->peer_print_name = NULL;
378 if (old_item->last_message) {
379 free(old_item->last_message);
380 old_item->last_message = NULL;
382 if (old_item->profile_pic_path) {
383 free(old_item->profile_pic_path);
384 old_item->profile_pic_path = NULL;
386 old_item->date_lbl = NULL;
387 old_item->msg_status_lbl = NULL;
388 old_item->main_item_layout = NULL;
389 old_item->profile_pic = NULL;
390 old_item->profile_pic_path = NULL;
391 old_item->status_lbl = NULL;
392 old_item->user_name_lbl = NULL;
393 ad->main_list = eina_list_remove(ad->main_list, ad->main_item_in_cahtting_data);
395 ad->main_item_in_cahtting_data = NULL;
398 ad->is_last_msg_changed = EINA_FALSE;
401 app_nf_back_cb(ad, NULL, NULL);
403 elm_naviframe_item_pop(ad->nf);
404 load_registered_user_data(ad);
405 load_buddy_list_data(ad);
406 load_unknown_buddy_list_data(ad);
408 load_main_list_data(ad);
409 ecore_timer_add(1, on_load_main_view_requested, ad);
412 } else if (user_data->peer_type == TGL_PEER_CHAT) {
414 //send group chat delete request
415 show_loading_popup(ad);
416 send_delete_group_chat_request(ad, ad->service_client, user_data->peer_id);
421 } else if (id == 0) { // View profile
422 launch_user_info_screen(ad, user_data->peer_id);
426 evas_object_del(ad->msg_popup);
427 ad->msg_popup = NULL;
432 char* on_messaging_menu_group_text_get_cb(void *data, Evas_Object *obj, const char *part)
436 return strdup(i18n_get_text("IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3"));
438 return strdup(i18n_get_text("IDS_TGRAM_OPT_DELETE"));
442 char* on_messaging_menu_text_get_cb(void *data, Evas_Object *obj, const char *part)
445 appdata_s *ad = evas_object_data_get(obj, "app_data");
446 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
447 tg_peer_info_s *user_data = sel_item->use_data;
448 if ((user_data->peer_type == TGL_PEER_USER) && get_buddy_unknown_status(user_data->peer_id)) {
450 return strdup(i18n_get_text("IDS_TGRAM_OPT_ADD_TO_CONTACTS_ABB2"));
451 } else if (id == 1) {
452 return strdup(i18n_get_text("IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3"));
454 return strdup(i18n_get_text("IDS_TGRAM_OPT_DELETE"));
458 return strdup(i18n_get_text("IDS_TGRAM_OPT_VIEW_PROFILE_ABB"));
461 return strdup(i18n_get_text("IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3"));
463 return strdup(i18n_get_text("IDS_TGRAM_OPT_DELETE"));
468 void on_msg_popup_back_cb(void *data, Evas_Object *obj, void *event_info)
470 appdata_s *ad = data;
472 evas_object_del(ad->msg_popup);
473 ad->msg_popup = NULL;
477 void on_messaging_menu_button_clicked(void *data, Evas_Object *obj, void *event_info)
479 appdata_s *ad = data;
480 if (ad->msg_popup || ad->current_app_state != TG_CHAT_MESSAGING_VIEW_STATE) {
484 static Elm_Genlist_Item_Class itc;
485 //Evas_Object *popup;
486 Evas_Object *genlist;
488 Evas_Object *win = ad->win;
490 ad->msg_popup = elm_popup_add(win);
491 elm_popup_align_set(ad->msg_popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
492 eext_object_event_callback_add(ad->msg_popup, EEXT_CALLBACK_BACK, on_msg_popup_back_cb, ad);
493 evas_object_size_hint_weight_set(ad->msg_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
495 evas_object_data_set(ad->msg_popup, "app_data", ad);
497 genlist = elm_genlist_add(ad->msg_popup);
498 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
499 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
501 evas_object_data_set(genlist, "app_data", ad);
503 itc.item_style = "default";
504 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
505 if (sel_item->use_data->peer_type == TGL_PEER_USER) {
506 itc.func.text_get = on_messaging_menu_text_get_cb;
507 } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
508 itc.func.text_get = on_messaging_menu_group_text_get_cb;
513 itc.func.content_get = NULL;
514 itc.func.state_get = NULL;
517 if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
518 for (i = 0; i < 2; i++) {
519 elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, on_messaging_menu_option_selected_cb, ad);
522 for (i = 0; i < 3; i++) {
523 elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, on_messaging_menu_option_selected_cb, ad);
526 evas_object_show(genlist);
528 elm_object_content_set(ad->msg_popup, genlist);
529 evas_object_show(ad->msg_popup);
533 /************************ Menu Handler ********************/
538 static Evas_Object *create_image_object_from_file(const char *icon_name, Evas_Object *parent)
540 Evas_Object *icon = elm_image_add(parent);
541 evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
542 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
543 elm_image_file_set(icon, icon_name, NULL);
544 evas_object_show(icon);
548 void on_chat_profile_pic_changed(appdata_s *ad, char *file_path)
550 if (!ad || !file_path) {
554 Evas_Object *profile_image = evas_object_data_get(ad->nf, "profile_picture");
556 elm_image_file_set(profile_image, file_path, NULL);
561 void on_group_chat_info_changed(appdata_s *ad, char *type_of_change)
563 if (!ad || !type_of_change) {
566 if (strstr(type_of_change, "edit_title") != NULL) {
567 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
569 tg_peer_info_s* user = sel_item->use_data;
570 char* user_name = replace(sel_item->use_data->print_name, '_', " ");
571 char temp_name[512] = {'\0'};
572 snprintf(temp_name, 512, "%s", user_name);
574 Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
575 elm_object_item_part_text_set(nf_it, "title", temp_name);
577 } else if (strstr(type_of_change, "delete_photo") != NULL) {
579 } else if (strstr(type_of_change, "add_user") != NULL) {
580 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
582 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
584 } else if (strstr(type_of_change, "delete_user") != NULL) {
585 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
587 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
594 void on_sent_media_item_clicked(void* data, Evas_Object* layout, void* event_info)
596 appdata_s* ad = evas_object_data_get(layout, "app_data");
597 char* media_type_str = evas_object_data_get(layout, "media_type");
598 char* media_file = evas_object_data_get(layout, "media_file");
600 if( access (media_file, F_OK) != -1 ) {
606 if (media_file && strlen(media_file) > 0) {
607 app_control_h app_control;
608 int ret = app_control_create(&app_control);
609 if(ret != APP_CONTROL_ERROR_NONE) {
610 show_toast(ad, "Error: Can not load image");
613 app_control_set_operation(app_control, APP_CONTROL_OPERATION_VIEW);
614 if (strstr(media_type_str, "video") != NULL) {
615 app_control_set_mime(app_control,"video/*");
616 } else if (strstr(media_type_str, "audio") != NULL) {
617 app_control_set_mime(app_control,"audio/*");
619 app_control_set_mime(app_control,"image/*");
621 app_control_set_uri(app_control, media_file);
623 app_control_send_launch_request(app_control, NULL, NULL);
624 app_control_destroy(app_control);
628 static Evas_Object* get_image_from_path(const char* path, Evas_Object* parent)
630 if (!path || !parent) {
633 Evas_Object *media_image = elm_image_add(parent);
634 elm_image_aspect_fixed_set(media_image, EINA_FALSE);
635 elm_image_file_set(media_image, path, NULL);
636 evas_object_size_hint_weight_set(media_image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
637 evas_object_size_hint_align_set(media_image, EVAS_HINT_FILL, EVAS_HINT_FILL);
638 evas_object_show(media_image);
642 int get_image_size(long long media_id)
644 Eina_List* media_sizes = get_image_sizes_from_db(media_id);
645 int row_count = eina_list_count(media_sizes);
651 for (int i = 0 ; i < row_count ; i++) {
652 Eina_List* row_vals = eina_list_nth(media_sizes, i);
653 int* temp_size1 = (int*)eina_list_nth(row_vals, 0);
658 int* temp_size2 = (int*)eina_list_nth(row_vals, 3);
663 int* temp_size3 = (int*)eina_list_nth(row_vals, 6);
668 int* temp_size4 = (int*)eina_list_nth(row_vals, 9);
673 eina_list_free(row_vals);
676 eina_list_free(media_sizes);
680 } else if (size2 > 0) {
682 } else if (size3 > 0) {
684 } else if (size4 > 0) {
692 void on_media_chat_item_clicked(void* data, Evas_Object *entry, void* event_info)
694 Evas_Object *button = evas_object_data_get(entry, "button_object");
696 char* img_state = evas_object_data_get(button, "image_state");
697 if (img_state && strstr(img_state, "download_in_progress") != NULL) {
702 appdata_s* ad = evas_object_data_get(entry, "app_data");
703 char *temp_media_id = evas_object_data_get(entry, "media_id");
704 char *media_type_str = evas_object_data_get(entry, "media_type");
706 if (media_type_str && strstr(media_type_str, "location") != NULL) {
707 char *url = evas_object_data_get(entry, "location_url");
708 launch_app_control(ad, media_type_str, url);
712 long long media_id = atoll(temp_media_id);
714 char *media_file = get_media_path_from_db(media_id);
716 if( access (media_file, F_OK) != -1 ) {
722 if (!media_file || strlen(media_file) <= 0) {
723 Eina_Bool ret = send_request_for_media_downloading(ad, ad->service_client, ad->peer_in_cahtting_data->use_data->peer_id, media_id);
725 show_toast(ad, "Please check your network connection.");
729 char temp_msg[256] = {0,};
730 snprintf(temp_msg, sizeof(temp_msg), "%s", "Downloading...");
731 elm_object_part_text_set(button, "size", temp_msg);
733 Evas_Object* progressbar = elm_progressbar_add(button);
734 elm_object_style_set(progressbar, "process_small");
735 evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
736 evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
737 elm_progressbar_pulse(progressbar, EINA_TRUE);
738 evas_object_show(progressbar);
740 Evas_Object* old_content = elm_object_part_content_unset(button, "download_image");
742 evas_object_del(old_content);
745 elm_object_part_content_set(button, "download_image", progressbar);
746 evas_object_data_set(button, "image_state", "download_in_progress");
749 launch_app_control(ad, media_type_str, media_file);
753 static void on_video_play_pressed(void *data, Evas_Object *obj, void *event_info)
757 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_PRESS_ICON), NULL);
760 static void on_video_play_unpressed(void *data, Evas_Object *obj, void *event_info)
764 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
767 static Evas_Object* get_video_paly_icon(Evas_Object *parent)
769 Evas_Object* play_pause_btn = elm_button_add(parent);
770 elm_object_style_set(play_pause_btn, "transparent");
771 evas_object_size_hint_align_set(play_pause_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
772 evas_object_size_hint_weight_set(play_pause_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
774 Evas_Object* play_pause_icon = elm_image_add(parent);
775 evas_object_size_hint_align_set(play_pause_icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
776 evas_object_size_hint_weight_set(play_pause_icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
778 elm_image_file_set(play_pause_icon, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
780 elm_image_resizable_set(play_pause_icon, EINA_TRUE, EINA_TRUE);
781 evas_object_show(play_pause_icon);
783 elm_object_content_set(play_pause_btn, play_pause_icon);
785 evas_object_smart_callback_add(play_pause_btn, "pressed", on_video_play_pressed, play_pause_icon);
786 evas_object_smart_callback_add(play_pause_btn, "unpressed", on_video_play_unpressed, play_pause_icon);
787 return play_pause_btn;
790 static Evas_Object *get_media_layout_with_play(char *img_path, Evas_Object *parent, Eina_Bool show_play_icon)
792 char edj_path[PATH_MAX] = {0, };
793 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
794 Evas_Object *rec_video_layout = elm_layout_add(parent);
795 elm_layout_file_set(rec_video_layout, edj_path, "bubble_video_item_layout");
796 evas_object_size_hint_weight_set(rec_video_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
797 evas_object_size_hint_align_set(rec_video_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
798 evas_object_show(rec_video_layout);
800 Evas_Object *vid_thumb_icon = get_image_from_path(img_path, parent);
801 elm_object_part_content_set(rec_video_layout, "swallow.video_thumb_item", vid_thumb_icon);
803 if (show_play_icon) {
804 /* Evas_Object* play_img = get_image_from_path(ui_utils_get_resource(MEDIA_PLAY_ICON), parent);
805 elm_object_part_content_set(rec_video_layout, "swallow.play_btn", play_img);*/
807 Evas_Object* play_pause_btn = get_video_paly_icon(parent);
808 elm_object_part_content_set(rec_video_layout, "swallow.play_btn", play_pause_btn);
811 return rec_video_layout;
814 void audio_player_progress_updated(void* handler, int current, int total, void *user_data)
816 Evas_Object *parent = user_data;
817 Evas_Object *progressbar = evas_object_data_get(parent, "progress_control");
820 int seconds = (int) (current / 1000) % 60 ;
821 int minutes = (int) ((current / (1000*60)) % 60);
823 char tot_dur[256] = {0,};
825 if (seconds < 10 && minutes < 10) {
827 } else if (seconds > 10 && minutes < 10) {
829 } else if (seconds < 10 && minutes > 10) {
835 sprintf(tot_dur, format, minutes, seconds);
836 elm_object_part_text_set(progressbar, "elm.text.bottom.right", tot_dur);
838 double current_status = (double)((double)current/(double)total);
840 elm_progressbar_value_set(progressbar, current_status);
844 void audio_player_state_changed(void* handler, TG_AUDIO_PLAYER_STATE state, void *user_data)
846 tg_player_handler *audio_payer = handler;
847 Evas_Object *parent = user_data;
849 if (!audio_payer || !parent) {
853 Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(parent, "is_play_mode");
854 switch(audio_payer->state) {
855 case TG_AUDIO_PLAYER_STATE_NONE:
857 case TG_AUDIO_PLAYER_STATE_INITIALIZED:
858 evas_object_data_set(parent, "tg_audio_player", audio_payer);
859 play_audio_player(audio_payer);
861 case TG_AUDIO_PLAYER_STATE_PLAYING:
862 elm_image_file_set(parent, ui_utils_get_resource(TG_PAUSE_NORMAL_ICON), NULL);
863 is_play_mode = !is_play_mode;
864 evas_object_data_set(parent, "is_play_mode", is_play_mode);
866 case TG_AUDIO_PLAYER_STATE_INTERRUPTED:
867 elm_image_file_set(parent, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
868 is_play_mode = !is_play_mode;
869 evas_object_data_set(parent, "is_play_mode", is_play_mode);
871 case TG_AUDIO_PLAYER_STATE_PAUSE:
872 elm_image_file_set(parent, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
873 is_play_mode = !is_play_mode;
874 evas_object_data_set(parent, "is_play_mode", is_play_mode);
876 case TG_AUDIO_PLAYER_STATE_ERROR:
878 case TG_AUDIO_PLAYER_STATE_END:
879 destroy_audio_player(audio_payer);
882 is_play_mode = EINA_FALSE;
883 evas_object_data_set(parent, "is_play_mode", is_play_mode);
884 evas_object_data_set(parent, "tg_audio_player", NULL);
885 elm_image_file_set(parent, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
886 audio_player_progress_updated(NULL, 0, 1, parent);
894 static void on_message_play_pause_clicked(void *data, Evas_Object *obj, void *event_info)
899 appdata_s * ad = evas_object_data_get(data, "app_data");
900 char *audio_file = evas_object_data_get(data, "audio_file_path");
901 char *media_id = evas_object_data_get(data, "media_id");
902 if (!audio_file || strlen(audio_file) <= 0 || strstr(audio_file, "_null_") != NULL) {
903 //there is no file. download it.
904 Evas_Object *progressbar = evas_object_data_get(data, "progress_control");
905 Eina_Bool is_download_in_progress = (Eina_Bool)evas_object_data_get(progressbar, "is_download_in_progress");
907 if (is_download_in_progress) {
910 elm_object_style_set(progressbar, "pending");
911 Eina_Bool ret = send_request_for_media_downloading(ad, ad->service_client, ad->peer_in_cahtting_data->use_data->peer_id, atoll(media_id));
913 show_toast(ad, "Please check your network connection.");
920 tg_player_handler *audio_payer = evas_object_data_get(data, "tg_audio_player");
923 audio_payer = init_audio_player(audio_file, &audio_player_state_changed, &audio_player_progress_updated, data);
926 show_toast(ad, "Unsupported file.");
931 if (audio_payer->state == TG_AUDIO_PLAYER_STATE_PAUSE || audio_payer->state == TG_AUDIO_PLAYER_STATE_INTERRUPTED) {
933 play_audio_player(audio_payer);
935 } else if (audio_payer->state == TG_AUDIO_PLAYER_STATE_PLAYING) {
937 pause_audio_player(audio_payer);
942 static void on_message_play_pause_pressed(void *data, Evas_Object *obj, void *event_info)
947 Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(data, "is_play_mode");
949 elm_image_file_set(data, ui_utils_get_resource(TG_PAUSE_PRESS_ICON), NULL);
951 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_PRESS_ICON), NULL);
955 static void on_message_play_pause_unpressed(void *data, Evas_Object *obj, void *event_info)
960 Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(data, "is_play_mode");
963 elm_image_file_set(data, ui_utils_get_resource(TG_PAUSE_NORMAL_ICON), NULL);
965 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
969 static void progressbar_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
975 static Evas_Object *create_audio_progressbar(Evas_Object *parent, int duration)
977 Evas_Object *progressbar;
979 progressbar = elm_progressbar_add(parent);
980 evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, 0.5);
981 evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
982 elm_progressbar_value_set(progressbar, 0.0);
983 evas_object_event_callback_add(progressbar, EVAS_CALLBACK_DEL, progressbar_del_cb, NULL);
984 evas_object_show(progressbar);
986 elm_object_part_text_set(progressbar, "elm.text.top.left", "");
987 elm_object_part_text_set(progressbar, "elm.text.top.right", "");
989 elm_object_part_text_set(progressbar, "elm.text.bottom.right", "00:00");
995 static Evas_Object *get_audio_layout_with_play(Evas_Object *parent)
997 Evas_Object* chat_scroller = parent;
998 Evas_Object *rec_video_layout = NULL;
999 tgl_media_s *media_msg = NULL;
1000 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1001 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1002 int message_id = (int)evas_object_data_get(chat_scroller, "message_id");
1004 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1005 int buddy_id = sel_item->use_data->peer_id;
1006 char* tablename = get_table_name_from_number(buddy_id);
1008 tg_message_s* msg = get_message_from_message_table(message_id, tablename);
1016 Evas_Object *parent_obj = evas_object_data_get(chat_scroller, "parent_obj"); //entry
1020 media_msg = get_media_details_from_db(atoll(msg->media_id));
1022 char *audio_file = media_msg->file_path;
1024 char edj_path[PATH_MAX] = {0, };
1025 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1026 rec_video_layout = elm_layout_add(parent);
1027 elm_layout_file_set(rec_video_layout, edj_path, "bubble_audio_item_layout");
1028 evas_object_size_hint_weight_set(rec_video_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1029 evas_object_size_hint_align_set(rec_video_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1030 evas_object_show(rec_video_layout);
1032 /**************** play icon **********************/
1033 Evas_Object* play_pause_btn = elm_button_add(parent);
1034 elm_object_style_set(play_pause_btn, "transparent");
1035 evas_object_size_hint_align_set(play_pause_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
1036 evas_object_size_hint_weight_set(play_pause_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1038 Evas_Object* play_pause_icon = elm_image_add(parent);
1039 evas_object_size_hint_align_set(play_pause_icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
1040 evas_object_size_hint_weight_set(play_pause_icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1041 elm_image_file_set(play_pause_icon, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
1043 elm_image_resizable_set(play_pause_icon, EINA_TRUE, EINA_TRUE);
1044 evas_object_show(play_pause_icon);
1045 elm_object_content_set(play_pause_btn, play_pause_icon);
1047 Eina_Bool is_play_mode = EINA_TRUE;
1048 evas_object_data_set(play_pause_icon, "is_play_mode", is_play_mode);
1051 evas_object_data_set(play_pause_icon, "audio_file_path", strdup(audio_file));
1053 evas_object_data_set(play_pause_icon, "app_data", ad);
1054 evas_object_data_set(play_pause_icon, "user_id", (void*)user_id);
1055 evas_object_data_set(play_pause_icon, "message_id", (void*)message_id);
1056 evas_object_data_set(play_pause_icon, "media_id", strdup(msg->media_id));
1058 evas_object_smart_callback_add(parent_obj, "clicked", on_message_play_pause_clicked, play_pause_icon);
1059 evas_object_smart_callback_add(parent_obj, "pressed", on_message_play_pause_pressed, play_pause_icon);
1060 evas_object_smart_callback_add(parent_obj, "unpressed", on_message_play_pause_unpressed, play_pause_icon);
1062 evas_object_smart_callback_add(play_pause_btn, "clicked", on_message_play_pause_clicked, play_pause_icon);
1063 evas_object_smart_callback_add(play_pause_btn, "pressed", on_message_play_pause_pressed, play_pause_icon);
1064 evas_object_smart_callback_add(play_pause_btn, "unpressed", on_message_play_pause_unpressed, play_pause_icon);
1065 elm_object_part_content_set(rec_video_layout, "swallow.play_icon", play_pause_btn);
1066 /**************** play icon **********************/
1068 /*************** progress bar ********************/
1070 int total_duration = 0;
1072 metadata_extractor_h metadata;
1073 metadata_extractor_create(&metadata);
1074 int ret = metadata_extractor_set_path(metadata, audio_file);
1076 ret = metadata_extractor_get_metadata(metadata, METADATA_DURATION, &value);
1077 metadata_extractor_destroy(metadata);
1080 total_duration = atoi(value);
1084 total_duration = media_msg->doc_duration;
1085 //convert into milli secs
1086 total_duration = 1000 * total_duration;
1089 Evas_Object *progress = create_audio_progressbar(parent, total_duration);
1091 evas_object_data_set(parent_obj, "play_pause_icon", play_pause_icon);
1092 evas_object_data_set(parent_obj, "progress_bar", progress);
1094 elm_object_part_content_set(rec_video_layout, "swallow.progress_icon", progress);
1096 evas_object_data_set(play_pause_icon, "progress_control", (void*)progress);
1097 Eina_Bool is_download_in_progress = EINA_FALSE;
1098 evas_object_data_set(progress, "is_download_in_progress", (void*)is_download_in_progress);
1100 /*************** progress bar ********************/
1106 msg->message = NULL;
1109 free(msg->media_id);
1110 msg->media_id = NULL;
1113 free_media_details(media_msg);
1115 return rec_video_layout;
1119 static Evas_Object * item_provider(void *data, Evas_Object *entry, const char *item)
1121 Evas_Object *layout = NULL;
1122 if (!strcmp(item, "itemprovider")) {
1123 Evas_Object* chat_scroller = data;
1124 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1125 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1126 int message_id = (int)evas_object_data_get(chat_scroller, "message_id");
1128 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1129 int buddy_id = sel_item->use_data->peer_id;
1131 char* tablename = get_table_name_from_number(buddy_id);
1132 tg_message_s* msg = get_message_from_message_table(message_id, tablename);
1138 Evas_Object *item_to_display = NULL;
1139 tgl_media_s *media_msg = NULL;
1140 if (msg->media_type == tgl_message_media_photo || msg->media_type == tgl_message_media_document) {
1142 Eina_Bool is_blur_image = EINA_FALSE;
1143 char* img_path = NULL;
1144 img_path = get_video_thumb_path_from_db(atoll(msg->media_id));
1145 if (img_path == NULL || strlen(img_path) == 0 || strstr(img_path, "_null_") != NULL) {
1146 img_path = get_media_path_from_db(atoll(msg->media_id));
1148 if (img_path == NULL || strlen(img_path) == 0 || strstr(img_path, "_null_") != NULL) {
1150 tmp = ui_utils_get_resource(BLUR_BG);
1151 img_path = strdup(tmp);
1152 is_blur_image = EINA_TRUE;
1155 if (msg->media_type == tgl_message_media_document) {
1156 media_msg = get_media_details_from_db(atoll(msg->media_id));
1158 if (media_msg && strstr(media_msg->doc_type, "video") != NULL) {
1159 if (img_path == NULL || strlen(img_path) == 0) {
1160 img_path = strdup(ui_utils_get_resource(TG_VIDEO_ICON));
1163 if (media_msg && strstr(media_msg->doc_type, "audio") != NULL) {
1168 img_path = strdup(ui_utils_get_resource(TG_AUDIO_ICON));
1170 char* media_file = get_media_path_from_db(atoll(msg->media_id));
1171 if (!media_file || !strcmp(media_file, "_null_") || strlen(media_file) <= 0 || access(media_file, F_OK) == -1) {
1172 is_blur_image = EINA_TRUE;
1178 if (media_msg && strstr(media_msg->doc_type, "audio") != NULL) {
1180 evas_object_data_set(chat_scroller, "parent_obj", (void*)entry);
1181 item_to_display = get_audio_layout_with_play(chat_scroller);
1183 } else if (msg->out) {
1185 if (msg->media_type == tgl_message_media_photo) {
1187 item_to_display = get_image_from_path(img_path, entry);
1190 if (media_msg && strstr(media_msg->doc_type, "video") != NULL) {
1192 item_to_display = get_media_layout_with_play(img_path, entry, EINA_TRUE);
1195 item_to_display = get_image_from_path(img_path, entry);
1196 //elm_image_animated_set(item_to_display, EINA_TRUE);
1197 //elm_image_animated_play_set(item_to_display, EINA_TRUE);
1202 if (!is_blur_image) {
1204 if (msg->media_type == tgl_message_media_photo) {
1206 item_to_display = get_image_from_path(img_path, entry);
1207 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1210 if (media_msg && strstr(media_msg->doc_type, "video") != NULL) {
1212 item_to_display = get_media_layout_with_play(img_path, entry, EINA_TRUE);
1215 item_to_display = get_image_from_path(img_path, entry);
1216 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1217 //elm_image_animated_set(item_to_display, EINA_TRUE);
1218 //elm_image_animated_play_set(item_to_display, EINA_TRUE);
1223 char edj_path[PATH_MAX] = {0, };
1224 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1225 Evas_Object *rec_img_layout = elm_layout_add(entry);
1226 elm_layout_file_set(rec_img_layout, edj_path, "bubble_received_media_layout");
1227 evas_object_size_hint_weight_set(rec_img_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1228 evas_object_size_hint_align_set(rec_img_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1229 evas_object_show(rec_img_layout);
1230 Evas_Object *img_item = NULL;
1233 if (msg->media_type == tgl_message_media_photo) {
1234 img_item = get_image_from_path(img_path, entry);
1236 if ((media_msg && strstr(media_msg->doc_type, "video") != NULL )|| (media_msg && strstr(media_msg->doc_type, "audio") != NULL)) {
1237 img_item = get_media_layout_with_play(img_path, entry, EINA_FALSE);
1239 img_item = get_image_from_path(img_path, entry);
1240 //elm_image_animated_set(img_item, EINA_TRUE);
1241 //elm_image_animated_play_set(img_item, EINA_TRUE);
1244 elm_object_part_content_set(rec_img_layout, "swallow.image_item", img_item);
1247 if (msg->media_type == tgl_message_media_photo) {
1248 media_size = get_image_size(atoll(msg->media_id));
1250 if (media_msg && strstr(media_msg->doc_type, "video") != NULL) {
1251 media_size = get_media_size_from_db(atoll(msg->media_id));
1252 } else if (media_msg && strstr(media_msg->doc_type, "audio") != NULL) {
1253 media_size = get_media_size_from_db(atoll(msg->media_id));
1255 media_size = get_media_size_from_db(atoll(msg->media_id));
1259 int media_size_kbs = (media_size < (1 << 20)); //convert to kbs
1260 char media_size_str[10] = { 0, };
1261 if (media_size_kbs > 0) {
1262 sprintf(media_size_str, "%dKB", media_size_kbs);
1264 sprintf(media_size_str, "%dB", media_size);
1268 Evas_Object *size_btn = elm_layout_add(entry);
1269 elm_layout_file_set(size_btn, edj_path, "download_btn");
1270 elm_object_part_text_set(size_btn, "size", media_size_str);
1271 evas_object_size_hint_weight_set(size_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1272 evas_object_size_hint_align_set(size_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
1273 evas_object_show(size_btn);
1275 evas_object_data_set(size_btn, "image_state", "ready_to_download");
1277 Evas_Object* download_img = get_image_from_path(ui_utils_get_resource(MEDIA_DOWNLOAD_ICON), entry);
1278 elm_object_part_content_set(size_btn, "download_image", download_img);
1280 elm_object_part_content_set(rec_img_layout, "swallow.download_btn", size_btn);
1282 evas_object_data_set(entry, "image_object", (void*)img_item);
1283 evas_object_data_set(entry, "button_object", (void*)size_btn);
1284 evas_object_data_set(entry, "image_size", (void*)strdup(media_size_str));
1286 ad->loaded_msg_list = eina_list_append(ad->loaded_msg_list, entry);
1288 item_to_display = rec_img_layout;
1296 // delete media details
1300 evas_object_data_set(entry, "chat_list", (void*)chat_scroller);
1301 evas_object_data_set(entry, "message_id", (void*)message_id);
1302 evas_object_data_set(entry, "app_data", (void*)ad);
1305 if (msg->media_type == tgl_message_media_photo) {
1306 evas_object_data_set(entry, "media_type", (void*)strdup("image"));
1307 } else if (msg->media_type == tgl_message_media_geo) {
1308 evas_object_data_set(entry, "media_type", (void*)strdup("location"));
1310 if (media_msg && strstr(media_msg->doc_type, "video") != NULL) {
1311 evas_object_data_set(entry, "media_type", (void*)strdup("video"));
1312 } else if (media_msg && strstr(media_msg->doc_type, "audio") != NULL) {
1313 evas_object_data_set(entry, "media_type", (void*)strdup("audio"));
1315 evas_object_data_set(entry, "media_type", (void*)strdup("image"));
1319 evas_object_data_set(entry, "media_id", (void*)strdup(msg->media_id));
1320 if (item_to_display) {
1321 if (media_msg && strstr(media_msg->doc_type, "audio") != NULL) {
1322 layout = item_to_display;
1324 char edj_path[PATH_MAX] = {0, };
1325 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1326 layout = elm_layout_add(entry);
1327 elm_layout_file_set(layout, edj_path, "chat_image_layout");
1328 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1329 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1330 evas_object_show(layout);
1332 Evas_Object *rounded_layout = elm_layout_add(entry);
1333 elm_layout_file_set(rounded_layout, edj_path, "rounded_corner_layout");
1334 evas_object_size_hint_weight_set(rounded_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1335 evas_object_size_hint_align_set(rounded_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1336 evas_object_show(rounded_layout);
1337 elm_object_part_content_set(rounded_layout, "content", item_to_display);
1339 elm_object_part_content_set(layout, "swallow.chat_image", rounded_layout);
1340 evas_object_smart_callback_add(entry, "clicked", on_media_chat_item_clicked, NULL);
1346 msg->message = NULL;
1350 free(msg->media_id);
1351 msg->media_id = NULL;
1355 free_media_details(media_msg);
1361 static void __resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1363 appdata_s *ad = data;
1364 Evas_Object *layout = NULL;
1365 Evas_Object *chat_scroller = NULL;
1367 layout = evas_object_data_get(ad->nf, "main_layout");
1368 chat_scroller = evas_object_data_get(ad->nf, "chat_list");
1370 int is_end_edge = 0;
1371 is_end_edge = (int)evas_object_data_get(layout, "is_end_edge");
1375 ret = scroller_show_bottom_edge(chat_scroller);
1377 LOGE("Fail to show the bottom of scroller");
1382 Evas_Object *on_message_item_content_get_cb(void *data, Evas_Object *obj, const char *part)
1384 Evas_Object *entry = elm_entry_add(obj);
1385 Evas_Object *layout = NULL;
1387 char edj_path[PATH_MAX] = {0, };
1388 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1390 if (!strcmp(part, "elm.icon.entry")) {
1392 int message_id = (int)data;
1393 Evas_Object *chat_scroller = obj;
1394 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1396 Evas_Object *nomsg_layout = evas_object_data_del(ad->nf, "chat_list_no_msg_text");
1398 elm_object_signal_emit(nomsg_layout, "hide", "message");
1401 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1402 evas_object_data_set(chat_scroller, "message_id", data);
1405 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1406 int buddy_id = sel_item->use_data->peer_id;
1408 char* tablename = get_table_name_from_number(buddy_id);
1409 tg_message_s* msg = get_message_from_message_table(message_id, tablename);
1410 //Eina_Bool is_blur_image = EINA_FALSE;
1416 update_msg_into_db(msg, tablename);
1417 ad->is_last_msg_changed = EINA_TRUE;
1427 if (msg->service == 2) {
1428 layout = elm_layout_add(obj);
1429 elm_layout_file_set(layout, edj_path, "chat_date_item");
1430 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1431 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1432 evas_object_show(layout);
1434 // convert date from string to int
1435 char *date_str = msg->message;
1436 int date_num = atoi(date_str);
1438 // convert date format
1439 time_t t = date_num;
1440 char *format = NULL;
1441 format = "%a, %e %b %Y";
1444 (void) localtime_r(&t, <);
1446 if (strftime(res, sizeof(res), format, <) == 0) {
1447 (void) fprintf(stderr, "strftime(3): cannot format supplied "
1448 "date/time into buffer of size %u "
1450 sizeof(res), format);
1453 elm_object_part_text_set(layout, "elm.text", res);
1455 } else if (msg->service == 1) {
1456 layout = elm_layout_add(obj);
1457 elm_layout_file_set(layout, edj_path, "chat_service_item_box");
1458 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1459 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1460 evas_object_show(layout);
1462 elm_object_part_text_set(layout, "elm.text", msg->message);
1467 evas_object_data_set(entry, "chat_list", (void*)chat_scroller);
1468 evas_object_data_set(entry, "message_id", (void*)message_id);
1470 elm_entry_editable_set(entry, EINA_FALSE);
1471 elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
1472 elm_entry_single_line_set(entry, EINA_TRUE);
1474 layout = elm_layout_add(obj);
1477 elm_layout_file_set(layout, edj_path, "entry,send,layout");
1478 elm_object_style_set(entry, "sentmessage1");
1479 //sender_name = replace(ad->current_user_data->print_name, '_', " ");
1481 elm_layout_file_set(layout, edj_path, "entry,receive,layout");
1482 elm_object_style_set(entry, "readmessage1");
1484 /* If you need to get the name, you need this code */
1486 char *sender_name = NULL;
1487 if (sel_item->use_data->peer_type == TGL_PEER_USER) {
1488 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1489 } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
1490 int from_id = msg->from_id;
1491 // get name of buddy
1492 char* buddy_name = get_buddy_name_from_id(from_id);
1494 sender_name = replace(buddy_name, '_', " ");
1498 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1503 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1504 elm_object_part_content_set(layout,"elm.swallow.content", entry);
1505 evas_object_show(layout);
1507 elm_entry_input_panel_enabled_set(entry, EINA_FALSE);
1508 evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1509 evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
1510 evas_object_show(entry);
1512 // To be handled for group chat
1514 Eina_Strbuf *buf = eina_strbuf_new();
1516 if (msg->media_type == tgl_message_media_none) {
1517 char *temp_msg = replace(msg->message, '\n', "<br>");
1518 eina_strbuf_append(buf, temp_msg);
1519 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1520 eina_strbuf_free(buf);
1522 } else if(msg->media_type == tgl_message_media_photo || msg->media_type == tgl_message_media_document) {
1523 elm_entry_item_provider_append(entry, item_provider, chat_scroller);
1525 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1528 if (strstr(media_msg->doc_type, "audio") != NULL) {
1529 if (ad->target_direction == TELEGRAM_TARGET_DIRECTION_PORTRAIT || ad->target_direction == TELEGRAM_TARGET_DIRECTION_PORTRAIT_INVERSE) {
1530 eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1532 eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1535 } else if (strstr(media_msg->doc_type, "video") != NULL) {
1536 eina_strbuf_append(buf, "<item size=318x200 vsize=full hsize=full href=itemprovider></item>");
1538 eina_strbuf_append(buf, "<item size=318x200 vsize=full href=itemprovider></item>");
1543 if (strstr(media_msg->doc_type, "audio") != NULL) {
1544 eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1545 } else if (strstr(media_msg->doc_type, "video") != NULL) {
1546 eina_strbuf_append(buf, "<item size=318x200 vsize=full hsize=full href=itemprovider></item>");
1548 eina_strbuf_append(buf, "<item size=318x200 vsize=full href=itemprovider></item>");
1552 free_media_details(media_msg);
1553 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1554 eina_strbuf_free(buf);
1555 } else if(msg->media_type == tgl_message_media_geo) {
1557 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1558 char loc_url[4*256] = {0,};
1560 snprintf(loc_url, sizeof(loc_url), "https://maps.google.com/?q=%s,%s", media_msg->latitude, media_msg->longitude);
1561 char temp_msg[4*256] = {0,};
1562 snprintf(temp_msg, sizeof(temp_msg), "<font=Tizen:style=Normal|underline color=#0000FF align=left><font_size=15>%s</font_size></font>", loc_url);
1563 eina_strbuf_append(buf, temp_msg);
1564 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1565 eina_strbuf_free(buf);
1568 free_media_details(media_msg);
1569 evas_object_data_set(entry, "media_type", (void*)strdup("location"));
1570 evas_object_data_set(entry, "location_url", (void*)strdup(loc_url));
1571 evas_object_smart_callback_add(entry, "clicked", on_media_chat_item_clicked, NULL);
1573 } else if(msg->media_type == tgl_message_media_contact) {
1575 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1578 char temp_msg[4*256] = {0,};
1579 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);
1580 eina_strbuf_append(buf, temp_msg);
1581 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1582 eina_strbuf_free(buf);
1583 free_media_details(media_msg);
1586 } else if(msg->media_type == tgl_message_media_unsupported) {
1588 } else if(msg->media_type == tgl_message_media_photo_encr) {
1590 } else if(msg->media_type == tgl_message_media_document_encr) {
1595 ad->loaded_msg_list = eina_list_append(ad->loaded_msg_list, entry);
1598 time_t t = msg->date;
1599 const char *format = "%I:%M %p";
1602 (void) localtime_r(&t, <);
1604 if (strftime(res, sizeof(res), format, <) == 0) {
1605 (void) fprintf(stderr, "strftime(3): cannot format supplied "
1606 "date/time into buffer of size %u "
1608 sizeof(res), format);
1611 char time_str[20]={0,};
1612 snprintf(time_str, sizeof(time_str) - 1, "%s", res);
1613 elm_object_part_text_set(entry, "time", time_str);
1615 Evas_Object *status_obj;
1616 status_obj = elm_icon_add(entry);
1617 evas_object_size_hint_weight_set(status_obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1618 evas_object_size_hint_align_set(status_obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
1620 if(msg->msg_state == TG_MESSAGE_STATE_SENDING) {
1621 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENDING_ICON), NULL);
1622 elm_object_signal_emit(entry, "status_on", "status");
1623 } else if(msg->msg_state == TG_MESSAGE_STATE_SENT) {
1624 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENT_ICON), NULL);
1625 elm_object_signal_emit(entry, "status_on", "status");
1626 } else if(msg->msg_state == TG_MESSAGE_STATE_DELIVERED) {
1627 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_DELIVERED_ICON), NULL);
1628 elm_object_signal_emit(entry, "status_on", "status");
1629 } else if(msg->msg_state == TG_MESSAGE_STATE_RECEIVED) {
1630 elm_object_signal_emit(entry, "status_off", "status");
1631 } else if(msg->msg_state == TG_MESSAGE_STATE_FAILED) {
1632 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_FAILED_ICON), NULL);
1633 elm_object_signal_emit(entry, "status_on", "status");
1634 } else if(msg->msg_state == TG_MESSAGE_STATE_READ) {
1635 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_READ_ICON), NULL);
1636 elm_object_signal_emit(entry, "status_on", "status");
1637 } else if(msg->msg_state == TG_MESSAGE_STATE_UNKNOWN) {
1638 elm_object_signal_emit(entry, "status_off", "status");
1641 elm_object_part_content_set(entry, "status_icon", status_obj);
1642 evas_object_show(status_obj);
1647 msg->message = NULL;
1651 free(msg->media_id);
1652 msg->media_id = NULL;
1658 if (chat_scroller) {
1659 int size = elm_genlist_items_count(chat_scroller);
1661 Elm_Object_Item *litem = elm_genlist_nth_item_get(chat_scroller, size -1);
1662 elm_genlist_item_show(litem, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1670 void on_text_message_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
1675 void on_text_message_received_from_buddy(appdata_s* ad, long long message_id, int type_of_chat)
1680 peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
1681 tg_peer_info_s* peer_item = pic_peer_item->use_data;
1682 char* tablename = get_table_name_from_number(peer_item->peer_id);
1683 tg_message_s* msg = get_message_from_message_table(message_id, tablename);
1685 Evas_Object* chat_scroller = evas_object_data_get(ad->nf, "chat_list");
1686 Evas_Object *message = NULL;
1689 // update peer table
1691 peer_item->last_msg_id = msg->msg_id;
1692 peer_item->last_msg_date = msg->date;
1693 insert_or_update_peer_into_database(peer_item);
1696 Evas_Object *layout = evas_object_data_get(ad->nf, "main_layout");
1698 int is_end_edge = (int) evas_object_data_get(layout, "is_end_edge");
1700 Evas_Object *bubble_layout = NULL;
1701 bubble_layout = elm_object_part_content_get(layout, "swallow.messagebubble");
1703 int user_id = (int) evas_object_data_get(chat_scroller, "user_id");
1704 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1705 char *sender_name = NULL;
1706 if (sel_item->use_data->peer_type == TGL_PEER_USER) {
1707 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1708 } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
1709 int from_id = msg->from_id;
1710 // get name of buddy
1711 char* buddy_name = get_buddy_name_from_id(from_id);
1713 sender_name = replace(buddy_name, '_', " ");
1717 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1720 elm_object_part_text_set(bubble_layout, "text_name", sender_name);
1721 elm_object_part_text_set(bubble_layout, "text_message", msg->message);
1722 elm_object_signal_emit(layout, "show", "bubblemessage");
1728 msg->message = NULL;
1732 free(msg->media_id);
1733 msg->media_id = NULL;
1740 message = on_message_item_content_get_cb((void *)message_id, chat_scroller, "elm.icon.entry");
1741 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)message_id);
1742 scroller_push_item(chat_scroller, message);
1744 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1745 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1747 send_request_for_marked_as_read(ad, ad->service_client, sel_item->use_data->peer_id, sel_item->use_data->peer_type);
1748 ad->is_last_msg_changed = EINA_TRUE;
1749 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
1753 void on_media_download_completed(appdata_s* ad, int buddy_id, long long media_id, const char* file_path)
1758 if (ad->loaded_msg_list && eina_list_count(ad->loaded_msg_list) > 0) {
1759 for (int i = eina_list_count(ad->loaded_msg_list) - 1 ; i >= 0; i--) {
1760 Evas_Object* entry = eina_list_nth(ad->loaded_msg_list, i);
1763 char* media_type_str = evas_object_data_get(entry, "media_type");
1764 char* media_id_str = evas_object_data_get(entry, "media_id");
1765 char* media_size_str = evas_object_data_get(entry, "image_size");
1766 Evas_Object *img_item = evas_object_data_get(entry, "image_object");
1767 Evas_Object *size_btn = evas_object_data_get(entry, "button_object");
1771 long long lmedia_id = atoll(media_id_str);
1773 if (media_id == lmedia_id) {
1774 if (img_item || (strstr(media_type_str, "audio") != NULL)) {
1777 if (strstr(file_path, "failed_to_load") != NULL) {
1779 if ((strstr(media_type_str, "audio") != NULL)) {
1780 Evas_Object *play_pause_icon = evas_object_data_get(entry, "play_pause_icon");
1781 Evas_Object *progressbar = evas_object_data_get(entry, "progress_bar");
1782 evas_object_data_set(progressbar, "is_download_in_progress", EINA_FALSE);
1783 evas_object_data_set(play_pause_icon, "audio_file_path", NULL);
1785 elm_object_style_set(progressbar, "default");
1791 Evas_Object* progress = elm_object_part_content_get(size_btn, "download_image");
1793 evas_object_del(progress);
1795 Evas_Object* download_img = get_image_from_path(ui_utils_get_resource(MEDIA_DOWNLOAD_ICON), size_btn);
1796 elm_object_part_content_set(size_btn, "download_image", download_img);
1797 evas_object_data_set(size_btn, "image_state", "ready_to_download");
1798 char temp_msg[256] = {0,};
1799 snprintf(temp_msg, sizeof(temp_msg), "<font=Tizen:style=Bold color=#008000 align=center><font_size=30>%s</font_size></font>", media_size_str);
1800 elm_object_text_set(size_btn, temp_msg);
1806 if ((strstr(media_type_str, "audio") != NULL)) {
1807 Evas_Object *play_pause_icon = evas_object_data_get(entry, "play_pause_icon");
1808 Evas_Object *progressbar = evas_object_data_get(entry, "progress_bar");
1809 evas_object_data_set(progressbar, "is_download_in_progress", EINA_FALSE);
1810 elm_object_style_set(progressbar, "default");
1811 evas_object_data_set(play_pause_icon, "audio_file_path", file_path);
1813 metadata_extractor_h metadata;
1814 metadata_extractor_create(&metadata);
1815 int ret = metadata_extractor_set_path(metadata, file_path);
1817 ret = metadata_extractor_get_metadata(metadata, METADATA_DURATION, &value);
1818 metadata_extractor_destroy(metadata);
1822 duration = atoi(value);
1826 elm_object_part_text_set(progressbar, "elm.text.top.left", "");
1827 elm_object_part_text_set(progressbar, "elm.text.top.right", "");
1833 evas_object_del(size_btn);
1836 if ((strstr(media_type_str, "video") != NULL)) {
1837 Evas_Object* play_img = get_video_paly_icon(img_item);
1838 //Evas_Object* play_img = get_image_from_path(ui_utils_get_resource(MEDIA_PLAY_ICON), img_item);
1839 elm_object_part_content_set(img_item, "swallow.play_btn", play_img);
1840 } else if (strstr(media_type_str, "image") != NULL) {
1841 elm_image_file_set(img_item, file_path, NULL);
1842 //elm_image_animated_set(img_item, EINA_TRUE);
1843 //elm_image_animated_play_set(img_item, EINA_TRUE);
1856 //elm_object_part_content_set(comp_img_layout, "swallow.chat_send_image", image);
1858 void on_video_thumb_download_completed(appdata_s* ad, int buddy_id, long long media_id, const char* file_path)
1860 on_media_download_completed(ad, buddy_id, media_id, file_path);
1863 void on_text_message_state_changed(appdata_s* ad, tg_message_s *msg, int type_of_chat)
1869 peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
1870 if (pic_peer_item) {
1871 tg_peer_info_s* peer_item = pic_peer_item->use_data;
1872 // update peer table
1874 peer_item->last_msg_id = msg->msg_id;
1875 peer_item->last_msg_date = msg->date;
1876 insert_or_update_peer_into_database(peer_item);
1880 if (ad->loaded_msg_list && eina_list_count(ad->loaded_msg_list) > 0) {
1881 for (int i = eina_list_count(ad->loaded_msg_list) - 1 ; i >= 0; i--) {
1882 Evas_Object* entry = eina_list_nth(ad->loaded_msg_list, i);
1885 int message_id = (int)evas_object_data_get(entry, "message_id");
1886 if (message_id == msg->msg_id || message_id == msg->unique_id) {
1888 evas_object_data_set(entry, "media_id", (void*)strdup(msg->media_id));
1889 evas_object_data_set(entry, "message_id", (void*)message_id);
1891 Evas_Object* status_obj = elm_object_part_content_get(entry, "status_icon");
1893 if(msg->msg_state == TG_MESSAGE_STATE_SENDING) {
1894 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENDING_ICON), NULL);
1895 elm_object_signal_emit(entry, "status_on", "status");
1896 } else if(msg->msg_state == TG_MESSAGE_STATE_SENT) {
1897 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENT_ICON), NULL);
1898 elm_object_signal_emit(entry, "status_on", "status");
1899 } else if(msg->msg_state == TG_MESSAGE_STATE_DELIVERED) {
1900 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_DELIVERED_ICON), NULL);
1901 elm_object_signal_emit(entry, "status_on", "status");
1902 } else if(msg->msg_state == TG_MESSAGE_STATE_RECEIVED) {
1903 elm_object_signal_emit(entry, "status_off", "status");
1904 } else if(msg->msg_state == TG_MESSAGE_STATE_FAILED) {
1905 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_FAILED_ICON), NULL);
1906 elm_object_signal_emit(entry, "status_on", "status");
1907 } else if(msg->msg_state == TG_MESSAGE_STATE_READ) {
1908 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_READ_ICON), NULL);
1909 elm_object_signal_emit(entry, "status_on", "status");
1910 } else if(msg->msg_state == TG_MESSAGE_STATE_UNKNOWN) {
1911 elm_object_signal_emit(entry, "status_off", "status");
1921 Eina_Bool add_date_item_to_chat(void *data)
1923 Evas_Object *chat_scroller = data;
1924 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1925 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1927 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1929 char* msg_table = get_table_name_from_number(sel_item->use_data->peer_id);
1930 create_buddy_msg_table(msg_table);
1931 int msg_id = insert_current_date_to_table(msg_table);
1935 // send request to service
1936 Evas_Object *message = NULL;
1938 message = on_message_item_content_get_cb((void *)msg_id, chat_scroller, "elm.icon.entry");
1939 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)msg_id);
1940 scroller_push_item(chat_scroller, message);
1942 ad->is_last_msg_changed = EINA_TRUE;
1950 static Eina_Bool on_new_text_message_send_cb(void *data)
1952 Evas_Object *chat_scroller = data;
1953 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1954 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1955 Evas_Object *text_entry = evas_object_data_get(chat_scroller, "text_entry");
1957 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
1959 const char* text_to_send = elm_entry_entry_get(text_entry);
1960 if (!text_to_send || (strlen(text_to_send) == 0))
1961 return ECORE_CALLBACK_CANCEL;
1963 int unique_id = time(NULL);
1965 msg.msg_id = unique_id;
1966 msg.from_id = ad->current_user_data->user_id.id;
1967 msg.date = time(NULL);
1971 msg.fwd_from_id = 0;
1973 msg.message = (char*)text_to_send;
1974 msg.message_len = strlen(text_to_send);
1975 msg.media_type = tgl_message_media_none;
1979 msg.to_id = sel_item->use_data->peer_id;
1981 msg.msg_state = TG_MESSAGE_STATE_SENDING;
1982 msg.is_marked_for_delete = 0;
1983 char* msg_table = get_table_name_from_number(msg.to_id);
1984 create_buddy_msg_table(msg_table);
1985 insert_msg_into_db(&msg, msg_table, unique_id);
1988 peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
1989 if (pic_peer_item) {
1990 tg_peer_info_s* peer_item = pic_peer_item->use_data;
1991 // update peer table
1993 peer_item->last_msg_id = msg.msg_id;
1994 peer_item->last_msg_date = msg.date;
1995 insert_or_update_peer_into_database(peer_item);
1999 // send request to service
2000 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);
2002 Evas_Object *message = NULL;
2004 message = on_message_item_content_get_cb((void *)unique_id, chat_scroller, "elm.icon.entry");
2005 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)unique_id);
2006 scroller_push_item(chat_scroller, message);
2008 elm_entry_entry_set(text_entry, "");
2009 ad->is_last_msg_changed = EINA_TRUE;
2010 return ECORE_CALLBACK_CANCEL;
2013 static void on_text_message_send_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2015 Evas_Object* chat_scroller = data;
2016 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2017 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2018 Evas_Object* text_entry = evas_object_data_get(chat_scroller, "text_entry");
2021 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2022 const char* text_to_send = elm_entry_markup_to_utf8(elm_object_text_get(text_entry));
2023 if (!text_to_send || (strlen(text_to_send) == 0))
2026 if(add_date_item_to_chat(data)) {
2027 //ecore_timer_add(2, on_new_text_message_send_cb, chat_scroller);
2030 int unique_id = time(NULL);
2032 msg.msg_id = unique_id;
2033 msg.from_id = ad->current_user_data->user_id.id;
2034 msg.date = time(NULL);
2038 msg.fwd_from_id = 0;
2040 msg.message = (char*)text_to_send;
2041 msg.message_len = strlen(text_to_send);
2042 msg.media_type = tgl_message_media_none;
2046 msg.to_id = sel_item->use_data->peer_id;
2048 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2049 msg.is_marked_for_delete = 0;
2050 char* msg_table = get_table_name_from_number(msg.to_id);
2051 create_buddy_msg_table(msg_table);
2052 insert_msg_into_db(&msg, msg_table, unique_id);
2055 peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
2056 if (pic_peer_item) {
2057 tg_peer_info_s* peer_item = pic_peer_item->use_data;
2058 // update peer table
2060 peer_item->last_msg_id = msg.msg_id;
2061 peer_item->last_msg_date = msg.date;
2062 insert_or_update_peer_into_database(peer_item);
2066 // send request to service
2067 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);
2069 Evas_Object *message = NULL;
2071 Evas_Object *layout = evas_object_data_get(ad->nf, "main_layout");
2072 evas_object_data_set(layout, "is_end_edge", (void *) 1);
2074 message = on_message_item_content_get_cb((void *)unique_id, chat_scroller, "elm.icon.entry");
2075 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)unique_id);
2076 scroller_push_item(chat_scroller, message);
2078 elm_entry_entry_set(text_entry, "");
2079 ad->is_last_msg_changed = EINA_TRUE;
2082 void on_user_status_changed(appdata_s* ad, char* status)
2087 Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
2088 char status_str[256]={0,};
2089 snprintf(status_str, sizeof(status_str) - 1, "%s", status);
2090 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2093 static void compare_with_current_date(int rtime, Elm_Object_Item *nf_it)
2095 char time_str[256]={0,};
2096 time_t local_t = time(NULL);
2102 diff_sec = local_t - rtime;
2103 diff_min = diff_sec / 60;
2104 diff_hour = diff_min / 60;
2105 diff_day = diff_hour / 24;
2106 LOGD("different : day : %d, hour = %d, min = %d, sec = %d", diff_day, diff_hour, diff_min, diff_sec);
2109 if (diff_day > 30) {
2110 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_LONG_TIME_AGO_ABB"));
2115 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_WITHIN_A_MONTH_ABB"));
2119 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_WITHIN_A_WEEK_ABB"));
2123 if (diff_hour > 1) {
2124 snprintf(time_str, sizeof(time_str) - 1, i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_PD_HOURS_AGO_ABB"), diff_hour);
2128 if (diff_hour == 1) {
2129 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_1_HOUR_AGO_ABB"));
2133 snprintf(time_str, sizeof(time_str) - 1, i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_PD_MINUTES_AGO_ABB"), diff_min);
2136 if (diff_min == 1) {
2137 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_1_MINUTE_AGO_ABB"));
2140 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_RECENTLY_ABB"));
2143 elm_object_item_part_text_set(nf_it, "subtitle", time_str);
2146 void on_user_presence_state_changed(appdata_s* ad, int buddy_id)
2150 int type_of_chat = ad->peer_in_cahtting_data->use_data->peer_type;
2151 Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
2153 if (type_of_chat == TGL_PEER_USER) {
2155 Eina_List* buddy_details_array = get_buddy_info(buddy_id);
2156 if (buddy_details_array && eina_list_count(buddy_details_array) > 0) {
2157 Eina_List* buddy_details = eina_list_nth(buddy_details_array, 0);
2158 if (buddy_details && eina_list_count(buddy_details) > 0) {
2159 int* temp_online = (int*)eina_list_nth(buddy_details, 12);
2160 int is_online = *temp_online;
2161 int* temp_last_seen = (int*)eina_list_nth(buddy_details, 13);
2162 int last_seen = *temp_last_seen;
2164 if (is_online > 0) {
2165 char status_str[256]={0,};
2166 snprintf(status_str, sizeof(status_str) - 1, "%s", i18n_get_text("IDS_TGRAM_SBODY_ONLINE"));
2167 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2169 compare_with_current_date(last_seen, nf_it);
2172 for (int i = 0 ; i < eina_list_count(buddy_details_array); i++) {
2173 void* val = eina_list_nth(buddy_details, i);
2176 eina_list_free(buddy_details);
2178 eina_list_free(buddy_details_array);
2181 } else if (type_of_chat == TGL_PEER_CHAT) {
2183 tg_chat_info_s* chat_info = get_chat_info(buddy_id);
2185 char status_str[256]={0,};
2186 snprintf(status_str, sizeof(status_str) - 1, "Unidentified.");
2187 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2191 int user_list_size = chat_info->user_list_size;
2192 int online_members = 0;
2194 char *names_of_buddies = NULL;
2197 for (int i = 0; i < user_list_size; i++) {
2199 int is_online = get_buddy_online_status(chat_info->chat_users[i]);
2200 if (is_online > 0) {
2204 char *buddy_full_name = get_buddy_name_from_id(chat_info->chat_users[i]);
2205 if (buddy_full_name) {
2206 char *buddy_name = replace(buddy_full_name, '_', " ");
2208 if (!names_of_buddies) {
2209 names_of_buddies = (char*)malloc(strlen(buddy_name) + 1);
2210 strcpy(names_of_buddies, buddy_name);
2212 names_of_buddies = (char*)realloc(names_of_buddies, strlen(names_of_buddies) + strlen(" / ") + strlen(buddy_name) + 1);
2213 strcat(names_of_buddies, " / ");
2214 strcat(names_of_buddies, buddy_name);
2220 evas_object_data_set(ad->nf, "names_of_buddies", (void*)names_of_buddies);
2223 if (online_members == 0) {
2224 char status_str[256]={0,};
2225 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"));
2226 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2228 char status_str[256]={0,};
2229 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"));
2230 elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2233 char status_str[256]={0,};
2234 snprintf(status_str, sizeof(status_str) - 1, i18n_get_text("IDS_TGRAM_BODY_PD_PARTICIPANTS"), user_list_size);
2236 char temp_status_str[512]={0,};
2237 snprintf(temp_status_str, sizeof(temp_status_str) - 1, "%s", status_str);
2239 elm_object_item_part_text_set(nf_it, "subtitle", temp_status_str);
2243 if(chat_info->print_title) {
2244 free(chat_info->print_title);
2245 chat_info->print_title = NULL;
2247 if(chat_info->photo_path) {
2248 free(chat_info->photo_path);
2249 chat_info->photo_path = NULL;
2251 if(chat_info->title) {
2252 free(chat_info->title);
2253 chat_info->title = NULL;
2260 static Eina_Bool on_change_input_type_requested(void *data)
2262 Evas_Object* text_entry = data;
2264 LOGE("Fail to get the text_entry");
2265 return ECORE_CALLBACK_CANCEL;
2267 elm_object_focus_set(text_entry, EINA_TRUE);
2268 elm_entry_input_panel_layout_set(text_entry, ELM_INPUT_PANEL_LAYOUT_EMOTICON);
2269 elm_entry_input_panel_show(text_entry);
2271 return ECORE_CALLBACK_CANCEL;
2274 static void on_message_cancel_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2276 Evas_Object *layout = data;
2278 LOGE("Fail to get the layout");
2281 elm_object_signal_emit(layout, "hide", "bubblemessage");
2284 static void on_message_smiley_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2286 Evas_Object* text_entry = data;
2288 LOGE("Fail to get the text_entry");
2291 ecore_timer_add(0.3, on_change_input_type_requested, text_entry);
2294 static void on_message_text_entry_clicked(void *data, Evas_Object *obj, void *event_info)
2297 LOGE("Fail to get the entry");
2300 /* This Api is needed for type of keyboard: emoticon or caractor */
2301 elm_entry_input_panel_layout_set(obj, ELM_INPUT_PANEL_LAYOUT_NORMAL);
2304 static void on_message_text_entry_changed(void *data, Evas_Object *obj, void *event_info)
2306 Evas_Object *layout = data;
2309 LOGE("Fail to get the entry layout");
2312 int attach_show = (int) evas_object_data_get(layout, "is_attach_show");
2314 if (elm_entry_is_empty(obj)) {
2316 elm_object_signal_emit(layout, "show", "attach_btn");
2317 evas_object_data_set(layout, "is_attach_show", (void *) 1);
2321 elm_object_signal_emit(layout, "hide", "attach_btn");
2322 evas_object_data_set(layout, "is_attach_show", (void *) 0);
2327 Evas_Object* create_chat_genlist(Evas_Object *win)
2329 Evas_Object *genlist;
2330 Elm_Theme *theme = elm_theme_new();
2331 char edj_path[PATH_MAX] = {0, };
2332 app_get_resource(TELEGRAM_GENLIST_THEME_EDJ, edj_path, (int)PATH_MAX);
2333 elm_theme_extension_add(theme, edj_path);
2334 genlist = elm_genlist_add(win);
2335 elm_object_theme_set(genlist, theme);
2336 elm_object_style_set(genlist, "telegram/default");
2337 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2338 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
2342 void on_list_media_item_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2347 static Eina_Bool on_new_contact_message_send_cb(void *data)
2349 Evas_Object *chat_scroller = data;
2350 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2351 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2353 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2355 int unique_id = time(NULL);
2357 char unique_id_str[50];
2358 sprintf(unique_id_str, "%d", unique_id);
2361 msg.msg_id = unique_id;
2362 msg.from_id = ad->current_user_data->user_id.id;
2363 msg.date = time(NULL);
2367 msg.fwd_from_id = 0;
2368 msg.unique_id = unique_id;
2370 msg.message_len = 0;
2371 msg.media_type = tgl_message_media_contact;
2372 msg.media_id = strdup(unique_id_str);
2375 msg.to_id = sel_item->use_data->peer_id;
2377 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2378 msg.is_marked_for_delete = 0;
2380 char* msg_table = get_table_name_from_number(msg.to_id);
2381 create_buddy_msg_table(msg_table);
2382 insert_msg_into_db(&msg, msg_table, unique_id);
2387 char *first_name = evas_object_data_get(chat_scroller, "contact_first_name");
2388 char *last_name = evas_object_data_get(chat_scroller, "contact_last_name");
2389 char *phone_number = evas_object_data_get(chat_scroller, "contact_phone_number");
2391 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, NULL, NULL, first_name, last_name, phone_number);
2395 // send request to service
2396 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);
2398 Evas_Object *message = NULL;
2400 message = on_message_item_content_get_cb((void *)unique_id, chat_scroller, "elm.icon.entry");
2401 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2402 scroller_push_item(chat_scroller, message);
2406 return ECORE_CALLBACK_CANCEL;
2410 void send_contact_message_to_buddy(void *data, char *first_name, char *last_name, char *phone_number)
2412 Evas_Object *chat_scroller = data;
2413 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2414 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2416 if(add_date_item_to_chat(data)) {
2417 /* evas_object_data_set(chat_scroller, "contact_first_name", strdup(first_name));
2418 evas_object_data_set(chat_scroller, "contact_last_name", strdup(last_name));
2419 evas_object_data_set(chat_scroller, "contact_phone_number", strdup(phone_number));
2421 ecore_timer_add(2, on_new_contact_message_send_cb, chat_scroller);
2425 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2427 int unique_id = time(NULL);
2429 char unique_id_str[50];
2430 sprintf(unique_id_str, "%d", unique_id);
2433 msg.msg_id = unique_id;
2434 msg.from_id = ad->current_user_data->user_id.id;
2435 msg.date = time(NULL);
2439 msg.fwd_from_id = 0;
2440 msg.unique_id = unique_id;
2442 msg.message_len = 0;
2443 msg.media_type = tgl_message_media_contact;
2444 msg.media_id = strdup(unique_id_str);
2447 msg.to_id = sel_item->use_data->peer_id;
2449 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2450 msg.is_marked_for_delete = 0;
2452 char* msg_table = get_table_name_from_number(msg.to_id);
2453 create_buddy_msg_table(msg_table);
2454 insert_msg_into_db(&msg, msg_table, unique_id);
2458 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, NULL, NULL, first_name, last_name, phone_number);
2462 // send request to service
2463 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);
2465 Evas_Object *message = NULL;
2467 message = on_message_item_content_get_cb((void *)unique_id, chat_scroller, "elm.icon.entry");
2468 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2469 scroller_push_item(chat_scroller, message);
2473 static Eina_Bool on_new_location_message_send_cb(void *data)
2475 Evas_Object *chat_scroller = data;
2476 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2477 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2479 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2481 int unique_id = time(NULL);
2483 char unique_id_str[50];
2484 sprintf(unique_id_str, "%d", unique_id);
2487 msg.msg_id = unique_id;
2488 msg.from_id = ad->current_user_data->user_id.id;
2489 msg.date = time(NULL);
2493 msg.fwd_from_id = 0;
2494 msg.unique_id = unique_id;
2496 msg.message_len = 0;
2497 msg.media_type = tgl_message_media_geo;
2498 msg.media_id = strdup(unique_id_str);
2501 msg.to_id = sel_item->use_data->peer_id;
2503 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2504 msg.is_marked_for_delete = 0;
2506 char* msg_table = get_table_name_from_number(msg.to_id);
2507 create_buddy_msg_table(msg_table);
2508 insert_msg_into_db(&msg, msg_table, unique_id);
2513 char *latitude = evas_object_data_get(chat_scroller, "contact_latitude");
2514 char *longitude = evas_object_data_get(chat_scroller, "contact_longitude");
2516 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, latitude, longitude, NULL, NULL, NULL);
2520 // send request to service
2521 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);
2523 Evas_Object *message = NULL;
2525 message = on_message_item_content_get_cb((void *)unique_id, chat_scroller, "elm.icon.entry");
2526 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2527 scroller_push_item(chat_scroller, message);
2530 return ECORE_CALLBACK_CANCEL;
2533 void send_location_message_to_buddy(void *data, char *latitude, char *longitude)
2535 Evas_Object *chat_scroller = data;
2536 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2537 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2539 if(add_date_item_to_chat(data)) {
2540 /* evas_object_data_set(chat_scroller, "contact_latitude", strdup(latitude));
2541 evas_object_data_set(chat_scroller, "contact_longitude", strdup(longitude));
2542 ecore_timer_add(2, on_new_location_message_send_cb, chat_scroller);
2546 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2548 int unique_id = time(NULL);
2550 char unique_id_str[50];
2551 sprintf(unique_id_str, "%d", unique_id);
2554 msg.msg_id = unique_id;
2555 msg.from_id = ad->current_user_data->user_id.id;
2556 msg.date = time(NULL);
2560 msg.fwd_from_id = 0;
2561 msg.unique_id = unique_id;
2563 msg.message_len = 0;
2564 msg.media_type = tgl_message_media_geo;
2565 msg.media_id = strdup(unique_id_str);
2568 msg.to_id = sel_item->use_data->peer_id;
2570 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2571 msg.is_marked_for_delete = 0;
2573 char* msg_table = get_table_name_from_number(msg.to_id);
2574 create_buddy_msg_table(msg_table);
2575 insert_msg_into_db(&msg, msg_table, unique_id);
2579 insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, latitude, longitude, NULL, NULL, NULL);
2583 // send request to service
2584 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);
2586 Evas_Object *message = NULL;
2588 message = on_message_item_content_get_cb((void *)unique_id, chat_scroller, "elm.icon.entry");
2589 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2590 scroller_push_item(chat_scroller, message);
2595 static Eina_Bool on_new_media_message_send_cb(void *data)
2597 Evas_Object *chat_scroller = data;
2598 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2599 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2601 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2603 int unique_id = time(NULL);
2605 char unique_id_str[50];
2606 sprintf(unique_id_str, "%d", unique_id);
2608 char *file_type_char = evas_object_data_get(chat_scroller, "file_type");
2609 int file_type = atoi(file_type_char);
2610 char *file_path = evas_object_data_get(chat_scroller, "file_path");
2613 msg.msg_id = unique_id;
2614 msg.from_id = ad->current_user_data->user_id.id;
2615 msg.date = time(NULL);
2619 msg.fwd_from_id = 0;
2620 msg.unique_id = unique_id;
2622 msg.message_len = 0;
2623 msg.media_type = file_type;
2624 msg.media_id = strdup(unique_id_str);
2627 msg.to_id = sel_item->use_data->peer_id;
2629 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2630 msg.is_marked_for_delete = 0;
2632 char* msg_table = get_table_name_from_number(msg.to_id);
2633 create_buddy_msg_table(msg_table);
2634 insert_msg_into_db(&msg, msg_table, unique_id);
2638 if (file_type == tgl_message_media_photo) {
2639 Evas_Object *img = create_image_object_from_file(file_path, chat_scroller);
2640 elm_image_object_size_get(img, &img_width, &img_height);
2642 stat(file_path, &st);
2643 media_size = st.st_size;
2644 evas_object_del(img);
2647 insert_media_info_to_db(&msg, (char*)file_path, img_width, img_height, media_size, NULL, NULL , NULL, NULL, NULL);
2651 // send request to service
2652 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);
2654 Evas_Object *message = NULL;
2656 message = on_message_item_content_get_cb((void *)unique_id, chat_scroller, "elm.icon.entry");
2657 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2658 scroller_push_item(chat_scroller, message);
2661 ad->is_last_msg_changed = EINA_TRUE;
2662 return ECORE_CALLBACK_CANCEL;
2665 void send_media_message_to_buddy(void *data, const char* file_path, enum tgl_message_media_type file_type)
2667 Evas_Object *chat_scroller = data;
2668 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2669 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2670 if(add_date_item_to_chat(data)) {
2671 /* int temp_file_type = file_type;
2672 char file_type_char[10]= {0, };
2673 sprintf(file_type_char, "%d", temp_file_type);
2674 evas_object_data_set(chat_scroller, "file_type", strdup(file_type_char));
2675 evas_object_data_set(chat_scroller, "file_path", strdup(file_path));
2677 ecore_timer_add(2, on_new_media_message_send_cb, chat_scroller);
2680 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2682 int unique_id = time(NULL);
2684 char unique_id_str[50];
2685 sprintf(unique_id_str, "%d", unique_id);
2688 msg.msg_id = unique_id;
2689 msg.from_id = ad->current_user_data->user_id.id;
2690 msg.date = time(NULL);
2694 msg.fwd_from_id = 0;
2695 msg.unique_id = unique_id;
2697 msg.message_len = 0;
2698 msg.media_type = file_type;
2699 msg.media_id = strdup(unique_id_str);
2702 msg.to_id = sel_item->use_data->peer_id;
2704 msg.msg_state = TG_MESSAGE_STATE_SENDING;
2705 msg.is_marked_for_delete = 0;
2707 char* msg_table = get_table_name_from_number(msg.to_id);
2708 create_buddy_msg_table(msg_table);
2709 insert_msg_into_db(&msg, msg_table, unique_id);
2713 if (file_type == tgl_message_media_photo) {
2714 Evas_Object* img = create_image_object_from_file(file_path, chat_scroller);
2715 elm_image_object_size_get(img, &img_width, &img_height);
2717 stat(file_path, &st);
2718 media_size = st.st_size;
2719 evas_object_del(img);
2722 insert_media_info_to_db(&msg, (char*)file_path, img_width, img_height, media_size, NULL, NULL , NULL, NULL, NULL);
2726 // send request to service
2727 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);
2729 Evas_Object *message = NULL;
2731 message = on_message_item_content_get_cb((void *)unique_id, chat_scroller, "elm.icon.entry");
2732 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2733 scroller_push_item(chat_scroller, message);
2736 ad->is_last_msg_changed = EINA_TRUE;
2739 static Eina_Bool on_timer_expired(void *data)
2741 Evas_Object *scroller = data;
2745 LOGE("Cannot get the scroller");
2746 return ECORE_CALLBACK_CANCEL;
2748 ret = scroller_show_bottom_edge(scroller);
2750 LOGE("Fail to show the bottom of scroller");
2753 return ECORE_CALLBACK_CANCEL;
2756 Eina_Bool load_chat_history(Evas_Object *chat_scroller)
2758 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2759 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2761 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
2762 int buddy_id = sel_item->use_data->peer_id;
2764 char* tablename = get_table_name_from_number(buddy_id);
2766 Eina_List* col_types = NULL;
2767 col_types = eina_list_append(col_types, TG_DB_COLUMN_INTEGER);
2769 Eina_List* col_names = NULL;
2770 col_names = eina_list_append(col_names, MESSAGE_INFO_TABLE_MESSAGE_ID);
2772 char unknown_str[50];
2774 sprintf(unknown_str, "%d", unknown);
2776 char* where_clause = (char*)malloc(strlen(MESSAGE_INFO_TABLE_MARKED_FOR_DELETE) + strlen(" = ") + strlen(unknown_str) + 1);
2777 strcpy(where_clause, MESSAGE_INFO_TABLE_MARKED_FOR_DELETE);
2778 strcat(where_clause, " = ");
2779 strcat(where_clause, unknown_str);
2781 Eina_List* vals = get_values_from_table_sync_order_by(tablename, col_names, col_types, MESSAGE_INFO_TABLE_DATE, EINA_TRUE, where_clause);
2783 // set no messages yet
2786 int row_count = eina_list_count(vals);
2788 if (row_count <= 0) {
2789 // set no messages yet
2793 for (int i = 0 ; i < row_count ; i++) {
2794 Eina_List* row_vals = eina_list_nth(vals, i);
2795 int* temp_message_id = (int*)eina_list_nth(row_vals, 0);
2796 int message_id = *temp_message_id;
2797 Evas_Object *message = NULL;
2799 message = on_message_item_content_get_cb((void *)message_id, chat_scroller, "elm.icon.entry");
2800 elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)message_id);
2801 scroller_push_item(chat_scroller, message);
2803 eina_list_free(row_vals);
2805 eina_list_free(vals);
2808 Ecore_Timer *timer = NULL;
2809 timer = ecore_timer_add(0.1, on_timer_expired, chat_scroller);
2817 void on_gallery_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2819 if (result == APP_CONTROL_RESULT_SUCCEEDED) {
2820 Evas_Object* chat_scroller = user_data;
2821 char* file_path = NULL;
2822 char** path_arryay = NULL;
2823 int array_length = 0;
2825 char* mime_type = NULL;
2826 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2828 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
2829 if (status != APP_CONTROL_ERROR_NONE) {
2830 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay, &array_length);
2831 if (status != APP_CONTROL_ERROR_NONE) {
2833 show_toast(ad, "Unable to get the result from attach panel");
2839 status = app_control_get_mime(reply, &mime_type);
2840 if (status != APP_CONTROL_ERROR_NONE) {
2842 show_toast(ad, "Unable to get the mime type from attach panel");
2847 for(int i = 0 ; i < array_length ; i++) {
2848 file_path = strdup(path_arryay[i]);
2849 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_photo);
2856 void on_location_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2858 Evas_Object* chat_scroller = user_data;
2859 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2860 if (result == APP_CONTROL_RESULT_SUCCEEDED) {
2861 char *latitude = NULL;
2862 char *longitude = NULL;
2863 app_control_get_extra_data(reply, "latitude", &latitude);
2864 app_control_get_extra_data(reply, "longitude", &longitude);
2866 if (latitude && longitude) {
2867 send_location_message_to_buddy(chat_scroller, latitude, longitude);
2869 //send_location_message_to_buddy(chat_scroller, "0.00000000000", "0.00000000000");
2870 show_toast(ad, "Unable to detect location values.");
2873 show_toast(ad, "Device does not support location feature.");
2877 void on_video_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2879 if (result == APP_CONTROL_RESULT_SUCCEEDED) {
2881 Evas_Object* chat_scroller = user_data;
2882 char* file_path = NULL;
2883 char** path_arryay = NULL;
2884 int array_length = 0;
2886 char* mime_type = NULL;
2887 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2889 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
2890 if (status != APP_CONTROL_ERROR_NONE) {
2891 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay, &array_length);
2892 if (status != APP_CONTROL_ERROR_NONE) {
2894 show_toast(ad, "Unable to get the result from attach panel");
2900 status = app_control_get_mime(reply, &mime_type);
2901 if (status != APP_CONTROL_ERROR_NONE) {
2903 show_toast(ad, "Unable to get the mime type from attach panel");
2907 for(int i = 0 ; i < array_length ; i++) {
2908 file_path = strdup(path_arryay[i]);
2909 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
2916 void on_file_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2918 if (result == APP_CONTROL_RESULT_SUCCEEDED) {
2920 Evas_Object* chat_scroller = user_data;
2921 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2922 char* file_path = NULL;
2923 char** path_arryay = NULL;
2924 int array_length = 0;
2925 app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
2927 for(int i = 0 ; i < array_length ; i++) {
2928 file_path = strdup(path_arryay[i]);
2930 // get mime type of the file
2932 char *mime_type = NULL;
2934 char *extn = strrchr(file_path, '.');
2936 extn = replace(extn, '.', "");
2939 mime_type_get_mime_type(extn, &mime_type);
2943 if (strstr(mime_type, "video") != NULL) {
2944 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
2945 } else if (strstr(mime_type, "audio") != NULL) {
2946 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
2947 } else if (strstr(mime_type, "image") != NULL) {
2948 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_photo);
2950 show_toast(ad, "Unsupported file.");
2953 show_toast(ad, "Unsupported file.");
2961 static void on_voice_record_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2963 if (result == APP_CONTROL_RESULT_SUCCEEDED) {
2964 Evas_Object* chat_scroller = user_data;
2966 char* file_path = NULL;
2967 char** path_arryay = NULL;
2968 int array_length = 0;
2970 char* mime_type = NULL;
2971 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2973 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay, &array_length);
2974 if (status != APP_CONTROL_ERROR_NONE) {
2975 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay, &array_length);
2976 if (status != APP_CONTROL_ERROR_NONE) {
2978 show_toast(ad, "Unable to get the result from attach panel");
2984 status = app_control_get_mime(reply, &mime_type);
2985 if (status != APP_CONTROL_ERROR_NONE) {
2987 show_toast(ad, "Unable to get the mime type from attach panel");
2992 for(int i = 0 ; i < array_length ; i++) {
2993 file_path = strdup(path_arryay[i]);
2994 send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3001 void on_contact_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3003 if (result == APP_CONTROL_RESULT_SUCCEEDED) {
3005 Evas_Object* chat_scroller = user_data;
3006 char *contact_name = NULL;
3007 char *phone_number = NULL;
3008 app_control_get_extra_data(reply, "http://tizen.org/appcontrol/data/name", &contact_name);
3009 app_control_get_extra_data(reply, "http://tizen.org/appcontrol/data/phone", &phone_number);
3014 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)
3016 switch(content_category) {
3017 case ATTACH_PANEL_CONTENT_CATEGORY_IMAGE:
3018 case ATTACH_PANEL_CONTENT_CATEGORY_CAMERA:
3019 on_gallery_app_control_reply_cb(NULL, result, result_code, user_data);
3021 case ATTACH_PANEL_CONTENT_CATEGORY_VIDEO:
3022 case ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER:
3023 on_video_app_control_reply_cb(NULL, result, result_code, user_data);
3025 case ATTACH_PANEL_CONTENT_CATEGORY_VOICE:
3026 on_voice_record_reply_cb(NULL, result, result_code, user_data);
3028 case ATTACH_PANEL_CONTENT_CATEGORY_MYFILES:
3029 case ATTACH_PANEL_CONTENT_CATEGORY_AUDIO:
3030 on_file_app_control_reply_cb(NULL, result, result_code, user_data);
3032 case ATTACH_PANEL_CONTENT_CATEGORY_CONTACT:
3033 on_contact_app_control_reply_cb(NULL, result, result_code, user_data);
3041 void on_media_type_selected_cb(void *data, Evas_Object *obj, void *event_info)
3043 Evas_Object* chat_scroller = data;
3044 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3045 const char *label = elm_object_item_text_get((Elm_Object_Item *) event_info);
3046 if (strcasecmp(label, POPUP_TEXT_TAKE_GALLERY) == 0) {
3047 app_control_h app_control;
3048 int ret = app_control_create(&app_control);
3049 if(ret != APP_CONTROL_ERROR_NONE) {
3050 show_toast(ad, "Error: Can not load image picker");
3054 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3056 app_control_set_mime(app_control,"image/*");
3057 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3058 app_control_send_launch_request(app_control, &on_gallery_app_control_reply_cb, data);
3059 app_control_destroy(app_control);
3060 } else if (strcasecmp(label, POPUP_TEXT_TAKE_PHOTO) == 0) {
3061 app_control_h app_control;
3062 int ret = app_control_create(&app_control);
3063 if(ret != APP_CONTROL_ERROR_NONE) {
3064 show_toast(ad, "Error: Can not load image picker");
3067 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3068 app_control_set_mime(app_control,"image/jpg");
3069 //app_control_add_extra_data(app_control, "crop", "caller_id");
3070 app_control_send_launch_request(app_control, &on_gallery_app_control_reply_cb, data);
3071 app_control_destroy(app_control);
3072 } else if (strcasecmp(label, POPUP_TEXT_TAKE_VIDEO) == 0) {
3073 app_control_h app_control;
3074 int ret = app_control_create(&app_control);
3075 if(ret != APP_CONTROL_ERROR_NONE) {
3076 show_toast(ad, "Error: Can not load image picker");
3080 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3082 int remain_byte_size = 10485760;
3083 int request_KB_size = 0;
3085 if (remain_byte_size >= 1024) {
3086 request_KB_size = remain_byte_size / 1024;
3088 // TODO: Need to check minimum size for recording
3089 request_KB_size = 1;
3092 char recording_size[128] = {0, };
3093 snprintf(recording_size, sizeof(recording_size), "%d", request_KB_size);
3094 app_control_set_mime(app_control,"video/3gp");
3095 app_control_add_extra_data(app_control, "LIMIT", recording_size);
3096 app_control_add_extra_data(app_control, "RESOLUTION", "VGA");
3097 app_control_add_extra_data(app_control, "CALLER", "telegram");
3099 app_control_send_launch_request(app_control, &on_video_app_control_reply_cb, data);
3100 app_control_destroy(app_control);
3101 } else if (strcasecmp(label, POPUP_TEXT_TAKE_AUDIO) == 0) {
3103 app_control_h app_control;
3104 int ret = app_control_create(&app_control);
3105 if(ret != APP_CONTROL_ERROR_NONE) {
3106 show_toast(ad, "Error: Can not load image picker");
3110 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3112 int size = 10485760;
3114 int remain_byte_size = (int)size;
3115 int request_KB_size = 0;
3117 if (remain_byte_size >= 1024) {
3118 request_KB_size = remain_byte_size / 1024;
3120 // TODO: Need to check minimum size for recording
3121 request_KB_size = 1;
3124 char recording_size[128] = {0, };
3125 snprintf(recording_size, sizeof(recording_size), "%d", request_KB_size);
3126 app_control_add_extra_data(app_control, "SIZE", recording_size);
3127 app_control_set_mime(app_control,"audio/*");
3128 app_control_send_launch_request(app_control, &on_voice_record_reply_cb, data);
3129 app_control_destroy(app_control);
3131 } else if (strcasecmp(label, POPUP_TEXT_TAKE_FILE) == 0) {
3132 app_control_h app_control;
3133 int ret = app_control_create(&app_control);
3134 if(ret != APP_CONTROL_ERROR_NONE) {
3135 show_toast(ad, "Error: Can not load image picker");
3139 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3141 app_control_set_mime(app_control,"*/*");
3142 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3143 app_control_send_launch_request(app_control, &on_file_app_control_reply_cb, data);
3144 app_control_destroy(app_control);
3146 } else if (strcasecmp(label, POPUP_TEXT_TAKE_LOCATION) == 0) {
3147 app_control_h app_control;
3148 int ret = app_control_create(&app_control);
3149 if(ret != APP_CONTROL_ERROR_NONE) {
3150 show_toast(ad, "Error: Can not load location picker");
3153 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3154 //app_control_set_app_id(app_control, "com.here.tizen.maps");
3155 app_control_set_uri(app_control, "geo");
3156 app_control_send_launch_request(app_control, &on_location_app_control_reply_cb, data);
3157 app_control_destroy(app_control);
3158 } else if (strcasecmp(label, POPUP_TEXT_TAKE_CONTACT) == 0) {
3159 app_control_h app_control;
3160 int ret = app_control_create(&app_control);
3161 if(ret != APP_CONTROL_ERROR_NONE) {
3162 show_toast(ad, "Error: Can not load location picker");
3165 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3166 app_control_set_mime(app_control,"application/vnd.tizen.contact");
3167 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3168 app_control_send_launch_request(app_control, &on_contact_app_control_reply_cb, data);
3169 app_control_destroy(app_control);
3172 evas_object_del(obj);
3176 void popup_move_dropdown(Evas_Object *ctxpopup, Evas_Object *btn)
3178 Evas_Coord x, y, w , h;
3179 evas_object_geometry_get(btn, &x, &y, &w, &h);
3180 evas_object_move(ctxpopup, x + (w / 2), y + h - 50);
3183 void on_media_attach_dismissed_cb(void *data, Evas_Object *obj, void *event_info)
3185 evas_object_del(obj);
3188 static void on_media_attach_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
3190 Evas_Object* chat_scroller = data;
3191 appdata_s *ad = evas_object_data_get(chat_scroller, "app_data");
3192 attach_panel_h attach_panel = NULL;
3194 bool visible = false;
3196 attach_panel = evas_object_data_get(ad->conform, "attach_panel");
3198 if (attach_panel_get_visibility(attach_panel, &visible) != ATTACH_PANEL_ERROR_NONE) {
3202 attach_panel_show(attach_panel);
3207 ret = attach_panel_create(ad->conform, &attach_panel);
3209 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, NULL);
3210 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA, NULL);
3211 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE, NULL);
3212 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO, NULL);
3213 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_AUDIO, NULL);
3214 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CONTACT, NULL);
3215 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_MYFILES, NULL);
3216 attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER, NULL);
3217 attach_panel_set_result_cb(attach_panel, _result_cb, chat_scroller);
3219 attach_panel_show(attach_panel);
3220 evas_object_data_set(ad->conform, "attach_panel", attach_panel);
3225 static void on_text_message_send_pressed(void *data, Evas_Object *obj, void *event_info)
3227 elm_image_file_set(data, ui_utils_get_resource(SEND_UNPRESSED_ICON), NULL);
3230 static void on_text_message_send_unpressed(void *data, Evas_Object *obj, void *event_info)
3232 elm_image_file_set(data, ui_utils_get_resource(SEND_PRESSED_ICON), NULL);
3236 void on_message_back_button_clicked(void *data, Evas_Object *obj, void *event_info)
3238 appdata_s *ad = data;
3242 app_nf_back_cb(data, obj, event_info);
3245 void on_user_info_button_clicked(void *data, Evas_Object *obj, void *event_info)
3247 appdata_s *ad = data;
3249 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
3250 tg_peer_info_s *user_data = sel_item->use_data;
3252 if (!sel_item || !user_data) {
3253 show_toast(ad, "Can not display user info");
3257 if (user_data->peer_type == TGL_PEER_USER) {
3258 launch_user_info_screen(ad, user_data->peer_id);
3259 } else if (user_data->peer_type == TGL_PEER_CHAT) {
3260 launch_chat_info_screen(ad, user_data->peer_id);
3266 void refresh_messaging_view(appdata_s *ad)
3271 Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
3274 Evas_Object *box_layout = NULL;
3275 Evas_Object *box = NULL;
3276 Eina_List *list = NULL;
3277 Eina_List *box_list = NULL;
3278 Evas_Object *last_item = NULL;
3280 box_layout = elm_object_content_get(scroller);
3282 LOGE("Fail to get the box into scroller");
3285 list = elm_box_children_get(box_layout);
3287 LOGE("Fail to get the list into box");
3291 box = eina_list_nth(list, 0);
3293 LOGE("Fail to get the box into box layout");
3297 box_list = elm_box_children_get(box);
3299 LOGE("Fail to get the box_list into box");
3303 last_item = eina_list_nth(box_list, eina_list_count(box_list)-1);
3305 LOGE("Fail to get the last item into box");
3310 evas_object_geometry_get(last_item, &x, &y, NULL, NULL);
3312 elm_scroller_region_show(scroller, x, y, -1, -1);
3314 eina_list_free(box_list);
3315 eina_list_free(list);
3319 static void on_expand_button_clicked(void *data, Evas_Object *obj, void *event_info)
3321 Evas_Object *expand_pic = data;
3325 appdata_s *ad = evas_object_data_get(expand_pic, "app_data");
3326 Evas_Object *parent_layout = evas_object_data_get(expand_pic, "parent_layout");
3328 Eina_Bool is_expanded = (Eina_Bool)evas_object_data_get(expand_pic, "is_expanded");
3332 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_CLOSE), NULL);
3334 Evas_Object *grp_names_bg = elm_bg_add(ad->nf);
3335 evas_object_size_hint_align_set(grp_names_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
3336 evas_object_size_hint_weight_set(grp_names_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3337 evas_object_color_set(grp_names_bg, 45, 165, 224, 202);
3338 elm_image_resizable_set(grp_names_bg, EINA_TRUE, EINA_TRUE);
3339 elm_image_fill_outside_set(grp_names_bg, EINA_TRUE);
3340 evas_object_show(grp_names_bg);
3341 elm_object_part_content_set(parent_layout, "swallow.group_detail_box,bg", grp_names_bg);
3343 Evas_Object* grp_names_lbl = elm_entry_add(ad->nf);
3344 elm_entry_cursor_end_set(grp_names_lbl);
3345 evas_object_size_hint_weight_set(grp_names_lbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3346 evas_object_size_hint_align_set(grp_names_lbl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3347 elm_entry_single_line_set(grp_names_lbl, EINA_FALSE);
3348 elm_entry_scrollable_set (grp_names_lbl, EINA_TRUE);
3349 elm_entry_cnp_mode_set(grp_names_lbl, ELM_CNP_MODE_NO_IMAGE);
3350 elm_entry_context_menu_disabled_set(grp_names_lbl, EINA_TRUE);
3351 elm_object_focus_set(grp_names_lbl, EINA_FALSE);
3352 elm_entry_editable_set(grp_names_lbl, EINA_FALSE);
3354 evas_object_show(grp_names_lbl);
3356 char *names_of_buddies = evas_object_data_get(ad->nf, "names_of_buddies");
3357 if (names_of_buddies) {
3358 int len = strlen(names_of_buddies);
3359 char *names_str = (char*)malloc(len + 256);
3360 sprintf(names_str, "<font=Tizen:style=Bold color=#FAFAFA align=center><font_size=40>%s</font_size></font>",names_of_buddies);
3361 elm_object_text_set(grp_names_lbl, names_str);
3365 elm_object_part_content_set(parent_layout, "swallow.group_detail_box", grp_names_lbl);
3369 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_OPEN), NULL);
3371 Evas_Object *grp_names_lbl = elm_object_part_content_get(parent_layout, "swallow.group_detail_box");
3372 if (grp_names_lbl) {
3373 evas_object_del(grp_names_lbl);
3374 grp_names_lbl = NULL;
3377 Evas_Object *grp_names_bg = elm_object_part_content_get(parent_layout, "swallow.group_detail_box,bg");
3379 evas_object_del(grp_names_bg);
3380 grp_names_bg = NULL;
3383 is_expanded = !is_expanded;
3384 evas_object_data_set(expand_pic, "is_expanded", (void *)is_expanded);
3387 static Eina_Bool _pop_cb(void *data, Elm_Object_Item *it)
3389 appdata_s *ad = data;
3390 attach_panel_h attach_panel = NULL;
3392 LOGE("Failed to get the ad");
3395 attach_panel = evas_object_data_get(ad->conform, "attach_panel");
3397 attach_panel_hide(attach_panel);
3403 static void _edge_cb(void *data, Evas_Object *scroller, void *event_info)
3405 Evas_Object *layout = data;
3406 int is_end_edge = 0;
3407 is_end_edge = (int)evas_object_data_get(layout, "is_end_edge");
3410 elm_object_signal_emit(layout, "hide", "bubblemessage");
3411 evas_object_data_set(layout, "is_end_edge", (void *) 1);
3415 static void _scroll_cb(void *data, Evas_Object *scroller, void *event_info)
3417 Evas_Object *layout = data;
3418 evas_object_data_set(layout, "is_end_edge", (void *) 0);
3421 void launch_messaging_view_cb(appdata_s* ad, int user_id)
3426 if (ad->msg_popup) {
3427 evas_object_del(ad->msg_popup);
3428 ad->msg_popup = NULL;
3431 delete_floating_button(ad);
3433 ad->current_app_state = TG_CHAT_MESSAGING_VIEW_STATE;
3434 ad->is_last_msg_changed = EINA_FALSE;
3435 send_request_for_server_connection_status(ad, ad->service_client);
3436 char edj_path[PATH_MAX] = {0, };
3437 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
3439 Evas_Object *layout = elm_layout_add(ad->nf);
3440 elm_layout_file_set(layout, edj_path, "chat_messaging_layout");
3441 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3442 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3443 evas_object_show(layout);
3445 peer_with_pic_s *sel_item = eina_list_nth(ad->peer_list, user_id);
3446 tg_peer_info_s* user = sel_item->use_data;
3448 /*************************** START: message list ************************************/
3450 Evas_Object* msg_box_layout = elm_layout_add(ad->nf);
3451 elm_layout_file_set(msg_box_layout, edj_path, "custom_gen_list");
3452 evas_object_size_hint_weight_set(msg_box_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3453 evas_object_size_hint_align_set(msg_box_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3454 evas_object_show(msg_box_layout);
3456 Evas_Object *list_bg = elm_image_add(msg_box_layout);
3457 evas_object_size_hint_align_set(list_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
3458 evas_object_size_hint_weight_set(list_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3459 if (ad->chat_background) {
3460 elm_image_file_set(list_bg, ad->chat_background, NULL);
3462 //elm_image_file_set(list_bg, ui_utils_get_resource(TG_CHAT_DEFAULT_BG), NULL);
3464 elm_image_resizable_set(list_bg, EINA_TRUE, EINA_TRUE);
3465 elm_image_fill_outside_set(list_bg, EINA_TRUE);
3466 evas_object_show(list_bg);
3468 elm_object_part_content_set(msg_box_layout, "swallow.gen_list.bg", list_bg);
3470 Evas_Object *chat_scroller = elm_scroller_add(ad->nf);
3471 evas_object_size_hint_weight_set(chat_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3472 evas_object_size_hint_align_set(chat_scroller, EVAS_HINT_FILL, 0.0);
3473 elm_scroller_policy_set(chat_scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
3474 evas_object_show(chat_scroller);
3475 evas_object_smart_callback_add(chat_scroller, "scroll", _scroll_cb, layout);
3476 evas_object_smart_callback_add(chat_scroller, "edge,bottom", _edge_cb, layout);
3477 evas_object_data_set(layout, "is_end_edge", (void *) 1);
3479 Evas_Object *align_box = elm_box_add(chat_scroller);
3481 LOGE("fail to add the box");
3485 elm_box_horizontal_set(align_box, EINA_FALSE);
3486 elm_box_align_set(align_box, 0.5, 0.0);
3487 evas_object_size_hint_weight_set(align_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3488 evas_object_size_hint_align_set(align_box, EVAS_HINT_FILL, 0.0);
3489 elm_object_content_set(chat_scroller, align_box);
3490 evas_object_show(align_box);
3492 Evas_Object *chat_box = elm_box_add(chat_scroller);
3494 LOGE("fail to add the box");
3497 elm_box_horizontal_set(chat_box, EINA_FALSE);
3498 elm_box_align_set(chat_box, 0.5, 0.0);
3499 evas_object_size_hint_weight_set(chat_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3500 evas_object_size_hint_align_set(chat_box, EVAS_HINT_FILL, 0.0);
3501 evas_object_show(chat_box);
3502 elm_box_pack_end(align_box, chat_box);
3503 evas_object_event_callback_add(chat_box, EVAS_CALLBACK_RESIZE, __resize_cb, ad);
3505 elm_object_part_content_set(msg_box_layout, "swallow.gen_list", chat_scroller);
3506 elm_object_part_content_set(layout, "swallow.chat_box", msg_box_layout);
3508 /********************** START: entry layout*******************************/
3509 Evas_Object* entry_box_layout = elm_layout_add(ad->win);
3510 if (!entry_box_layout) {
3511 LOGE("Fail to add the entry box layout");
3514 elm_layout_file_set(entry_box_layout, edj_path, "chat_entry_box");
3515 evas_object_size_hint_align_set(entry_box_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3516 evas_object_size_hint_weight_set(entry_box_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3517 evas_object_show(entry_box_layout);
3519 Evas_Object *entry_layout = elm_layout_add(entry_box_layout);
3520 if (!entry_layout) {
3521 LOGE("Fail to add the entry_layout");
3523 elm_layout_theme_set(entry_layout, "layout", "editfield", "singleline");
3525 Evas_Object* text_entry = elm_entry_add(entry_layout);
3527 LOGE("Fail to add the text_entry");
3530 elm_object_part_text_set(text_entry, "elm.guide", "Text message");
3531 elm_entry_line_wrap_set(text_entry, EINA_TRUE);
3532 elm_entry_scrollable_set(text_entry, EINA_TRUE);
3533 evas_object_size_hint_align_set(text_entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
3534 evas_object_size_hint_weight_set(text_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3535 evas_object_show(text_entry);
3536 evas_object_data_set(entry_box_layout, "is_attach_show", (void *) 1);
3538 elm_object_part_content_set(entry_layout, "elm.swallow.content", text_entry);
3539 evas_object_smart_callback_add(text_entry, "changed", on_message_text_entry_changed, entry_box_layout);
3540 evas_object_smart_callback_add(text_entry, "preedit,changed", on_message_text_entry_changed, entry_box_layout);
3541 evas_object_smart_callback_add(text_entry, "clicked", on_message_text_entry_clicked, NULL);
3542 elm_object_part_content_set(entry_box_layout, "swallow.text_entry", entry_layout);
3544 /* button clicked event */
3545 elm_object_signal_callback_add(entry_box_layout, "smile", "clicked", on_message_smiley_clicked, text_entry);
3546 elm_object_signal_callback_add(entry_box_layout, "attach", "clicked", on_media_attach_clicked, chat_scroller);
3547 elm_object_signal_callback_add(entry_box_layout, "send", "clicked", on_text_message_send_clicked, chat_scroller);
3548 elm_object_part_content_set(layout, "swallow.entry", entry_box_layout);
3550 /********************** END: entry layout*******************************/
3552 /************************* START: message bubble ************************/
3554 Evas_Object* bubble_layout = elm_layout_add(ad->win);
3555 if (!bubble_layout) {
3556 LOGE("Fail to add the bubble_layout");
3559 elm_layout_file_set(bubble_layout, edj_path, "bubble_layout");
3560 evas_object_size_hint_align_set(bubble_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3561 evas_object_size_hint_weight_set(bubble_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3562 evas_object_show(bubble_layout);
3563 elm_object_signal_callback_add(bubble_layout, "cancel", "clicked", on_message_cancel_clicked, layout);
3564 elm_object_part_content_set(layout, "swallow.messagebubble", bubble_layout);
3565 evas_object_data_set(ad->nf, "main_layout", layout);
3567 /********************** END: entry message bubble*******************************/
3569 evas_object_data_set(ad->nf, "chat_list", (void*)chat_scroller);
3570 evas_object_data_set(chat_scroller, "app_data", ad);
3571 evas_object_data_set(chat_scroller, "user_id", (void*)user_id);
3572 evas_object_data_set(chat_scroller, "text_entry", (void*)text_entry);
3574 /* Set the name in title area */
3576 char temp_name[512] = {'\0'};
3578 if ((user->peer_type == TGL_PEER_USER) && get_buddy_unknown_status(user->peer_id)) {
3579 snprintf(temp_name, 512, "%s", get_buddy_phone_num_from_id(sel_item->use_data->peer_id));
3581 char* user_name = replace(sel_item->use_data->print_name, '_', " ");
3582 snprintf(temp_name, 512, "%s", user_name);
3586 Elm_Object_Item *nf_it = elm_naviframe_item_push(ad->nf, temp_name, NULL, NULL, layout, NULL);
3587 evas_object_data_set(ad->nf, "navi_item", nf_it);
3589 on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
3591 Evas_Object *back_btn = create_button(ad->nf, "naviframe/back_btn/default", NULL);
3592 evas_object_smart_callback_add(back_btn, "clicked", on_message_back_button_clicked, ad);
3593 elm_object_item_part_content_set(nf_it, "elm.swallow.prev_btn", back_btn);
3594 elm_naviframe_item_pop_cb_set(nf_it, _pop_cb, ad);
3596 /******************** expand ************************/
3597 if (user->peer_type == TGL_PEER_CHAT) {
3598 Evas_Object *expand_pic = NULL;
3599 expand_pic = elm_image_add(layout);
3600 evas_object_size_hint_weight_set(expand_pic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3601 evas_object_size_hint_align_set(expand_pic, EVAS_HINT_FILL, EVAS_HINT_FILL);
3602 elm_object_focus_set(expand_pic, EINA_FALSE);
3603 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_OPEN), NULL);
3604 evas_object_show(expand_pic);
3605 evas_object_data_set(expand_pic, "app_data", ad);
3606 evas_object_data_set(expand_pic, "parent_layout", layout);
3608 Eina_Bool is_expanded = EINA_FALSE;
3609 evas_object_data_set(expand_pic, "is_expanded", is_expanded);
3610 Evas_Object* expand_btn = elm_button_add(ad->layout);
3611 elm_object_style_set(expand_btn, "transparent");
3612 evas_object_smart_callback_add(expand_btn, "clicked", on_expand_button_clicked, expand_pic);
3613 elm_object_content_set(expand_btn, expand_pic);
3614 evas_object_show(expand_btn);
3615 elm_object_item_part_content_set(nf_it, "title_right_btn", expand_btn);
3618 /******************** expand ************************/
3620 Eina_Bool ret = load_chat_history(chat_scroller);
3622 int buddy_id = sel_item->use_data->peer_id;
3623 char* tablename = get_table_name_from_number(buddy_id);
3625 Eina_Bool res = set_all_rows_read(tablename);
3632 LOGD("There is no message in chat room");
3634 elm_object_part_text_set(layout, "no_msg_text", i18n_get_text("IDS_TGRAM_BODY_NO_MESSAGES_HERE_YET_ING"));
3635 elm_object_signal_emit(layout, "show", "message");
3636 evas_object_data_set(ad->nf, "chat_list_no_msg_text", layout);
3639 send_request_for_marked_as_read(ad, ad->service_client, sel_item->use_data->peer_id, sel_item->use_data->peer_type);
3640 eext_object_event_callback_add(ad->nf, EEXT_CALLBACK_MORE, on_messaging_menu_button_clicked, ad);