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