6d338b78f2716cf1823b89fbbfe6b5a54ff12d58
[apps/native/telegram-tizen.git] / TelegramTizen / src / tg_search_peer_view.c
1 /*
2  * tg_search_peer_view.c
3  *
4  *  Created on: Sep 18, 2015
5  *      Author: sandeep
6  */
7
8 #include "tg_search_peer_view.h"
9 #include "tg_db_wrapper.h"
10 #include "tg_messaging_view.h"
11 #include "contact_selection_view.h"
12 #include "ucol.h"
13 #include "device_contacts_manager.h"
14 #include "tg_search_peer_view.h"
15 #include "server_requests.h"
16 #include <contacts.h>
17
18 #define COMMAND_MENU_ITEM_COUNT 2
19 #define MOBILE_BUTTON_SIZE (98*1.4f)
20
21 typedef struct {
22         char* string;
23         char* image_path;
24         void (*func) (void *data, Evas_Object * obj, void *event_info);
25         Elm_Object_Item *item;
26 } _command_item_info;
27
28 static void _append_command_item(Evas_Object *genlist, appdata_s *ad);
29 static void _append_peer_item(Evas_Object *genlist, appdata_s *ad, Eina_List* item_list);
30 static void _append_contact_item(Evas_Object *genlist, appdata_s *ad, Eina_List* item_list);
31 static void on_invite_friends_clicked(void *data, Evas_Object *obj, void *event_info);
32 static void on_group_chat_clicked(void *data, Evas_Object *obj, void *event_info);
33 static void on_secret_chat_clicked(void *data, Evas_Object *obj, void *event_info);
34
35 static _command_item_info contact_screen_command_item_list[COMMAND_MENU_ITEM_COUNT] = {
36         {"IDS_TGRAM_MBODY_INVITE_FRIENDS",      TELEGRAM_CONTACT_ADD_ICON, on_invite_friends_clicked, NULL},
37         {"IDS_TGRAM_MBODY_GROUP_CHAT",          DEFAULT_LIST_THUMB_MULTI_PIC, on_group_chat_clicked, NULL},
38         /*{"secret chat",               "telegram_list_thumb_image_secrete.png", on_secret_chat_clicked, NULL},*/
39 };
40
41
42 static char* _util_get_first_char(char *input_text)
43 {       /*
44         int unicode_len = eina_unicode_utf8_get_len(input_text);
45         int str_len = strlen(input_text);
46         int lang_byte = str_len / unicode_len + (str_len % unicode_len > 0 ? 1 : 0);
47
48         first_char = strndup(input_text, lang_byte);
49         */
50         char *first_char = NULL;
51         int count;
52         int flag;
53         unsigned char mask = 0x80;
54
55         count = 0;
56         while (*input_text & mask) {
57                 mask = mask >> 1;
58                 count++;
59         }
60
61         count = count == 0 ? 1 : count;
62         first_char = strndup(input_text, count);
63
64         return first_char;
65 }
66
67
68
69 static Evas_Object* create_image_object_from_file(const char *icon_name, Evas_Object *parent)
70 {
71         Evas_Object *icon = elm_image_add(parent);
72         evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
73         evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
74         elm_image_file_set(icon, icon_name, NULL);
75         evas_object_show(icon);
76         return icon;
77 }
78
79
80 char* on_peer_list_name_requested(void *data, Evas_Object *obj, const char *part)
81 {
82         int id = (int) data;
83
84         appdata_s* ad = evas_object_data_get(obj, "app_data");
85         Eina_List *list = evas_object_data_get(obj, "result_list");
86
87         if (!list) {
88                 list = ad->search_peer_list;
89         }
90
91         user_data_with_pic_s *item = eina_list_nth(list, id);
92         if (!item) {
93                 return NULL;
94         }
95
96         user_data_s* user = item->use_data;
97         if (!user) {
98                 return NULL;
99         }
100
101         if (!strcmp(part,"elm.text.main.left.top") || !strcmp(part,"elm.text")){
102                 char *full_name = replace(user->print_name, '_', " ");
103                 return full_name;
104         } else if (!strcmp(part, "elm.text.sub.left.bottom") || !strcmp(part,"elm.text.sub")) {
105                 char* last_seen = get_budy_state(ad, user->user_id.id);
106                 if (last_seen) {
107                         return last_seen;
108                 }
109         }
110         return NULL;
111 }
112
113 char* _on_command_name_requested(void *data, Evas_Object *obj, const char *part)
114 {
115         int row = (int)data;
116
117         if (!strcmp(part,"elm.text.main.left.top") || !strcmp(part,"elm.text")){
118                 char buf[512] = {'\0'};
119                 snprintf(buf, 512, "<align=left><font_size=45><color=#1776D2>%s</color></font_size></align>", _(contact_screen_command_item_list[row].string));
120                 return strdup(buf);
121         }
122
123         return NULL;
124 }
125
126 Evas_Object* _on_command_name_image_requested(void *data, Evas_Object *obj, const char *part)
127 {
128         int row = (int)data;
129
130         Evas_Object *eo = NULL;
131         char path[256] = {0,};
132
133         if (!strcmp(part, "elm.icon.left") || !strcmp(part, "elm.icon.1") || !strcmp(part, "elm.swallow.icon")  ) {
134
135                 Evas_Object *profile_pic = NULL;
136                 profile_pic = create_image_object_from_file(ui_utils_get_resource(contact_screen_command_item_list[row].image_path), obj);
137                 evas_object_color_set(profile_pic, 45, 165, 224, 255);
138
139                 char edj_path[PATH_MAX] = {0, };
140                 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
141                 Evas_Object *user_pic_layout = elm_layout_add(obj);
142                 elm_layout_file_set(user_pic_layout, edj_path, "menu_circle_layout");
143                 evas_object_size_hint_weight_set(user_pic_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
144                 evas_object_size_hint_align_set(user_pic_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
145                 evas_object_show(user_pic_layout);
146                 elm_object_part_content_set(user_pic_layout, "content", profile_pic);
147
148                 eo = elm_layout_add(obj);
149                 elm_layout_theme_set(eo, "layout", "list/B/type.2", "default");
150                 elm_layout_content_set(eo, "elm.swallow.content", user_pic_layout);
151
152         }
153         return eo;
154 }
155
156
157 void on_peer_icon_deleted(void *data, Evas *e, Evas_Object *icon, void *event_info)
158 {
159         user_data_with_pic_s *item  = data;
160         item->contact_icon = NULL;
161 }
162
163 Evas_Object* on_peer_list_image_requested(void *data, Evas_Object *obj, const char *part)
164 {
165         Evas_Object *eo = NULL;
166         if (!strcmp(part, "elm.icon.left") || !strcmp(part, "elm.icon.1") || !strcmp(part, "elm.swallow.icon")  ) {
167                 int id = (int) data;
168                 appdata_s* ad = evas_object_data_get(obj, "app_data");
169                 Eina_List *list = evas_object_data_get(obj, "result_list");
170                 if (!list) {
171                         list = ad->search_peer_list;
172                 }
173                 int size = eina_list_count(list);
174                 if (size <= 0) {
175                         return eo;
176                 }
177
178                 user_data_with_pic_s *item = eina_list_nth(list, id);
179                 user_data_s *user = item->use_data;
180                 Evas_Object *profile_pic = NULL;
181
182                 if (user->photo_path && strcmp(user->photo_path, "") != 0) {
183                         profile_pic = create_image_object_from_file(user->photo_path, obj);
184                 } else {
185
186                         profile_pic = create_image_object_from_file(ui_utils_get_resource(DEFAULT_LIST_THUMB_SINGLE_PIC), obj);
187                         evas_object_color_set(profile_pic, 45, 165, 224, 255);
188                 }
189
190                 item->contact_icon = profile_pic;
191                 evas_object_event_callback_add(item->contact_icon, EVAS_CALLBACK_DEL, on_peer_icon_deleted, item);
192                 char edj_path[PATH_MAX] = {0, };
193                 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
194                 Evas_Object* user_pic_layout = elm_layout_add(ad->nf);
195                 elm_layout_file_set(user_pic_layout, edj_path, "search_circle_layout");
196                 evas_object_size_hint_weight_set(user_pic_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
197                 evas_object_size_hint_align_set(user_pic_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
198                 evas_object_show(user_pic_layout);
199                 elm_object_part_content_set(user_pic_layout, "content", item->contact_icon);
200
201                 eo = elm_layout_add(obj);
202                 elm_layout_theme_set(eo, "layout", "list/B/type.2", "default");
203                 elm_layout_content_set(eo, "elm.swallow.content", user_pic_layout);
204
205         }
206         return eo;
207 }
208
209 static void clear_search_list(appdata_s *ad)
210 {
211         if (!ad) {
212                 return;
213         }
214         for (int i = 0; i < eina_list_count(ad->search_peer_list) ; i++) {
215                 user_data_with_pic_s *item = eina_list_nth(ad->search_peer_list, i);
216                 user_data_s* user_data = item->use_data;
217
218                 if (user_data->print_name) {
219                         free(user_data->print_name);
220                         user_data->print_name = NULL;
221                 }
222
223                 if (user_data->photo_path) {
224                         free(user_data->photo_path);
225                         user_data->photo_path = NULL;
226                 }
227
228                 if (user_data->first_name) {
229                         free(user_data->first_name);
230                         user_data->first_name = NULL;
231                 }
232
233                 if (user_data->last_name) {
234                         free(user_data->last_name);
235                         user_data->last_name = NULL;
236                 }
237
238                 if (user_data->phone) {
239                         free(user_data->phone);
240                         user_data->phone = NULL;
241                 }
242                 if (user_data->real_first_name) {
243                         free(user_data->real_first_name);
244                         user_data->real_first_name = NULL;
245                 }
246
247                 if (user_data->real_last_name) {
248                         free(user_data->real_last_name);
249                         user_data->real_last_name = NULL;
250                 }
251
252                 if (user_data->username) {
253                         free(user_data->username);
254                         user_data->username = NULL;
255                 }
256                 free(user_data);
257                 free(item);
258         }
259
260         eina_list_free(ad->search_peer_list);
261         ad->search_peer_list = NULL;
262
263 }
264
265
266
267 void on_new_contact_creation_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
268 {
269         if (result == APP_CONTROL_RESULT_SUCCEEDED) {
270                 appdata_s* ad = user_data;
271                 char* file_path = NULL;
272                 char** path_arryay = NULL;
273                 int array_length = 0;
274                 int status;
275                 char* mime_type = NULL;
276                 status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_SELECTED, &path_arryay,  &array_length);
277                 if (status != APP_CONTROL_ERROR_NONE) {
278                         status = app_control_get_extra_data_array(reply, APP_CONTROL_DATA_PATH, &path_arryay,  &array_length);
279                         if (status != APP_CONTROL_ERROR_NONE) {
280                                 if (ad) {
281                                         show_toast(ad, "Unable to get the result from attach panel");
282                                 }
283                                 return;
284                         }
285                 }
286
287                 status = app_control_get_mime(reply, &mime_type);
288                 if (status != APP_CONTROL_ERROR_NONE) {
289                         if (ad) {
290                                 show_toast(ad, "Unable to get the mime type from attach panel");
291                         }
292                         return;
293                 }
294
295                 for(int i = 0 ; i < array_length ; i++) {
296                         file_path = strdup(path_arryay[i]);
297                         free(file_path);
298                 }
299         }
300 }
301
302 static void delete_btn_clicked(void *data, Evas_Object *obj, void *event_info)
303 {
304         void **cbdata = (void **)data;
305         Elm_Object_Item *item = *cbdata;
306         Evas_Object *entry = NULL;
307         Evas_Object *layout = NULL;
308
309         layout = elm_object_item_part_content_get(item, "elm.icon.entry");
310         entry = elm_object_part_content_get(layout, "elm.swallow.content");
311
312         elm_object_text_set(entry, "");
313 }
314
315 static void list_delete_btn_clicked(void *data, Evas_Object *obj, void *event_info)
316 {
317         Evas_Object *genlist = data;
318         Evas_Object *btn = NULL;
319         Elm_Object_Item *item = NULL;
320
321         int count = 0;
322         int idx = 3;
323         count = elm_genlist_items_count(genlist);
324
325         while(idx <= count) {
326                 item = elm_genlist_nth_item_get(genlist, idx);
327                 btn = elm_object_item_part_content_get(item, "elm.icon.2");
328                 if (btn == obj) break;
329                 idx ++;
330         }
331
332         elm_object_item_del(item);
333 }
334
335 static void onFocus(void *data, Evas_Object *obj, void *event_info)
336 {
337         elm_object_signal_emit((Evas_Object*) data, "elm,state,focused", "");
338 }
339
340 static void onUnfocus(void *data, Evas_Object *obj, void *event_info)
341 {
342         elm_object_signal_emit((Evas_Object*) data, "elm,state,unfocused", "");
343 }
344
345 static Evas_Object *_get_content_cb(void *data, Evas_Object *obj, const char *part)
346 {
347         if (0 == strcmp(part, "elm.icon.entry")) {
348                 Evas_Object *layout = elm_layout_add(obj);
349                 elm_layout_theme_set(layout, "layout", "editfield", "singleline");
350
351                 Evas_Object* phone_entry = elm_entry_add(obj);
352                 evas_object_size_hint_weight_set(phone_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
353                 evas_object_size_hint_align_set(phone_entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
354                 elm_entry_input_panel_layout_set(phone_entry, ELM_INPUT_PANEL_LAYOUT_PHONENUMBER);
355
356                 elm_object_part_text_set(phone_entry, "elm.guide", i18n_get_text("IDS_TGRAM_BODY_PHONE_NUMBER_ABB"));
357
358                 elm_entry_single_line_set(phone_entry, EINA_TRUE);
359                 elm_entry_scrollable_set (phone_entry, EINA_TRUE);
360                 elm_object_part_content_set(layout, "elm.swallow.content", phone_entry);
361                 evas_object_smart_callback_add(phone_entry, "focused", onFocus, layout);
362                 evas_object_smart_callback_add(phone_entry, "unfocused", onUnfocus, layout);
363                 evas_object_show(phone_entry);
364
365                 appdata_s *ad = evas_object_data_get(obj, "app_data");
366                 if (ad) {
367                         if(ad->is_loading_from_msg_view) {
368                                 char temp_name[512] = {'\0'};
369                                 snprintf(temp_name, 512, "%s", get_buddy_phone_num_from_id(ad->peer_in_cahtting_data->use_data->peer_id));
370                                 elm_object_text_set(phone_entry, temp_name);
371                         }
372                         evas_object_data_set(ad->nf, "add_contact_phone_number", phone_entry);
373                 }
374                 return layout;
375         } else if (0 == strcmp(part, "elm.icon.2")) {
376
377                 Evas_Object* phone_delete_btn = elm_button_add(obj);
378                 elm_object_style_set(phone_delete_btn, "icon_expand_delete");
379                 evas_object_smart_callback_add(phone_delete_btn, "clicked", delete_btn_clicked, data);
380                 evas_object_show(phone_delete_btn);
381                 return phone_delete_btn;
382         } else if (0 == strcmp(part, "elm.icon.1")) {
383         }
384
385         return NULL;
386 }
387
388 static Evas_Object *_get_first_name_content_cb(void *data, Evas_Object *obj, const char *part)
389 {
390         if (0 == strcmp(part, "elm.icon.entry")) {
391                 Evas_Object *layout = elm_layout_add(obj);
392                 elm_layout_theme_set(layout, "layout", "editfield", "singleline");
393
394                 Evas_Object* phone_entry = elm_entry_add(obj);
395                 evas_object_size_hint_weight_set(phone_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
396                 evas_object_size_hint_align_set(phone_entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
397
398                 elm_object_part_text_set(phone_entry, "elm.guide", i18n_get_text("IDS_TGRAM_BODY_FIRST_NAME_ABB"));
399
400                 elm_entry_single_line_set(phone_entry, EINA_TRUE);
401                 elm_entry_scrollable_set (phone_entry, EINA_TRUE);
402                 elm_object_part_content_set(layout, "elm.swallow.content", phone_entry);
403                 evas_object_smart_callback_add(phone_entry, "focused", onFocus, layout);
404                 evas_object_smart_callback_add(phone_entry, "unfocused", onUnfocus, layout);
405                 evas_object_show(phone_entry);
406
407                 appdata_s *ad = evas_object_data_get(obj, "app_data");
408                 if (ad) {
409                         evas_object_data_set(ad->nf, "add_contact_first_name", phone_entry);
410                 }
411
412                 return layout;
413
414         } else if (0 == strcmp(part, "elm.icon.2")) {
415                 Evas_Object* phone_delete_btn = elm_button_add(obj);
416                 elm_object_style_set(phone_delete_btn, "icon_expand_delete");
417                 evas_object_smart_callback_add(phone_delete_btn, "clicked", delete_btn_clicked, data);
418                 evas_object_show(phone_delete_btn);
419                 return phone_delete_btn;
420         }
421         return NULL;
422 }
423
424 static Evas_Object *_get_second_name_content_cb(void *data, Evas_Object *obj, const char *part)
425 {
426         if (0 == strcmp(part, "elm.icon.entry")) {
427
428                 Evas_Object *layout = elm_layout_add(obj);
429                 elm_layout_theme_set(layout, "layout", "editfield", "singleline");
430
431                 Evas_Object* phone_entry = elm_entry_add(obj);
432                 evas_object_size_hint_weight_set(phone_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
433                 evas_object_size_hint_align_set(phone_entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
434
435                 elm_object_part_text_set(phone_entry, "elm.guide", i18n_get_text("IDS_TGRAM_BODY_LAST_NAME_ABB"));
436
437                 elm_entry_single_line_set(phone_entry, EINA_TRUE);
438                 elm_entry_scrollable_set (phone_entry, EINA_TRUE);
439                 elm_object_part_content_set(layout, "elm.swallow.content", phone_entry);
440                 evas_object_smart_callback_add(phone_entry, "focused", onFocus, layout);
441                 evas_object_smart_callback_add(phone_entry, "unfocused", onUnfocus, layout);
442                 evas_object_show(phone_entry);
443
444                 appdata_s *ad = evas_object_data_get(obj, "app_data");
445                 if (ad) {
446                         evas_object_data_set(ad->nf, "add_contact_last_name", phone_entry);
447                 }
448
449                 return layout;
450
451         } else if (0 == strcmp(part, "elm.icon.2")) {
452                 Evas_Object* phone_delete_btn = elm_button_add(obj);
453                 elm_object_style_set(phone_delete_btn, "icon_expand_delete");
454                 evas_object_smart_callback_add(phone_delete_btn, "clicked", delete_btn_clicked, data);
455                 evas_object_show(phone_delete_btn);
456                 return phone_delete_btn;
457         }
458         return NULL;
459 }
460
461 static char *_get_name_text_cb(void *data, Evas_Object *obj, const char *part)
462 {
463         char *buf = NULL;
464         if (0 == strcmp(part, "elm.text")) {
465                 buf = elm_entry_utf8_to_markup(i18n_get_text("IDS_TGRAM_BODY_NAME_ABB"));
466                 return buf;
467         }
468         return NULL;
469 }
470
471 static Evas_Object* get_image_from_path(const char* path, Evas_Object* parent)
472 {
473         if (!path || !parent) {
474                 return NULL;
475         }
476         Evas_Object *media_image = evas_object_image_filled_add(evas_object_evas_get(parent));
477         evas_object_image_file_set(media_image, path, NULL);
478         return media_image;
479 }
480
481 static Evas_Object *_get_picture_cb(void *data, Evas_Object *obj, const char *part)
482 {
483         if (0 == strcmp(part, "contents")) {
484                 char edj_path[PATH_MAX] = {0, };
485                 Evas_Object *profile_pic = NULL;
486                 Evas_Object *image_layout = NULL;
487
488                 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
489                 image_layout = elm_layout_add(obj);
490                 elm_layout_file_set(image_layout, edj_path, "contact_image_masking");
491                 evas_object_size_hint_weight_set(image_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
492                 evas_object_size_hint_align_set(image_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
493                 evas_object_show(image_layout);
494
495                 profile_pic = get_image_from_path(ui_utils_get_resource(TG_CALLER_ID_IMAGE), obj);
496                 evas_object_color_set(profile_pic, 45, 165, 224, 225);
497
498                 appdata_s *ad = evas_object_data_get(obj, "app_data");
499                 if (ad) {
500                         evas_object_data_set(ad->nf, "add_contact_pic", profile_pic);
501                 }
502                 elm_object_part_content_set(image_layout, "image", profile_pic);
503
504                 return image_layout;
505         }
506         return NULL;
507 }
508
509 static void _append_picture_item(Evas_Object *genlist, appdata_s *ad)
510 {
511         Elm_Genlist_Item_Class *itc = NULL;
512         Elm_Object_Item *item = NULL;
513
514         itc = elm_genlist_item_class_new();
515         itc->item_style = "input.1image";
516         itc->func.text_get = NULL;
517         itc->func.content_get = _get_picture_cb;
518         itc->func.state_get = NULL;
519         itc->func.del = NULL;
520
521         item = elm_genlist_item_append(genlist, itc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
522
523         if(itc) elm_genlist_item_class_free(itc);
524 }
525
526 static void del_cb(void *data, Evas_Object *obj)
527 {
528         free(data);
529 }
530
531 static void _append_name_item(Evas_Object *genlist, appdata_s *ad)
532 {
533         Elm_Genlist_Item_Class *itc = NULL;
534         Elm_Genlist_Item_Class *ttc = NULL;
535         Elm_Object_Item *item = NULL;
536         void **item_data;
537         void **second_data;
538
539         ttc = elm_genlist_item_class_new();
540         ttc->item_style = "input.2icon";
541         ttc->func.text_get = _get_name_text_cb;
542         ttc->func.content_get = _get_first_name_content_cb;
543         ttc->func.state_get = NULL;
544         ttc->func.del = del_cb;
545
546         item_data = malloc(sizeof(*item_data));
547         second_data = malloc(sizeof(*second_data));
548
549         item = elm_genlist_item_append(genlist, ttc, item_data, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
550
551         *item_data = item;
552
553         itc = elm_genlist_item_class_new();
554         itc->item_style = "input.3icon";
555         itc->func.text_get = NULL;
556         itc->func.content_get = _get_second_name_content_cb;
557         itc->func.state_get = NULL;
558         itc->func.del = NULL;
559
560         item = elm_genlist_item_append(genlist, itc, second_data, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
561         *second_data = item;
562
563         if(itc) elm_genlist_item_class_free(itc);
564         if(ttc) elm_genlist_item_class_free(ttc);
565 }
566
567 static void _append_phone_item(Evas_Object *genlist, appdata_s *ad)
568 {
569         Elm_Genlist_Item_Class *itc = NULL;
570         Elm_Object_Item *item = NULL;
571         void **item_data;
572
573         itc = elm_genlist_item_class_new();
574         itc->item_style = "input.3icon";
575         itc->func.text_get = NULL;
576         itc->func.content_get = _get_content_cb;
577         itc->func.state_get = NULL;
578         itc->func.del = NULL;
579
580         item_data = malloc(sizeof(*item_data));
581
582         item = elm_genlist_item_append(genlist, itc, item_data, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
583
584         *item_data = item;
585
586         if(itc) elm_genlist_item_class_free(itc);
587 }
588
589 static void _insert_before_phone_item(Evas_Object *genlist, appdata_s *ad)
590 {
591         Elm_Genlist_Item_Class *itc = NULL;
592         Elm_Object_Item *item = NULL;
593         Elm_Object_Item *before = NULL;
594
595         itc = elm_genlist_item_class_new();
596         itc->item_style = "input.3icon";
597         itc->func.text_get = NULL;
598         itc->func.content_get = _get_content_cb;
599         itc->func.state_get = NULL;
600         itc->func.del = NULL;
601
602         before = elm_genlist_last_item_get(genlist);
603
604         item = elm_genlist_item_insert_before(genlist, itc, NULL, NULL, before, ELM_GENLIST_ITEM_NONE, NULL, NULL);
605
606         if(itc) elm_genlist_item_class_free(itc);
607 }
608
609 static void phone_btn_clicked(void *data, Evas_Object *obj, void *event_info)
610 {
611         Evas_Object *genlist = data;
612         appdata_s *ad = evas_object_data_get(genlist, "app_data");
613
614         _insert_before_phone_item(genlist, ad);
615 }
616
617 static Evas_Object *_get_icon_cb(void *data, Evas_Object *obj, const char *part)
618 {
619         if (0 == strcmp(part, "elm.icon.1")) {
620                 Evas_Object* mobile_btn = elm_button_add(obj);
621                 elm_object_style_set(mobile_btn, "transparent");
622                 evas_object_size_hint_weight_set(mobile_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
623                 evas_object_size_hint_align_set(mobile_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
624                 evas_object_size_hint_min_set(mobile_btn, ELM_SCALE_SIZE(MOBILE_BUTTON_SIZE), ELM_SCALE_SIZE(MOBILE_BUTTON_SIZE));
625                 evas_object_smart_callback_add(mobile_btn, "clicked", phone_btn_clicked, obj);
626                 elm_object_translatable_text_set(mobile_btn, "IDS_TGRAM_OPT_MOBILE");
627                 evas_object_show(mobile_btn);
628
629                 return mobile_btn;
630         }
631         return NULL;
632 }
633
634 static void _append_phone_icon(Evas_Object *genlist, appdata_s *ad)
635 {
636         Elm_Genlist_Item_Class *itc = NULL;
637         Elm_Object_Item *item = NULL;
638
639         itc = elm_genlist_item_class_new();
640         itc->item_style = "input.1icon";
641         itc->func.text_get = NULL;
642         itc->func.content_get = _get_icon_cb;
643         itc->func.state_get = NULL;
644         itc->func.del = NULL;
645
646         item = elm_genlist_item_append(genlist, itc, ad, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
647
648         if(itc) elm_genlist_item_class_free(itc);
649 }
650
651 static Evas_Object* create_genlist(appdata_s *ad, Evas_Object *layout)
652 {
653         Evas_Object *list = elm_genlist_add(layout);
654         elm_genlist_mode_set(list, ELM_LIST_COMPRESS);
655         evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
656         evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
657         evas_object_show(list);
658         elm_object_focus_set(list, EINA_TRUE);
659         return list;
660 }
661
662 void add_contact_to_phone_book(appdata_s *ad)
663 {
664         if (!ad)
665                 return;
666
667         char* phone_num = NULL;
668         char* first_name = NULL;
669         char* last_name = NULL;
670         char* profile_pic_path = NULL;
671
672         Evas_Object *phone_num_entry = evas_object_data_get(ad->nf, "add_contact_phone_number");
673         if (phone_num_entry)
674                 phone_num = elm_entry_markup_to_utf8(elm_object_text_get(phone_num_entry));
675
676         Evas_Object *first_name_entry = evas_object_data_get(ad->nf, "add_contact_first_name");
677         if (first_name_entry)
678                 first_name = elm_entry_markup_to_utf8(elm_object_text_get(first_name_entry));
679
680         Evas_Object *last_name_entry = evas_object_data_get(ad->nf, "add_contact_last_name");
681         if (last_name_entry)
682                 last_name = elm_entry_markup_to_utf8(elm_object_text_get(last_name_entry));
683
684         if ((phone_num && strlen(phone_num) > 0) && (first_name && strlen(first_name) > 0) && (last_name && strlen(last_name) > 0)) {
685
686                 contacts_record_h contact = NULL;
687                 contacts_record_create(_contacts_contact._uri, &contact);
688
689                 // add name
690                 contacts_record_h name = NULL;
691                 contacts_record_create(_contacts_name._uri, &name);
692                 contacts_record_set_str(name, _contacts_name.first, first_name);
693                 contacts_record_add_child_record(contact, _contacts_contact.name, name);
694
695
696                 // add name
697                 contacts_record_h lname = NULL;
698                 contacts_record_create(_contacts_name._uri, &lname);
699                 contacts_record_set_str(lname, _contacts_name.last, first_name);
700                 contacts_record_add_child_record(contact, _contacts_contact.name, lname);
701
702                 // add number
703                 contacts_record_h number = NULL;
704                 contacts_record_create(_contacts_number._uri, &number);
705                 contacts_record_set_str(name, _contacts_number.number, phone_num);
706                 contacts_record_add_child_record(contact, _contacts_contact.number, number);
707
708                 // insert to database
709                 int contact_id = 0;
710                 contacts_db_insert_record(contact, &contact_id);
711
712                 // destroy record
713                 contacts_record_destroy(contact, true);
714
715
716         } else {
717                 // show message
718         }
719
720 }
721 static Eina_Bool on_contacts_reloaded(void *data)
722 {
723         appdata_s *ad = data;
724         elm_naviframe_item_pop(ad->nf);
725         ad->current_app_state = TG_PEER_SEARCH_VIEW_STATE;
726         show_floating_button(ad);
727         return ECORE_CALLBACK_CANCEL;
728 }
729
730 void on_new_contact_added_response_received(appdata_s *ad, int buddy_id, Eina_Bool is_success)
731 {
732         if (is_success) {
733
734                 if (ad->is_loading_from_msg_view) {
735                         show_loading_popup(ad);
736                         elm_naviframe_item_pop(ad->nf);
737                         ad->current_app_state = TG_CHAT_MESSAGING_VIEW_STATE;
738                         elm_naviframe_item_pop(ad->nf);
739                         load_registered_user_data(ad);
740                         load_buddy_list_data(ad);
741                         load_unknown_buddy_list_data(ad);
742                         load_peer_data(ad);
743                         load_main_list_data(ad);
744                         ecore_timer_add(1, on_load_main_view_requested, ad);
745                 } else {
746                         // add new buddy to list
747                         Evas_Object *peer_list = evas_object_data_get(ad->nf, "search_list");
748                         if (peer_list) {
749                                 elm_genlist_clear(peer_list);
750                                 clear_search_list(ad);
751                                 free_contact_list(ad->contact_list);
752
753                                 ad->search_peer_list = load_buddy_data_by_name(ad->user_id.id, NULL);
754                                 ad->contact_list = get_contact_list_from_device_db();
755
756                                 _append_command_item(peer_list, ad);
757                                 _append_peer_item(peer_list, ad, ad->search_peer_list);
758                                 if (ad->contact_list && eina_list_count(ad->contact_list) > 0) {
759                                         _append_contact_item(peer_list, ad, ad->contact_list);
760                                 }
761                         }
762                         ecore_timer_add(5, on_contacts_reloaded, ad);
763                 }
764         } else {
765                 // show failed message
766         }
767 }
768
769 static void on_new_contact_done_clicked(void *data, Evas_Object *obj, void *event_info)
770 {
771         appdata_s* ad = data;
772         char* phone_num = NULL;
773         char* first_name = NULL;
774         char* last_name = NULL;
775         char* profile_pic_path = NULL;
776
777         Evas_Object *phone_num_entry = evas_object_data_get(ad->nf, "add_contact_phone_number");
778         if (phone_num_entry)
779                 phone_num = elm_entry_markup_to_utf8(elm_object_text_get(phone_num_entry));
780
781         Evas_Object *first_name_entry = evas_object_data_get(ad->nf, "add_contact_first_name");
782         if (first_name_entry)
783                 first_name = elm_entry_markup_to_utf8(elm_object_text_get(first_name_entry));
784
785         Evas_Object *last_name_entry = evas_object_data_get(ad->nf, "add_contact_last_name");
786         if (last_name_entry)
787                 last_name = elm_entry_markup_to_utf8(elm_object_text_get(last_name_entry));
788
789         if ((phone_num && strlen(phone_num) > 0) && (first_name && strlen(first_name) > 0) && (last_name && strlen(last_name) > 0)) {
790                 add_contact_to_phone_book(ad);
791                 show_loading_popup(ad);
792                 send_add_buddy_request(ad, ad->service_client, -1, first_name, last_name, phone_num);
793         } else {
794                 // show message
795         }
796 }
797
798 static void on_new_contact_cancel_clicked(void *data, Evas_Object *obj, void *event_info)
799 {
800         appdata_s* ad = data;
801         if (!ad)
802                 return;
803         elm_naviframe_item_pop(ad->nf);
804         if (ad->is_loading_from_msg_view) {
805                 ad->is_loading_from_msg_view = EINA_FALSE;
806                 ad->current_app_state = TG_CHAT_MESSAGING_VIEW_STATE;
807         } else {
808                 ad->current_app_state = TG_PEER_SEARCH_VIEW_STATE;
809                 show_floating_button(ad);
810         }
811 }
812
813 void on_create_new_contact(appdata_s* ad)
814 {
815         if (!ad)
816                 return;
817
818         delete_floating_button(ad);
819         ad->current_app_state = TG_ADD_CONTACT_STATE;
820
821         char edj_path[PATH_MAX] = {0, };
822         app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
823
824         Elm_Theme *theme = elm_theme_new();
825         elm_theme_ref_set(theme, NULL);
826         elm_theme_extension_add(theme, edj_path);
827
828         Evas_Object* phone_list = create_genlist(ad, ad->nf);
829         elm_genlist_select_mode_set(phone_list, ELM_OBJECT_SELECT_MODE_NONE);
830         elm_object_theme_set(phone_list, theme);
831         evas_object_data_set(phone_list, "app_data", ad);
832
833         _append_picture_item(phone_list, ad);
834         _append_name_item(phone_list, ad);
835         _append_phone_item(phone_list, ad);
836         //_append_phone_icon(phone_list, ad);
837
838         Elm_Object_Item* navi_item = elm_naviframe_item_push(ad->nf, i18n_get_text("IDS_TGRAM_HEADER_CREATE_CONTACT_ABB"), NULL, NULL, phone_list, NULL);
839
840         Evas_Object *done_btn = elm_button_add(ad->nf);
841         elm_object_style_set(done_btn, "naviframe/title_right");
842         elm_object_text_set(done_btn, i18n_get_text("IDS_TGRAM_ACBUTTON_DONE_ABB"));
843         evas_object_smart_callback_add(done_btn, "clicked", on_new_contact_done_clicked, ad);
844
845         Evas_Object *cancel_btn = elm_button_add(ad->nf);
846         elm_object_style_set(cancel_btn, "naviframe/title_left");
847         elm_object_text_set(cancel_btn, i18n_get_text("IDS_TGRAM_ACBUTTON_CANCEL_ABB"));
848         evas_object_smart_callback_add(cancel_btn, "clicked", on_new_contact_cancel_clicked, ad);
849
850         elm_object_item_part_content_set(navi_item, "title_right_btn", done_btn);
851         elm_object_item_part_content_set(navi_item, "title_left_btn", cancel_btn);
852
853         evas_object_data_set(ad->nf, "name_done_btn", (void*)done_btn);
854         //elm_object_disabled_set(done_btn, EINA_TRUE);
855 }
856
857
858 static void on_invite_friends_clicked(void *data, Evas_Object *obj, void *event_info)
859 {
860         Elm_Object_Item *it = event_info;
861         elm_genlist_item_selected_set(it, EINA_FALSE);
862         app_control_h app_control;
863         int ret = app_control_create(&app_control);
864         if (ret != APP_CONTROL_ERROR_NONE) {
865                 return;
866         }
867         app_control_set_operation(app_control, APP_CONTROL_OPERATION_COMPOSE);
868         app_control_set_uri(app_control, "sms:");
869         //app_control_set_mime(app_control,"text/html");
870         char *text = "Invite you to telegram! https://telegram.org/dl";
871         app_control_add_extra_data(app_control, APP_CONTROL_DATA_TEXT, text);
872         if (app_control_send_launch_request(app_control, NULL, NULL) == APP_CONTROL_ERROR_NONE) {
873                 // sms view launched
874         }
875         app_control_destroy(app_control);
876 }
877
878 static void on_group_chat_clicked(void *data, Evas_Object *obj, void *event_info)
879 {
880         Elm_Object_Item *it = event_info;
881         elm_genlist_item_selected_set(it, EINA_FALSE);
882         appdata_s* ad = evas_object_data_get(obj, "app_data");
883
884         if (ad && ad->buddy_list && eina_list_count(ad->buddy_list) > 0) {
885                 delete_floating_button(ad);
886                 launch_contact_selction_view(ad);
887         } else {
888                 char msg_str[512]={0,};
889                 int size = 0;
890                 snprintf(msg_str, sizeof(msg_str) - 1, i18n_get_text("IDS_TGRAM_BODY_PD_PARTICIPANTS"), size);
891
892                 char org_msg[1024] = {0,};
893                 strcpy(org_msg, msg_str);
894                 strcat(org_msg, ". ");
895                 strcat(org_msg, i18n_get_text("IDS_TGRAM_MBODY_INVITE_FRIENDS"));
896                 show_toast(ad, org_msg);
897         }
898 }
899
900 static void on_secret_chat_clicked(void *data, Evas_Object *obj, void *event_info)
901 {
902         Elm_Object_Item *it = event_info;
903         elm_genlist_item_selected_set(it, EINA_FALSE);
904
905         show_toast(data, "on_secret_chat_clicked");
906 }
907
908 static void on_peer_item_clicked(void *data, Evas_Object *obj, void *event_info)
909 {
910         Elm_Object_Item *it = event_info;
911         elm_genlist_item_selected_set(it, EINA_FALSE);
912
913         int item_id = (int) data;
914         appdata_s* ad = evas_object_data_get(obj, "app_data");
915         Eina_List *list = evas_object_data_get(obj, "result_list");
916
917         user_data_with_pic_s* sel_item = eina_list_nth(list, item_id);
918         ad->buddy_in_cahtting_data = sel_item;
919
920         int peer_id = -1;
921         for (int i = 0; i < eina_list_count(ad->peer_list); i++) {
922                 peer_with_pic_s* pic_item = eina_list_nth(ad->peer_list, i);
923                 tg_peer_info_s* item = pic_item->use_data;
924
925                 if (item->peer_id == sel_item->use_data->user_id.id) {
926                         ad->peer_in_cahtting_data = pic_item;
927                         peer_id = i;
928                         break;
929                 }
930         }
931
932         if (peer_id == -1) {
933                 ad->peer_in_cahtting_data = NULL;
934                 ad->buddy_in_cahtting_data = NULL;
935                 show_toast(ad, "Unable to retrieve buddy details");
936                 return;
937         }
938
939         ad->main_item_in_cahtting_data = NULL;
940         for (int i = 0 ; i < eina_list_count(ad->main_list) ; i++) {
941                 tg_main_list_item_s *item = eina_list_nth(ad->main_list, i);
942                 if (item->peer_id == sel_item->use_data->user_id.id) {
943                         ad->main_item_in_cahtting_data = item;
944                         break;
945                 }
946         }
947
948         ad->buddy_in_cahtting_data = NULL;
949         for (int i = 0 ; i < eina_list_count(ad->buddy_list) ; i++) {
950                 user_data_with_pic_s *item = eina_list_nth(ad->buddy_list, i);
951                 if (item->use_data->user_id.id == sel_item->use_data->user_id.id) {
952                         ad->buddy_in_cahtting_data = item;
953                         break;
954                 }
955         }
956
957         elm_naviframe_item_pop(ad->nf);
958         delete_floating_button(ad);
959         launch_messaging_view_cb(ad, peer_id);
960 }
961
962 #if 0
963 static void _update_index_item(void *data, void *item_data, int id, Eina_List *list)
964 {
965         appdata_s* ad = data;
966         user_data_with_pic_s* item = eina_list_nth(list, id);
967         user_data_s* user = item->use_data;
968
969         Evas_Object *index = evas_object_data_get(ad->nf, "fs_index");
970
971         /*
972         char *index_text = NULL;
973         int unicode_len = eina_unicode_utf8_get_len(user->print_name);
974         int str_len = strlen(user->print_name);
975         int lang_byte = str_len / unicode_len + (str_len % unicode_len > 0 ? 1 : 0);
976
977         index_text = strndup(user->print_name, lang_byte);
978         */
979
980         char *index_text = _util_get_first_char(user->print_name);
981
982         Elm_Object_Item *it = elm_index_item_append(index, index_text, NULL, NULL);
983
984         elm_object_item_data_set(it, item_data);
985
986 }
987 #endif
988
989 void _append_peer_item(Evas_Object *genlist, appdata_s *ad, Eina_List* item_list)
990 {
991         int i;
992         static Elm_Genlist_Item_Class itc;
993         Elm_Object_Item* item = NULL;
994
995         itc.item_style = "type1";
996         itc.func.text_get = on_peer_list_name_requested;
997         itc.func.content_get = on_peer_list_image_requested;
998         itc.func.state_get = NULL;
999         itc.func.del = NULL;
1000
1001         int count = eina_list_count(item_list);
1002
1003         evas_object_data_set(genlist, "result_list", item_list);
1004
1005         if(count > 0) {
1006                 for (i = 0; i < count; i++) {
1007                         item = elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, on_peer_item_clicked, (void*) i);
1008                 }
1009         }
1010 }
1011
1012 static void on_contact_item_clicked(void *data, Evas_Object *obj, void *event_info)
1013 {
1014         Elm_Object_Item *it = event_info;
1015         elm_genlist_item_selected_set(it, EINA_FALSE);
1016
1017         int item_id = (int) data;
1018         appdata_s* ad = evas_object_data_get(obj, "app_data");
1019         Eina_List *list = evas_object_data_get(obj, "contact_list");
1020
1021         contact_data_s* contact = eina_list_nth(list, item_id);
1022         if (!contact) {
1023                 return;
1024         }
1025
1026         app_control_h app_control;
1027         int ret = app_control_create(&app_control);
1028         if (ret != APP_CONTROL_ERROR_NONE) {
1029                 return;
1030         }
1031         app_control_set_operation(app_control, APP_CONTROL_OPERATION_COMPOSE);
1032         app_control_set_uri(app_control, "sms:");
1033
1034         char phone_num[512] = {0,};
1035         strcpy(phone_num, "sms:");
1036         strcat(phone_num, contact->phone_number);
1037
1038         app_control_set_uri(app_control, phone_num);
1039         char *text = "Invite you to telegram! https://telegram.org/dl";
1040         app_control_add_extra_data(app_control, APP_CONTROL_DATA_TEXT, text);
1041         if (app_control_send_launch_request(app_control, NULL, NULL) == APP_CONTROL_ERROR_NONE) {
1042                 // sms view launched
1043         }
1044         app_control_destroy(app_control);
1045
1046         return;
1047 }
1048
1049 char* on_contact_list_name_requested(void *data, Evas_Object *obj, const char *part)
1050 {
1051         int id = (int) data;
1052
1053         appdata_s* ad = evas_object_data_get(obj, "app_data");
1054         Eina_List *list = evas_object_data_get(obj, "contact_list");
1055
1056         if (!list) {
1057                 list = ad->contact_list;
1058         }
1059
1060         contact_data_s* contact = eina_list_nth(list, id);
1061         if (!contact) {
1062                 return NULL;
1063         }
1064
1065         if (!strcmp(part,"elm.text.main.left.top") || !strcmp(part,"elm.text")){
1066                 return strdup(contact->display_name);
1067         } else if (!strcmp(part, "elm.text.sub.left.bottom") || !strcmp(part,"elm.text.sub")) {
1068                 return NULL;
1069         }
1070         return NULL;
1071 }
1072
1073
1074 Evas_Object* on_contact_list_image_requested(void *data, Evas_Object *obj, const char *part)
1075 {
1076         Evas_Object *eo = NULL;
1077         if (!strcmp(part, "elm.icon.left") || !strcmp(part, "elm.icon.1") || !strcmp(part, "elm.swallow.icon")  ) {
1078                 int id = (int) data;
1079                 appdata_s* ad = evas_object_data_get(obj, "app_data");
1080                 Eina_List *list = evas_object_data_get(obj, "contact_list");
1081                 if (!list) {
1082                         list = ad->contact_list;
1083                 }
1084                 int size = eina_list_count(list);
1085                 if (size <= 0) {
1086                         return eo;
1087                 }
1088                 contact_data_s* contact = eina_list_nth(list, id);
1089                 if (!contact || !contact->pic_url) {
1090                         return NULL;
1091                 }
1092
1093                 Evas_Object *profile_pic = NULL;
1094                 profile_pic = create_image_object_from_file(contact->pic_url, obj);
1095                 evas_object_color_set(profile_pic, 45, 165, 224, 255);
1096
1097                 char edj_path[PATH_MAX] = {0, };
1098                 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1099                 Evas_Object* user_pic_layout = elm_layout_add(ad->nf);
1100                 elm_layout_file_set(user_pic_layout, edj_path, "search_circle_layout");
1101                 evas_object_size_hint_weight_set(user_pic_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1102                 evas_object_size_hint_align_set(user_pic_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1103                 evas_object_show(user_pic_layout);
1104                 elm_object_part_content_set(user_pic_layout, "content", profile_pic);
1105
1106                 eo = elm_layout_add(obj);
1107                 elm_layout_theme_set(eo, "layout", "list/B/type.2", "default");
1108                 elm_layout_content_set(eo, "elm.swallow.content", user_pic_layout);
1109
1110         }
1111         return eo;
1112 }
1113
1114
1115 void _append_contact_item(Evas_Object *genlist, appdata_s *ad, Eina_List* item_list)
1116 {
1117
1118         if (!genlist || !ad || !item_list) {
1119                 return;
1120         }
1121
1122         int i;
1123         static Elm_Genlist_Item_Class itc;
1124         Elm_Object_Item* item = NULL;
1125
1126         itc.item_style = "type1";
1127         itc.func.text_get = on_contact_list_name_requested;
1128         itc.func.content_get = on_contact_list_image_requested;
1129         itc.func.state_get = NULL;
1130         itc.func.del = NULL;
1131
1132         int count = eina_list_count(item_list);
1133
1134         evas_object_data_set(genlist, "contact_list", item_list);
1135
1136         if(count > 0) {
1137                 for (i = 0; i < count; i++) {
1138                         item = elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, on_contact_item_clicked, (void*) i);
1139                 }
1140         }
1141 }
1142
1143 void _append_command_item(Evas_Object *genlist, appdata_s *ad)
1144 {
1145         int i;
1146         static Elm_Genlist_Item_Class itc;
1147
1148         //itc.item_style = "2line.top";
1149         itc.item_style = "type1";
1150         itc.func.text_get = _on_command_name_requested;
1151         itc.func.content_get = _on_command_name_image_requested;
1152         itc.func.state_get = NULL;
1153         itc.func.del = NULL;
1154
1155         for (i = 0; i < COMMAND_MENU_ITEM_COUNT; i++) {
1156                 elm_genlist_item_append(genlist, &itc, (void *)i, NULL, ELM_GENLIST_ITEM_NONE, contact_screen_command_item_list[i].func, ad);
1157         }
1158
1159
1160 }
1161
1162 static void _append_index_item(Evas_Object *genlist, appdata_s *ad)
1163 {
1164         int i;
1165         static Elm_Genlist_Item_Class itc;
1166         Elm_Object_Item* item = NULL;
1167
1168         //itc.item_style = "2line.top";
1169         itc.item_style = "type1";
1170         itc.func.text_get = on_peer_list_name_requested;
1171         itc.func.content_get = on_peer_list_image_requested;
1172         itc.func.state_get = NULL;
1173         itc.func.del = NULL;
1174
1175         int count = eina_list_count(ad->search_peer_list);
1176
1177         if(count > 0) {
1178                 for (i = 0; i < count; i++) {
1179                         item = elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, on_peer_item_clicked, (void*) i);
1180                 }
1181         } else {
1182                 i = 1;
1183                 elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, NULL, (void*) i);
1184         }
1185 }
1186
1187
1188 void _group_index_selected_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
1189 {
1190         Elm_Object_Item *it = (Elm_Object_Item*)event_info;
1191         elm_genlist_item_selected_set(it, EINA_FALSE);
1192
1193         Evas_Object *check = elm_object_item_part_content_get(it, "elm.swallow.end");
1194         if (!check) {
1195                 check = elm_object_item_part_content_get(it, "elm.icon.right");
1196         }
1197
1198         if (check) {
1199                 elm_check_state_set(check, !elm_check_state_get(check));
1200                 evas_object_smart_callback_call(check, "changed", NULL);
1201         }
1202 }
1203
1204 /*
1205 char* _group_index_text_get_cb(void *data, Evas_Object *obj, const char *part)
1206 {
1207         char *text = (char*)data;
1208
1209         if (!strcmp(part, "elm.text.main")) {
1210                 return strdup(text);
1211         }
1212 }
1213
1214 void _append_gl_group_index(Evas_Object *genlist, char* text) {
1215         static Elm_Genlist_Item_Class itc;
1216         ret_if(!itc);
1217
1218         itc.item_style = "groupindex";
1219         itc.func.text_get = _group_index_text_get_cb;
1220         itc.func.content_get = NULL;
1221         itc.func.del = gl_del_cb;
1222
1223         elm_genlist_item_append(genlist, &itc, strdup(text), NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
1224 }*/
1225
1226 static void _on_search_entry_changed(void *data, Evas_Object *obj, void *event_info)
1227 {
1228         appdata_s* ad = data;
1229         char* entry_text = NULL;
1230
1231         Evas_Object *search_list = evas_object_data_get(ad->nf, "search_list");
1232         Evas_Object *main_layout = evas_object_data_get(ad->nf, "main_layout");
1233         Evas_Object *index = evas_object_data_get(ad->nf, "fs_index");
1234
1235         user_data_with_pic_s *item;
1236         user_data_s* user; // = item->use_data;
1237
1238         if (!search_list) {
1239                 DBG("search_list is null");
1240                 return;
1241         }
1242
1243         elm_genlist_clear(search_list);
1244
1245         entry_text = trim(elm_entry_markup_to_utf8(elm_object_text_get(obj)));
1246
1247         Eina_List *result_list = NULL;
1248         Eina_List *l = NULL;
1249
1250         if (ucol_is_jamo(entry_text)) {
1251                 LOGD("entry_text is jamo, %s", entry_text);
1252                 EINA_LIST_FOREACH(ad->search_peer_list, l, item) {
1253                         int result;
1254                         user = item->use_data;
1255                         result = ucol_compare_first_letters(user->print_name, entry_text);
1256                         if (result == 0) {
1257                                 result_list = eina_list_append(result_list, item);
1258                         }
1259                 }
1260         } else {
1261                 LOGD("entry_text is not jamo, %s", entry_text);
1262                 EINA_LIST_FOREACH(ad->search_peer_list, l, item) {
1263                         user = item->use_data;
1264
1265                         if (ucol_search(user->print_name, entry_text) != -ENOENT) {
1266                                 result_list = eina_list_append(result_list, item);
1267                         }
1268                 }
1269         }
1270
1271         if ((entry_text == NULL || strlen(entry_text) == 0) && result_list == NULL) {
1272                 result_list = ad->search_peer_list;
1273                 _append_command_item(search_list, ad);
1274         }
1275
1276         LOGD("count of result_list is %d", eina_list_count(result_list));
1277
1278         if (!(entry_text == NULL || strlen(entry_text) == 0) && !result_list) {
1279                 Evas_Object *no_contents = evas_object_data_get(ad->nf, "no_contents_layout");
1280
1281                 elm_object_part_content_unset(main_layout, "elm.swallow.content");
1282                 elm_object_part_content_set(main_layout, "elm.swallow.content", no_contents);
1283         } else {
1284                 Evas_Object *fs_layout = evas_object_data_get(ad->nf, "fs_layout");
1285                 _append_peer_item(search_list, data, result_list);
1286                 Evas_Object *content = elm_object_part_content_unset(main_layout, "elm.swallow.content");
1287                 if (evas_object_data_get(ad->nf, "no_contents_layout") == content) {
1288                         evas_object_hide(content);
1289                 }
1290                 elm_object_part_content_set(main_layout, "elm.swallow.content", fs_layout);
1291         }
1292
1293         elm_index_level_go(index, 0);
1294         elm_genlist_realized_items_update(search_list);
1295         if (entry_text) {
1296                 free(entry_text);
1297         }
1298 }
1299
1300 static void _on_search_entry_focused(void *data, Evas_Object *obj, void *event_info)
1301 {
1302         Evas_Object *layout = data;
1303         if (elm_object_focus_get(layout)) {
1304                 elm_object_signal_emit(layout, "elm,state,focused", "");
1305         } else{
1306                 elm_object_signal_emit(layout, "elm,state,unfocused", "");
1307         }
1308 }
1309
1310
1311 static Evas_Object *_create_searchbar(Evas_Object* parent, void* data)
1312 {
1313         char edj_path[PATH_MAX] = {0, };
1314         app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1315
1316         Evas_Object* layout = elm_layout_add(parent);
1317         elm_layout_file_set(layout, edj_path, "");
1318
1319         /* editfield layout */
1320         Evas_Object* searchbar_layout = elm_layout_add(parent);
1321         elm_layout_theme_set(searchbar_layout, "layout", "searchfield", "singleline");
1322         evas_object_size_hint_align_set(searchbar_layout, EVAS_HINT_FILL, 0.0);
1323         evas_object_size_hint_weight_set(searchbar_layout, EVAS_HINT_EXPAND, 0.0);
1324         //evas_object_event_callback_add(searchbar_layout, EVAS_CALLBACK_DEL, _searchbar_layout_del_cb, NULL);
1325
1326         /* entry */
1327         Evas_Object* searchbar_entry = elm_entry_add(searchbar_layout);
1328         elm_entry_cursor_end_set(searchbar_entry);
1329         evas_object_size_hint_weight_set(searchbar_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1330         evas_object_size_hint_align_set(searchbar_entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
1331         elm_entry_single_line_set(searchbar_entry,  EINA_TRUE);
1332         elm_entry_scrollable_set (searchbar_entry, EINA_FALSE);
1333         elm_entry_cnp_mode_set(searchbar_entry, ELM_CNP_MODE_NO_IMAGE);
1334         elm_entry_context_menu_disabled_set(searchbar_entry, EINA_TRUE);
1335         elm_object_part_text_set(searchbar_entry, "elm.guide", i18n_get_text("IDS_TGRAM_NPBODY_SEARCH"));
1336         elm_object_focus_set(searchbar_entry, EINA_FALSE);
1337         //elm_object_tree_focus_allow_set(searchbar_entry, EINA_FALSE);
1338         //evas_object_event_callback_add(searchbar_entry, EVAS_CALLBACK_DEL, _searchbar_entry_del_cb, NULL);
1339
1340         limit_filter_data.max_char_count = 255;
1341         elm_entry_markup_filter_append(searchbar_entry, elm_entry_filter_limit_size, &limit_filter_data);
1342
1343
1344         evas_object_smart_callback_add(searchbar_entry, "changed", _on_search_entry_changed, data);
1345         evas_object_smart_callback_add(searchbar_entry, "preedit,changed", _on_search_entry_changed, data);
1346         evas_object_smart_callback_add(searchbar_entry, "focused", _on_search_entry_focused, searchbar_layout);
1347         /*
1348         evas_object_smart_callback_add(ad->searchbar_entry, "maxlength,reached", _searchbar_entry_max_length_reached_cb, data);
1349         evas_object_smart_callback_add(ad->searchbar_entry,     "preedit,changed", _searchbar_entry_preedit_changed_cb, data);
1350         evas_object_smart_callback_add(ad->searchbar_entry, "language,changed", _searchbar_entry_lang_changed, data);
1351          */
1352
1353         elm_object_part_content_set(searchbar_layout, "elm.swallow.content", searchbar_entry);
1354         return searchbar_layout;
1355 }
1356
1357 static void _index_selected_cb(void *data, Evas_Object *obj, void *event_info)
1358 {
1359         appdata_s* ad = data;
1360         Evas_Object *search_list = evas_object_data_get(ad->nf, "search_list");
1361         //Elm_Object_Item *gl_item = elm_genlist_first_item_get(search_list);
1362
1363         user_data_with_pic_s* gl_item = NULL;//eina_list_nth(ad->search_peer_list, 0);
1364
1365         //tg_peer_info_s* user = item->use_data;
1366         Eina_List* list = ad->search_peer_list;
1367         int index = 0;
1368         Eina_List *l;
1369
1370         EINA_LIST_FOREACH(list, l, gl_item) {
1371                 if (ucol_compare_first_letters(gl_item->use_data->print_name, elm_index_item_letter_get(event_info)) == 0) {
1372                         break;
1373                 }
1374                 index++;
1375         }
1376
1377         if (eina_list_count(list) == index) {
1378                 return;
1379         }
1380
1381         if (list == ad->search_peer_list) {
1382                 index += 2;
1383         }
1384
1385         Elm_Object_Item *item = elm_genlist_nth_item_get(search_list, index);
1386         elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1387 }
1388
1389 static Evas_Object* create_fastscroll(appdata_s *ad)
1390         {
1391                 Evas_Object *parent = ad->nf;
1392                 Evas_Object *index;
1393                 int i = 0, j, len;
1394                 char *str;
1395                 char buf[PATH_MAX] = {0, };
1396
1397                 index = elm_index_add(parent);
1398                 elm_object_part_content_set(parent, "elm.swallow.fastscroll", index);
1399                 elm_index_autohide_disabled_set(index, EINA_TRUE);
1400                 elm_index_omit_enabled_set(index, EINA_TRUE);
1401
1402                 /* 1. Special character & Numbers */
1403                 elm_index_item_append(index, "#", NULL, NULL);
1404
1405                 /* 2. Local language */
1406                 str = i18n_get_text("IDS_COM_BODY_ABCDEFGHIJKLMNOPQRSTUVWXYZ");
1407                 len = strlen(str);
1408
1409                 while (i < len) {
1410                         j = i;
1411                         eina_unicode_utf8_next_get(str, &i);
1412                         snprintf(buf, i - j + 1, "%s", str + j);
1413                         buf[i - j + 1] = 0;
1414
1415                         elm_index_item_append(index, buf, NULL, NULL);
1416                 }
1417                 elm_index_level_go(index, 0);
1418
1419                 evas_object_smart_callback_add(index, "selected", _index_selected_cb, ad);
1420                 //evas_object_smart_callback_add(index, "changed", _index_changed_cb, NULL);
1421                 //evas_object_smart_callback_add(index, "language,changed", _index_language_changed_cb, NULL);
1422
1423                 return index;
1424         }
1425
1426 void launch_start_peer_search_view(appdata_s* ad)
1427 {
1428         if (!ad)
1429                 return;
1430
1431         ad->current_app_state = TG_PEER_SEARCH_VIEW_STATE;
1432
1433         clear_search_list(ad);
1434
1435         free_contact_list(ad->contact_list);
1436
1437         ad->search_peer_list = load_buddy_data_by_name(ad->user_id.id, NULL);
1438         ad->contact_list = get_contact_list_from_device_db();
1439
1440         Evas_Object* layout = elm_layout_add(ad->nf);
1441         elm_layout_theme_set(layout, "layout", "application", "searchbar_base");
1442         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1443         evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1444         evas_object_show(layout);
1445
1446         Evas_Object* searchbar_layout = _create_searchbar(layout, ad);
1447         elm_object_part_content_set(layout, "searchbar", searchbar_layout);
1448
1449         Evas_Object* fs_layout = elm_layout_add(layout);
1450         //elm_layout_theme_set(fs_layout, "layout", "application", "fastscroll");
1451         elm_layout_theme_set(fs_layout, "layout", "application", "default");
1452         elm_object_part_content_set(layout, "elm.swallow.content", fs_layout);
1453
1454 #if 0
1455         Evas_Object* index = create_fastscroll(ad);
1456         elm_object_part_content_set(fs_layout, "elm.swallow.fastscroll", index);
1457 #endif
1458
1459         Evas_Object* peer_list = create_genlist(ad, fs_layout);
1460         evas_object_data_set(peer_list, "app_data", ad);
1461         elm_object_part_content_set(fs_layout, "elm.swallow.content", peer_list);
1462
1463         _append_command_item(peer_list, ad);
1464         _append_peer_item(peer_list, ad, ad->search_peer_list);
1465         if (ad->contact_list && eina_list_count(ad->contact_list) > 0) {
1466                 _append_contact_item(peer_list, ad, ad->contact_list);
1467         }
1468
1469         /* no contents */
1470         Evas_Object *nocontents = elm_layout_add(ad->nf);
1471         elm_layout_theme_set(nocontents, "layout", "nocontents", "default");
1472         evas_object_size_hint_weight_set(nocontents, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1473         evas_object_size_hint_align_set(nocontents, EVAS_HINT_FILL, EVAS_HINT_FILL);
1474         elm_object_part_text_set(nocontents, "elm.text", _("IDS_TGRAM_NPBODY_NO_RESULTS_FOUND_ABB"));
1475         evas_object_data_set(ad->nf, "no_contents_layout", nocontents);
1476
1477         evas_object_data_set(ad->nf, "fs_layout", fs_layout);
1478         evas_object_data_set(ad->nf, "fs_index", index);
1479         evas_object_data_set(ad->nf, "main_layout", layout);
1480         evas_object_data_set(ad->nf, "search_list", peer_list);
1481
1482         elm_naviframe_item_push(ad->nf, i18n_get_text("IDS_TGRAM_HEADER_CONTACTS_ABB"), NULL, NULL, layout, NULL);
1483
1484 }