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