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