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