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