add telegram account, fix db insert error.
[apps/native/telegram-tizen.git] / TelegramTizen / src / contact_selection_view.c
1 /*
2     This file is part of Telegram application for tizen
3
4     This library is free software; you can redistribute it and/or
5     modify it under the terms of the GNU Lesser General Public
6     License as published by the Free Software Foundation; either
7     version 2.1 of the License, or (at your option) any later version.
8
9     This library is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12     Lesser General Public License for more details.
13
14     You should have received a copy of the GNU Lesser General Public
15     License along with this library; if not, write to the Free Software
16     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17 */
18
19 #include "contact_selection_view.h"
20 #include "group_chat_entry_view.h"
21 #include "tg_db_wrapper.h"
22 #include "ucol.h"
23
24 static Evas_Object* create_image_object_from_file(const char *icon_name, Evas_Object *parent)
25 {
26         Evas_Object *icon = elm_image_add(parent);
27         evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
28         evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
29         elm_image_file_set(icon, icon_name, NULL);
30         evas_object_show(icon);
31         return icon;
32 }
33
34 void on_buddy_selected(void *data, Evas_Object *obj, void *event_info)
35 {
36         Elm_Object_Item *it = event_info;
37         elm_genlist_item_selected_set(it, EINA_FALSE);
38         Evas_Object *layout = elm_object_item_part_content_get(event_info, "elm.swallow.end");
39         Evas_Object *checkbox = elm_object_part_content_get(layout, "elm.swallow.content");
40         Eina_Bool checked = elm_check_state_get(checkbox);
41         checked = !checked;
42         elm_check_state_set(checkbox, checked);
43
44         int id = (int)data;
45         appdata_s* ad = evas_object_data_get(obj, "app_data");
46
47         if (ad && ad->known_buddy_list && eina_list_count(ad->known_buddy_list) > 0) {
48                 if (id == 0) {
49                         for (int i = 0 ; i < eina_list_count(ad->known_buddy_list) ; i++) {
50                                 user_data_with_pic_s *item = eina_list_nth(ad->known_buddy_list, i);
51                                 user_data_s* user = item->use_data;
52                                 user->is_selected = checked;
53
54
55                                 Elm_Object_Item* list_item = elm_genlist_nth_item_get(obj, i+1);
56                                 if (list_item) {
57                                         elm_genlist_item_selected_set(list_item, EINA_FALSE);
58                                         Evas_Object *llayout = elm_object_item_part_content_get(list_item, "elm.swallow.end");
59                                         Evas_Object *lcheckbox = elm_object_part_content_get(llayout, "elm.swallow.content");
60                                         elm_check_state_set(lcheckbox, checked);
61                                 }
62                         }
63                 } else {
64                         user_data_with_pic_s *item = eina_list_nth(ad->known_buddy_list, id - 1);
65                         user_data_s* user = item->use_data;
66                         user->is_selected = checked;
67
68                         if (!checked) {
69                                 Elm_Object_Item* list_item = elm_genlist_nth_item_get(obj, 0);
70                                 if (list_item) {
71                                         elm_genlist_item_selected_set(list_item, EINA_FALSE);
72                                         Evas_Object *llayout = elm_object_item_part_content_get(list_item, "elm.swallow.end");
73                                         Evas_Object *lcheckbox = elm_object_part_content_get(llayout, "elm.swallow.content");
74                                         elm_check_state_set(lcheckbox, EINA_FALSE);
75                                 }
76                         } else {
77                                 Eina_Bool all_items_selected = EINA_TRUE;
78
79                                 Eina_List *l = NULL;
80                                 user_data_with_pic_s *item = NULL;
81                                 EINA_LIST_FOREACH(ad->known_buddy_list, l, item) {
82                                         if (!item)
83                                                 continue;
84                                         user_data_s* user = item->use_data;
85                                         if (!user->is_selected) {
86                                                 all_items_selected = EINA_FALSE;
87                                                 break;
88                                         }
89                                 }
90                                 Elm_Object_Item* list_item = elm_genlist_nth_item_get(obj, 0);
91                                 if (list_item) {
92                                         elm_genlist_item_selected_set(list_item, EINA_FALSE);
93                                         Evas_Object *llayout = elm_object_item_part_content_get(list_item, "elm.swallow.end");
94                                         Evas_Object *lcheckbox = elm_object_part_content_get(llayout, "elm.swallow.content");
95                                         elm_check_state_set(lcheckbox, all_items_selected);
96                                 }
97                         }
98                 }
99         }
100 }
101
102 char* on_buddy_name_get_cb(void *data, Evas_Object *obj, const char *part)
103 {
104         int id = (int)data;
105         appdata_s* ad = evas_object_data_get(obj, "app_data");
106         Eina_List *list = evas_object_data_get(obj, "result_list");
107
108         if (!list) {
109                 list = ad->known_buddy_list;
110         }
111
112         if (list && eina_list_count(list) > 0) {
113                 if (!strcmp(part, "elm.text")) {
114                         if (id == 0) {
115                                 char buf[512] = { 0, };
116                                 snprintf(buf, 512, "%s", i18n_get_text("IDS_TGRAM_MBODY_SELECT_ALL"));
117                                 return strdup(buf);
118                         }
119
120                         user_data_with_pic_s* item = eina_list_nth(list, id - 1);
121                         user_data_s* user = item->use_data;
122
123                         if (user && user->print_name) {
124                                 char* user_name = replace(user->print_name, '_', " ");
125                                 char buf[512] = {'\0'};
126                                 snprintf(buf, 512, "<align=left><font_size=35><color=#000000>%s</color></font_size></align>", user_name);
127                                 free(user_name);
128                                 return strdup(buf);
129                         }
130                 }
131         }
132
133         return NULL;
134 }
135
136 void on_item_checkbox_sel_cb(void *data, Evas_Object *obj, void *event_info)
137 {
138         int id = (int)data;
139         appdata_s* ad = evas_object_data_get(obj, "app_data");
140         Eina_Bool checked = elm_check_state_get(obj);
141         Evas_Object* buddy_gen_list = evas_object_data_get(obj, "buddy_gen_list");
142         Eina_List *list = evas_object_data_get(buddy_gen_list, "result_list");
143
144         if (!list) {
145                 list = ad->known_buddy_list;
146         }
147         if (ad && list && eina_list_count(list) > 0) {
148                 if (id == 0) {
149                         for (int i = 0 ; i < eina_list_count(list) ; i++) {
150                                 user_data_with_pic_s *item = eina_list_nth(list, i);
151                                 user_data_s* user = item->use_data;
152                                 user->is_selected = checked;
153
154                                 Elm_Object_Item* list_item = elm_genlist_nth_item_get(buddy_gen_list, i + 1);
155                                 if (list_item) {
156                                         elm_genlist_item_selected_set(list_item, EINA_FALSE);
157                                         Evas_Object *llayout = elm_object_item_part_content_get(list_item, "elm.swallow.end");
158                                         Evas_Object *lcheckbox = elm_object_part_content_get(llayout, "elm.swallow.content");
159                                         elm_check_state_set(lcheckbox, checked);
160                                 }
161                         }
162                 } else {
163                         user_data_with_pic_s *item = eina_list_nth(list, id - 1);
164                         user_data_s* user = item->use_data;
165                         user->is_selected = checked;
166
167                         if (!checked) {
168                                 Elm_Object_Item* list_item = elm_genlist_nth_item_get(buddy_gen_list, 0);
169                                 if (list_item) {
170                                         elm_genlist_item_selected_set(list_item, EINA_FALSE);
171                                         Evas_Object *llayout = elm_object_item_part_content_get(list_item, "elm.swallow.end");
172                                         Evas_Object *lcheckbox = elm_object_part_content_get(llayout, "elm.swallow.content");
173                                         elm_check_state_set(lcheckbox, EINA_FALSE);
174                                 }
175                         } else {
176                                 Eina_Bool all_items_selected = EINA_TRUE;
177                                 Eina_List *l = NULL;
178                                 user_data_with_pic_s *item = NULL;
179                                 EINA_LIST_FOREACH(list, l, item) {
180                                         if (!item)
181                                                 continue;
182                                         user_data_s* user = item->use_data;
183                                         if (!user->is_selected) {
184                                                 all_items_selected = EINA_FALSE;
185                                                 break;
186                                         }
187                                 }
188                                 Elm_Object_Item* list_item = elm_genlist_nth_item_get(buddy_gen_list, 0);
189                                 if (list_item) {
190                                         elm_genlist_item_selected_set(list_item, EINA_FALSE);
191                                         Evas_Object *llayout = elm_object_item_part_content_get(list_item, "elm.swallow.end");
192                                         Evas_Object *lcheckbox = elm_object_part_content_get(llayout, "elm.swallow.content");
193                                         elm_check_state_set(lcheckbox, all_items_selected);
194                                 }
195                         }
196                 }
197         }
198 }
199
200 Evas_Object* on_buddy_selection_part_content_get_cb(void *data, Evas_Object *obj, const char *part)
201 {
202         Evas_Object *eo = NULL;
203         appdata_s *ad;
204         int id;
205
206         id = (int)data;
207
208         ad = evas_object_data_get(obj, "app_data");
209         if (!ad) {
210                 return NULL;
211         }
212
213         Eina_List *list = evas_object_data_get(obj, "result_list");
214
215         if (!list) {
216                 list = ad->known_buddy_list;
217         }
218
219         if (!strcmp(part, "elm.swallow.icon")) {
220                 Evas_Object *image = NULL;
221
222                 if (id == 0 && list && eina_list_count(list) > 0) {
223                         return eo;
224                 }
225
226                 user_data_with_pic_s *item = eina_list_nth(list, id - 1);
227                 user_data_s* user = item->use_data;
228
229                 if (user->photo_path && strcmp(user->photo_path, "") != 0) {
230                         image = create_image_object_from_file(user->photo_path, obj);
231                 } else {
232                         image = create_image_object_from_file(ui_utils_get_resource(DEFAULT_LIST_THUMB_SINGLE_PIC), obj);
233                         evas_object_color_set(image, 45, 165, 224, 255);
234                 }
235
236                 item->contact_icon = image;
237                 //evas_object_event_callback_add(item->contact_icon, EVAS_CALLBACK_DEL, buddy_icon_del_cb, item);
238
239                 if (image) {
240                         char edj_path[PATH_MAX] = {0, };
241                         app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
242                         Evas_Object* user_pic_layout = elm_layout_add(ad->nf);
243                         elm_layout_file_set(user_pic_layout, edj_path, "search_circle_layout");
244                         evas_object_size_hint_weight_set(user_pic_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
245                         evas_object_size_hint_align_set(user_pic_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
246                         evas_object_show(user_pic_layout);
247                         elm_object_part_content_set(user_pic_layout, "content", item->contact_icon);
248
249                         eo = elm_layout_add(obj);
250                         elm_layout_theme_set(eo, "layout", "list/B/type.2", "default");
251                         elm_layout_content_set(eo, "elm.swallow.content", user_pic_layout);
252
253                 }
254         } else if (!strcmp(part, "elm.swallow.end")) {
255                 if (id == 0 && list && eina_list_count(list) > 0) {
256
257                         Eina_Bool all_items_selected = (Eina_Bool)evas_object_data_get(obj, "all_selected");
258
259                         eo = elm_layout_add(obj);
260                         elm_layout_theme_set(eo, "layout", "list/C/type.2", "default");
261                         Evas_Object *check = elm_check_add(obj);
262                         elm_check_state_set(check, all_items_selected);
263                         elm_object_focus_set(check, EINA_FALSE);
264                         evas_object_propagate_events_set(check, EINA_FALSE);
265                         evas_object_data_set(check, "app_data", ad);
266                         evas_object_data_set(check, "buddy_gen_list", obj);
267                         evas_object_smart_callback_add(check, "changed", on_item_checkbox_sel_cb, data);
268                         elm_layout_content_set(eo, "elm.swallow.content", check);
269                         return eo;
270                 }
271
272                 user_data_with_pic_s *item = eina_list_nth(list, id - 1);
273                 user_data_s* user = item->use_data;
274
275                 eo = elm_layout_add(obj);
276                 elm_layout_theme_set(eo, "layout", "list/C/type.2", "default");
277                 Evas_Object *check = elm_check_add(obj);
278                 elm_check_state_set(check, user->is_selected);
279                 elm_check_state_pointer_set(check, &user->is_selected);
280                 elm_object_focus_set(check, EINA_FALSE);
281                 evas_object_propagate_events_set(check, EINA_FALSE);
282                 evas_object_data_set(check, "app_data", ad);
283                 evas_object_data_set(check, "buddy_gen_list", obj);
284                 evas_object_smart_callback_add(check, "changed", on_item_checkbox_sel_cb, data);
285                 elm_layout_content_set(eo, "elm.swallow.content", check);
286         } else {
287
288         }
289
290         return eo;
291 }
292
293 void on_done_buton_clicked(void *data, Evas_Object *object, void *event_info)
294 {
295         int selected_item_count = 0;
296         appdata_s* ad = data;
297         if (ad && ad->known_buddy_list) {
298                 for (int i = 0 ; i < eina_list_count(ad->known_buddy_list) ; i++) {
299                         user_data_with_pic_s *item = eina_list_nth(ad->known_buddy_list, i);
300                         user_data_s* user = item->use_data;
301                         if (user->is_selected) {
302                                 selected_item_count++;
303                         }
304                 }
305         }
306
307         if (selected_item_count > 1) {
308                 appdata_s* ad = data;
309                 // elm_naviframe_item_pop(ad->nf);
310                 // Load chat name entry view
311                 launch_group_chat_name_entry_view(ad);
312         } else {
313                 show_toast(ad, "Select at least 2 buddies.");
314         }
315 }
316
317 void on_cancel_buton_clicked(void *data, Evas_Object *object, void *event_info)
318 {
319         appdata_s* ad = data;
320         if (ad && ad->known_buddy_list) {
321                 for (int i = 0 ; i < eina_list_count(ad->known_buddy_list) ; i++) {
322                         user_data_with_pic_s *item = eina_list_nth(ad->known_buddy_list, i);
323                         user_data_s* user = item->use_data;
324                         user->is_selected = EINA_FALSE;
325                 }
326         }
327         elm_naviframe_item_pop(ad->nf);
328         ad->current_app_state = TG_PEER_SEARCH_VIEW_STATE;
329         evas_object_show(ad->panel);
330 }
331
332 #if 0
333 static char* _util_get_first_char(char *input_text)
334 {       /*
335         int unicode_len = eina_unicode_utf8_get_len(input_text);
336         int str_len = strlen(input_text);
337         int lang_byte = str_len / unicode_len + (str_len % unicode_len > 0 ? 1 : 0);
338
339         first_char = strndup(input_text, lang_byte);
340         */
341         char *first_char = NULL;
342         int count;
343         int flag;
344         unsigned char mask = 0x80;
345
346         count = 0;
347         while (*input_text & mask) {
348                 mask = mask >> 1;
349                 count++;
350         }
351
352         count = count == 0 ? 1 : count;
353         first_char = strndup(input_text, count);
354
355         return first_char;
356 }
357
358 static void _update_index_item(void *data, void *item_data, int id, Eina_List *list)
359 {
360         appdata_s* ad = data;
361         if (id == 0) {
362                 return;
363         }
364         user_data_with_pic_s* item = eina_list_nth(list, id-1);
365         user_data_s* user = item->use_data;
366
367         Evas_Object *index = evas_object_data_get(ad->nf, "fs_index");
368
369         /*
370         char *index_text = NULL;
371         int unicode_len = eina_unicode_utf8_get_len(user->print_name);
372         int str_len = strlen(user->print_name);
373         int lang_byte = str_len / unicode_len + (str_len % unicode_len > 0 ? 1 : 0);
374
375         index_text = strndup(user->print_name, lang_byte);
376         */
377
378         char *index_text = _util_get_first_char(user->print_name);
379
380         Elm_Object_Item *it = elm_index_item_append(index, index_text, NULL, NULL);
381
382         elm_object_item_data_set(it, item_data);
383
384 }
385 #endif
386
387 static void _append_peer_item(Evas_Object *genlist, appdata_s *ad, Eina_List *item_list)
388 {
389         int i;
390         static Elm_Genlist_Item_Class itc;
391         Elm_Object_Item* item = NULL;
392
393         itc.item_style = "type1";
394         itc.func.text_get = on_buddy_name_get_cb;
395         itc.func.content_get = on_buddy_selection_part_content_get_cb;
396         itc.func.state_get = NULL;
397         itc.func.del = NULL;
398
399         int count = eina_list_count(item_list);
400
401         evas_object_data_set(genlist, "result_list", item_list);
402
403         if (count > 0) {
404                 for (i = 0; i < count+1; i++) {
405                         item = elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, on_buddy_selected, (void*) i);
406                         //_update_index_item(ad, item, i, item_list);
407                 }
408         } else {
409                 i = 1;
410                 elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, NULL, (void*) i);
411         }
412 }
413
414 static void _on_search_entry_changed(void *data, Evas_Object *obj, void *event_info)
415 {
416         appdata_s* ad = data;
417         char* entry_text = NULL;
418
419         Evas_Object *buddy_list = evas_object_data_get(ad->nf, "buddy_list");
420         Evas_Object *main_layout = evas_object_data_get(ad->nf, "main_layout");
421         Evas_Object *index = evas_object_data_get(ad->nf, "fs_index");
422
423         user_data_with_pic_s *item;
424         user_data_s* user; // = item->use_data;
425
426         if (!buddy_list) {
427                 DBG("buddy_list is null");
428                 return;
429         }
430
431         elm_genlist_clear(buddy_list);
432         //elm_index_item_clear(index);
433
434         entry_text = trim(elm_entry_markup_to_utf8(elm_object_text_get(obj)));
435
436         Eina_List *result_list = NULL;
437         Eina_List *l = NULL;
438
439         if (ucol_is_jamo(entry_text)) {
440                 LOGD("entry_text is jamo, %s", entry_text);
441                 EINA_LIST_FOREACH(ad->known_buddy_list, l, item) {
442                         int result;
443                         user = item->use_data;
444                         result = ucol_compare_first_letters(user->print_name, entry_text);
445                         if (result == 0) {
446                                 result_list = eina_list_append(result_list, item);
447                         }
448                 }
449         } else {
450                 LOGD("entry_text is not jamo, %s", entry_text);
451                 EINA_LIST_FOREACH(ad->known_buddy_list, l, item) {
452                         user = item->use_data;
453
454                         if (ucol_search(user->print_name, entry_text) != -ENOENT) {
455                                 result_list = eina_list_append(result_list, item);
456                         }
457                 }
458         }
459
460         if ((entry_text == NULL || strlen(entry_text) == 0) && result_list == NULL) {
461                 result_list = ad->known_buddy_list;
462         }
463
464         LOGD("count of result_list is %d", eina_list_count(result_list));
465
466         if (result_list) {
467                 Evas_Object *fs_layout = evas_object_data_get(ad->nf, "fs_layout");
468                 _append_peer_item(buddy_list, data, result_list);
469                 Evas_Object *content = elm_object_part_content_unset(main_layout, "elm.swallow.content");
470                 if (evas_object_data_get(ad->nf, "no_contents_layout") == content) {
471                         evas_object_hide(content);
472                 }
473                 elm_object_part_content_set(main_layout, "elm.swallow.content", fs_layout);
474
475         } else {
476                 Evas_Object *no_contents = evas_object_data_get(ad->nf, "no_contents_layout");
477
478                 elm_object_part_content_unset(main_layout, "elm.swallow.content");
479                 elm_object_part_content_set(main_layout, "elm.swallow.content", no_contents);
480         }
481
482         elm_index_level_go(index, 0);
483         elm_genlist_realized_items_update(buddy_list);
484         if (entry_text) {
485                 free(entry_text);
486         }
487 }
488
489 static void _on_search_entry_focused(void *data, Evas_Object *obj, void *event_info)
490 {
491         Evas_Object *layout = data;
492         if (elm_object_focus_get(layout)) {
493                 elm_object_signal_emit(layout, "elm,state,focused", "");
494         } else{
495                 elm_object_signal_emit(layout, "elm,state,unfocused", "");
496         }
497 }
498
499 static Evas_Object *create_searchbar(Evas_Object* parent, void* data)
500 {
501         char edj_path[PATH_MAX] = {0, };
502         app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
503
504         Evas_Object* layout = elm_layout_add(parent);
505         elm_layout_file_set(layout, edj_path, "");
506
507         /* edit field layout */
508         Evas_Object* searchbar_layout = elm_layout_add(parent);
509         elm_layout_theme_set(searchbar_layout, "layout", "searchfield", "singleline");
510         evas_object_size_hint_align_set(searchbar_layout, EVAS_HINT_FILL, 0.0);
511         evas_object_size_hint_weight_set(searchbar_layout, EVAS_HINT_EXPAND, 0.0);
512         //evas_object_event_callback_add(searchbar_layout, EVAS_CALLBACK_DEL, _searchbar_layout_del_cb, NULL);
513
514         /* entry */
515         Evas_Object* searchbar_entry = elm_entry_add(searchbar_layout);
516         elm_entry_cursor_end_set(searchbar_entry);
517         evas_object_size_hint_weight_set(searchbar_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
518         evas_object_size_hint_align_set(searchbar_entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
519         elm_entry_single_line_set(searchbar_entry,  EINA_TRUE);
520         elm_entry_scrollable_set(searchbar_entry, EINA_FALSE);
521         elm_entry_cnp_mode_set(searchbar_entry, ELM_CNP_MODE_NO_IMAGE);
522         elm_entry_context_menu_disabled_set(searchbar_entry, EINA_TRUE);
523         elm_object_part_text_set(searchbar_entry, "elm.guide", i18n_get_text("IDS_TGRAM_NPBODY_SEARCH"));
524         elm_object_focus_set(searchbar_entry, EINA_FALSE);
525
526         limit_filter_data.max_char_count = 255;
527         elm_entry_markup_filter_append(searchbar_entry, elm_entry_filter_limit_size, &limit_filter_data);
528
529
530         evas_object_smart_callback_add(searchbar_entry, "changed", _on_search_entry_changed, data);
531         evas_object_smart_callback_add(searchbar_entry, "preedit,changed", _on_search_entry_changed, data);
532         evas_object_smart_callback_add(searchbar_entry, "focused", _on_search_entry_focused, searchbar_layout);
533
534         elm_object_part_content_set(searchbar_layout, "elm.swallow.content", searchbar_entry);
535         return searchbar_layout;
536 }
537
538 static void _index_selected_cb(void *data, Evas_Object *obj, void *event_info)
539 {
540         appdata_s* ad = data;
541         Evas_Object *buddy_list = evas_object_data_get(ad->nf, "buddy_list");
542         //Elm_Object_Item *gl_item = elm_genlist_first_item_get(search_list);
543
544         user_data_with_pic_s* gl_item = NULL;//eina_list_nth(ad->search_peer_list, 0);
545
546         //tg_peer_info_s* user = item->use_data;
547         Eina_List *list = ad->known_buddy_list;
548         int index = 0;
549         Eina_List *l;
550
551         EINA_LIST_FOREACH(list, l, gl_item) {
552                 if (ucol_compare_first_letters(gl_item->use_data->print_name, elm_index_item_letter_get(event_info)) == 0) {
553                         break;
554                 }
555                 index++;
556         }
557
558         if (eina_list_count(list) == index) {
559                 return;
560         }
561
562         Elm_Object_Item *item = elm_genlist_nth_item_get(buddy_list, ++index);
563         elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_TOP);
564 }
565
566 static Evas_Object* create_fastscroll(appdata_s *ad)
567 {
568         Evas_Object *parent = ad->nf;
569         Evas_Object *index;
570         int i = 0, j, len;
571         char *str;
572         char buf[PATH_MAX] = {0, };
573
574         index = elm_index_add(parent);
575         elm_object_part_content_set(parent, "elm.swallow.fastscroll", index);
576         elm_index_autohide_disabled_set(index, EINA_TRUE);
577         elm_index_omit_enabled_set(index, EINA_TRUE);
578
579         /* 1. Special character & Numbers */
580         elm_index_item_append(index, "#", NULL, NULL);
581
582         /* 2. Local language */
583         str = i18n_get_text("IDS_COM_BODY_ABCDEFGHIJKLMNOPQRSTUVWXYZ");
584         len = strlen(str);
585
586         while (i < len) {
587                 j = i;
588                 eina_unicode_utf8_next_get(str, &i);
589                 snprintf(buf, i - j + 1, "%s", str + j);
590                 buf[i - j + 1] = 0;
591
592                 elm_index_item_append(index, buf, NULL, NULL);
593         }
594         elm_index_level_go(index, 0);
595
596         evas_object_smart_callback_add(index, "selected", _index_selected_cb, ad);
597         //evas_object_smart_callback_add(index, "changed", _index_changed_cb, NULL);
598         //evas_object_smart_callback_add(index, "language,changed", _index_language_changed_cb, NULL);
599
600         return index;
601 }
602
603 void free_known_buddylist(appdata_s *ad)
604 {
605         user_data_with_pic_s* item = NULL;
606         EINA_LIST_FREE(ad->known_buddy_list, item) {
607
608                 if (!item)
609                         continue;
610
611                 user_data_s* user_data = item->use_data;
612
613                 if (user_data->print_name) {
614                         free(user_data->print_name);
615                         user_data->print_name = NULL;
616                 }
617
618                 if (user_data->photo_path) {
619                         free(user_data->photo_path);
620                         user_data->photo_path = NULL;
621                 }
622
623                 if (user_data->first_name) {
624                         free(user_data->first_name);
625                         user_data->first_name = NULL;
626                 }
627
628                 if (user_data->last_name) {
629                         free(user_data->last_name);
630                         user_data->last_name = NULL;
631                 }
632
633                 if (user_data->phone) {
634                         free(user_data->phone);
635                         user_data->phone = NULL;
636                 }
637                 if (user_data->real_first_name) {
638                         free(user_data->real_first_name);
639                         user_data->real_first_name = NULL;
640                 }
641
642                 if (user_data->real_last_name) {
643                         free(user_data->real_last_name);
644                         user_data->real_last_name = NULL;
645                 }
646
647                 if (user_data->username) {
648                         free(user_data->username);
649                         user_data->username = NULL;
650                 }
651                 free(user_data);
652                 free(item);
653         }
654         ad->known_buddy_list = NULL;
655 }
656
657 void launch_contact_selction_view(void *data)
658 {
659         appdata_s* ad = data;
660         ad->current_app_state = TG_BUDDY_LIST_SELECTION_STATE;
661         free_known_buddylist(ad);
662         ad->known_buddy_list = load_buddy_data_by_name(ad->user_id.id, NULL);
663         if (ad->panel) {
664                 evas_object_hide(ad->panel);
665                 elm_panel_hidden_set(ad->panel, EINA_TRUE);
666         }
667
668         elm_layout_theme_set(ad->layout, "layout", "application", "default");
669
670         /* Modified */
671         Evas_Object* layout = elm_layout_add(ad->nf);
672         elm_layout_theme_set(layout, "layout", "application", "searchbar_base");
673         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
674         evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
675         evas_object_show(layout);
676
677         Evas_Object* searchbar_layout = create_searchbar(layout, ad);
678         elm_object_part_content_set(layout, "searchbar", searchbar_layout);
679
680         Evas_Object* fs_layout = elm_layout_add(layout);
681         elm_layout_theme_set(fs_layout, "layout", "application", "fastscroll");
682         elm_object_part_content_set(layout, "elm.swallow.content", fs_layout);
683
684         Evas_Object* index = create_fastscroll(ad);
685         elm_object_part_content_set(fs_layout, "elm.swallow.fastscroll", index);
686
687         Evas_Object* buddy_gen_list = elm_genlist_add(ad->nf);
688         elm_list_mode_set(buddy_gen_list, ELM_LIST_COMPRESS);
689
690         // FIXME: Deprecated API
691         // elm_genlist_decorate_mode_set(buddy_gen_list, ELM_LIST_COMPRESS);
692         evas_object_size_hint_weight_set(buddy_gen_list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
693         evas_object_size_hint_align_set(buddy_gen_list, EVAS_HINT_FILL, EVAS_HINT_FILL);
694
695         evas_object_data_set(buddy_gen_list, "app_data", ad);
696         elm_object_part_content_set(fs_layout, "elm.swallow.content", buddy_gen_list);
697
698         Eina_Bool all_items_selected = EINA_FALSE;
699         evas_object_data_set(buddy_gen_list, "all_selected", (void *)((int)all_items_selected));
700
701         evas_object_show(buddy_gen_list);
702
703         _append_peer_item(buddy_gen_list, ad, ad->known_buddy_list);
704
705         /* no contents */
706         Evas_Object *nocontents = elm_layout_add(ad->nf);
707         elm_layout_theme_set(nocontents, "layout", "nocontents", "default");
708         evas_object_size_hint_weight_set(nocontents, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
709         evas_object_size_hint_align_set(nocontents, EVAS_HINT_FILL, EVAS_HINT_FILL);
710         elm_object_part_text_set(nocontents, "elm.text", _("IDS_TGRAM_NPBODY_NO_RESULTS_FOUND_ABB"));
711         evas_object_data_set(ad->nf, "no_contents_layout", nocontents);
712
713         evas_object_data_set(ad->nf, "fs_layout", fs_layout);
714         evas_object_data_set(ad->nf, "fs_index", index);
715         evas_object_data_set(ad->nf, "main_layout", layout);
716         evas_object_data_set(ad->nf, "buddy_list", buddy_gen_list);
717
718         Evas_Object* done_btn = elm_button_add(ad->layout);
719         elm_object_style_set(done_btn, "naviframe/title_right");
720         evas_object_smart_callback_add(done_btn, "clicked", on_done_buton_clicked, ad);
721         elm_object_text_set(done_btn, i18n_get_text("IDS_TGRAM_ACBUTTON_DONE_ABB"));
722         evas_object_show(done_btn);
723
724         Evas_Object* cancel_btn = elm_button_add(ad->layout);
725         elm_object_style_set(cancel_btn, "naviframe/title_left");
726         evas_object_smart_callback_add(cancel_btn, "clicked", on_cancel_buton_clicked, ad);
727         elm_object_text_set(cancel_btn, i18n_get_text("IDS_TGRAM_ACBUTTON_CANCEL_ABB"));
728         evas_object_show(cancel_btn);
729
730         Elm_Object_Item* buddy_sel_nav_item = NULL;
731         buddy_sel_nav_item = elm_naviframe_item_push(ad->nf, i18n_get_text("IDS_TGRAM_TMBODY_SELECT_CONTACTS_ABB"), NULL, NULL, layout, NULL);
732         elm_object_item_part_content_set(buddy_sel_nav_item, "title_right_btn", done_btn);
733         elm_object_item_part_content_set(buddy_sel_nav_item, "title_left_btn", cancel_btn);
734
735 }