[Telegram] Modify the push type; pack_end and pack_start
[apps/native/telegram-tizen.git] / TelegramTizen / src / tg_messaging_view.c
1 /*
2     This file is part of Telegram application for tizen
3
4     This library is free software; you can redistribute it and/or
5     modify it under the terms of the GNU Lesser General Public
6     License as published by the Free Software Foundation; either
7     version 2.1 of the License, or (at your option) any later version.
8
9     This library is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12     Lesser General Public License for more details.
13
14     You should have received a copy of the GNU Lesser General Public
15     License along with this library; if not, write to the Free Software
16     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17 */
18
19 #include "tg_messaging_view.h"
20 #include "tg_db_wrapper.h"
21 #include "server_requests.h"
22 #include <attach_panel.h>
23 #include <mime_type.h>
24 #include <Elementary.h>
25 #include "tg_user_info_view.h"
26 #include "tg_chat_info_view.h"
27 #include "tg_audio_player.h"
28 #include <metadata_extractor.h>
29 #include "tg_search_peer_view.h"
30
31 typedef struct buddies_name_and_id{
32         char *name;
33         int id;
34 }buddies_info;
35
36 static int scroller_show_bottom_edge(Evas_Object *scroller)
37 {
38         if (!scroller) {
39                 LOGE("Cannot get the scroller");
40                 return 0;
41         }
42         Evas_Object *box_layout = NULL;
43         Evas_Object *box = NULL;
44         Eina_List *list = NULL;
45
46         box_layout = elm_object_content_get(scroller);
47         if (!box_layout) {
48                 LOGE("Fail to get the box into scroller");
49                 return 0;
50         }
51         list = elm_box_children_get(box_layout);
52         if (!list) {
53                 LOGE("Fail to get the list into box");
54                 return 0;
55         }
56
57         box = eina_list_nth(list, 0);
58         if (!box) {
59                 LOGE("Fail to get the box into box layout");
60                 return 0;
61         }
62
63         int h;
64         evas_object_geometry_get(box, NULL, NULL, NULL, &h);
65         elm_scroller_region_show(scroller, 0, h, 720, 1280);
66
67         eina_list_free(list);
68
69         return 1;
70 }
71
72 static int scroller_previous_region_get(Evas_Object *scroller)
73 {
74         if (!scroller) {
75                 LOGE("Cannot get the scroller");
76                 return 0;
77         }
78         Evas_Object *box_layout = NULL;
79         Evas_Object *box = NULL;
80         Eina_List *list = NULL;
81
82         box_layout = elm_object_content_get(scroller);
83         if (!box_layout) {
84                 LOGE("Fail to get the box into scroller");
85                 return 0;
86         }
87         list = elm_box_children_get(box_layout);
88         if (!list) {
89                 LOGE("Fail to get the list into box");
90                 return 0;
91         }
92
93         box = eina_list_nth(list, 0);
94         if (!box) {
95                 LOGE("Fail to get the box into box layout");
96                 return 0;
97         }
98
99         int h;
100         evas_object_geometry_get(box, NULL, NULL, NULL, &h);
101
102         eina_list_free(list);
103
104         return h;
105 }
106
107 static int scroller_show_previous_region(Evas_Object *scroller)
108 {
109         if (!scroller) {
110                 LOGE("Cannot get the scroller");
111                 return 0;
112         }
113         Evas_Object *box_layout = NULL;
114         Evas_Object *box = NULL;
115         Eina_List *list = NULL;
116
117         box_layout = elm_object_content_get(scroller);
118         if (!box_layout) {
119                 LOGE("Fail to get the box into scroller");
120                 return 0;
121         }
122         list = elm_box_children_get(box_layout);
123         if (!list) {
124                 LOGE("Fail to get the list into box");
125                 return 0;
126         }
127
128         box = eina_list_nth(list, 0);
129         if (!box) {
130                 LOGE("Fail to get the box into box layout");
131                 return 0;
132         }
133
134         int h,prev_h;
135         prev_h = (int)evas_object_data_get(scroller, "previous_h");
136         evas_object_geometry_get(box, NULL, NULL, NULL, &h);
137         elm_scroller_region_show(scroller, 0, (h-prev_h), 720, 1280);
138
139         eina_list_free(list);
140
141         return 1;
142 }
143
144 static void scroller_push_item(Evas_Object *scroller, Evas_Object *item, int prepand)
145 {
146         Evas_Object *box_layout = NULL;
147         Evas_Object *box = NULL;
148         Eina_List *list = NULL;
149
150         box_layout = elm_object_content_get(scroller);
151         if (!box_layout) {
152                 LOGE("Fail to get the box into scroller");
153                 return;
154         }
155
156         list = elm_box_children_get(box_layout);
157         if (!list) {
158                 LOGE("Fail to get the list into box");
159                 return;
160         }
161
162         box = eina_list_nth(list, 0);
163         if (!box) {
164                 LOGE("Fail to get the box into box layout");
165                 return;
166         }
167
168         eina_list_free(list);
169
170         if (!prepand) {
171                 elm_box_pack_end(box, item);
172
173         } else {
174                 elm_box_pack_start(box, item);
175                 //elm_box_recalculate(box);
176         }
177
178         return;
179 }
180
181 /************************ Menu Handler ********************/
182
183 void on_messaging_menu_option_selected_cb(void *data, Evas_Object *obj, void *event_info)
184 {
185         appdata_s *ad = data;
186         Elm_Object_Item *it = event_info;
187         elm_genlist_item_selected_set(it, EINA_FALSE);
188         int id = (int)elm_object_item_data_get(it);
189
190
191         peer_with_pic_s  *sel_item = ad->peer_in_cahtting_data;
192         tg_peer_info_s *user_data = sel_item->use_data;
193
194         if (!sel_item || !user_data) {
195                 show_toast(ad, "There are no messages to delete.");
196                 if (ad->msg_popup) {
197                         evas_object_del(ad->msg_popup);
198                         ad->msg_popup = NULL;
199                 }
200                 return;
201         }
202
203
204         if (get_buddy_unknown_status(user_data->peer_id) && user_data->peer_type == TGL_PEER_USER) {
205
206                 if (id == 0) {
207                         ad->is_loading_from_msg_view = EINA_TRUE;
208                         on_create_new_contact(ad);
209                 } else if (id == 1) {
210
211                         // mark all the massages for deletion.
212                         char* tablename = get_table_name_from_number(user_data->peer_id);
213                         mark_all_records_for_deletion(tablename);
214                         // delete date messages
215                         delete_date_messages_from_table(tablename);
216                         free(tablename);
217                         // clear screen
218                         // clear all messages
219                         Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
220
221
222                         Evas_Object *box_layout = NULL;
223                         Evas_Object *box = NULL;
224                         Eina_List *list = NULL;
225
226                         box_layout = elm_object_content_get(scroller);
227                         if (!box_layout) {
228                                 LOGE("Fail to get the box into scroller");
229                                 return;
230                         }
231
232                         list = elm_box_children_get(box_layout);
233                         if (!list) {
234                                 LOGE("Fail to get the list into box");
235                                 return;
236                         }
237
238                         box = eina_list_nth(list, 0);
239                         if (!box) {
240                                 LOGE("Fail to get the box into box layout");
241                                 return;
242                         }
243
244                         eina_list_free(list);
245                         elm_box_clear(box);
246                         elm_box_recalculate(box);
247
248
249                         // send request to server
250                         send_delete_group_chat_request(ad, ad->service_client, user_data->peer_id);
251
252                         if (ad->main_item_in_cahtting_data) {
253                                 tg_main_list_item_s* old_item = ad->main_item_in_cahtting_data;
254                                 if (old_item->last_message) {
255                                         free(old_item->last_message);
256                                         old_item->last_message = NULL;
257                                 }
258                                 old_item->last_message = strdup("");
259                         }
260
261                         Evas_Object *nomsg_layout = evas_object_data_get(ad->nf, "chat_list_no_msg_text");
262                         if (nomsg_layout) {
263                                 elm_object_signal_emit(nomsg_layout, "show", "message");
264                         }
265
266                 } else {
267                         char* tablename = get_table_name_from_number(user_data->peer_id);
268                         delete_all_records(tablename);
269                         free(tablename);
270
271                         // clear all messages
272                         Evas_Object *genlist = evas_object_data_get(ad->nf, "chat_list");
273                         elm_genlist_clear(genlist);
274
275                         // remove main item from main list
276                         if (ad->main_item_in_cahtting_data) {
277                                 tg_main_list_item_s* old_item = ad->main_item_in_cahtting_data;
278                                 if (old_item->peer_print_name) {
279                                         free(old_item->peer_print_name);
280                                         old_item->peer_print_name = NULL;
281                                 }
282                                 if (old_item->last_message) {
283                                         free(old_item->last_message);
284                                         old_item->last_message = NULL;
285                                 }
286                                 if (old_item->profile_pic_path) {
287                                         free(old_item->profile_pic_path);
288                                         old_item->profile_pic_path = NULL;
289                                 }
290                                 old_item->date_lbl = NULL;
291                                 old_item->msg_status_lbl = NULL;
292                                 old_item->main_item_layout = NULL;
293                                 old_item->profile_pic = NULL;
294                                 old_item->profile_pic_path = NULL;
295                                 old_item->status_lbl = NULL;
296                                 old_item->user_name_lbl = NULL;
297                                 ad->main_list = eina_list_remove(ad->main_list,  ad->main_item_in_cahtting_data);
298
299                                 ad->main_item_in_cahtting_data = NULL;
300                         }
301
302                         ad->is_last_msg_changed = EINA_FALSE;
303
304
305                         app_nf_back_cb(ad, NULL, NULL);
306                 }
307                 if (ad->msg_popup) {
308                         evas_object_del(ad->msg_popup);
309                         ad->msg_popup = NULL;
310                 }
311                 return;
312         }
313
314         if (user_data->peer_type == TGL_PEER_USER) {
315                 if (id == 0) {
316                         launch_user_info_screen(ad, user_data->peer_id);
317                 } else if (id == 1) {
318                         // mark all the massages for deletion.
319                         char* tablename = get_table_name_from_number(user_data->peer_id);
320                         mark_all_records_for_deletion(tablename);
321                         // delete date messages
322                         delete_date_messages_from_table(tablename);
323                         free(tablename);
324                         // clear screen
325                         // clear all messages
326                         Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
327
328
329                         Evas_Object *box_layout = NULL;
330                         Evas_Object *box = NULL;
331                         Eina_List *list = NULL;
332
333                         box_layout = elm_object_content_get(scroller);
334                         if (!box_layout) {
335                                 LOGE("Fail to get the box into scroller");
336                                 return;
337                         }
338
339                         list = elm_box_children_get(box_layout);
340                         if (!list) {
341                                 LOGE("Fail to get the list into box");
342                                 return;
343                         }
344
345                         box = eina_list_nth(list, 0);
346                         if (!box) {
347                                 LOGE("Fail to get the box into box layout");
348                                 return;
349                         }
350
351                         eina_list_free(list);
352                         elm_box_clear(box);
353                         elm_box_recalculate(box);
354
355                         // send request to server
356                         send_delete_all_messages_request(ad, ad->service_client, user_data->peer_id, user_data->peer_type);
357
358                         Evas_Object *nomsg_layout = evas_object_data_get(ad->nf, "chat_list_no_msg_text");
359                         if (nomsg_layout) {
360                                 elm_object_signal_emit(nomsg_layout, "show", "message");
361                         }
362                 }  else if (id == 2) {
363                         show_loading_popup(ad);
364                         char* tablename = get_table_name_from_number(user_data->peer_id);
365                         delete_all_records(tablename);
366                         free(tablename);
367
368                         elm_naviframe_item_pop(ad->nf);
369                         load_registered_user_data(ad);
370                         load_buddy_list_data(ad);
371                         load_unknown_buddy_list_data(ad);
372                         load_peer_data(ad);
373                         load_main_list_data(ad);
374                         ecore_timer_add(1, on_load_main_view_requested, ad);
375                 }
376         } else if (user_data->peer_type == TGL_PEER_CHAT) {
377                 if (id == 0) {
378                         // mark all the massages for deletion.
379                         char* tablename = get_table_name_from_number(user_data->peer_id);
380                         mark_all_records_for_deletion(tablename);
381                         // delete date messages
382                         delete_date_messages_from_table(tablename);
383                         free(tablename);
384                         // clear screen
385                         // clear all messages
386                         Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
387
388
389                         Evas_Object *box_layout = NULL;
390                         Evas_Object *box = NULL;
391                         Eina_List *list = NULL;
392
393                         box_layout = elm_object_content_get(scroller);
394                         if (!box_layout) {
395                                 LOGE("Fail to get the box into scroller");
396                                 return;
397                         }
398
399                         list = elm_box_children_get(box_layout);
400                         if (!list) {
401                                 LOGE("Fail to get the list into box");
402                                 return;
403                         }
404
405                         box = eina_list_nth(list, 0);
406                         if (!box) {
407                                 LOGE("Fail to get the box into box layout");
408                                 return;
409                         }
410
411                         eina_list_free(list);
412                         elm_box_clear(box);
413                         elm_box_recalculate(box);
414
415                         send_delete_all_messages_request(ad, ad->service_client, user_data->peer_id, user_data->peer_type);
416
417                         Evas_Object *nomsg_layout = evas_object_data_get(ad->nf, "chat_list_no_msg_text");
418                         if (nomsg_layout) {
419                                 elm_object_signal_emit(nomsg_layout, "show", "message");
420                         }
421
422                 } else if (id == 1) {
423                         //send group chat delete request
424                         show_loading_popup(ad);
425                         send_delete_group_chat_request(ad, ad->service_client, user_data->peer_id);
426                 }
427         }
428
429         if (ad->msg_popup) {
430                 evas_object_del(ad->msg_popup);
431                 ad->msg_popup = NULL;
432         }
433         return;
434 }
435
436
437 char* on_messaging_menu_group_text_get_cb(void *data, Evas_Object *obj, const char *part)
438 {
439         int id = (int) data;
440         if (id == 0) {
441                 return strdup(i18n_get_text("IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3"));
442         } else {
443                 return strdup(i18n_get_text("IDS_TGRAM_OPT_DELETE"));
444         }
445 }
446
447 char* on_messaging_menu_text_get_cb(void *data, Evas_Object *obj, const char *part)
448 {
449         int id = (int) data;
450         appdata_s *ad = evas_object_data_get(obj, "app_data");
451         peer_with_pic_s  *sel_item = ad->peer_in_cahtting_data;
452         tg_peer_info_s *user_data = sel_item->use_data;
453         if ((user_data->peer_type == TGL_PEER_USER) && get_buddy_unknown_status(user_data->peer_id)) {
454             if (id == 0) {
455                 return strdup(i18n_get_text("IDS_TGRAM_OPT_ADD_TO_CONTACTS_ABB2"));
456             } else if (id == 1) {
457                 return strdup(i18n_get_text("IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3"));
458                 } else {
459                         return strdup(i18n_get_text("IDS_TGRAM_OPT_DELETE"));
460                 }
461         } else {
462                 if (id == 0) {
463                         return strdup(i18n_get_text("IDS_TGRAM_OPT_VIEW_PROFILE_ABB"));
464                 } else if (id == 1) {
465                         return strdup(i18n_get_text("IDS_TGRAM_OPT_CLEAR_HISTORY_ABB3"));
466                 } else {
467                         return strdup(i18n_get_text("IDS_TGRAM_OPT_DELETE"));
468                 }
469         }
470 }
471
472 void on_msg_popup_back_cb(void *data, Evas_Object *obj, void *event_info)
473 {
474         appdata_s *ad = data;
475         if (ad->msg_popup) {
476                 evas_object_del(ad->msg_popup);
477                 ad->msg_popup = NULL;
478         }
479 }
480
481 void on_messaging_menu_button_clicked(void *data, Evas_Object *obj, void *event_info)
482 {
483         appdata_s *ad = data;
484         if (ad->msg_popup || ad->current_app_state != TG_CHAT_MESSAGING_VIEW_STATE) {
485                 return;
486         }
487
488         static Elm_Genlist_Item_Class itc;
489         //Evas_Object *popup;
490         Evas_Object *genlist;
491         int i;
492         Evas_Object *win = ad->win;
493
494         ad->msg_popup = elm_popup_add(win);
495         elm_popup_align_set(ad->msg_popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
496         eext_object_event_callback_add(ad->msg_popup, EEXT_CALLBACK_BACK, on_msg_popup_back_cb, ad);
497         evas_object_size_hint_weight_set(ad->msg_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
498
499         evas_object_data_set(ad->msg_popup, "app_data", ad);
500
501         genlist = elm_genlist_add(ad->msg_popup);
502         evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
503         evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
504
505         evas_object_data_set(genlist, "app_data", ad);
506
507         itc.item_style = "default";
508         peer_with_pic_s  *sel_item = ad->peer_in_cahtting_data;
509         if (sel_item->use_data->peer_type == TGL_PEER_USER) {
510                 itc.func.text_get = on_messaging_menu_text_get_cb;
511         } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
512                 itc.func.text_get = on_messaging_menu_group_text_get_cb;
513         } else {
514
515         }
516
517         itc.func.content_get = NULL;
518         itc.func.state_get = NULL;
519         itc.func.del = NULL;
520
521         if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
522                 for (i = 0; i < 2; i++) {
523                         elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, on_messaging_menu_option_selected_cb, ad);
524                 }
525         } else {
526                 for (i = 0; i < 3; i++) {
527                         elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, on_messaging_menu_option_selected_cb, ad);
528                 }
529         }
530         evas_object_show(genlist);
531
532         elm_object_content_set(ad->msg_popup, genlist);
533         evas_object_show(ad->msg_popup);
534 }
535
536
537 /************************ Menu Handler ********************/
538
539
540
541
542 static Evas_Object *create_image_object_from_file(const char *icon_name, Evas_Object *parent)
543 {
544         Evas_Object *icon = elm_image_add(parent);
545         evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
546         evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
547         elm_image_file_set(icon, icon_name, NULL);
548         evas_object_show(icon);
549         return icon;
550 }
551
552 void on_chat_profile_pic_changed(appdata_s *ad, char *file_path)
553 {
554         if (!ad || !file_path) {
555                 return;
556         }
557
558         Evas_Object *profile_image = evas_object_data_get(ad->nf, "profile_picture");
559         if (profile_image) {
560                 elm_image_file_set(profile_image, file_path, NULL);
561         }
562
563 }
564
565 void on_group_chat_info_changed(appdata_s *ad, char *type_of_change)
566 {
567         if (!ad || !type_of_change) {
568                 return;
569         }
570         if (strstr(type_of_change, "edit_title") != NULL) {
571                 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
572                 if (sel_item) {
573                         tg_peer_info_s* user = sel_item->use_data;
574                         char* user_name = replace(sel_item->use_data->print_name, '_', " ");
575                         char temp_name[512] = {'\0'};
576                         snprintf(temp_name, 512, "%s", user_name);
577                         free(user_name);
578                         Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
579                         elm_object_item_part_text_set(nf_it, "title", temp_name);
580                 }
581         } else if (strstr(type_of_change, "delete_photo") != NULL) {
582
583         } else if (strstr(type_of_change, "add_user") != NULL) {
584                 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
585                 if (sel_item) {
586                         on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
587                 }
588         } else if (strstr(type_of_change, "delete_user") != NULL) {
589                 peer_with_pic_s *sel_item = ad->peer_in_cahtting_data;
590                 if (sel_item) {
591                         on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
592                 }
593         } else {
594
595         }
596 }
597
598 void on_sent_media_item_clicked(void* data, Evas_Object* layout, void* event_info)
599 {
600         appdata_s* ad = evas_object_data_get(layout, "app_data");
601         char* media_type_str = evas_object_data_get(layout, "media_type");
602         char* media_file = evas_object_data_get(layout, "media_file");
603
604         if (access(media_file, F_OK) != -1) {
605
606         } else {
607                 media_file = NULL;
608         }
609
610         if (media_file && strlen(media_file) > 0) {
611                 app_control_h app_control;
612                 int ret = app_control_create(&app_control);
613                 if (ret != APP_CONTROL_ERROR_NONE) {
614                         show_toast(ad, "Error: Can not load image");
615                         return;
616                 }
617                 app_control_set_operation(app_control, APP_CONTROL_OPERATION_VIEW);
618                 if (media_type_str && strstr(media_type_str, "video") != NULL) {
619                         app_control_set_mime(app_control, "video/*");
620                 } else if (media_type_str && strstr(media_type_str, "audio") != NULL) {
621                         app_control_set_mime(app_control, "audio/*");
622                 } else {
623                         app_control_set_mime(app_control, "image/*");
624                 }
625                 app_control_set_uri(app_control, media_file);
626
627                 app_control_send_launch_request(app_control, NULL, NULL);
628                 app_control_destroy(app_control);
629         }
630 }
631
632 static Evas_Object *get_gif_image_from_path(const char* path, Evas_Object* parent, char *key)
633 {
634         if (!path || !parent || !key) {
635                         return NULL;
636                 }
637         LOGD("key : %s", key);
638         Evas_Object *media_image = elm_image_add(parent);
639         elm_image_aspect_fixed_set(media_image, EINA_FALSE);
640         elm_image_file_set(media_image, path, key);
641         evas_object_size_hint_weight_set(media_image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
642         evas_object_size_hint_align_set(media_image, EVAS_HINT_FILL, EVAS_HINT_FILL);
643         evas_object_show(media_image);
644         return media_image;
645 }
646
647 static Evas_Object *get_image_from_path(const char* path, Evas_Object* parent)
648 {
649         if (!path || !parent) {
650                 return NULL;
651         }
652         Evas_Object *media_image = elm_image_add(parent);
653         elm_image_aspect_fixed_set(media_image, EINA_FALSE);
654         elm_image_file_set(media_image, path, NULL);
655         evas_object_size_hint_weight_set(media_image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
656         evas_object_size_hint_align_set(media_image, EVAS_HINT_FILL, EVAS_HINT_FILL);
657         evas_object_show(media_image);
658         return media_image;
659 }
660
661 int get_image_size(long long media_id)
662 {
663         Eina_List* media_sizes = get_image_sizes_from_db(media_id);
664         int row_count = eina_list_count(media_sizes);
665         int size1 = 0;
666         int size2 = 0;
667         int size3 = 0;
668         int size4 = 0;
669         int media_size = 0;
670         for (int i = 0 ; i < row_count ; i++) {
671                 Eina_List* row_vals = eina_list_nth(media_sizes, i);
672                 int *temp_size1 = (int *)eina_list_nth(row_vals, 0);
673                 if (temp_size1) {
674                         size1 = *temp_size1;
675                         free(temp_size1);
676                 }
677                 int *temp_size2 = (int*)eina_list_nth(row_vals, 3);
678                 if (temp_size2) {
679                         size2 = *temp_size2;
680                         free(temp_size2);
681                 }
682                 int *temp_size3 = (int*)eina_list_nth(row_vals, 6);
683                 if (temp_size3) {
684                         size3 = *temp_size3;
685                         free(temp_size3);
686                 }
687                 int *temp_size4 = (int*)eina_list_nth(row_vals, 9);
688                 if (temp_size4) {
689                         size4 = *temp_size4;
690                         free(temp_size4);
691                 }
692                 eina_list_free(row_vals);
693                 break;
694         }
695         eina_list_free(media_sizes);
696
697         if (size1 > 0) {
698                 media_size = size1;
699         } else if (size2 > 0) {
700                 media_size = size2;
701         } else if (size3 > 0) {
702                 media_size = size3;
703         } else if (size4 > 0) {
704                 media_size = size4;
705         } else {
706
707         }
708         return media_size;
709 }
710
711 void on_media_chat_item_clicked(void* data, Evas_Object *entry, void* event_info)
712 {
713         Evas_Object *button = evas_object_data_get(entry, "button_object");
714         if (button) {
715                 char* img_state = evas_object_data_get(button, "image_state");
716                 if (img_state && strstr(img_state, "download_in_progress") != NULL) {
717                         return;
718                 }
719         }
720
721         appdata_s* ad = evas_object_data_get(entry, "app_data");
722         char *temp_media_id = evas_object_data_get(entry, "media_id");
723         char *media_type_str = evas_object_data_get(entry, "media_type");
724
725         if (media_type_str && strstr(media_type_str, "location") != NULL) {
726                 char *url = evas_object_data_get(entry, "location_url");
727                 launch_app_control(ad, media_type_str, url);
728                 return;
729         }
730
731         long long media_id = atoll(temp_media_id);
732
733         char *media_file = get_media_path_from_db(media_id);
734
735         if (access(media_file, F_OK) != -1) {
736
737         } else {
738                 media_file = NULL;
739         }
740
741         if (!media_file || strlen(media_file) <= 0) {
742                 Eina_Bool ret = send_request_for_media_downloading(ad, ad->service_client, ad->peer_in_cahtting_data->use_data->peer_id, media_id);
743                 if (!ret) {
744                         show_toast(ad, "Please check your network connection.");
745                         return;
746                 }
747                 // show progress bar
748                 char temp_msg[256] = {0,};
749             snprintf(temp_msg, sizeof(temp_msg), "%s", "Downloading...");
750                 elm_object_part_text_set(button, "size", temp_msg);
751
752                 Evas_Object* progressbar = elm_progressbar_add(button);
753                 elm_object_style_set(progressbar, "process_small");
754                 evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
755                 evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
756                 elm_progressbar_pulse(progressbar, EINA_TRUE);
757                 evas_object_show(progressbar);
758
759                 Evas_Object* old_content = elm_object_part_content_unset(button, "download_image");
760                 if (old_content) {
761                         evas_object_del(old_content);
762                 }
763
764                 elm_object_part_content_set(button, "download_image", progressbar);
765                 evas_object_data_set(button, "image_state", "download_in_progress");
766
767         } else {
768                 launch_app_control(ad, media_type_str, media_file);
769         }
770 }
771
772 static void on_video_play_pressed(void *data, Evas_Object *obj, void *event_info)
773 {
774         if (!data)
775                 return;
776         elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_PRESS_ICON), NULL);
777 }
778
779 static void on_video_play_unpressed(void *data, Evas_Object *obj, void *event_info)
780 {
781         if (!data)
782                 return;
783         elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
784 }
785
786 static Evas_Object* get_video_paly_icon(Evas_Object *parent)
787 {
788         Evas_Object* play_pause_btn = elm_button_add(parent);
789         elm_object_style_set(play_pause_btn, "transparent");
790         evas_object_size_hint_align_set(play_pause_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
791         evas_object_size_hint_weight_set(play_pause_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
792
793         Evas_Object* play_pause_icon = elm_image_add(parent);
794         evas_object_size_hint_align_set(play_pause_icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
795         evas_object_size_hint_weight_set(play_pause_icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
796
797         elm_image_file_set(play_pause_icon, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
798
799         elm_image_resizable_set(play_pause_icon, EINA_TRUE, EINA_TRUE);
800         evas_object_show(play_pause_icon);
801
802         elm_object_content_set(play_pause_btn, play_pause_icon);
803
804         evas_object_smart_callback_add(play_pause_btn, "pressed", on_video_play_pressed, play_pause_icon);
805         evas_object_smart_callback_add(play_pause_btn, "unpressed", on_video_play_unpressed, play_pause_icon);
806         return play_pause_btn;
807 }
808
809 static Evas_Object *get_media_layout_with_play(char *img_path, Evas_Object *parent, Eina_Bool show_play_icon)
810 {
811         char edj_path[PATH_MAX] = {0, };
812         app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
813         Evas_Object *rec_video_layout = elm_layout_add(parent);
814         elm_layout_file_set(rec_video_layout, edj_path, "bubble_video_item_layout");
815         evas_object_size_hint_weight_set(rec_video_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
816         evas_object_size_hint_align_set(rec_video_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
817         evas_object_show(rec_video_layout);
818
819         Evas_Object *vid_thumb_icon = get_image_from_path(img_path, parent);
820         elm_object_part_content_set(rec_video_layout, "swallow.video_thumb_item", vid_thumb_icon);
821
822         if (show_play_icon) {
823 /*              Evas_Object* play_img = get_image_from_path(ui_utils_get_resource(MEDIA_PLAY_ICON), parent);
824                 elm_object_part_content_set(rec_video_layout, "swallow.play_btn", play_img);*/
825
826                 Evas_Object* play_pause_btn = get_video_paly_icon(parent);
827                 elm_object_part_content_set(rec_video_layout, "swallow.play_btn", play_pause_btn);
828         }
829
830         return rec_video_layout;
831 }
832
833 void audio_player_progress_updated(void* handler, int current, int total, void *user_data)
834 {
835         Evas_Object *parent = user_data;
836         Evas_Object *progressbar = evas_object_data_get(parent, "progress_control");
837
838
839         int seconds = (int) (current / 1000) % 60 ;
840         int minutes = (int) ((current / (1000*60)) % 60);
841
842         char tot_dur[256] = {0,};
843         char *format = NULL;
844         if (seconds < 10 && minutes < 10) {
845                 format = "0%d:0%d";
846         } else if (seconds > 10 && minutes < 10) {
847                 format = "%d:0%d";
848         } else if (seconds < 10 && minutes > 10) {
849                 format = "0%d:%d";
850         } else {
851                 format = "0%d:0%d";
852         }
853
854         sprintf(tot_dur, format, minutes, seconds);
855         elm_object_part_text_set(progressbar, "elm.text.bottom.right", tot_dur);
856
857         double current_status = (double)((double)current/(double)total);
858
859         elm_progressbar_value_set(progressbar, current_status);
860
861 }
862
863 void audio_player_state_changed(void* handler, TG_AUDIO_PLAYER_STATE state, void *user_data)
864 {
865         tg_player_handler *audio_payer = handler;
866         Evas_Object *parent = user_data;
867
868         if (!audio_payer || !parent) {
869                 return;
870         }
871
872         Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(parent, "is_play_mode");
873         switch (audio_payer->state) {
874         case TG_AUDIO_PLAYER_STATE_NONE:
875                 break;
876         case TG_AUDIO_PLAYER_STATE_INITIALIZED:
877                 evas_object_data_set(parent, "tg_audio_player", audio_payer);
878                 play_audio_player(audio_payer);
879                 break;
880         case TG_AUDIO_PLAYER_STATE_PLAYING:
881                 elm_image_file_set(parent, ui_utils_get_resource(TG_PAUSE_NORMAL_ICON), NULL);
882                 is_play_mode = !is_play_mode;
883                 evas_object_data_set(parent, "is_play_mode", is_play_mode);
884                 break;
885         case TG_AUDIO_PLAYER_STATE_INTERRUPTED:
886                 elm_image_file_set(parent, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
887                 is_play_mode = !is_play_mode;
888                 evas_object_data_set(parent, "is_play_mode", is_play_mode);
889                 break;
890         case TG_AUDIO_PLAYER_STATE_PAUSE:
891                 elm_image_file_set(parent, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
892                 is_play_mode = !is_play_mode;
893                 evas_object_data_set(parent, "is_play_mode", is_play_mode);
894                 break;
895         case TG_AUDIO_PLAYER_STATE_ERROR:
896                 break;
897         case TG_AUDIO_PLAYER_STATE_END:
898                 destroy_audio_player(audio_payer);
899                 free(audio_payer);
900
901                 is_play_mode = EINA_FALSE;
902                 evas_object_data_set(parent, "is_play_mode", is_play_mode);
903                 evas_object_data_set(parent, "tg_audio_player", NULL);
904                 elm_image_file_set(parent, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
905                 audio_player_progress_updated(NULL, 0, 1, parent);
906                 break;
907         default:
908                 break;
909         }
910
911 }
912
913 static void on_message_play_pause_clicked(void *data, Evas_Object *obj, void *event_info)
914 {
915         if (!data)
916                 return;
917
918         appdata_s * ad = evas_object_data_get(data, "app_data");
919         char *audio_file = evas_object_data_get(data, "audio_file_path");
920         char *media_id = evas_object_data_get(data, "media_id");
921         if (!audio_file  || strlen(audio_file) <= 0 || (audio_file && strstr(audio_file, "_null_")) != NULL) {
922                 //there is no file. download it.
923                 Evas_Object *progressbar = evas_object_data_get(data, "progress_control");
924                 Eina_Bool is_download_in_progress = (Eina_Bool)evas_object_data_get(progressbar, "is_download_in_progress");
925
926                 if (is_download_in_progress) {
927
928                 } else {
929                         elm_object_style_set(progressbar, "pending");
930                         Eina_Bool ret = send_request_for_media_downloading(ad, ad->service_client, ad->peer_in_cahtting_data->use_data->peer_id, atoll(media_id));
931                         if (!ret) {
932                                 show_toast(ad, "Please check your network connection.");
933                                 return;
934                         }
935                 }
936                 return;
937         }
938
939         tg_player_handler *audio_payer = evas_object_data_get(data, "tg_audio_player");
940
941         if (!audio_payer) {
942                 audio_payer = init_audio_player(audio_file, &audio_player_state_changed, &audio_player_progress_updated, data);
943
944                 if (!audio_payer) {
945                         show_toast(ad, "Unsupported file.");
946                 }
947                 return;
948         }
949
950         if (audio_payer->state == TG_AUDIO_PLAYER_STATE_PAUSE || audio_payer->state == TG_AUDIO_PLAYER_STATE_INTERRUPTED) {
951
952                 play_audio_player(audio_payer);
953
954         } else if (audio_payer->state == TG_AUDIO_PLAYER_STATE_PLAYING) {
955
956                 pause_audio_player(audio_payer);
957
958         }
959 }
960
961 static void on_message_play_pause_pressed(void *data, Evas_Object *obj, void *event_info)
962 {
963         if (!data)
964                 return;
965
966         Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(data, "is_play_mode");
967         if (is_play_mode) {
968                 elm_image_file_set(data, ui_utils_get_resource(TG_PAUSE_PRESS_ICON), NULL);
969         } else {
970                 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_PRESS_ICON), NULL);
971         }
972 }
973
974 static void on_message_play_pause_unpressed(void *data, Evas_Object *obj, void *event_info)
975 {
976         if (!data)
977                 return;
978
979         Eina_Bool is_play_mode = (Eina_Bool)evas_object_data_get(data, "is_play_mode");
980         if (is_play_mode) {
981
982                 elm_image_file_set(data, ui_utils_get_resource(TG_PAUSE_NORMAL_ICON), NULL);
983         } else {
984                 elm_image_file_set(data, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
985         }
986 }
987
988 static void progressbar_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
989 {
990
991
992 }
993
994 static Evas_Object *create_audio_progressbar(Evas_Object *parent, int duration)
995 {
996         Evas_Object *progressbar;
997
998         progressbar = elm_progressbar_add(parent);
999         evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, 0.5);
1000         evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1001         elm_progressbar_value_set(progressbar, 0.0);
1002         evas_object_event_callback_add(progressbar, EVAS_CALLBACK_DEL, progressbar_del_cb, NULL);
1003         evas_object_show(progressbar);
1004
1005         elm_object_part_text_set(progressbar, "elm.text.top.left", "");
1006         elm_object_part_text_set(progressbar, "elm.text.top.right", "");
1007
1008         elm_object_part_text_set(progressbar, "elm.text.bottom.right", "00:00");
1009
1010         return progressbar;
1011 }
1012
1013
1014 static Evas_Object *get_audio_layout_with_play(Evas_Object *parent)
1015 {
1016         Evas_Object* chat_scroller = parent;
1017         Evas_Object *rec_video_layout = NULL;
1018         tgl_media_s *media_msg = NULL;
1019         appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1020         int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1021         int message_id = (int)evas_object_data_get(chat_scroller, "message_id");
1022
1023         peer_with_pic_s *sel_item =  eina_list_nth(ad->peer_list, user_id);
1024         int buddy_id = sel_item->use_data->peer_id;
1025         char* tablename = get_table_name_from_number(buddy_id);
1026
1027         tg_message_s* msg = get_message_from_message_table(message_id, tablename);
1028
1029         free(tablename);
1030
1031         if (!msg) {
1032                 return NULL;
1033         }
1034
1035         Evas_Object *parent_obj = evas_object_data_get(chat_scroller, "parent_obj"); //entry
1036
1037         //if (msg->out) {
1038
1039                 media_msg = get_media_details_from_db(atoll(msg->media_id));
1040
1041                 char *audio_file = media_msg->file_path;
1042
1043                 char edj_path[PATH_MAX] = {0, };
1044                 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1045                 rec_video_layout = elm_layout_add(parent);
1046                 elm_layout_file_set(rec_video_layout, edj_path, "bubble_audio_item_layout");
1047                 evas_object_size_hint_weight_set(rec_video_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1048                 evas_object_size_hint_align_set(rec_video_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1049                 evas_object_show(rec_video_layout);
1050
1051                 /**************** play icon **********************/
1052                 Evas_Object* play_pause_btn = elm_button_add(parent);
1053                 elm_object_style_set(play_pause_btn, "transparent");
1054                 evas_object_size_hint_align_set(play_pause_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
1055                 evas_object_size_hint_weight_set(play_pause_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1056
1057                 Evas_Object* play_pause_icon = elm_image_add(parent);
1058                 evas_object_size_hint_align_set(play_pause_icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
1059                 evas_object_size_hint_weight_set(play_pause_icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1060                 elm_image_file_set(play_pause_icon, ui_utils_get_resource(TG_PLAY_NORMAL_ICON), NULL);
1061
1062                 elm_image_resizable_set(play_pause_icon, EINA_TRUE, EINA_TRUE);
1063                 evas_object_show(play_pause_icon);
1064                 elm_object_content_set(play_pause_btn, play_pause_icon);
1065
1066                 Eina_Bool is_play_mode = EINA_TRUE;
1067                 evas_object_data_set(play_pause_icon, "is_play_mode", is_play_mode);
1068
1069                 if (audio_file) {
1070                         evas_object_data_set(play_pause_icon, "audio_file_path", strdup(audio_file));
1071                 }
1072                 evas_object_data_set(play_pause_icon, "app_data", ad);
1073                 evas_object_data_set(play_pause_icon, "user_id", (void*)user_id);
1074                 evas_object_data_set(play_pause_icon, "message_id", (void*)message_id);
1075                 evas_object_data_set(play_pause_icon, "media_id", strdup(msg->media_id));
1076
1077                 evas_object_smart_callback_add(parent_obj, "clicked", on_message_play_pause_clicked, play_pause_icon);
1078                 evas_object_smart_callback_add(parent_obj, "pressed", on_message_play_pause_pressed, play_pause_icon);
1079                 evas_object_smart_callback_add(parent_obj, "unpressed", on_message_play_pause_unpressed, play_pause_icon);
1080
1081                 evas_object_smart_callback_add(play_pause_btn, "clicked", on_message_play_pause_clicked, play_pause_icon);
1082                 evas_object_smart_callback_add(play_pause_btn, "pressed", on_message_play_pause_pressed, play_pause_icon);
1083                 evas_object_smart_callback_add(play_pause_btn, "unpressed", on_message_play_pause_unpressed, play_pause_icon);
1084                 elm_object_part_content_set(rec_video_layout, "swallow.play_icon", play_pause_btn);
1085                 /**************** play icon **********************/
1086
1087                 /*************** progress bar ********************/
1088
1089                 int total_duration = 0;
1090                 if (audio_file) {
1091                         metadata_extractor_h metadata;
1092                         metadata_extractor_create(&metadata);
1093                         int ret = metadata_extractor_set_path(metadata, audio_file);
1094                         char *value = NULL;
1095                         ret = metadata_extractor_get_metadata(metadata, METADATA_DURATION, &value);
1096                         metadata_extractor_destroy(metadata);
1097
1098                         if (value) {
1099                                 total_duration = atoi(value);
1100                                 free(value);
1101                         }
1102                 } else {
1103                         total_duration = media_msg->doc_duration;
1104                         //convert into milli secs
1105                         total_duration = 1000 * total_duration;
1106                 }
1107
1108                 Evas_Object *progress = create_audio_progressbar(parent, total_duration);
1109
1110                 evas_object_data_set(parent_obj, "play_pause_icon", play_pause_icon);
1111                 evas_object_data_set(parent_obj, "progress_bar", progress);
1112
1113                 elm_object_part_content_set(rec_video_layout, "swallow.progress_icon", progress);
1114
1115                 evas_object_data_set(play_pause_icon, "progress_control", (void*)progress);
1116                 Eina_Bool is_download_in_progress = EINA_FALSE;
1117                 evas_object_data_set(progress, "is_download_in_progress", (void*)is_download_in_progress);
1118
1119                 /*************** progress bar ********************/
1120
1121         //}
1122
1123         if (msg->message) {
1124                 free(msg->message);
1125                 msg->message = NULL;
1126         }
1127         if (msg->media_id) {
1128                 free(msg->media_id);
1129                 msg->media_id = NULL;
1130         }
1131         free(msg);
1132         free_media_details(media_msg);
1133
1134         return rec_video_layout;
1135 }
1136
1137
1138 static Evas_Object * item_provider(void *data, Evas_Object *entry, const char *item)
1139 {
1140         Evas_Object *layout = NULL;
1141         if (!strcmp(item, "itemprovider")) {
1142                 Evas_Object* chat_scroller = data;
1143                 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1144                 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1145                 int message_id = (int)evas_object_data_get(chat_scroller, "message_id");
1146
1147                 peer_with_pic_s *sel_item =  eina_list_nth(ad->peer_list, user_id);
1148                 int buddy_id = sel_item->use_data->peer_id;
1149
1150                 char* tablename = get_table_name_from_number(buddy_id);
1151                 tg_message_s* msg = get_message_from_message_table(message_id, tablename);
1152                 free(tablename);
1153
1154                 if (!msg) {
1155                         return NULL;
1156                 }
1157
1158                 Evas_Object *item_to_display = NULL;
1159                 tgl_media_s *media_msg = NULL;
1160                 if (msg->media_type == tgl_message_media_photo || msg->media_type == tgl_message_media_document) {
1161
1162                         Eina_Bool is_blur_image = EINA_FALSE;
1163                         char* img_path = NULL;
1164                         Evas_Object *temp = NULL;
1165                         temp = evas_object_data_get(entry, "img_object");
1166                         if (temp == NULL) {
1167                                 const char *tmp;
1168                                 tmp = ui_utils_get_resource(BLUR_BG);
1169                                 img_path = strdup(tmp);
1170                                 is_blur_image = EINA_TRUE;
1171                         } else {
1172                                 item_to_display = temp;
1173                         }
1174
1175                         if (msg->media_type == tgl_message_media_document) {
1176                                 media_msg = get_media_details_from_db(atoll(msg->media_id));
1177
1178                                 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1179                                         if (img_path == NULL || strlen(img_path) == 0) {
1180                                                 img_path = strdup(ui_utils_get_resource(TG_VIDEO_ICON));
1181                                         }
1182                                 }
1183                                 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1184                                         if (img_path) {
1185                                                 free(img_path);
1186                                                 img_path = NULL;
1187                                         }
1188                                         img_path = strdup(ui_utils_get_resource(TG_AUDIO_ICON));
1189                                 }
1190                                 char* media_file = get_media_path_from_db(atoll(msg->media_id));
1191                                 if (!media_file || (media_file && !strcmp(media_file, "_null_")) || (media_file && strlen(media_file) <= 0) ||  (media_file && access(media_file, F_OK) == -1)) {
1192                                         is_blur_image = EINA_TRUE;
1193                                 }
1194
1195                                 if (media_file && strstr(media_file, ".webp") != NULL) {
1196                                         is_blur_image = EINA_FALSE;
1197                                 }
1198                                 free(media_file);
1199
1200                         }
1201
1202                         if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1203
1204                                 evas_object_data_set(chat_scroller, "parent_obj", (void*)entry);
1205                                 item_to_display = get_audio_layout_with_play(chat_scroller);
1206
1207                         } else if (msg->out) {
1208
1209                                 if (msg->media_type == tgl_message_media_photo) {
1210
1211                                         //item_to_display = get_image_from_path(img_path, entry);
1212
1213                                 } else {
1214                                         if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1215
1216                                                 item_to_display = get_media_layout_with_play(img_path, entry, EINA_TRUE);
1217
1218                                         } else {
1219                                                 //item_to_display = get_image_from_path(img_path, entry);
1220                                                 elm_image_animated_set(item_to_display, EINA_TRUE);
1221                                                 elm_image_animated_play_set(item_to_display, EINA_TRUE);
1222                                         }
1223                                 }
1224
1225                         } else {
1226                                 if (!is_blur_image) {
1227
1228                                         if (msg->media_type == tgl_message_media_photo) {
1229
1230                                                 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1231
1232                                         } else {
1233                                                 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1234
1235                                                         item_to_display = get_media_layout_with_play(img_path, entry, EINA_TRUE);
1236
1237                                                 } else {
1238                                                         if (media_msg && media_msg->mime_type && strstr(media_msg->mime_type, "webp") != NULL) {
1239                                                                 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1240                                                         } else {
1241                                                                 evas_object_data_set(entry, "image_object", (void*)item_to_display);
1242                                                                 elm_image_animated_set(item_to_display, EINA_TRUE);
1243                                                                 elm_image_animated_play_set(item_to_display, EINA_TRUE);
1244                                                         }
1245                                                 }
1246                                         }
1247
1248                                 } else {
1249                                         char edj_path[PATH_MAX] = {0, };
1250                                         app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1251                                         Evas_Object *rec_img_layout = elm_layout_add(entry);
1252                                         elm_layout_file_set(rec_img_layout, edj_path, "bubble_received_media_layout");
1253                                         evas_object_size_hint_weight_set(rec_img_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1254                                         evas_object_size_hint_align_set(rec_img_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1255                                         evas_object_show(rec_img_layout);
1256                                         Evas_Object *img_item = NULL;
1257
1258
1259                                         if (msg->media_type == tgl_message_media_photo) {
1260                                                 img_item = get_image_from_path(img_path, entry);
1261                                         } else {
1262                                                 if ((media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) || (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL)) {
1263                                                         img_item = get_media_layout_with_play(img_path, entry, EINA_FALSE);
1264                                                 } else {
1265                                                         img_item = get_image_from_path(img_path, entry);
1266                                                 }
1267                                         }
1268                                         elm_object_part_content_set(rec_img_layout, "swallow.image_item", img_item);
1269
1270                                         int media_size = 0;
1271                                         if (msg->media_type == tgl_message_media_photo) {
1272                                                 media_size = get_image_size(atoll(msg->media_id));
1273                                         } else {
1274                                                 if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1275                                                         media_size = get_media_size_from_db(atoll(msg->media_id));
1276                                                 } else if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1277                                                         media_size = get_media_size_from_db(atoll(msg->media_id));
1278                                                 } else {
1279                                                         media_size = get_media_size_from_db(atoll(msg->media_id));
1280                                                 }
1281                                         }
1282
1283                                         int media_size_kbs = (media_size < (1 << 20)); //convert to kbs
1284                                         char media_size_str[10] = { 0, };
1285                                         if (media_size_kbs > 0) {
1286                                                 sprintf(media_size_str, "%dKB", media_size_kbs);
1287                                         } else {
1288                                                 sprintf(media_size_str, "%dB", media_size);
1289                                         }
1290
1291
1292                                         Evas_Object *size_btn = elm_layout_add(entry);
1293                                         elm_layout_file_set(size_btn, edj_path, "download_btn");
1294                                         elm_object_part_text_set(size_btn, "size", media_size_str);
1295                                         evas_object_size_hint_weight_set(size_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1296                                         evas_object_size_hint_align_set(size_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
1297                                         evas_object_show(size_btn);
1298
1299                                         evas_object_data_set(size_btn, "image_state", "ready_to_download");
1300
1301                                         Evas_Object* download_img = get_image_from_path(ui_utils_get_resource(MEDIA_DOWNLOAD_ICON), entry);
1302                                         elm_object_part_content_set(size_btn, "download_image", download_img);
1303
1304                                         elm_object_part_content_set(rec_img_layout, "swallow.download_btn", size_btn);
1305
1306                                         evas_object_data_set(entry, "image_object", (void*)img_item);
1307                                         evas_object_data_set(entry, "button_object", (void*)size_btn);
1308                                         evas_object_data_set(entry, "image_size", (void*)strdup(media_size_str));
1309
1310                                         //ad->loaded_msg_list = eina_list_append(ad->loaded_msg_list, entry);
1311
1312                                         item_to_display = rec_img_layout;
1313                                 }
1314                         }
1315
1316                         if (img_path) {
1317                                 free(img_path);
1318                                 img_path = NULL;
1319                         }
1320                         // delete media details
1321
1322                 }
1323
1324                 evas_object_data_set(entry, "chat_list", (void*)chat_scroller);
1325                 evas_object_data_set(entry, "message_id", (void*)message_id);
1326                 evas_object_data_set(entry, "app_data", (void*)ad);
1327
1328
1329                 if (msg->media_type == tgl_message_media_photo) {
1330                         evas_object_data_set(entry, "media_type", (void*)strdup("image"));
1331                 } else if (msg->media_type == tgl_message_media_geo) {
1332                         evas_object_data_set(entry, "media_type", (void*)strdup("location"));
1333                 } else {
1334                         if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1335                                 evas_object_data_set(entry, "media_type", (void*)strdup("video"));
1336                         } else if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1337                                 evas_object_data_set(entry, "media_type", (void*)strdup("audio"));
1338                         } else {
1339                                 if (media_msg && media_msg->mime_type && strstr(media_msg->mime_type, "webp") != NULL) {
1340                                         evas_object_data_set(entry, "media_type", (void*)strdup("image"));
1341                                 } else {
1342                                         evas_object_data_set(entry, "media_type", (void*)strdup("animated_gif"));
1343                                 }
1344                         }
1345                 }
1346
1347                 evas_object_data_set(entry, "media_id", (void*)strdup(msg->media_id));
1348                 if (item_to_display) {
1349                         if (media_msg && media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1350                                 layout = item_to_display;
1351                         } else {
1352                                 char edj_path[PATH_MAX] = {0, };
1353                                 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1354                                 layout = elm_layout_add(entry);
1355                                 elm_layout_file_set(layout, edj_path, "chat_image_layout");
1356                                 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1357                                 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1358                                 evas_object_show(layout);
1359
1360                                 Evas_Object *rounded_layout = elm_layout_add(entry);
1361                                 elm_layout_file_set(rounded_layout, edj_path, "rounded_corner_layout");
1362                                 evas_object_size_hint_weight_set(rounded_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1363                                 evas_object_size_hint_align_set(rounded_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1364                                 evas_object_show(rounded_layout);
1365                                 elm_object_part_content_set(rounded_layout, "content", item_to_display);
1366
1367                                 elm_object_part_content_set(layout, "swallow.chat_image", rounded_layout);
1368                                 evas_object_smart_callback_add(entry, "clicked", on_media_chat_item_clicked, NULL);
1369                         }
1370                 }
1371
1372                 if (msg->message) {
1373                         free(msg->message);
1374                         msg->message = NULL;
1375                 }
1376
1377                 if (msg->media_id) {
1378                         free(msg->media_id);
1379                         msg->media_id = NULL;
1380                 }
1381
1382                 free(msg);
1383                 free_media_details(media_msg);
1384         }
1385
1386         return layout;
1387 }
1388
1389 static void __resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1390 {
1391         appdata_s *ad = data;
1392         Evas_Object *layout = NULL;
1393         Evas_Object *chat_scroller = NULL;
1394
1395         layout = evas_object_data_get(ad->nf, "main_layout");
1396         chat_scroller = evas_object_data_get(ad->nf, "chat_list");
1397
1398         int is_end_edge = 0;
1399         is_end_edge = (int)evas_object_data_get(layout, "is_end_edge");
1400         int is_end_edge_top = 0;
1401         is_end_edge_top = (int)evas_object_data_get(chat_scroller, "is_end_edge_top");
1402         if (is_end_edge) {
1403                 int ret = 1;
1404                 /*if(is_end_edge_top)
1405                         ret = scroller_show_previous_region(chat_scroller);
1406                 else*/
1407                         ret = scroller_show_bottom_edge(chat_scroller);
1408                 if (!ret) {
1409                         LOGE("Fail to show the bottom of scroller");
1410                 }
1411         }
1412         if(is_end_edge_top)
1413                 scroller_show_previous_region(chat_scroller);
1414 }
1415
1416 static void _create_image_item(tg_message_s *msg, Evas_Object *entry, char *image, int size)
1417 {
1418         char* img_path = NULL;
1419         img_path = get_video_thumb_path_from_db(atoll(msg->media_id));
1420         if (img_path == NULL || (img_path && strlen(img_path) == 0) || (img_path && strstr(img_path, "_null_") != NULL)) {
1421                 img_path = get_media_path_from_db(atoll(msg->media_id));
1422                 if (access(img_path, F_OK) == -1) {
1423                         img_path = NULL;
1424                 }
1425         }
1426
1427         int w, h, entry_h;
1428         Evas_Object *img_item = NULL;
1429         char key[256] = {0, };
1430         snprintf(key, sizeof(key), "%d", msg->msg_id);
1431
1432         if (img_path && strstr(img_path, ".webp") != NULL) {
1433                 img_item = get_image_from_path(img_path, entry);
1434         } else {
1435                 if (img_path) {
1436                         if (msg->media_type == tgl_message_media_document) {
1437                                 img_item = get_gif_image_from_path(img_path, entry, key);
1438                         } else {
1439                                 img_item = get_image_from_path(img_path, entry);
1440                         }
1441                 }
1442         }
1443
1444         w = 0;
1445         h = 0;
1446         if (img_item) {
1447                 evas_object_data_set(entry, "img_object", img_item);
1448                 elm_image_object_size_get(img_item, &w, &h);
1449         }
1450
1451         if (img_path && strstr(img_path, ".webp") != NULL) {
1452                 entry_h = 200;
1453         } else {
1454                 if (w && h) {
1455                         entry_h = (318 * h) / w;
1456                 } else {
1457                         entry_h = 200;
1458                         evas_object_data_set(entry, "img_object", NULL);
1459                 }
1460         }
1461         snprintf(image, size - 1, "<item size=318x%d vsize=full href=itemprovider></item>", entry_h);
1462 }
1463
1464 Evas_Object *on_message_item_content_get_cb(void *data, Evas_Object *obj, const char *part)
1465 {
1466         Evas_Object *entry = NULL;
1467         Evas_Object *layout = NULL;
1468
1469         if (data == NULL) {
1470                 ERR("Invalid Parameter.");
1471         }
1472
1473         char edj_path[PATH_MAX] = {0, };
1474         app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1475
1476         if (!strcmp(part, "elm.icon.entry")) {
1477
1478                 tg_message_s *msg = (tg_message_s*)data;
1479                 Evas_Object *chat_scroller = obj;
1480                 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
1481
1482                 Evas_Object *nomsg_layout = evas_object_data_get(ad->nf, "chat_list_no_msg_text");
1483                 if (nomsg_layout) {
1484                         elm_object_signal_emit(nomsg_layout, "hide", "message");
1485                 }
1486
1487                 int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1488                 evas_object_data_set(chat_scroller, "message_id", msg->msg_id);
1489
1490                 peer_with_pic_s *sel_item =  eina_list_nth(ad->peer_list, user_id);
1491                 int buddy_id = sel_item->use_data->peer_id;
1492
1493                 char* tablename = get_table_name_from_number(buddy_id);
1494
1495                 //Eina_Bool is_blur_image = EINA_FALSE;
1496
1497                 if (msg) {
1498 #if 0
1499                         if (msg->unread) {
1500                                 msg->unread = 0;
1501                                 update_msg_into_db(msg, tablename);
1502                                 ad->is_last_msg_changed = EINA_TRUE;
1503                         }
1504 #endif
1505                         if (msg->out) {
1506
1507                         } else {
1508                                 // update un read
1509
1510                         }
1511
1512                         if (msg->service == 2) {
1513                                 layout = elm_layout_add(obj);
1514                                 elm_layout_file_set(layout, edj_path, "chat_date_item");
1515                                 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1516                                 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1517                                 evas_object_show(layout);
1518
1519                                 // convert date from string to int
1520                                 char *date_str = msg->message;
1521                                 int date_num = atoi(date_str);
1522
1523                                 // convert date format
1524                                 time_t t = date_num;
1525                                 char *format = NULL;
1526                                 format = "%a, %e %b %Y";
1527                                 struct tm lt;
1528                                 char res[256];
1529                                 (void) localtime_r(&t, &lt);
1530
1531                                 if (strftime(res, sizeof(res), format, &lt) == 0) {
1532                                         (void) fprintf(stderr,  "strftime(3): cannot format supplied "
1533                                                         "date/time into buffer of size %u "
1534                                                         "using: '%s'\n",
1535                                                         sizeof(res), format);
1536                                 }
1537
1538                                 elm_object_part_text_set(layout, "elm.text", res);
1539                                 return layout;
1540                         } else if (msg->service == 1) {
1541                                 layout = elm_layout_add(obj);
1542                                 elm_layout_file_set(layout, edj_path, "chat_service_item_box");
1543                                 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1544                                 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1545                                 evas_object_show(layout);
1546
1547                                 elm_object_part_text_set(layout, "elm.text", msg->message);
1548
1549                                 return layout;
1550                         }
1551                         evas_object_data_set(entry, "chat_list", (void*)chat_scroller);
1552                         evas_object_data_set(entry, "message_id", (void*)msg->msg_id);
1553
1554                         if (msg->media_type != tgl_message_media_none) {
1555                                 entry = elm_entry_add(obj);
1556                                 elm_entry_editable_set(entry, EINA_FALSE);
1557                                 elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
1558                                 elm_entry_single_line_set(entry, EINA_TRUE);
1559                                 elm_entry_input_panel_enabled_set(entry, EINA_FALSE);
1560                         } else {
1561                                 entry = elm_label_add(obj);
1562                         }
1563                         layout = elm_layout_add(obj);
1564
1565                         if (msg->out) {
1566                                 elm_layout_file_set(layout, edj_path, "entry,send,layout");
1567                                 elm_object_style_set(entry, "sentmessage1");
1568                                 //sender_name = replace(ad->current_user_data->print_name, '_', " ");
1569                         } else {
1570                                 elm_layout_file_set(layout, edj_path, "entry,receive,layout");
1571                                 elm_object_style_set(entry, "readmessage1");
1572
1573                                 /* If you need to get the name, you need this code */
1574                                 /*
1575                                 char *sender_name = NULL;
1576                                 if (sel_item->use_data->peer_type == TGL_PEER_USER) {
1577                                         sender_name = replace(sel_item->use_data->print_name, '_', " ");
1578                                 } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
1579                                         int from_id = msg->from_id;
1580                                         // get name of buddy
1581                                         char* buddy_name = get_buddy_name_from_id(from_id);
1582                                         if (buddy_name) {
1583                                                 sender_name = replace(buddy_name, '_', " ");
1584                                                 free(buddy_name);
1585                                         }
1586                                 } else {
1587                                         sender_name = replace(sel_item->use_data->print_name, '_', " ");
1588                                 }
1589                                 */
1590                         }
1591
1592                         evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1593                         elm_object_part_content_set(layout, "elm.swallow.content", entry);
1594                         evas_object_show(layout);
1595
1596                         evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1597                         evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
1598                         evas_object_show(entry);
1599                         // To be handled for group chat
1600                         Eina_Strbuf *buf = eina_strbuf_new();
1601                         char *caption = NULL;
1602                         LOGD("entry media type is %d", msg->media_type);
1603                         if (msg->media_type == tgl_message_media_none) {
1604                                 char *temp_msg = replace(msg->message, '\n', "<br>");
1605                                 elm_object_part_text_set(entry, "elm.text", temp_msg);
1606                                 //eina_strbuf_append(buf, temp_msg);
1607                                 //elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1608                                 eina_strbuf_free(buf);
1609
1610                         } else if (msg->media_type == tgl_message_media_photo || msg->media_type == tgl_message_media_document) {
1611                                 elm_entry_item_provider_append(entry, item_provider, chat_scroller);
1612
1613                                 LOGD("media id[%s]", msg->media_id);
1614                                 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1615                                 if (media_msg)
1616                                         LOGD("file path[%s]", media_msg->file_path);
1617                                 if (media_msg && media_msg->caption && strlen(media_msg->caption) > 0) {
1618                                         caption = strdup(media_msg->caption);
1619                                         LOGD("caption[%s]", caption);
1620                                 }
1621                                 if (msg->out) {
1622                                         if (media_msg) {
1623                                                 if (media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1624                                                         if (ad->target_direction == TELEGRAM_TARGET_DIRECTION_PORTRAIT || ad->target_direction == TELEGRAM_TARGET_DIRECTION_PORTRAIT_INVERSE) {
1625                                                                 eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1626                                                         } else {
1627                                                                 eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1628                                                         }
1629
1630                                                 } else if (media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1631                                                         eina_strbuf_append(buf, "<item size=318x200 vsize=full hsize=full href=itemprovider></item>");
1632                                                 } else {
1633                                                         char image[256] = {0,};
1634                                                         _create_image_item(msg, entry, image, sizeof(image));
1635                                                         eina_strbuf_append(buf, image);
1636                                                 }
1637                                         }
1638                                 } else {
1639                                         if (media_msg) {
1640                                                 if (media_msg->doc_type && strstr(media_msg->doc_type, "audio") != NULL) {
1641                                                         eina_strbuf_append(buf, "<item size=318x100 vsize=full hsize=full href=itemprovider></item>");
1642                                                 } else if (media_msg->doc_type && strstr(media_msg->doc_type, "video") != NULL) {
1643                                                         eina_strbuf_append(buf, "<item size=318x200 vsize=full hsize=full href=itemprovider></item>");
1644                                                 } else {
1645                                                         char image[256] = {0,};
1646                                                         _create_image_item(msg, entry, image, sizeof(image));
1647                                                         eina_strbuf_append(buf, image);
1648                                                 }
1649                                         }
1650                                 }
1651                                 free_media_details(media_msg);
1652                                 elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1653                                 eina_strbuf_free(buf);
1654                         } else if (msg->media_type == tgl_message_media_geo) {
1655
1656                                 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1657
1658                                 char loc_url[4*256] = {0,};
1659                                 if (media_msg) {
1660                                         if (media_msg->caption && strlen(media_msg->caption) > 0) {
1661                                                 caption = strdup(media_msg->caption);
1662                                         }
1663                                         snprintf(loc_url, sizeof(loc_url), "https://maps.google.com/?q=%s,%s", media_msg->latitude, media_msg->longitude);
1664                                         char temp_msg[4*256] = {0,};
1665                                         snprintf(temp_msg, sizeof(temp_msg), "<font=Tizen:style=Normal|underline color=#0000FF align=left><font_size=15>%s</font_size></font>", loc_url);
1666                                         eina_strbuf_append(buf, temp_msg);
1667                                         elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1668                                         eina_strbuf_free(buf);
1669                                 }
1670
1671                                 free_media_details(media_msg);
1672                                 evas_object_data_set(entry, "media_type", (void*)strdup("location"));
1673                                 evas_object_data_set(entry, "location_url", (void*)strdup(loc_url));
1674                                 evas_object_smart_callback_add(entry, "clicked", on_media_chat_item_clicked, NULL);
1675
1676                         } else if (msg->media_type == tgl_message_media_contact) {
1677
1678                                 tgl_media_s *media_msg = get_media_details_from_db(atoll(msg->media_id));
1679
1680                                 if (media_msg) {
1681                                         if (media_msg->caption && strlen(media_msg->caption) > 0) {
1682                                                 caption = strdup(media_msg->caption);
1683                                         }
1684                                         char temp_msg[4*256] = {0,};
1685                                         snprintf(temp_msg, sizeof(temp_msg), "<font=Tizen:style=Normal|underline color=#000000 align=left><font_size=15>%s %s, %s</font_size></font>", media_msg->first_name, media_msg->last_name, media_msg->phone_no);
1686                                         eina_strbuf_append(buf, temp_msg);
1687                                         elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1688                                         eina_strbuf_free(buf);
1689                                         free_media_details(media_msg);
1690                                 }
1691
1692                         } else if (msg->media_type == tgl_message_media_unsupported) {
1693
1694                         } else if (msg->media_type == tgl_message_media_photo_encr) {
1695
1696                         } else if (msg->media_type == tgl_message_media_document_encr) {
1697
1698                         } else  {
1699
1700                         }
1701                         ad->loaded_msg_list = eina_list_append(ad->loaded_msg_list, entry);
1702                         if (caption) {
1703                                 // implement UI.
1704                                 LOGD("caption is (%s)", caption);
1705                                 free(caption);
1706                         }
1707                         //set time
1708                         time_t t = msg->date;
1709                         const char *format = "%I:%M %p";
1710                         struct tm lt;
1711                         char res[32];
1712                         (void) localtime_r(&t, &lt);
1713
1714                         if (strftime(res, sizeof(res), format, &lt) == 0) {
1715                                 (void) fprintf(stderr,  "strftime(3): cannot format supplied "
1716                                                 "date/time into buffer of size %u "
1717                                                 "using: '%s'\n",
1718                                                 sizeof(res), format);
1719                         }
1720
1721                         char time_str[20] = {0,};
1722                         snprintf(time_str, sizeof(time_str) - 1, "%s", res);
1723                         elm_object_part_text_set(entry, "time", time_str);
1724
1725                         Evas_Object *status_obj;
1726                         status_obj = elm_icon_add(entry);
1727                         evas_object_size_hint_weight_set(status_obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1728                         evas_object_size_hint_align_set(status_obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
1729
1730                         if (msg->msg_state == TG_MESSAGE_STATE_SENDING) {
1731                                 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENDING_ICON), NULL);
1732                                 elm_object_signal_emit(entry, "status_on", "status");
1733                         } else if (msg->msg_state == TG_MESSAGE_STATE_SENT) {
1734                                 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENT_ICON), NULL);
1735                                 elm_object_signal_emit(entry, "status_on", "status");
1736                         } else if (msg->msg_state == TG_MESSAGE_STATE_DELIVERED) {
1737                                 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_DELIVERED_ICON), NULL);
1738                                 elm_object_signal_emit(entry, "status_on", "status");
1739                         } else if (msg->msg_state == TG_MESSAGE_STATE_RECEIVED) {
1740                                 elm_object_signal_emit(entry, "status_off", "status");
1741                         } else if (msg->msg_state == TG_MESSAGE_STATE_FAILED) {
1742                                 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_FAILED_ICON), NULL);
1743                                 elm_object_signal_emit(entry, "status_on", "status");
1744                         } else if (msg->msg_state == TG_MESSAGE_STATE_READ) {
1745                                 elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_READ_ICON), NULL);
1746                                 elm_object_signal_emit(entry, "status_on", "status");
1747                         } else if (msg->msg_state == TG_MESSAGE_STATE_UNKNOWN) {
1748                                 elm_object_signal_emit(entry, "status_off", "status");
1749                         }
1750
1751                         elm_object_part_content_set(entry, "status_icon", status_obj);
1752                         evas_object_show(status_obj);
1753                         free(tablename);
1754                 }
1755 #if 0
1756                 if (chat_scroller) {
1757                         int size = elm_genlist_items_count(chat_scroller);
1758                         if (size > 0) {
1759                                 Elm_Object_Item *litem = elm_genlist_nth_item_get(chat_scroller, size -1);
1760                                 elm_genlist_item_show(litem, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1761                         }
1762                 }
1763 #endif
1764         }
1765         return layout;
1766 }
1767
1768 void on_text_message_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
1769 {
1770
1771 }
1772
1773 void on_text_message_received_from_buddy(appdata_s* ad, long long message_id, int type_of_chat)
1774 {
1775         if (!ad) {
1776                 return;
1777         }
1778         peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
1779         tg_peer_info_s* peer_item = pic_peer_item->use_data;
1780         char* tablename = get_table_name_from_number(peer_item->peer_id);
1781         tg_message_s* msg = get_message_from_message_table(message_id, tablename);
1782
1783         Evas_Object* chat_scroller = evas_object_data_get(ad->nf, "chat_list");
1784         Evas_Object *message = NULL;
1785
1786         if (msg) {
1787                         // update peer table
1788                         if (peer_item) {
1789                                 peer_item->last_msg_id = msg->msg_id;
1790                                 peer_item->last_msg_date =  msg->date;
1791                                 insert_or_update_peer_into_database(peer_item);
1792                         }
1793
1794                         Evas_Object *layout = evas_object_data_get(ad->nf, "main_layout");
1795                         if (layout) {
1796                                 int is_end_edge = (int) evas_object_data_get(layout, "is_end_edge");
1797                                 if (!is_end_edge) {
1798                                         Evas_Object *bubble_layout = NULL;
1799                                         bubble_layout = elm_object_part_content_get(layout, "swallow.messagebubble");
1800
1801                                         int user_id = (int) evas_object_data_get(chat_scroller, "user_id");
1802                                         peer_with_pic_s *sel_item =  eina_list_nth(ad->peer_list, user_id);
1803                                         char *sender_name = NULL;
1804                                         if (sel_item->use_data->peer_type == TGL_PEER_USER) {
1805                                                 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1806                                         } else if (sel_item->use_data->peer_type == TGL_PEER_CHAT) {
1807                                                 int from_id = msg->from_id;
1808                                                 // get name of buddy
1809                                                 char* buddy_name = get_buddy_name_from_id(from_id);
1810                                                 if (buddy_name) {
1811                                                         sender_name = replace(buddy_name, '_', " ");
1812                                                         free(buddy_name);
1813                                                 }
1814                                         } else {
1815                                                 sender_name = replace(sel_item->use_data->print_name, '_', " ");
1816                                         }
1817
1818                                         elm_object_part_text_set(bubble_layout, "text_name", sender_name);
1819                                         elm_object_part_text_set(bubble_layout, "text_message", msg->message);
1820                                         elm_object_signal_emit(layout, "show", "bubblemessage");
1821                                 }
1822                         }
1823
1824                 if (msg->message) {
1825                         free(msg->message);
1826                         msg->message = NULL;
1827                 }
1828
1829                 if (msg->media_id) {
1830                         free(msg->media_id);
1831                         msg->media_id = NULL;
1832                 }
1833
1834                 free(msg);
1835         }
1836         free(tablename);
1837
1838         message = on_message_item_content_get_cb((void *)msg, chat_scroller, "elm.icon.entry");
1839         elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)message_id);
1840         scroller_push_item(chat_scroller, message, 0);
1841
1842         int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
1843         peer_with_pic_s *sel_item =  eina_list_nth(ad->peer_list, user_id);
1844
1845         send_request_for_marked_as_read(ad, ad->service_client, sel_item->use_data->peer_id, sel_item->use_data->peer_type);
1846         ad->is_last_msg_changed = EINA_TRUE;
1847         on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
1848 }
1849
1850
1851 void on_media_download_completed(appdata_s* ad, int buddy_id, long long media_id, const char *file_path, const char *caption)
1852 {
1853         if (!ad)
1854                 return;
1855
1856         if (ad->loaded_msg_list && eina_list_count(ad->loaded_msg_list) > 0) {
1857                 for (int i = eina_list_count(ad->loaded_msg_list) - 1 ; i >= 0; i--) {
1858                         Evas_Object* entry = eina_list_nth(ad->loaded_msg_list, i);
1859                         if (entry) {
1860
1861                                 char* media_type_str = evas_object_data_get(entry, "media_type");
1862                                 char* media_id_str = evas_object_data_get(entry, "media_id");
1863                                 char* media_size_str = evas_object_data_get(entry, "image_size");
1864                                 Evas_Object *img_item = evas_object_data_get(entry, "image_object");
1865                                 Evas_Object *size_btn = evas_object_data_get(entry, "button_object");
1866
1867                                 if (media_id_str) {
1868
1869                                         long long lmedia_id = atoll(media_id_str);
1870
1871                                         if (media_id == lmedia_id) {
1872                                                 if (img_item || (media_type_str && strstr(media_type_str, "audio") != NULL)) {
1873
1874
1875                                                         if (file_path && strstr(file_path, "failed_to_load") != NULL) {
1876
1877                                                                 if (media_type_str && (strstr(media_type_str, "audio") != NULL)) {
1878                                                                         Evas_Object *play_pause_icon = evas_object_data_get(entry, "play_pause_icon");
1879                                                                         Evas_Object *progressbar = evas_object_data_get(entry, "progress_bar");
1880                                                                         evas_object_data_set(progressbar, "is_download_in_progress", EINA_FALSE);
1881                                                                         evas_object_data_set(play_pause_icon, "audio_file_path", NULL);
1882                                                                         //sandeep
1883                                                                         elm_object_style_set(progressbar, "default");
1884                                                                         return;
1885                                                                 }
1886
1887                                                                 // download failed.
1888                                                                 if (size_btn) {
1889                                                                         Evas_Object* progress = elm_object_part_content_get(size_btn, "download_image");
1890                                                                         if (progress) {
1891                                                                                 evas_object_del(progress);
1892                                                                         }
1893                                                                         Evas_Object* download_img = get_image_from_path(ui_utils_get_resource(MEDIA_DOWNLOAD_ICON), size_btn);
1894                                                                         elm_object_part_content_set(size_btn, "download_image", download_img);
1895                                                                         evas_object_data_set(size_btn, "image_state", "ready_to_download");
1896                                                                         char temp_msg[256] = {0,};
1897                                                                         snprintf(temp_msg, sizeof(temp_msg), "<font=Tizen:style=Bold color=#008000 align=center><font_size=30>%s</font_size></font>", media_size_str);
1898                                                                         elm_object_text_set(size_btn, temp_msg);
1899                                                                 }
1900
1901
1902                                                         } else {
1903
1904                                                                 if (media_type_str && (strstr(media_type_str, "audio") != NULL)) {
1905                                                                         Evas_Object *play_pause_icon = evas_object_data_get(entry, "play_pause_icon");
1906                                                                         Evas_Object *progressbar = evas_object_data_get(entry, "progress_bar");
1907                                                                         evas_object_data_set(progressbar, "is_download_in_progress", EINA_FALSE);
1908                                                                         elm_object_style_set(progressbar, "default");
1909                                                                         evas_object_data_set(play_pause_icon, "audio_file_path", file_path);
1910                                                                         //sandeep
1911                                                                         metadata_extractor_h metadata;
1912                                                                         metadata_extractor_create(&metadata);
1913                                                                         int ret = metadata_extractor_set_path(metadata, file_path);
1914                                                                         char *value = NULL;
1915                                                                         ret = metadata_extractor_get_metadata(metadata, METADATA_DURATION, &value);
1916                                                                         metadata_extractor_destroy(metadata);
1917
1918                                                                         int duration = 0;
1919                                                                         if (value) {
1920                                                                                 duration = atoi(value);
1921                                                                                 free(value);
1922                                                                         }
1923
1924                                                                         elm_object_part_text_set(progressbar, "elm.text.top.left", "");
1925                                                                         elm_object_part_text_set(progressbar, "elm.text.top.right", "");
1926
1927                                                                         return;
1928                                                                 }
1929
1930                                                                 if (size_btn) {
1931                                                                         evas_object_del(size_btn);
1932                                                                 }
1933
1934                                                                 if (media_type_str && (strstr(media_type_str, "video") != NULL)) {
1935                                                                         Evas_Object* play_img = get_video_paly_icon(img_item);
1936                                                                         //Evas_Object* play_img = get_image_from_path(ui_utils_get_resource(MEDIA_PLAY_ICON), img_item);
1937                                                                         elm_object_part_content_set(img_item, "swallow.play_btn", play_img);
1938                                                                 } else if (media_type_str && strstr(media_type_str, "image") != NULL) {
1939
1940                                                                         img_item = get_image_from_path(file_path, entry);
1941                                                                         int w, h, entry_h;
1942                                                                         elm_image_object_size_get(img_item, &w, &h);
1943                                                                         entry_h = (318 * h) / w;
1944                                                                         Eina_Strbuf *buf = eina_strbuf_new();
1945                                                                         char image[256] = {0,};
1946                                                                         evas_object_data_set(entry, "img_object", img_item);
1947                                                                         snprintf(image, sizeof(image) - 1, "<item size=318x%d vsize=full href=itemprovider></item>", entry_h);
1948                                                                         eina_strbuf_append(buf, image);
1949                                                                         elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1950                                                                         eina_strbuf_free(buf);
1951
1952                                                                 } else if (media_type_str && strstr(media_type_str, "animated_gif") != NULL) {
1953
1954                                                                         int msg_id = (int) evas_object_data_get(entry, "message_id");
1955                                                                         char key[256] = {0, };
1956                                                                         snprintf(key, sizeof(key), "%d", msg_id);
1957
1958                                                                         img_item = get_gif_image_from_path(file_path, entry, key);
1959                                                                         //elm_image_animated_set(img_item, EINA_TRUE);
1960                                                                         //elm_image_animated_play_set(img_item, EINA_TRUE);
1961                                                                         int w, h, entry_h;
1962                                                                         elm_image_object_size_get(img_item, &w, &h);
1963                                                                         entry_h = (318 * h) / w;
1964                                                                         evas_object_data_set(entry, "img_object", img_item);
1965                                                                         Eina_Strbuf *buf = eina_strbuf_new();
1966                                                                         char image[256] = {0,};
1967                                                                         snprintf(image, sizeof(image) - 1, "<item size=318x%d vsize=full href=itemprovider></item>", entry_h);
1968                                                                         eina_strbuf_append(buf, image);
1969                                                                         elm_entry_entry_set(entry, eina_strbuf_string_get(buf));
1970                                                                         eina_strbuf_free(buf);
1971                                                                 }
1972                                                         }
1973                                                 }
1974                                         }
1975
1976                                 }
1977                         }
1978                 }
1979         }
1980 }
1981
1982 //elm_object_part_content_set(comp_img_layout, "swallow.chat_send_image", image);
1983
1984 void on_video_thumb_download_completed(appdata_s* ad, int buddy_id, long long media_id, const char* file_path, const char *caption)
1985 {
1986         on_media_download_completed(ad, buddy_id, media_id, file_path, caption);
1987 }
1988
1989 void on_text_message_state_changed(appdata_s* ad, tg_message_s *msg, int type_of_chat)
1990 {
1991         if (!ad)
1992                 return;
1993
1994 #if 0
1995         peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
1996         if (pic_peer_item) {
1997                 tg_peer_info_s* peer_item = pic_peer_item->use_data;
1998                 // update peer table
1999                 if (peer_item) {
2000                         peer_item->last_msg_id = msg->msg_id;
2001                         peer_item->last_msg_date =  msg->date;
2002                         insert_or_update_peer_into_database(peer_item);
2003                 }
2004         }
2005 #endif
2006         if (ad->loaded_msg_list && eina_list_count(ad->loaded_msg_list) > 0) {
2007                 for (int i = eina_list_count(ad->loaded_msg_list) - 1 ; i >= 0; i--) {
2008                         Evas_Object* entry = eina_list_nth(ad->loaded_msg_list, i);
2009
2010                         if (entry) {
2011                                 int message_id = (int)evas_object_data_get(entry, "message_id");
2012                                 if (message_id == msg->msg_id || message_id == msg->unique_id) {
2013
2014                                         evas_object_data_set(entry, "media_id", (void*)strdup(msg->media_id));
2015                                         evas_object_data_set(entry, "message_id", (void*)message_id);
2016
2017                                         Evas_Object* status_obj = elm_object_part_content_get(entry, "status_icon");
2018                                         if (status_obj) {
2019                                                 if (msg->msg_state == TG_MESSAGE_STATE_SENDING) {
2020                                                         elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENDING_ICON), NULL);
2021                                                         elm_object_signal_emit(entry, "status_on", "status");
2022                                                 } else if (msg->msg_state == TG_MESSAGE_STATE_SENT) {
2023                                                         elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_SENT_ICON), NULL);
2024                                                         elm_object_signal_emit(entry, "status_on", "status");
2025                                                 } else if (msg->msg_state == TG_MESSAGE_STATE_DELIVERED) {
2026                                                         elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_DELIVERED_ICON), NULL);
2027                                                         elm_object_signal_emit(entry, "status_on", "status");
2028                                                 } else if (msg->msg_state == TG_MESSAGE_STATE_RECEIVED) {
2029                                                         elm_object_signal_emit(entry, "status_off", "status");
2030                                                 } else if (msg->msg_state == TG_MESSAGE_STATE_FAILED) {
2031                                                         elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_FAILED_ICON), NULL);
2032                                                         elm_object_signal_emit(entry, "status_on", "status");
2033                                                 } else if (msg->msg_state == TG_MESSAGE_STATE_READ) {
2034                                                         elm_image_file_set(status_obj, ui_utils_get_resource(MESSAGE_READ_ICON), NULL);
2035                                                         elm_object_signal_emit(entry, "status_on", "status");
2036                                                 } else if (msg->msg_state == TG_MESSAGE_STATE_UNKNOWN) {
2037                                                         elm_object_signal_emit(entry, "status_off", "status");
2038                                                 }
2039                                         }
2040                                         return;
2041                                 }
2042                         }
2043                 }
2044         }
2045 }
2046
2047 Eina_Bool add_date_item_to_chat(void *data)
2048 {
2049         Evas_Object *chat_scroller = data;
2050         appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2051         Eina_Bool ret = EINA_FALSE;
2052         if (!ad) {
2053                 return ret;
2054         }
2055         int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2056         if (!ad->peer_list) {
2057                 return ret;
2058         }
2059
2060         peer_with_pic_s *sel_item =  eina_list_nth(ad->peer_list, user_id);
2061
2062         char* msg_table = get_table_name_from_number(sel_item->use_data->peer_id);
2063         create_buddy_msg_table(msg_table);
2064         int msg_id = insert_current_date_to_table(msg_table);
2065
2066         if (msg_id > 0) {
2067                 // send request to service
2068                 Evas_Object *message = NULL;
2069                 tg_message_s* msg = get_message_from_message_table(msg_id, msg_table);
2070
2071                 message = on_message_item_content_get_cb((void *)msg, chat_scroller, "elm.icon.entry");
2072                 elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)msg_id);
2073                 scroller_push_item(chat_scroller, message, 0);
2074
2075                 free_message(&msg);
2076
2077                 ad->is_last_msg_changed = EINA_TRUE;
2078                 ret = EINA_TRUE;
2079         }
2080         if (msg_table)
2081                 free(msg_table);
2082         return ret;
2083 }
2084
2085
2086
2087 static Eina_Bool on_new_text_message_send_cb(void *data)
2088 {
2089         Evas_Object *chat_scroller = data;
2090         appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2091         int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2092         Evas_Object *text_entry = evas_object_data_get(chat_scroller, "text_entry");
2093
2094         peer_with_pic_s *sel_item =  eina_list_nth(ad->peer_list, user_id);
2095
2096         const char* text_to_send = elm_entry_entry_get(text_entry);
2097         if (!text_to_send || (strlen(text_to_send) == 0))
2098                 return ECORE_CALLBACK_CANCEL;
2099
2100         int unique_id = get_time_stamp_in_macro();
2101         if (unique_id < 0) {
2102                 unique_id = -1 * unique_id;
2103         }
2104         tg_message_s msg;
2105         msg.msg_id = unique_id;
2106         msg.from_id = ad->current_user_data->user_id.id;
2107         msg.date = time(NULL);
2108         msg.flags = 0;
2109         msg.fwd_date = 0;
2110         msg.fwd_from_id = 0;
2111         msg.fwd_from_id = 0;
2112         msg.unique_id = 0;
2113         msg.message = (char*)text_to_send;
2114         msg.message_len = strlen(text_to_send);
2115         msg.media_type = tgl_message_media_none;
2116         msg.media_id = "";
2117         msg.out = 1;
2118         msg.service = 0;
2119         msg.to_id = sel_item->use_data->peer_id;
2120         msg.unread = 0;
2121         msg.msg_state = TG_MESSAGE_STATE_SENDING;
2122         msg.is_marked_for_delete = 0;
2123         char* msg_table = get_table_name_from_number(msg.to_id);
2124         create_buddy_msg_table(msg_table);
2125         insert_msg_into_db(&msg, msg_table, unique_id);
2126         free(msg_table);
2127
2128         peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
2129         if (pic_peer_item) {
2130                 tg_peer_info_s* peer_item = pic_peer_item->use_data;
2131                 // update peer table
2132                 if (peer_item) {
2133                         peer_item->last_msg_id = msg.msg_id;
2134                         peer_item->last_msg_date =  msg.date;
2135                         insert_or_update_peer_into_database(peer_item);
2136                 }
2137         }
2138
2139         // send request to service
2140         send_request_for_message_transport(ad, ad->service_client, sel_item->use_data->peer_id, msg.msg_id, tgl_message_media_none, text_to_send, sel_item->use_data->peer_type);
2141
2142         Evas_Object *message = NULL;
2143
2144         message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2145         elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)unique_id);
2146         scroller_push_item(chat_scroller, message, 0);
2147
2148         elm_entry_entry_set(text_entry, "");
2149         ad->is_last_msg_changed = EINA_TRUE;
2150         return ECORE_CALLBACK_CANCEL;
2151 }
2152
2153 static void on_text_message_send_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2154 {
2155         Evas_Object* chat_scroller = data;
2156         appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2157         if (!ad) {
2158                 return;
2159         }
2160         int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2161         Evas_Object* text_entry = evas_object_data_get(chat_scroller, "text_entry");
2162         int ret = 1;
2163
2164         peer_with_pic_s *sel_item =  eina_list_nth(ad->peer_list, user_id);
2165         const char* text_to_send = elm_entry_markup_to_utf8(elm_object_text_get(text_entry));
2166         if (!text_to_send || (strlen(text_to_send) == 0))
2167                 return;
2168
2169         if (add_date_item_to_chat(data)) {
2170                 //ecore_timer_add(2, on_new_text_message_send_cb, chat_scroller);
2171                 //return;
2172                 wait_for(2);
2173         }
2174
2175         int unique_id = get_time_stamp_in_macro();
2176         if (unique_id < 0) {
2177                 unique_id = -1 * unique_id;
2178         }
2179         tg_message_s msg;
2180         msg.msg_id = unique_id;
2181         msg.from_id = ad->current_user_data->user_id.id;
2182         msg.date = time(NULL);
2183         msg.flags = 0;
2184         msg.fwd_date = 0;
2185         msg.fwd_from_id = 0;
2186         msg.fwd_from_id = 0;
2187         msg.unique_id = 0;
2188         msg.message = (char*)text_to_send;
2189         msg.message_len = strlen(text_to_send);
2190         msg.media_type = tgl_message_media_none;
2191         msg.media_id = "";
2192         msg.out = 1;
2193         msg.service = 0;
2194         msg.to_id = sel_item->use_data->peer_id;
2195         msg.unread = 0;
2196         msg.msg_state = TG_MESSAGE_STATE_SENDING;
2197         msg.is_marked_for_delete = 0;
2198         char* msg_table = get_table_name_from_number(msg.to_id);
2199         create_buddy_msg_table(msg_table);
2200         insert_msg_into_db(&msg, msg_table, unique_id);
2201         free(msg_table);
2202
2203         peer_with_pic_s* pic_peer_item = ad->peer_in_cahtting_data;
2204         if (pic_peer_item) {
2205                 tg_peer_info_s* peer_item = pic_peer_item->use_data;
2206                 // update peer table
2207                 if (peer_item) {
2208                         peer_item->last_msg_id = msg.msg_id;
2209                         peer_item->last_msg_date =  msg.date;
2210                         insert_or_update_peer_into_database(peer_item);
2211                 }
2212         }
2213
2214         // send request to service
2215         send_request_for_message_transport(ad, ad->service_client, sel_item->use_data->peer_id, msg.msg_id, tgl_message_media_none, text_to_send, sel_item->use_data->peer_type);
2216
2217         Evas_Object *message = NULL;
2218
2219         Evas_Object *layout = evas_object_data_get(ad->nf, "main_layout");
2220         evas_object_data_set(layout, "is_end_edge", (void *) 1);
2221
2222         message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2223         elm_object_signal_callback_add(message, "clicked", "item", on_text_message_clicked, (void*)unique_id);
2224         scroller_push_item(chat_scroller, message, 0);
2225
2226         elm_entry_entry_set(text_entry, "");
2227         ad->is_last_msg_changed = EINA_TRUE;
2228 }
2229
2230 void on_user_status_changed(appdata_s* ad, char* status)
2231 {
2232         if (!ad || !status)
2233                 return;
2234
2235         Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
2236         char status_str[256] = {0,};
2237         snprintf(status_str, sizeof(status_str) - 1, "%s", status);
2238         elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2239 }
2240
2241 static void compare_with_current_date(int rtime, Elm_Object_Item *nf_it)
2242 {
2243         char time_str[256] = {0,};
2244         time_t local_t = time(NULL);
2245         int diff_sec = 0;
2246         int diff_min = 0;
2247         int diff_hour = 0;
2248         int diff_day = 0;
2249
2250         diff_sec = local_t - rtime;
2251         diff_min = diff_sec / 60;
2252         diff_hour = diff_min / 60;
2253         diff_day = diff_hour / 24;
2254         LOGD("different : day : %d, hour = %d, min = %d, sec = %d", diff_day, diff_hour, diff_min, diff_sec);
2255
2256
2257         if (diff_day > 30) {
2258                 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_LONG_TIME_AGO_ABB"));
2259                 goto OUT;
2260         }
2261
2262         if (diff_day > 7) {
2263                 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_WITHIN_A_MONTH_ABB"));
2264                 goto OUT;
2265         }
2266         if (diff_day > 1) {
2267                 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_WITHIN_A_WEEK_ABB"));
2268                 goto OUT;
2269         }
2270
2271         if (diff_hour > 1) {
2272                 snprintf(time_str, sizeof(time_str) - 1, i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_PD_HOURS_AGO_ABB"), diff_hour);
2273                 goto OUT;
2274         }
2275
2276         if (diff_hour == 1) {
2277                 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_1_HOUR_AGO_ABB"));
2278                 goto OUT;
2279         }
2280         if (diff_min > 1) {
2281                 snprintf(time_str, sizeof(time_str) - 1, i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_PD_MINUTES_AGO_ABB"), diff_min);
2282                 goto OUT;
2283         }
2284         if (diff_min == 1) {
2285                 snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_1_MINUTE_AGO_ABB"));
2286                 goto OUT;
2287         }
2288         snprintf(time_str, sizeof(time_str) - 1, "%s", i18n_get_text("IDS_TGRAM_HEADER_LAST_SEEN_RECENTLY_ABB"));
2289
2290 OUT:
2291         elm_object_item_part_text_set(nf_it, "subtitle", time_str);
2292 }
2293
2294 void on_user_presence_state_changed(appdata_s* ad, int buddy_id)
2295 {
2296         if (!ad)
2297                 return;
2298         int type_of_chat = ad->peer_in_cahtting_data->use_data->peer_type;
2299         Elm_Object_Item *nf_it = evas_object_data_get(ad->nf, "navi_item");
2300
2301         if (type_of_chat == TGL_PEER_USER) {
2302
2303                 Eina_List* buddy_details_array = get_buddy_info(buddy_id);
2304                 if (buddy_details_array && eina_list_count(buddy_details_array) > 0) {
2305                         Eina_List* buddy_details = eina_list_nth(buddy_details_array, 0);
2306                         if (buddy_details && eina_list_count(buddy_details) > 0) {
2307                                 int* temp_online = (int*)eina_list_nth(buddy_details, 12);
2308                                 int is_online = *temp_online;
2309                                 int* temp_last_seen = (int*)eina_list_nth(buddy_details, 13);
2310                                 int last_seen = *temp_last_seen;
2311
2312                                 if (is_online > 0) {
2313                                         char status_str[256] = {0,};
2314                                         snprintf(status_str, sizeof(status_str) - 1, "%s", i18n_get_text("IDS_TGRAM_SBODY_ONLINE"));
2315                                         elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2316                                 } else {
2317                                         compare_with_current_date(last_seen, nf_it);
2318                                 }
2319
2320                                 for (int i = 0 ; i < eina_list_count(buddy_details_array); i++) {
2321                                         void* val = eina_list_nth(buddy_details, i);
2322                                         free(val);
2323                                 }
2324                                 eina_list_free(buddy_details);
2325                         }
2326                         eina_list_free(buddy_details_array);
2327                 }
2328
2329         } else if (type_of_chat == TGL_PEER_CHAT) {
2330
2331                 tg_chat_info_s* chat_info = get_chat_info(buddy_id);
2332                 if (!chat_info) {
2333                         char status_str[256] = {0,};
2334                         snprintf(status_str, sizeof(status_str) - 1, "Unidentified.");
2335                         elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2336                         return;
2337                 }
2338
2339                 int user_list_size = chat_info->user_list_size;
2340                 int online_members = 0;
2341
2342                 Eina_List *names_of_buddies = NULL;
2343
2344                 for (int i = 0; i < user_list_size; i++) {
2345
2346                         int is_online = get_buddy_online_status(chat_info->chat_users[i]);
2347                         if (is_online > 0) {
2348                                 online_members++;
2349                         }
2350
2351                         char *buddy_full_name = NULL;
2352                         int buddy_id = chat_info->chat_users[i];
2353
2354                         if (buddy_id == ad->current_user_data->user_id.id) {
2355                                 buddy_full_name = strdup(ad->current_user_data->print_name);
2356                         } else {
2357                                 buddy_full_name = get_buddy_name_from_id(buddy_id);
2358                         }
2359
2360                         if (buddy_full_name) {
2361                                 char *buddy_name =  replace(buddy_full_name, '_', " ");
2362                                 if (buddy_name) {
2363                                         buddies_info *buddy_info = (buddies_info*)malloc(sizeof(buddies_info));
2364                                         buddy_info->name = buddy_name;
2365                                         buddy_info->id = buddy_id;
2366                                         names_of_buddies = eina_list_append(names_of_buddies, (void*)(buddy_info));
2367                                 }
2368                                 free(buddy_full_name);
2369                         }
2370                 }
2371
2372                 evas_object_data_set(ad->nf, "names_of_buddies", (void*)names_of_buddies);
2373
2374 #if 0
2375                 if (online_members == 0) {
2376                         char status_str[256] = {0,};
2377                         snprintf(status_str, sizeof(status_str) - 1, "<font=Tizen:style=Bold color=#ffffff align=left><font_size=30>%d %s</font_size></font>", user_list_size, i18n_get_text("IDS_TGRAM_BODY_PD_PARTICIPANTS"));
2378                         elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2379                 } else {
2380                         char status_str[256] = {0,};
2381                         snprintf(status_str, sizeof(status_str) - 1, "<font=Tizen:style=Bold color=#ffffff align=left><font_size=30>%d %s, %d %s</font_size></font>", user_list_size, , online_members, i18n_get_text("IDS_TGRAM_SBODY_ONLINE"));
2382                         elm_object_item_part_text_set(nf_it, "subtitle", status_str);
2383                 }
2384 #else
2385                 char status_str[256] = {0,};
2386                 snprintf(status_str, sizeof(status_str) - 1, i18n_get_text("IDS_TGRAM_BODY_PD_PARTICIPANTS"), user_list_size);
2387
2388                 char temp_status_str[512] = {0,};
2389                 snprintf(temp_status_str, sizeof(temp_status_str) - 1, "%s", status_str);
2390
2391                 elm_object_item_part_text_set(nf_it, "subtitle", temp_status_str);
2392 #endif
2393
2394                 if (chat_info) {
2395                         if (chat_info->print_title) {
2396                                 free(chat_info->print_title);
2397                                 chat_info->print_title = NULL;
2398                         }
2399                         if (chat_info->photo_path) {
2400                                 free(chat_info->photo_path);
2401                                 chat_info->photo_path = NULL;
2402                         }
2403                         if (chat_info->title) {
2404                                 free(chat_info->title);
2405                                 chat_info->title = NULL;
2406                         }
2407
2408                 }
2409         }
2410 }
2411
2412 static Eina_Bool on_change_input_type_requested(void *data)
2413 {
2414         Evas_Object* text_entry = data;
2415         if (!text_entry) {
2416                 LOGE("Fail to get the text_entry");
2417                 return ECORE_CALLBACK_CANCEL;
2418         }
2419         elm_object_focus_set(text_entry, EINA_TRUE);
2420         elm_entry_input_panel_layout_set(text_entry, ELM_INPUT_PANEL_LAYOUT_EMOTICON);
2421         elm_entry_input_panel_show(text_entry);
2422
2423         return ECORE_CALLBACK_CANCEL;
2424 }
2425
2426 static void on_message_cancel_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2427 {
2428         Evas_Object *layout = data;
2429         if (!layout) {
2430                 LOGE("Fail to get the layout");
2431                 return;
2432         }
2433         elm_object_signal_emit(layout, "hide", "bubblemessage");
2434 }
2435
2436 static void on_message_smiley_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2437 {
2438         Evas_Object* text_entry = data;
2439         if (!text_entry) {
2440                 LOGE("Fail to get the text_entry");
2441                 return;
2442         }
2443         ecore_timer_add(0.3, on_change_input_type_requested, text_entry);
2444 }
2445
2446 static void on_message_text_entry_clicked(void *data, Evas_Object *obj, void *event_info)
2447 {
2448         if (!obj) {
2449                 LOGE("Fail to get the entry");
2450                 return;
2451         }
2452         /* This Api is needed for type of keyboard: emoticon or caractor */
2453         elm_entry_input_panel_layout_set(obj, ELM_INPUT_PANEL_LAYOUT_NORMAL);
2454 }
2455
2456 static void on_message_text_entry_changed(void *data, Evas_Object *obj, void *event_info)
2457 {
2458         Evas_Object *layout = data;
2459
2460         if (!layout) {
2461                 LOGE("Fail to get the entry layout");
2462                 return;
2463         }
2464         int attach_show = (int) evas_object_data_get(layout, "is_attach_show");
2465
2466         if (elm_entry_is_empty(obj)) {
2467                 if (!attach_show) {
2468                         elm_object_signal_emit(layout, "show", "attach_btn");
2469                         evas_object_data_set(layout, "is_attach_show", (void *) 1);
2470                 }
2471         } else {
2472                 if (attach_show) {
2473                         elm_object_signal_emit(layout, "hide", "attach_btn");
2474                         evas_object_data_set(layout, "is_attach_show", (void *) 0);
2475                 }
2476         }
2477 }
2478
2479 Evas_Object* create_chat_genlist(Evas_Object *win)
2480 {
2481     Evas_Object *genlist;
2482     Elm_Theme *theme = elm_theme_new();
2483         char edj_path[PATH_MAX] = {0, };
2484         app_get_resource(TELEGRAM_GENLIST_THEME_EDJ, edj_path, (int)PATH_MAX);
2485         elm_theme_extension_add(theme, edj_path);
2486     genlist = elm_genlist_add(win);
2487     elm_object_theme_set(genlist, theme);
2488     elm_object_style_set(genlist, "telegram/default");
2489     evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2490     elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
2491     return genlist;
2492 }
2493
2494 void on_list_media_item_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
2495 {
2496
2497 }
2498
2499 static Eina_Bool on_new_contact_message_send_cb(void *data)
2500 {
2501         Evas_Object *chat_scroller = data;
2502         appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2503         int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2504
2505         peer_with_pic_s *sel_item =  eina_list_nth(ad->peer_list, user_id);
2506
2507         int unique_id = time(NULL);
2508
2509         char unique_id_str[50];
2510         sprintf(unique_id_str, "%d", unique_id);
2511
2512         tg_message_s msg;
2513         msg.msg_id = unique_id;
2514         msg.from_id = ad->current_user_data->user_id.id;
2515         msg.date = time(NULL);
2516         msg.flags = 0;
2517         msg.fwd_date = 0;
2518         msg.fwd_from_id = 0;
2519         msg.fwd_from_id = 0;
2520         msg.unique_id = unique_id;
2521         msg.message = "";
2522         msg.message_len = 0;
2523         msg.media_type = tgl_message_media_contact;
2524         msg.media_id = strdup(unique_id_str);
2525         msg.out = 1;
2526         msg.service = 0;
2527         msg.to_id = sel_item->use_data->peer_id;
2528         msg.unread = 0;
2529         msg.msg_state = TG_MESSAGE_STATE_SENDING;
2530         msg.is_marked_for_delete = 0;
2531
2532         char* msg_table = get_table_name_from_number(msg.to_id);
2533         create_buddy_msg_table(msg_table);
2534         insert_msg_into_db(&msg, msg_table, unique_id);
2535         int img_width = 0;
2536         int img_height = 0;
2537         int media_size = 0;
2538
2539         char *first_name = evas_object_data_get(chat_scroller, "contact_first_name");
2540         char *last_name = evas_object_data_get(chat_scroller, "contact_last_name");
2541         char *phone_number = evas_object_data_get(chat_scroller, "contact_phone_number");
2542
2543         insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, NULL, NULL, first_name, last_name, phone_number);
2544
2545         free(msg_table);
2546
2547         // send request to service
2548         send_request_for_media_transport(ad, ad->service_client, sel_item->use_data->peer_id, msg.msg_id, unique_id, tgl_message_media_contact, NULL, sel_item->use_data->peer_type);
2549
2550         Evas_Object *message = NULL;
2551
2552         message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2553         elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2554         scroller_push_item(chat_scroller, message, 0);
2555
2556         free(msg.media_id);
2557
2558         return ECORE_CALLBACK_CANCEL;
2559
2560 }
2561
2562 void send_contact_message_to_buddy(void *data, char *first_name, char *last_name, char *phone_number)
2563 {
2564         Evas_Object *chat_scroller = data;
2565         appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2566         if (!ad) {
2567                 return;
2568         }
2569         int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2570
2571         if (add_date_item_to_chat(data)) {
2572 /*              evas_object_data_set(chat_scroller, "contact_first_name", strdup(first_name));
2573                 evas_object_data_set(chat_scroller, "contact_last_name", strdup(last_name));
2574                 evas_object_data_set(chat_scroller, "contact_phone_number", strdup(phone_number));
2575
2576                 ecore_timer_add(2, on_new_contact_message_send_cb, chat_scroller);
2577                 return;*/
2578                 wait_for(2);
2579         }
2580
2581         peer_with_pic_s *sel_item =  eina_list_nth(ad->peer_list, user_id);
2582
2583         int unique_id = get_time_stamp_in_macro();
2584         if (unique_id < 0) {
2585                 unique_id = -1 * unique_id;
2586         }
2587         char unique_id_str[50];
2588         sprintf(unique_id_str, "%d", unique_id);
2589
2590         tg_message_s msg;
2591         msg.msg_id = unique_id;
2592         msg.from_id = ad->current_user_data->user_id.id;
2593         msg.date = time(NULL);
2594         msg.flags = 0;
2595         msg.fwd_date = 0;
2596         msg.fwd_from_id = 0;
2597         msg.fwd_from_id = 0;
2598         msg.unique_id = unique_id;
2599         msg.message = "";
2600         msg.message_len = 0;
2601         msg.media_type = tgl_message_media_contact;
2602         msg.media_id = strdup(unique_id_str);
2603         msg.out = 1;
2604         msg.service = 0;
2605         msg.to_id = sel_item->use_data->peer_id;
2606         msg.unread = 0;
2607         msg.msg_state = TG_MESSAGE_STATE_SENDING;
2608         msg.is_marked_for_delete = 0;
2609
2610         char* msg_table = get_table_name_from_number(msg.to_id);
2611         create_buddy_msg_table(msg_table);
2612         insert_msg_into_db(&msg, msg_table, unique_id);
2613         int img_width = 0;
2614         int img_height = 0;
2615         int media_size = 0;
2616         insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, NULL, NULL, first_name, last_name, phone_number);
2617
2618         free(msg_table);
2619
2620         // send request to service
2621         send_request_for_media_transport(ad, ad->service_client, sel_item->use_data->peer_id, msg.msg_id, unique_id, tgl_message_media_contact, NULL, sel_item->use_data->peer_type);
2622
2623         Evas_Object *message = NULL;
2624
2625         message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2626         elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2627         scroller_push_item(chat_scroller, message, 0);
2628         free(msg.media_id);
2629 }
2630
2631 static Eina_Bool on_new_location_message_send_cb(void *data)
2632 {
2633         Evas_Object *chat_scroller = data;
2634         appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2635         int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2636
2637         peer_with_pic_s *sel_item =  eina_list_nth(ad->peer_list, user_id);
2638
2639         int unique_id = time(NULL);
2640
2641         char unique_id_str[50];
2642         sprintf(unique_id_str, "%d", unique_id);
2643
2644         tg_message_s msg;
2645         msg.msg_id = unique_id;
2646         msg.from_id = ad->current_user_data->user_id.id;
2647         msg.date = time(NULL);
2648         msg.flags = 0;
2649         msg.fwd_date = 0;
2650         msg.fwd_from_id = 0;
2651         msg.fwd_from_id = 0;
2652         msg.unique_id = unique_id;
2653         msg.message = "";
2654         msg.message_len = 0;
2655         msg.media_type = tgl_message_media_geo;
2656         msg.media_id = strdup(unique_id_str);
2657         msg.out = 1;
2658         msg.service = 0;
2659         msg.to_id = sel_item->use_data->peer_id;
2660         msg.unread = 0;
2661         msg.msg_state = TG_MESSAGE_STATE_SENDING;
2662         msg.is_marked_for_delete = 0;
2663
2664         char* msg_table = get_table_name_from_number(msg.to_id);
2665         create_buddy_msg_table(msg_table);
2666         insert_msg_into_db(&msg, msg_table, unique_id);
2667         int img_width = 0;
2668         int img_height = 0;
2669         int media_size = 0;
2670
2671         char *latitude = evas_object_data_get(chat_scroller, "contact_latitude");
2672         char *longitude = evas_object_data_get(chat_scroller, "contact_longitude");
2673
2674         insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, latitude, longitude, NULL, NULL, NULL);
2675
2676         free(msg_table);
2677
2678         // send request to service
2679         send_request_for_media_transport(ad, ad->service_client, sel_item->use_data->peer_id, msg.msg_id, unique_id, tgl_message_media_geo, NULL, sel_item->use_data->peer_type);
2680
2681         Evas_Object *message = NULL;
2682
2683         message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2684         elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2685         scroller_push_item(chat_scroller, message, 0);
2686
2687         free(msg.media_id);
2688         return ECORE_CALLBACK_CANCEL;
2689 }
2690
2691 void send_location_message_to_buddy(void *data, char *latitude, char *longitude)
2692 {
2693         Evas_Object *chat_scroller = data;
2694         appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2695         if (!ad) {
2696                 return;
2697         }
2698         int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2699
2700         if (add_date_item_to_chat(data)) {
2701 /*              evas_object_data_set(chat_scroller, "contact_latitude", strdup(latitude));
2702                 evas_object_data_set(chat_scroller, "contact_longitude", strdup(longitude));
2703                 ecore_timer_add(2, on_new_location_message_send_cb, chat_scroller);
2704                 return;*/
2705                 wait_for(2);
2706         }
2707
2708         peer_with_pic_s *sel_item =  eina_list_nth(ad->peer_list, user_id);
2709
2710         int unique_id = get_time_stamp_in_macro();
2711         if (unique_id < 0) {
2712                 unique_id = -1 * unique_id;
2713         }
2714         char unique_id_str[50];
2715         sprintf(unique_id_str, "%d", unique_id);
2716
2717         tg_message_s msg;
2718         msg.msg_id = unique_id;
2719         msg.from_id = ad->current_user_data->user_id.id;
2720         msg.date = time(NULL);
2721         msg.flags = 0;
2722         msg.fwd_date = 0;
2723         msg.fwd_from_id = 0;
2724         msg.fwd_from_id = 0;
2725         msg.unique_id = unique_id;
2726         msg.message = "";
2727         msg.message_len = 0;
2728         msg.media_type = tgl_message_media_geo;
2729         msg.media_id = strdup(unique_id_str);
2730         msg.out = 1;
2731         msg.service = 0;
2732         msg.to_id = sel_item->use_data->peer_id;
2733         msg.unread = 0;
2734         msg.msg_state = TG_MESSAGE_STATE_SENDING;
2735         msg.is_marked_for_delete = 0;
2736
2737         char* msg_table = get_table_name_from_number(msg.to_id);
2738         create_buddy_msg_table(msg_table);
2739         insert_msg_into_db(&msg, msg_table, unique_id);
2740         int img_width = 0;
2741         int img_height = 0;
2742         int media_size = 0;
2743         insert_media_info_to_db(&msg, NULL, img_width, img_height, media_size, latitude, longitude, NULL, NULL, NULL);
2744
2745         free(msg_table);
2746
2747         // send request to service
2748         send_request_for_media_transport(ad, ad->service_client, sel_item->use_data->peer_id, msg.msg_id, unique_id, tgl_message_media_geo, NULL, sel_item->use_data->peer_type);
2749
2750         Evas_Object *message = NULL;
2751
2752         message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2753         elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2754         scroller_push_item(chat_scroller, message, 0);
2755
2756         free(msg.media_id);
2757 }
2758
2759 static Eina_Bool on_new_media_message_send_cb(void *data)
2760 {
2761         Evas_Object *chat_scroller = data;
2762         appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2763         int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2764
2765         peer_with_pic_s *sel_item =  eina_list_nth(ad->peer_list, user_id);
2766
2767         int unique_id = time(NULL);
2768
2769         char unique_id_str[50];
2770         sprintf(unique_id_str, "%d", unique_id);
2771
2772         char *file_type_char = evas_object_data_get(chat_scroller, "file_type");
2773         int file_type = atoi(file_type_char);
2774         char *file_path = evas_object_data_get(chat_scroller, "file_path");
2775
2776         tg_message_s msg;
2777         msg.msg_id = unique_id;
2778         msg.from_id = ad->current_user_data->user_id.id;
2779         msg.date = time(NULL);
2780         msg.flags = 0;
2781         msg.fwd_date = 0;
2782         msg.fwd_from_id = 0;
2783         msg.fwd_from_id = 0;
2784         msg.unique_id = unique_id;
2785         msg.message = "";
2786         msg.message_len = 0;
2787         msg.media_type = file_type;
2788         msg.media_id = strdup(unique_id_str);
2789         msg.out = 1;
2790         msg.service = 0;
2791         msg.to_id = sel_item->use_data->peer_id;
2792         msg.unread = 0;
2793         msg.msg_state = TG_MESSAGE_STATE_SENDING;
2794         msg.is_marked_for_delete = 0;
2795
2796         char* msg_table = get_table_name_from_number(msg.to_id);
2797         create_buddy_msg_table(msg_table);
2798         insert_msg_into_db(&msg, msg_table, unique_id);
2799         int img_width = 0;
2800         int img_height = 0;
2801         int media_size = 0;
2802         if (file_type == tgl_message_media_photo) {
2803                 Evas_Object *img = create_image_object_from_file(file_path, chat_scroller);
2804                 elm_image_object_size_get(img, &img_width, &img_height);
2805                 struct stat st;
2806                 stat(file_path, &st);
2807                 media_size = st.st_size;
2808                 evas_object_del(img);
2809         }
2810
2811         insert_media_info_to_db(&msg, (char*)file_path, img_width, img_height, media_size, NULL, NULL , NULL, NULL, NULL);
2812
2813         free(msg_table);
2814
2815         // send request to service
2816         send_request_for_media_transport(ad, ad->service_client, sel_item->use_data->peer_id, msg.msg_id, unique_id, file_type, file_path, sel_item->use_data->peer_type);
2817
2818         Evas_Object *message = NULL;
2819
2820         message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2821         elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2822         scroller_push_item(chat_scroller, message, 0);
2823
2824         free(msg.media_id);
2825         ad->is_last_msg_changed = EINA_TRUE;
2826         return ECORE_CALLBACK_CANCEL;
2827 }
2828
2829 void send_media_message_to_buddy(void *data, const char* file_path, enum tgl_message_media_type file_type)
2830 {
2831         Evas_Object *chat_scroller = data;
2832         appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2833         if (!ad) {
2834                 return;
2835         }
2836         int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2837         if (add_date_item_to_chat(data)) {
2838 /*              int temp_file_type = file_type;
2839                 char file_type_char[10]= {0, };
2840                 sprintf(file_type_char, "%d", temp_file_type);
2841                 evas_object_data_set(chat_scroller, "file_type", strdup(file_type_char));
2842                 evas_object_data_set(chat_scroller, "file_path", strdup(file_path));
2843
2844                 ecore_timer_add(2, on_new_media_message_send_cb, chat_scroller);
2845                 return;*/
2846                 wait_for(2);
2847         }
2848         peer_with_pic_s *sel_item =  eina_list_nth(ad->peer_list, user_id);
2849
2850         int unique_id = get_time_stamp_in_macro();
2851         if (unique_id < 0) {
2852                 unique_id = -1 * unique_id;
2853         }
2854         char unique_id_str[50];
2855         sprintf(unique_id_str, "%d", unique_id);
2856
2857         tg_message_s msg;
2858         msg.msg_id = unique_id;
2859         msg.from_id = ad->current_user_data->user_id.id;
2860         msg.date = time(NULL);
2861         msg.flags = 0;
2862         msg.fwd_date = 0;
2863         msg.fwd_from_id = 0;
2864         msg.fwd_from_id = 0;
2865         msg.unique_id = unique_id;
2866         msg.message = "";
2867         msg.message_len = 0;
2868         msg.media_type = file_type;
2869         msg.media_id = strdup(unique_id_str);
2870         msg.out = 1;
2871         msg.service = 0;
2872         msg.to_id = sel_item->use_data->peer_id;
2873         msg.unread = 0;
2874         msg.msg_state = TG_MESSAGE_STATE_SENDING;
2875         msg.is_marked_for_delete = 0;
2876
2877         char* msg_table = get_table_name_from_number(msg.to_id);
2878         create_buddy_msg_table(msg_table);
2879         insert_msg_into_db(&msg, msg_table, unique_id);
2880         int img_width = 0;
2881         int img_height = 0;
2882         int media_size = 0;
2883         if (file_type == tgl_message_media_photo) {
2884                 Evas_Object* img = create_image_object_from_file(file_path, chat_scroller);
2885                 elm_image_object_size_get(img, &img_width, &img_height);
2886                 struct stat st;
2887                 stat(file_path, &st);
2888                 media_size = st.st_size;
2889                 evas_object_del(img);
2890         }
2891
2892         insert_media_info_to_db(&msg, (char*)file_path, img_width, img_height, media_size, NULL, NULL , NULL, NULL, NULL);
2893
2894         free(msg_table);
2895
2896         // send request to service
2897         send_request_for_media_transport(ad, ad->service_client, sel_item->use_data->peer_id, msg.msg_id, unique_id, file_type, file_path, sel_item->use_data->peer_type);
2898
2899         Evas_Object *message = NULL;
2900
2901         message = on_message_item_content_get_cb((void *)&msg, chat_scroller, "elm.icon.entry");
2902         elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)unique_id);
2903         scroller_push_item(chat_scroller, message, 0);
2904
2905         free(msg.media_id);
2906         ad->is_last_msg_changed = EINA_TRUE;
2907 }
2908
2909 static Eina_Bool on_timer_expired(void *data)
2910 {
2911         Evas_Object *scroller = data;
2912         int ret = 1;
2913         int is_end_edge_top = 0;
2914         is_end_edge_top = (int)evas_object_data_get(scroller, "is_end_edge_top");
2915
2916         if (!scroller) {
2917                 LOGE("Cannot get the scroller");
2918                 return ECORE_CALLBACK_CANCEL;
2919         }
2920         //ret = scroller_show_bottom_edge(scroller);
2921         ret = scroller_show_previous_region(scroller);
2922         if (!ret) {
2923                 LOGE("Fail to show the bottom of scroller");
2924         }
2925
2926         return ECORE_CALLBACK_CANCEL;
2927 }
2928
2929 Eina_Bool load_chat_history(Evas_Object *chat_scroller)
2930 {
2931         int offset_num = (int)evas_object_data_get(chat_scroller,"offset_num");
2932         if(offset_num < -TG_DBMGR_LIMITED) return EINA_FALSE;
2933         appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2934         int user_id = (int)evas_object_data_get(chat_scroller, "user_id");
2935
2936         peer_with_pic_s *sel_item =  eina_list_nth(ad->peer_list, user_id);
2937         int buddy_id = sel_item->use_data->peer_id;
2938         char* tablename = get_table_name_from_number(buddy_id);
2939         Eina_List *vals = NULL;
2940         if(offset_num >= 0)
2941                 vals = get_messages_from_message_table_order_by(tablename, MESSAGE_INFO_TABLE_DATE, EINA_TRUE, TG_DBMGR_LIMITED, offset_num);
2942         else
2943                 vals = get_messages_from_message_table_order_by(tablename, MESSAGE_INFO_TABLE_DATE, EINA_TRUE, TG_DBMGR_LIMITED + offset_num, 0);
2944         tg_message_s *message_item = NULL;
2945
2946         if (!vals) {
2947                 // set no messages yet
2948                 return EINA_FALSE;
2949         } else {
2950                 int row_count = eina_list_count(vals);
2951
2952                 for (int i = row_count-1 ; i >= 0 ; i--) {
2953                         Evas_Object *message = NULL;
2954
2955                         message_item = eina_list_nth(vals, i);
2956                         message = on_message_item_content_get_cb((void *)message_item, chat_scroller, "elm.icon.entry");
2957                         elm_object_signal_callback_add(message, "clicked", "item", on_list_media_item_clicked, (void*)message_item->msg_id);
2958                         scroller_push_item(chat_scroller, message, 1);
2959                         free_message(&message_item);
2960                 }
2961                 eina_list_free(vals);
2962         }
2963
2964 //      Ecore_Timer *timer = NULL;
2965 //      timer = ecore_timer_add(0.1, on_timer_expired, chat_scroller);
2966
2967         free(tablename);
2968         evas_object_data_set(chat_scroller, "offset_num", (void *)(offset_num-TG_DBMGR_LIMITED));
2969         return EINA_TRUE;
2970 }
2971
2972
2973
2974 void on_gallery_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
2975 {
2976         if (result == APP_CONTROL_RESULT_SUCCEEDED) {
2977                 Evas_Object* chat_scroller = user_data;
2978                 char* file_path = NULL;
2979                 char** path_arryay = NULL;
2980                 int array_length = 0;
2981                 int status;
2982                 char* mime_type = NULL;
2983                 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
2984
2985                 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay,  &array_length);
2986                 if (status != APP_CONTROL_ERROR_NONE) {
2987                         status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay,  &array_length);
2988                         if (status != APP_CONTROL_ERROR_NONE) {
2989                                 if (ad) {
2990                                         show_toast(ad, "Unable to get the result from attach panel");
2991                                 }
2992                                 return;
2993                         }
2994                 }
2995
2996                 status = app_control_get_mime(reply, &mime_type);
2997                 if (status != APP_CONTROL_ERROR_NONE) {
2998                         if (ad) {
2999                                 show_toast(ad, "Unable to get the mime type from attach panel");
3000                         }
3001                         return;
3002                 }
3003
3004                 for (int i = 0 ; i < array_length ; i++) {
3005                         file_path = strdup(path_arryay[i]);
3006                         send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_photo);
3007                         free(file_path);
3008                         //break;
3009                 }
3010         }
3011 }
3012
3013 void on_location_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3014 {
3015         Evas_Object* chat_scroller = user_data;
3016         appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3017         if (result == APP_CONTROL_RESULT_SUCCEEDED) {
3018                 char *latitude = NULL;
3019                 char *longitude = NULL;
3020                 app_control_get_extra_data(reply, "latitude", &latitude);
3021                 app_control_get_extra_data(reply, "longitude", &longitude);
3022
3023                 if (latitude && longitude) {
3024                         send_location_message_to_buddy(chat_scroller, latitude, longitude);
3025                 } else {
3026                         //send_location_message_to_buddy(chat_scroller, "0.00000000000", "0.00000000000");
3027                         show_toast(ad, "Unable to detect location values.");
3028                 }
3029         } else {
3030                 show_toast(ad, "Device does not support location feature.");
3031         }
3032 }
3033
3034 void on_video_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3035 {
3036         if (result == APP_CONTROL_RESULT_SUCCEEDED) {
3037
3038                 Evas_Object* chat_scroller = user_data;
3039                 char* file_path = NULL;
3040                 char** path_arryay = NULL;
3041                 int array_length = 0;
3042                 int status;
3043                 char* mime_type = NULL;
3044                 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3045
3046                 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay,  &array_length);
3047                 if (status != APP_CONTROL_ERROR_NONE) {
3048                         status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay,  &array_length);
3049                         if (status != APP_CONTROL_ERROR_NONE) {
3050                                 if (ad) {
3051                                         show_toast(ad, "Unable to get the result from attach panel");
3052                                 }
3053                                 return;
3054                         }
3055                 }
3056
3057                 status = app_control_get_mime(reply, &mime_type);
3058                 if (status != APP_CONTROL_ERROR_NONE) {
3059                         if (ad) {
3060                                 show_toast(ad, "Unable to get the mime type from attach panel");
3061                         }
3062                         return;
3063                 }
3064                 for (int i = 0 ; i < array_length ; i++) {
3065                         file_path = strdup(path_arryay[i]);
3066                         send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3067                         free(file_path);
3068                         //break;
3069                 }
3070         }
3071 }
3072
3073 void on_file_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3074 {
3075         if (result == APP_CONTROL_RESULT_SUCCEEDED) {
3076
3077                 Evas_Object* chat_scroller = user_data;
3078                 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3079                 char* file_path = NULL;
3080                 char** path_arryay = NULL;
3081                 int array_length = 0;
3082                 app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay,  &array_length);
3083
3084                 for (int i = 0 ; i < array_length ; i++) {
3085                         file_path = strdup(path_arryay[i]);
3086
3087                         // get mime type of the file
3088
3089                         char *mime_type = NULL;
3090                         if (file_path) {
3091                                 char *extn = strrchr(file_path, '.');
3092                                 if (extn) {
3093                                         extn = replace(extn, '.', "");
3094                                 }
3095                                 if (extn) {
3096                                         mime_type_get_mime_type(extn, &mime_type);
3097                                 }
3098                         }
3099                         if (mime_type) {
3100                                 if (strstr(mime_type, "video") != NULL) {
3101                                         send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3102                                 } else if (strstr(mime_type, "audio") != NULL) {
3103                                         send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3104                                 } else if (strstr(mime_type, "image") != NULL) {
3105                                         send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_photo);
3106                                 } else {
3107                                         show_toast(ad, "Unsupported file.");
3108                                 }
3109                         } else {
3110                                 show_toast(ad, "Unsupported file.");
3111                         }
3112                         free(file_path);
3113                         break;
3114                 }
3115         }
3116 }
3117
3118 static void on_voice_record_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3119 {
3120         if (result == APP_CONTROL_RESULT_SUCCEEDED) {
3121                 Evas_Object* chat_scroller = user_data;
3122
3123                 char* file_path = NULL;
3124                 char** path_arryay = NULL;
3125                 int array_length = 0;
3126                 int status;
3127                 char* mime_type = NULL;
3128                 appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3129
3130                 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay,  &array_length);
3131                 if (status != APP_CONTROL_ERROR_NONE) {
3132                         status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay,  &array_length);
3133                         if (status != APP_CONTROL_ERROR_NONE) {
3134                                 if (ad) {
3135                                         show_toast(ad, "Unable to get the result from attach panel");
3136                                 }
3137                                 return;
3138                         }
3139                 }
3140
3141                 status = app_control_get_mime(reply, &mime_type);
3142                 if (status != APP_CONTROL_ERROR_NONE) {
3143                         if (ad) {
3144                                 show_toast(ad, "Unable to get the mime type from attach panel");
3145                         }
3146                         return;
3147                 }
3148
3149                 for (int i = 0 ; i < array_length ; i++) {
3150                         file_path = strdup(path_arryay[i]);
3151                         send_media_message_to_buddy(chat_scroller, file_path, tgl_message_media_document);
3152                         free(file_path);
3153                         //break;
3154                 }
3155         }
3156 }
3157
3158 void on_contact_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
3159 {
3160         if (result == APP_CONTROL_RESULT_SUCCEEDED) {
3161
3162                 Evas_Object* chat_scroller = user_data;
3163                 char *contact_name = NULL;
3164                 char *phone_number = NULL;
3165                 app_control_get_extra_data(reply, "http://tizen.org/appcontrol/data/name", &contact_name);
3166                 app_control_get_extra_data(reply, "http://tizen.org/appcontrol/data/phone", &phone_number);
3167
3168         }
3169 }
3170
3171 static void _result_cb(attach_panel_h attach_panel, attach_panel_content_category_e content_category, app_control_h result, app_control_result_e result_code, void *user_data)
3172 {
3173         switch (content_category) {
3174         case ATTACH_PANEL_CONTENT_CATEGORY_IMAGE:
3175         case ATTACH_PANEL_CONTENT_CATEGORY_CAMERA:
3176                 on_gallery_app_control_reply_cb(NULL, result, result_code, user_data);
3177                 break;
3178         case ATTACH_PANEL_CONTENT_CATEGORY_VIDEO:
3179         case ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER:
3180                 on_video_app_control_reply_cb(NULL, result, result_code, user_data);
3181                 break;
3182         case ATTACH_PANEL_CONTENT_CATEGORY_VOICE:
3183                 on_voice_record_reply_cb(NULL, result, result_code, user_data);
3184                 break;
3185         case ATTACH_PANEL_CONTENT_CATEGORY_MYFILES:
3186         case ATTACH_PANEL_CONTENT_CATEGORY_AUDIO:
3187                 on_file_app_control_reply_cb(NULL, result, result_code, user_data);
3188                 break;
3189         case ATTACH_PANEL_CONTENT_CATEGORY_CONTACT:
3190                 on_contact_app_control_reply_cb(NULL, result, result_code, user_data);
3191                 break;
3192         default:
3193                 break;
3194         }
3195         attach_panel_hide(attach_panel);
3196 }
3197
3198 void on_media_type_selected_cb(void *data, Evas_Object *obj, void *event_info)
3199 {
3200         Evas_Object* chat_scroller = data;
3201         appdata_s* ad = evas_object_data_get(chat_scroller, "app_data");
3202         const char *label = elm_object_item_text_get((Elm_Object_Item *) event_info);
3203         if (strcasecmp(label, POPUP_TEXT_TAKE_GALLERY) == 0) {
3204                 app_control_h app_control;
3205                 int ret = app_control_create(&app_control);
3206                 if (ret != APP_CONTROL_ERROR_NONE) {
3207                         show_toast(ad, "Error: Can not load image picker");
3208                         return;
3209                 }
3210
3211                 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3212
3213                 app_control_set_mime(app_control, "image/*");
3214                 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3215                 app_control_send_launch_request(app_control, &on_gallery_app_control_reply_cb, data);
3216                 app_control_destroy(app_control);
3217         } else if (strcasecmp(label, POPUP_TEXT_TAKE_PHOTO) == 0) {
3218                 app_control_h app_control;
3219                 int ret = app_control_create(&app_control);
3220                 if (ret != APP_CONTROL_ERROR_NONE) {
3221                         show_toast(ad, "Error: Can not load image picker");
3222                         return;
3223                 }
3224                 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3225                 app_control_set_mime(app_control, "image/jpg");
3226                 //app_control_add_extra_data(app_control, "crop", "caller_id");
3227                 app_control_send_launch_request(app_control, &on_gallery_app_control_reply_cb, data);
3228                 app_control_destroy(app_control);
3229         } else if (strcasecmp(label, POPUP_TEXT_TAKE_VIDEO) == 0) {
3230                 app_control_h app_control;
3231                 int ret = app_control_create(&app_control);
3232                 if (ret != APP_CONTROL_ERROR_NONE) {
3233                         show_toast(ad, "Error: Can not load image picker");
3234                         return;
3235                 }
3236
3237                 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3238
3239                 int remain_byte_size = 10485760;
3240                 int request_KB_size = 0;
3241
3242                 if (remain_byte_size >= 1024) {
3243                         request_KB_size = remain_byte_size / 1024;
3244                 } else {
3245                         // TODO: Need to check minimum size for recording
3246                         request_KB_size = 1;
3247                 }
3248
3249                 char recording_size[128] = {0, };
3250                 snprintf(recording_size, sizeof(recording_size), "%d", request_KB_size);
3251                 app_control_set_mime(app_control, "video/3gp");
3252                 app_control_add_extra_data(app_control, "LIMIT", recording_size);
3253                 app_control_add_extra_data(app_control, "RESOLUTION", "VGA");
3254                 app_control_add_extra_data(app_control, "CALLER", "telegram");
3255
3256                 app_control_send_launch_request(app_control, &on_video_app_control_reply_cb, data);
3257                 app_control_destroy(app_control);
3258         } else if (strcasecmp(label, POPUP_TEXT_TAKE_AUDIO) == 0) {
3259
3260                 app_control_h app_control;
3261                 int ret = app_control_create(&app_control);
3262                 if (ret != APP_CONTROL_ERROR_NONE) {
3263                         show_toast(ad, "Error: Can not load image picker");
3264                         return;
3265                 }
3266
3267                 app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
3268
3269                 int size = 10485760;
3270
3271         int remain_byte_size = (int)size;
3272         int request_KB_size = 0;
3273
3274         if (remain_byte_size >= 1024) {
3275                 request_KB_size = remain_byte_size / 1024;
3276         } else {
3277                 // TODO: Need to check minimum size for recording
3278                 request_KB_size = 1;
3279         }
3280
3281                 char recording_size[128] = {0, };
3282                 snprintf(recording_size, sizeof(recording_size), "%d", request_KB_size);
3283                 app_control_add_extra_data(app_control, "SIZE", recording_size);
3284                 app_control_set_mime(app_control, "audio/*");
3285                 app_control_send_launch_request(app_control, &on_voice_record_reply_cb, data);
3286                 app_control_destroy(app_control);
3287
3288         } else if (strcasecmp(label, POPUP_TEXT_TAKE_FILE) == 0) {
3289                 app_control_h app_control;
3290                 int ret = app_control_create(&app_control);
3291                 if (ret != APP_CONTROL_ERROR_NONE) {
3292                         show_toast(ad, "Error: Can not load image picker");
3293                         return;
3294                 }
3295
3296                 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3297
3298                 app_control_set_mime(app_control, "*/*");
3299                 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3300                 app_control_send_launch_request(app_control, &on_file_app_control_reply_cb, data);
3301                 app_control_destroy(app_control);
3302
3303         } else if (strcasecmp(label, POPUP_TEXT_TAKE_LOCATION) == 0) {
3304                 app_control_h app_control;
3305                 int ret = app_control_create(&app_control);
3306                 if (ret != APP_CONTROL_ERROR_NONE) {
3307                         show_toast(ad, "Error: Can not load location picker");
3308                         return;
3309                 }
3310                 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3311                 //app_control_set_app_id(app_control, "com.here.tizen.maps");
3312                 app_control_set_uri(app_control, "geo");
3313                 app_control_send_launch_request(app_control, &on_location_app_control_reply_cb, data);
3314                 app_control_destroy(app_control);
3315         } else if (strcasecmp(label, POPUP_TEXT_TAKE_CONTACT) == 0) {
3316                 app_control_h app_control;
3317                 int ret = app_control_create(&app_control);
3318                 if (ret != APP_CONTROL_ERROR_NONE) {
3319                         show_toast(ad, "Error: Can not load location picker");
3320                         return;
3321                 }
3322                 app_control_set_operation(app_control, APP_CONTROL_OPERATION_PICK);
3323                 app_control_set_mime(app_control, "application/vnd.tizen.contact");
3324                 app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, "single");
3325                 app_control_send_launch_request(app_control, &on_contact_app_control_reply_cb, data);
3326                 app_control_destroy(app_control);
3327         }
3328
3329         evas_object_del(obj);
3330 }
3331
3332
3333 void popup_move_dropdown(Evas_Object *ctxpopup, Evas_Object *btn)
3334 {
3335         Evas_Coord x, y, w , h;
3336         evas_object_geometry_get(btn, &x, &y, &w, &h);
3337         evas_object_move(ctxpopup, x + (w / 2), y + h - 50);
3338 }
3339
3340 void on_media_attach_dismissed_cb(void *data, Evas_Object *obj, void *event_info)
3341 {
3342         evas_object_del(obj);
3343 }
3344
3345 static void on_media_attach_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
3346 {
3347         Evas_Object* chat_scroller = data;
3348         if (!chat_scroller) {
3349                 return;
3350         }
3351         appdata_s *ad = evas_object_data_get(chat_scroller, "app_data");
3352         if (!ad) {
3353                 return;
3354         }
3355         attach_panel_h attach_panel = NULL;
3356         int ret;
3357         bool visible = false;
3358
3359         attach_panel = evas_object_data_get(ad->conform, "attach_panel");
3360         if (attach_panel) {
3361                         if (attach_panel_get_visibility(attach_panel, &visible) != ATTACH_PANEL_ERROR_NONE) {
3362                                 attach_panel_set_result_cb(attach_panel, _result_cb, chat_scroller);
3363                                 return;
3364                         }
3365                         if (!visible) {
3366                                 attach_panel_show(attach_panel);
3367                         }
3368                         attach_panel_set_result_cb(attach_panel, _result_cb, chat_scroller);
3369                         return;
3370                 }
3371
3372         ret = attach_panel_create(ad->conform, &attach_panel);
3373
3374         if (!attach_panel) {
3375                 return;
3376         }
3377         attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, NULL);
3378         attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA, NULL);
3379         attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE, NULL);
3380         attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO, NULL);
3381         attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_AUDIO, NULL);
3382         attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CONTACT, NULL);
3383         attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_MYFILES, NULL);
3384         attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER, NULL);
3385         attach_panel_set_result_cb(attach_panel, _result_cb, chat_scroller);
3386
3387         attach_panel_show(attach_panel);
3388         evas_object_data_set(ad->conform, "attach_panel", attach_panel);
3389
3390 }
3391
3392 #if 0
3393 static void on_text_message_send_pressed(void *data, Evas_Object *obj, void *event_info)
3394 {
3395         elm_image_file_set(data, ui_utils_get_resource(SEND_UNPRESSED_ICON), NULL);
3396 }
3397
3398 static void on_text_message_send_unpressed(void *data, Evas_Object *obj, void *event_info)
3399 {
3400         elm_image_file_set(data, ui_utils_get_resource(SEND_PRESSED_ICON), NULL);
3401 }
3402 #endif
3403
3404 void on_message_back_button_clicked(void *data, Evas_Object *obj, void *event_info)
3405 {
3406         appdata_s *ad = data;
3407         if (!ad)
3408                 return;
3409
3410         app_nf_back_cb(data, obj, event_info);
3411 }
3412
3413 void on_user_info_button_clicked(void *data, Evas_Object *obj, void *event_info)
3414 {
3415         appdata_s *ad = data;
3416
3417         peer_with_pic_s  *sel_item = ad->peer_in_cahtting_data;
3418         tg_peer_info_s *user_data = sel_item->use_data;
3419
3420         if (!sel_item || !user_data) {
3421                 show_toast(ad, "Can not display user info");
3422                 return;
3423         }
3424
3425         if (user_data->peer_type == TGL_PEER_USER) {
3426                 launch_user_info_screen(ad, user_data->peer_id);
3427         } else if (user_data->peer_type == TGL_PEER_CHAT) {
3428                 launch_chat_info_screen(ad, user_data->peer_id);
3429         } else {
3430
3431         }
3432 }
3433
3434 void refresh_messaging_view(appdata_s *ad)
3435 {
3436         if (!ad)
3437                 return;
3438
3439         Evas_Object *scroller = evas_object_data_get(ad->nf, "chat_list");
3440
3441                 if (scroller) {
3442                         Evas_Object *box_layout = NULL;
3443                         Evas_Object *box = NULL;
3444                         Eina_List *list = NULL;
3445                         Eina_List *box_list = NULL;
3446                         Evas_Object *last_item = NULL;
3447
3448                         box_layout = elm_object_content_get(scroller);
3449                         if (!box_layout) {
3450                                 LOGE("Fail to get the box into scroller");
3451                                 return;
3452                         }
3453                         list = elm_box_children_get(box_layout);
3454                         if (!list) {
3455                                 LOGE("Fail to get the list into box");
3456                                 return;
3457                         }
3458
3459                         box = eina_list_nth(list, 0);
3460                         if (!box) {
3461                                 LOGE("Fail to get the box into box layout");
3462                                 return;
3463                         }
3464
3465                         box_list = elm_box_children_get(box);
3466                         if (!box_list) {
3467                                 LOGE("Fail to get the box_list into box");
3468                                 return;
3469                         }
3470
3471                         last_item = eina_list_nth(box_list, eina_list_count(box_list)-1);
3472                         if (!last_item) {
3473                                 LOGE("Fail to get the last item into box");
3474                                 return;
3475                         }
3476
3477                         int x, y;
3478                         evas_object_geometry_get(last_item, &x, &y, NULL, NULL);
3479
3480                         elm_scroller_region_show(scroller, x, y, -1, -1);
3481
3482                         eina_list_free(box_list);
3483                         eina_list_free(list);
3484                 }
3485 }
3486
3487 static void click_user_name_cb(void *data, Evas_Object *obj, void *event_info)
3488 {
3489         appdata_s *ad = evas_object_data_get(obj,"app_data");
3490         Elm_Object_Item *item = event_info;
3491         const char *clicked_name = elm_object_item_text_get(item);
3492         int peer_id = (int)elm_object_item_data_get(item);
3493         peer_with_pic_s* prev_peer_in_chatting_data = ad->peer_in_cahtting_data;
3494         user_data_with_pic_s* prev_buddy_in_chatting_data = ad->buddy_in_cahtting_data;
3495
3496         int buddy_list_counts = eina_list_count(ad->buddy_list);
3497         for (int i = 0; i < buddy_list_counts; i++) {
3498                 user_data_with_pic_s *item = eina_list_nth(ad->buddy_list, i);
3499                 user_data_s* user_data = item->use_data;
3500
3501                 if (user_data->user_id.id == peer_id) {
3502                         ad->buddy_in_cahtting_data = item;
3503                         break;
3504                 }
3505         }
3506         int peer_list_counts = eina_list_count(ad->peer_list);
3507         for (int i = 0; i < peer_list_counts; i++) {
3508                 peer_with_pic_s* pic_item = eina_list_nth(ad->peer_list, i);
3509                 tg_peer_info_s* item = pic_item->use_data;
3510                 if (item->peer_id == peer_id) {
3511                         ad->peer_in_cahtting_data = pic_item;
3512                         break;
3513                 }
3514         }
3515
3516         launch_user_info_screen(ad, peer_id);
3517
3518         ad->buddy_in_cahtting_data = prev_buddy_in_chatting_data;
3519         ad->peer_in_cahtting_data = prev_peer_in_chatting_data;
3520 }
3521
3522 static void on_expand_button_clicked(void *data, Evas_Object *obj, void *event_info)
3523 {
3524         Evas_Object *expand_pic = data;
3525         if (!expand_pic)
3526                 return;
3527
3528         appdata_s *ad = evas_object_data_get(expand_pic, "app_data");
3529         Evas_Object *parent_layout = evas_object_data_get(expand_pic, "parent_layout");
3530
3531         Eina_Bool is_expanded = (Eina_Bool)evas_object_data_get(expand_pic, "is_expanded");
3532
3533         if (!is_expanded) {
3534
3535                 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_CLOSE), NULL);
3536
3537                 Evas_Object *grp_names_bg = elm_bg_add(ad->nf);
3538                 evas_object_size_hint_align_set(grp_names_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
3539                 evas_object_size_hint_weight_set(grp_names_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3540                 evas_object_color_set(grp_names_bg, 255, 255, 255, 255);
3541             elm_image_resizable_set(grp_names_bg, EINA_TRUE, EINA_TRUE);
3542             elm_image_fill_outside_set(grp_names_bg, EINA_TRUE);
3543             evas_object_show(grp_names_bg);
3544             elm_object_part_content_set(parent_layout, "swallow.group_detail_box,bg", grp_names_bg);
3545
3546             Evas_Object* grp_names_lbl = elm_multibuttonentry_add(ad->nf);
3547
3548             elm_entry_cursor_end_set(grp_names_lbl);
3549                 evas_object_size_hint_weight_set(grp_names_lbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3550                 evas_object_size_hint_align_set(grp_names_lbl, EVAS_HINT_FILL, EVAS_HINT_FILL);
3551                 elm_entry_single_line_set(grp_names_lbl,  EINA_FALSE);
3552                 elm_entry_scrollable_set(grp_names_lbl, EINA_TRUE);
3553                 elm_entry_cnp_mode_set(grp_names_lbl, ELM_CNP_MODE_NO_IMAGE);
3554                 elm_entry_context_menu_disabled_set(grp_names_lbl, EINA_TRUE);
3555                 elm_object_focus_set(grp_names_lbl, EINA_FALSE);
3556                 elm_multibuttonentry_editable_set(grp_names_lbl, EINA_FALSE);
3557
3558                 evas_object_show(grp_names_lbl);
3559
3560                 evas_object_data_set(grp_names_lbl, "app_data", ad);
3561
3562                 Eina_List *names_of_buddies = NULL;
3563                 names_of_buddies = evas_object_data_get(ad->nf, "names_of_buddies");
3564
3565                 if (names_of_buddies) {
3566                         int buddies_counts = eina_list_count(names_of_buddies);
3567                         buddies_info *buddy_info;
3568                         for(int i = 0 ; i < buddies_counts ; i++){
3569                                 buddy_info = (buddies_info*)eina_list_nth(names_of_buddies,i);
3570                                 if(buddy_info == NULL) continue;
3571                                 int len = strlen(buddy_info->name);
3572                                 char *name_str = (char*)malloc(len + 256);
3573                                 if(name_str){
3574                                         sprintf(name_str, "<font=Tizen:style=Bold align=center><font_size=40>%s</font_size></font>", buddy_info->name);
3575                                         Elm_Object_Item *button_item = elm_multibuttonentry_item_append(grp_names_lbl, name_str, click_user_name_cb, ad);
3576                                         elm_object_item_data_set(button_item, (void*)(buddy_info->id));
3577                                         free(name_str);
3578                                 }
3579                         }
3580                 }
3581
3582                 elm_object_part_content_set(parent_layout, "swallow.group_detail_box", grp_names_lbl);
3583
3584         } else {
3585
3586                 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_OPEN), NULL);
3587
3588                 Evas_Object *grp_names_lbl = elm_object_part_content_get(parent_layout, "swallow.group_detail_box");
3589                 if (grp_names_lbl) {
3590                         evas_object_del(grp_names_lbl);
3591                         grp_names_lbl = NULL;
3592                 }
3593
3594                 Evas_Object *grp_names_bg = elm_object_part_content_get(parent_layout, "swallow.group_detail_box,bg");
3595                 if (grp_names_bg) {
3596                         evas_object_del(grp_names_bg);
3597                         grp_names_bg = NULL;
3598                 }
3599         }
3600         is_expanded = !is_expanded;
3601         evas_object_data_set(expand_pic, "is_expanded", (void *)is_expanded);
3602 }
3603
3604 static Eina_Bool _pop_cb(void *data, Elm_Object_Item *it)
3605 {
3606         appdata_s *ad = data;
3607         attach_panel_h attach_panel = NULL;
3608         if (!ad) {
3609                 LOGE("Failed to get the ad");
3610                 return EINA_FALSE;
3611         }
3612         attach_panel = evas_object_data_get(ad->conform, "attach_panel");
3613         if (attach_panel) {
3614                 attach_panel_hide(attach_panel);
3615         }
3616         Eina_List *names_of_buddies = evas_object_data_get(ad->nf, "names_of_buddies");
3617
3618         if(names_of_buddies != NULL){
3619                 buddies_info *buddy = NULL;
3620                 EINA_LIST_FREE(names_of_buddies, buddy) {
3621                         if (buddy) {
3622                                 if(buddy->name) free(buddy->name);
3623                         }
3624                 }
3625                 names_of_buddies = NULL;
3626         }
3627
3628         return EINA_TRUE;
3629 }
3630
3631 static void _edge_cb(void *data, Evas_Object *scroller, void *event_info)
3632 {
3633         Evas_Object *layout = data;
3634         int is_end_edge = 0;
3635         is_end_edge = (int)evas_object_data_get(layout, "is_end_edge");
3636
3637         if (!is_end_edge) {
3638                 elm_object_signal_emit(layout, "hide", "bubblemessage");
3639                 evas_object_data_set(layout, "is_end_edge", (void *) 1);
3640         }
3641 }
3642
3643 static void _edge_top_cb(void *data, Evas_Object *scroller, void *event_info)
3644 {
3645         int is_end_edge_top = 0;
3646         //int offset_num = (int)evas_object_data_get(scroller, "offset_num");
3647         is_end_edge_top = (int)evas_object_data_get(scroller, "is_end_edge_top");
3648
3649         if (!is_end_edge_top) {
3650                 elm_scroller_movement_block_set(scroller,ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL );
3651                 int prev_h = scroller_previous_region_get(scroller);
3652                 evas_object_data_set(scroller, "previous_h",(void*)prev_h);
3653                 evas_object_data_set(scroller, "is_end_edge_top",(void*)1);
3654                 load_chat_history(scroller);
3655                 elm_scroller_movement_block_set(scroller,ELM_SCROLLER_MOVEMENT_NO_BLOCK);
3656         }
3657 }
3658
3659 static void _scroll_cb(void *data, Evas_Object *scroller, void *event_info)
3660 {
3661         Evas_Object *layout = data;
3662         evas_object_data_set(layout, "is_end_edge", (void *) 0);
3663         evas_object_data_set(scroller, "is_end_edge_top", (void *) 0);
3664 //      evas_object_data_set(layout, "is_end_edge_top", (void *) 0);
3665 }
3666
3667 int get_start_offset_num(char* table_name){
3668         char unknown_str[50];
3669         int unknown = 0;
3670         sprintf(unknown_str, "%d", unknown);
3671
3672         char* where_clause = (char*)malloc(strlen(MESSAGE_INFO_TABLE_MARKED_FOR_DELETE) + strlen(" = ") + strlen(unknown_str) + 1);
3673         sprintf(where_clause, "%s = %s", MESSAGE_INFO_TABLE_MARKED_FOR_DELETE, unknown_str);
3674 /*      strcpy(where_clause, MESSAGE_INFO_TABLE_MARKED_FOR_DELETE);
3675         strcat(where_clause, " = ");
3676         strcat(where_clause, unknown_str);*/
3677         int row_counts = get_number_of_rows(table_name,where_clause);
3678         return (row_counts-TG_DBMGR_LIMITED);
3679 }
3680
3681 static Eina_Bool _load_history_cb(void *data)
3682 {
3683         Evas_Object *nf = data;
3684         if (!nf) {
3685                 LOGE("Fail to get the nf");
3686                 return ECORE_CALLBACK_CANCEL;
3687         }
3688         Evas_Object *scroller = evas_object_data_get(nf, "chat_list");
3689         if (!scroller) {
3690                 LOGE("Fail to get the scroller");
3691                 return ECORE_CALLBACK_CANCEL;
3692         }
3693         Evas_Object *layout = evas_object_data_get(nf, "chat_list_no_msg_text");
3694         if (!layout) {
3695                 LOGE("Fail to get the layout");
3696                 return ECORE_CALLBACK_CANCEL;
3697         }
3698
3699         Eina_Bool ret = load_chat_history(scroller);
3700         if (!ret) {
3701                 LOGD("There is no message in chat room");
3702                 // show no messages
3703                 elm_object_part_text_set(layout, "no_msg_text", i18n_get_text("IDS_TGRAM_BODY_NO_MESSAGES_HERE_YET_ING"));
3704                 elm_object_signal_emit(layout, "show", "message");
3705         }
3706
3707         return ECORE_CALLBACK_CANCEL;
3708 }
3709
3710 void launch_messaging_view_cb(appdata_s* ad, int user_id)
3711 {
3712         if (!ad)
3713                 return;
3714
3715         if (ad->msg_popup) {
3716                 evas_object_del(ad->msg_popup);
3717                 ad->msg_popup = NULL;
3718         }
3719
3720         delete_floating_button(ad);
3721
3722         ad->current_app_state = TG_CHAT_MESSAGING_VIEW_STATE;
3723         ad->is_last_msg_changed = EINA_FALSE;
3724         send_request_for_server_connection_status(ad, ad->service_client);
3725         char edj_path[PATH_MAX] = {0, };
3726         app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
3727
3728         Evas_Object *layout = elm_layout_add(ad->nf);
3729         elm_layout_file_set(layout, edj_path, "chat_messaging_layout");
3730         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3731         evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3732         evas_object_show(layout);
3733
3734         peer_with_pic_s *sel_item =  eina_list_nth(ad->peer_list, user_id);
3735         tg_peer_info_s* user = sel_item->use_data;
3736
3737         /*************************** START: message list ************************************/
3738
3739         Evas_Object* msg_box_layout = elm_layout_add(ad->nf);
3740         elm_layout_file_set(msg_box_layout, edj_path, "custom_gen_list");
3741         evas_object_size_hint_weight_set(msg_box_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3742         evas_object_size_hint_align_set(msg_box_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3743         evas_object_show(msg_box_layout);
3744
3745         Evas_Object *list_bg = elm_image_add(msg_box_layout);
3746         evas_object_size_hint_align_set(list_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
3747         evas_object_size_hint_weight_set(list_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3748         if (ad->chat_background) {
3749                 elm_image_file_set(list_bg, ad->chat_background, NULL);
3750         } else {
3751                 //elm_image_file_set(list_bg, ui_utils_get_resource(TG_CHAT_DEFAULT_BG), NULL);
3752         }
3753     elm_image_resizable_set(list_bg, EINA_TRUE, EINA_TRUE);
3754     elm_image_fill_outside_set(list_bg, EINA_TRUE);
3755     evas_object_show(list_bg);
3756
3757     elm_object_part_content_set(msg_box_layout, "swallow.gen_list.bg", list_bg);
3758
3759         Evas_Object *chat_scroller = elm_scroller_add(ad->nf);
3760         evas_object_size_hint_weight_set(chat_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3761         evas_object_size_hint_align_set(chat_scroller, EVAS_HINT_FILL, 0.0);
3762         elm_scroller_policy_set(chat_scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
3763         evas_object_show(chat_scroller);
3764         evas_object_smart_callback_add(chat_scroller, "scroll", _scroll_cb, layout);
3765         /*check_top*/
3766         //evas_object_smart_callback_add(chat_scroller,"scroll,drag,start", _scroll_cb, layout);
3767         evas_object_smart_callback_add(chat_scroller, "edge,bottom", _edge_cb, layout);
3768         /*add top*/
3769         evas_object_smart_callback_add(chat_scroller, "edge,top", _edge_top_cb, layout);
3770         evas_object_data_set(layout, "is_end_edge", (void *) 1);
3771         /*setting offset_num*/
3772 //      evas_object_data_set(chat_scroller, "offset_num", (void *) 1);
3773         evas_object_data_set(chat_scroller, "prev_h", (void *) 0);
3774         /*check edge is top*/
3775         evas_object_data_set(chat_scroller, "is_end_edge_top",(void*)1);
3776
3777         Evas_Object *align_box = elm_box_add(chat_scroller);
3778         if (!align_box) {
3779                 LOGE("fail to add the box");
3780                 return;
3781         }
3782
3783         elm_box_horizontal_set(align_box, EINA_FALSE);
3784         elm_box_align_set(align_box, 0.5, 0.0);
3785         evas_object_size_hint_weight_set(align_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3786         evas_object_size_hint_align_set(align_box, EVAS_HINT_FILL, 0.0);
3787         elm_object_content_set(chat_scroller, align_box);
3788         evas_object_show(align_box);
3789
3790         Evas_Object *chat_box = elm_box_add(chat_scroller);
3791         if (!chat_box) {
3792                 LOGE("fail to add the box");
3793                 return;
3794         }
3795         elm_box_horizontal_set(chat_box, EINA_FALSE);
3796         elm_box_align_set(chat_box, 0.5, 0.0);
3797         evas_object_size_hint_weight_set(chat_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3798         evas_object_size_hint_align_set(chat_box, EVAS_HINT_FILL, 0.0);
3799         evas_object_show(chat_box);
3800         elm_box_pack_end(align_box, chat_box);
3801         evas_object_event_callback_add(chat_box, EVAS_CALLBACK_RESIZE, __resize_cb, ad);
3802
3803         elm_object_part_content_set(msg_box_layout, "swallow.gen_list", chat_scroller);
3804         elm_object_part_content_set(layout, "swallow.chat_box", msg_box_layout);
3805
3806         /********************** START: entry layout*******************************/
3807         Evas_Object* entry_box_layout = elm_layout_add(ad->win);
3808         if (!entry_box_layout) {
3809                 LOGE("Fail to add the entry box layout");
3810         }
3811
3812         elm_layout_file_set(entry_box_layout, edj_path, "chat_entry_box");
3813         evas_object_size_hint_align_set(entry_box_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3814         evas_object_size_hint_weight_set(entry_box_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3815         evas_object_show(entry_box_layout);
3816
3817         Evas_Object *entry_layout = elm_layout_add(entry_box_layout);
3818         if (!entry_layout) {
3819                 LOGE("Fail to add the entry_layout");
3820         }
3821         elm_layout_theme_set(entry_layout, "layout", "editfield", "singleline");
3822
3823         Evas_Object* text_entry = elm_entry_add(entry_layout);
3824         if (!text_entry) {
3825                 LOGE("Fail to add the text_entry");
3826         }
3827
3828         elm_object_part_text_set(text_entry, "elm.guide", "Text message");
3829         elm_entry_line_wrap_set(text_entry, EINA_TRUE);
3830         elm_entry_scrollable_set(text_entry, EINA_TRUE);
3831         evas_object_size_hint_align_set(text_entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
3832         evas_object_size_hint_weight_set(text_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3833         evas_object_show(text_entry);
3834         evas_object_data_set(entry_box_layout, "is_attach_show", (void *) 1);
3835
3836         elm_object_part_content_set(entry_layout, "elm.swallow.content", text_entry);
3837         evas_object_smart_callback_add(text_entry, "changed", on_message_text_entry_changed, entry_box_layout);
3838         evas_object_smart_callback_add(text_entry, "preedit,changed", on_message_text_entry_changed, entry_box_layout);
3839         evas_object_smart_callback_add(text_entry, "clicked", on_message_text_entry_clicked, NULL);
3840         elm_object_part_content_set(entry_box_layout, "swallow.text_entry", entry_layout);
3841
3842         /* button clicked event */
3843         elm_object_signal_callback_add(entry_box_layout, "smile", "clicked", on_message_smiley_clicked, text_entry);
3844         elm_object_signal_callback_add(entry_box_layout, "attach", "clicked", on_media_attach_clicked, chat_scroller);
3845         elm_object_signal_callback_add(entry_box_layout, "send", "clicked", on_text_message_send_clicked, chat_scroller);
3846         elm_object_part_content_set(layout, "swallow.entry", entry_box_layout);
3847
3848         /********************** END: entry layout*******************************/
3849
3850         /************************* START: message bubble ************************/
3851
3852         Evas_Object* bubble_layout = elm_layout_add(ad->win);
3853         if (!bubble_layout) {
3854                 LOGE("Fail to add the bubble_layout");
3855         }
3856
3857         elm_layout_file_set(bubble_layout, edj_path, "bubble_layout");
3858         evas_object_size_hint_align_set(bubble_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
3859         evas_object_size_hint_weight_set(bubble_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3860         evas_object_show(bubble_layout);
3861         elm_object_signal_callback_add(bubble_layout, "cancel", "clicked", on_message_cancel_clicked, layout);
3862         elm_object_part_content_set(layout, "swallow.messagebubble", bubble_layout);
3863         evas_object_data_set(ad->nf, "main_layout", layout);
3864
3865         /********************** END: entry message bubble*******************************/
3866
3867         evas_object_data_set(ad->nf, "chat_list", (void*)chat_scroller);
3868         evas_object_data_set(chat_scroller, "app_data", ad);
3869         evas_object_data_set(chat_scroller, "user_id", (void*)user_id);
3870         evas_object_data_set(chat_scroller, "text_entry", (void*)text_entry);
3871
3872         /* Set the name in title area */
3873
3874         char temp_name[512] = {'\0'};
3875
3876         if ((user->peer_type == TGL_PEER_USER) && get_buddy_unknown_status(user->peer_id)) {
3877                 //snprintf(temp_name, 512, "%s", get_buddy_phone_num_from_id(sel_item->use_data->peer_id));
3878
3879                 char *phone_num = get_buddy_phone_num_from_id(sel_item->use_data->peer_id);
3880
3881                 if (phone_num == NULL || (phone_num && strcmp(phone_num, "+") == 0)) {
3882 #if 0
3883                         char *user_name = NULL;
3884                         char *first_name = NULL;
3885                         char *last_name = NULL;
3886                         char *phone_num = NULL;
3887                         get_buddy_contact_details_from_db(sel_item->use_data->peer_id, &first_name, &last_name, &phone_num);
3888
3889                         if (!first_name || strstr(first_name, "null") != 0) {
3890                                 first_name = NULL;
3891                         }
3892
3893                         if (!first_name && !last_name && phone_num) {
3894                                 first_name = phone_num;
3895                         }
3896
3897                         if (!last_name || strstr(last_name, "null") != 0) {
3898                                 last_name = "";
3899                         }
3900                         user_name = (char*)malloc(strlen(first_name) + strlen(" ") + strlen(last_name) + 1);
3901                         strcpy(user_name, first_name);
3902                         strcat(user_name, " ");
3903                         strcat(user_name, last_name);
3904                         snprintf(temp_name, 512, "%s", user_name);
3905                         free(user_name);
3906 #endif
3907                         if (sel_item->use_data->print_name) {
3908                                 snprintf(temp_name, 512, "%s", sel_item->use_data->print_name);
3909                         } else {
3910                                 snprintf(temp_name, 512, "%s", "unknown");
3911                         }
3912                 } else {
3913                         snprintf(temp_name, 512, "%s", get_buddy_phone_num_from_id(sel_item->use_data->peer_id));
3914                 }
3915                 free(phone_num);
3916
3917
3918         } else {
3919                 char* user_name = replace(sel_item->use_data->print_name, '_', " ");
3920                 snprintf(temp_name, 512, "%s", user_name);
3921                 free(user_name);
3922         }
3923
3924         Elm_Object_Item *nf_it = elm_naviframe_item_push(ad->nf, temp_name, NULL, NULL, layout, NULL);
3925         evas_object_data_set(ad->nf, "navi_item", nf_it);
3926
3927         on_user_presence_state_changed(ad, sel_item->use_data->peer_id);
3928
3929         Evas_Object *back_btn = create_button(ad->nf, "naviframe/back_btn/default", NULL);
3930         evas_object_smart_callback_add(back_btn, "clicked", on_message_back_button_clicked, ad);
3931         elm_object_item_part_content_set(nf_it, "elm.swallow.prev_btn", back_btn);
3932         elm_naviframe_item_pop_cb_set(nf_it, _pop_cb, ad);
3933
3934         /******************** expand ************************/
3935         if (user->peer_type == TGL_PEER_CHAT) {
3936                 Evas_Object *expand_pic = NULL;
3937                 expand_pic = elm_image_add(layout);
3938                 evas_object_size_hint_weight_set(expand_pic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
3939                 evas_object_size_hint_align_set(expand_pic, EVAS_HINT_FILL, EVAS_HINT_FILL);
3940                 elm_object_focus_set(expand_pic, EINA_FALSE);
3941                 elm_image_file_set(expand_pic, ui_utils_get_resource(TG_EXPAND_OPEN), NULL);
3942                 evas_object_show(expand_pic);
3943                 evas_object_data_set(expand_pic, "app_data", ad);
3944                 evas_object_data_set(expand_pic, "parent_layout", layout);
3945
3946                 Eina_Bool is_expanded = EINA_FALSE;
3947                 evas_object_data_set(expand_pic, "is_expanded", is_expanded);
3948                 Evas_Object* expand_btn = elm_button_add(ad->layout);
3949                 elm_object_style_set(expand_btn, "transparent");
3950                 evas_object_smart_callback_add(expand_btn, "clicked", on_expand_button_clicked, expand_pic);
3951                 elm_object_content_set(expand_btn, expand_pic);
3952                 evas_object_show(expand_btn);
3953                 elm_object_item_part_content_set(nf_it, "title_right_btn", expand_btn);
3954
3955         }
3956         /******************** expand ************************/
3957
3958         Ecore_Timer *timer = NULL;
3959         timer = ecore_timer_add(0.001f, _load_history_cb, ad->nf);
3960
3961         int buddy_id = sel_item->use_data->peer_id;
3962         char* tablename = get_table_name_from_number(buddy_id);
3963         int offset_num = get_start_offset_num(tablename);
3964         evas_object_data_set(chat_scroller, "offset_num", (void *)(offset_num));
3965
3966         Eina_Bool res = set_all_rows_read(tablename);
3967         if (!res) {
3968                 //failed.
3969         }
3970         free(tablename);
3971
3972         evas_object_data_set(ad->nf, "chat_list_no_msg_text", layout);
3973
3974         send_request_for_marked_as_read(ad, ad->service_client, sel_item->use_data->peer_id, sel_item->use_data->peer_type);
3975         eext_object_event_callback_add(ad->nf, EEXT_CALLBACK_MORE, on_messaging_menu_button_clicked, ad);
3976 }
3977