2 * tg_search_peer_view.c
4 * Created on: Sep 18, 2015
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"
13 #include "device_contacts_manager.h"
14 #include "tg_search_peer_view.h"
15 #include "server_requests.h"
18 #define COMMAND_MENU_ITEM_COUNT 2
19 #define MOBILE_BUTTON_SIZE (98*1.4f)
24 void (*func) (void *data, Evas_Object * obj, void *event_info);
25 Elm_Object_Item *item;
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);
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},*/
42 static char* _util_get_first_char(char *input_text)
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);
48 first_char = strndup(input_text, lang_byte);
50 char *first_char = NULL;
53 unsigned char mask = 0x80;
56 while (*input_text & mask) {
61 count = count == 0 ? 1 : count;
62 first_char = strndup(input_text, count);
69 static Evas_Object* create_image_object_from_file(const char *icon_name, Evas_Object *parent)
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);
80 char* on_peer_list_name_requested(void *data, Evas_Object *obj, const char *part)
84 appdata_s* ad = evas_object_data_get(obj, "app_data");
85 Eina_List *list = evas_object_data_get(obj, "result_list");
88 list = ad->search_peer_list;
91 user_data_with_pic_s *item = eina_list_nth(list, id);
96 user_data_s* user = item->use_data;
101 if (!strcmp(part,"elm.text.main.left.top") || !strcmp(part,"elm.text")){
102 char *full_name = replace(user->print_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);
113 char* _on_command_name_requested(void *data, Evas_Object *obj, const char *part)
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));
126 Evas_Object* _on_command_name_image_requested(void *data, Evas_Object *obj, const char *part)
130 Evas_Object *eo = NULL;
131 char path[256] = {0,};
133 if (!strcmp(part, "elm.icon.left") || !strcmp(part, "elm.icon.1") || !strcmp(part, "elm.swallow.icon") ) {
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);
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);
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);
157 void on_peer_icon_deleted(void *data, Evas *e, Evas_Object *icon, void *event_info)
159 user_data_with_pic_s *item = data;
160 item->contact_icon = NULL;
163 Evas_Object* on_peer_list_image_requested(void *data, Evas_Object *obj, const char *part)
165 Evas_Object *eo = NULL;
166 if (!strcmp(part, "elm.icon.left") || !strcmp(part, "elm.icon.1") || !strcmp(part, "elm.swallow.icon") ) {
168 appdata_s* ad = evas_object_data_get(obj, "app_data");
169 Eina_List *list = evas_object_data_get(obj, "result_list");
171 list = ad->search_peer_list;
173 int size = eina_list_count(list);
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;
182 if (user->photo_path && strcmp(user->photo_path, "") != 0) {
183 profile_pic = create_image_object_from_file(user->photo_path, obj);
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);
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);
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);
209 static void clear_search_list(appdata_s *ad)
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;
218 if (user_data->print_name) {
219 free(user_data->print_name);
220 user_data->print_name = NULL;
223 if (user_data->photo_path) {
224 free(user_data->photo_path);
225 user_data->photo_path = NULL;
228 if (user_data->first_name) {
229 free(user_data->first_name);
230 user_data->first_name = NULL;
233 if (user_data->last_name) {
234 free(user_data->last_name);
235 user_data->last_name = NULL;
238 if (user_data->phone) {
239 free(user_data->phone);
240 user_data->phone = NULL;
242 if (user_data->real_first_name) {
243 free(user_data->real_first_name);
244 user_data->real_first_name = NULL;
247 if (user_data->real_last_name) {
248 free(user_data->real_last_name);
249 user_data->real_last_name = NULL;
252 if (user_data->username) {
253 free(user_data->username);
254 user_data->username = NULL;
260 eina_list_free(ad->search_peer_list);
261 ad->search_peer_list = NULL;
267 void on_new_contact_creation_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
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;
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) {
281 show_toast(ad, "Unable to get the result from attach panel");
287 status = app_control_get_mime(reply, &mime_type);
288 if (status != APP_CONTROL_ERROR_NONE) {
290 show_toast(ad, "Unable to get the mime type from attach panel");
295 for(int i = 0 ; i < array_length ; i++) {
296 file_path = strdup(path_arryay[i]);
302 static void delete_btn_clicked(void *data, Evas_Object *obj, void *event_info)
304 void **cbdata = (void **)data;
305 Elm_Object_Item *item = *cbdata;
306 Evas_Object *entry = NULL;
307 Evas_Object *layout = NULL;
309 layout = elm_object_item_part_content_get(item, "elm.icon.entry");
310 entry = elm_object_part_content_get(layout, "elm.swallow.content");
312 elm_object_text_set(entry, "");
315 static void list_delete_btn_clicked(void *data, Evas_Object *obj, void *event_info)
317 Evas_Object *genlist = data;
318 Evas_Object *btn = NULL;
319 Elm_Object_Item *item = NULL;
323 count = elm_genlist_items_count(genlist);
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;
332 elm_object_item_del(item);
335 static void onFocus(void *data, Evas_Object *obj, void *event_info)
337 elm_object_signal_emit((Evas_Object*) data, "elm,state,focused", "");
340 static void onUnfocus(void *data, Evas_Object *obj, void *event_info)
342 elm_object_signal_emit((Evas_Object*) data, "elm,state,unfocused", "");
345 static Evas_Object *_get_content_cb(void *data, Evas_Object *obj, const char *part)
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");
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);
356 elm_object_part_text_set(phone_entry, "elm.guide", i18n_get_text("IDS_TGRAM_BODY_PHONE_NUMBER_ABB"));
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);
365 appdata_s *ad = evas_object_data_get(obj, "app_data");
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);
372 evas_object_data_set(ad->nf, "add_contact_phone_number", phone_entry);
375 } else if (0 == strcmp(part, "elm.icon.2")) {
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")) {
388 static Evas_Object *_get_first_name_content_cb(void *data, Evas_Object *obj, const char *part)
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");
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);
398 elm_object_part_text_set(phone_entry, "elm.guide", i18n_get_text("IDS_TGRAM_BODY_FIRST_NAME_ABB"));
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);
407 appdata_s *ad = evas_object_data_get(obj, "app_data");
409 evas_object_data_set(ad->nf, "add_contact_first_name", phone_entry);
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;
424 static Evas_Object *_get_second_name_content_cb(void *data, Evas_Object *obj, const char *part)
426 if (0 == strcmp(part, "elm.icon.entry")) {
428 Evas_Object *layout = elm_layout_add(obj);
429 elm_layout_theme_set(layout, "layout", "editfield", "singleline");
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);
435 elm_object_part_text_set(phone_entry, "elm.guide", i18n_get_text("IDS_TGRAM_BODY_LAST_NAME_ABB"));
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);
444 appdata_s *ad = evas_object_data_get(obj, "app_data");
446 evas_object_data_set(ad->nf, "add_contact_last_name", phone_entry);
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;
461 static char *_get_name_text_cb(void *data, Evas_Object *obj, const char *part)
464 if (0 == strcmp(part, "elm.text")) {
465 buf = elm_entry_utf8_to_markup(i18n_get_text("IDS_TGRAM_BODY_NAME_ABB"));
471 static Evas_Object* get_image_from_path(const char* path, Evas_Object* parent)
473 if (!path || !parent) {
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);
481 static Evas_Object *_get_picture_cb(void *data, Evas_Object *obj, const char *part)
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;
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);
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);
498 appdata_s *ad = evas_object_data_get(obj, "app_data");
500 evas_object_data_set(ad->nf, "add_contact_pic", profile_pic);
502 elm_object_part_content_set(image_layout, "image", profile_pic);
509 static void _append_picture_item(Evas_Object *genlist, appdata_s *ad)
511 Elm_Genlist_Item_Class *itc = NULL;
512 Elm_Object_Item *item = NULL;
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;
521 item = elm_genlist_item_append(genlist, itc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
523 if(itc) elm_genlist_item_class_free(itc);
526 static void del_cb(void *data, Evas_Object *obj)
531 static void _append_name_item(Evas_Object *genlist, appdata_s *ad)
533 Elm_Genlist_Item_Class *itc = NULL;
534 Elm_Genlist_Item_Class *ttc = NULL;
535 Elm_Object_Item *item = NULL;
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;
546 item_data = malloc(sizeof(*item_data));
547 second_data = malloc(sizeof(*second_data));
549 item = elm_genlist_item_append(genlist, ttc, item_data, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
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;
560 item = elm_genlist_item_append(genlist, itc, second_data, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
563 if(itc) elm_genlist_item_class_free(itc);
564 if(ttc) elm_genlist_item_class_free(ttc);
567 static void _append_phone_item(Evas_Object *genlist, appdata_s *ad)
569 Elm_Genlist_Item_Class *itc = NULL;
570 Elm_Object_Item *item = NULL;
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;
580 item_data = malloc(sizeof(*item_data));
582 item = elm_genlist_item_append(genlist, itc, item_data, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
586 if(itc) elm_genlist_item_class_free(itc);
589 static void _insert_before_phone_item(Evas_Object *genlist, appdata_s *ad)
591 Elm_Genlist_Item_Class *itc = NULL;
592 Elm_Object_Item *item = NULL;
593 Elm_Object_Item *before = NULL;
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;
602 before = elm_genlist_last_item_get(genlist);
604 item = elm_genlist_item_insert_before(genlist, itc, NULL, NULL, before, ELM_GENLIST_ITEM_NONE, NULL, NULL);
606 if(itc) elm_genlist_item_class_free(itc);
609 static void phone_btn_clicked(void *data, Evas_Object *obj, void *event_info)
611 Evas_Object *genlist = data;
612 appdata_s *ad = evas_object_data_get(genlist, "app_data");
614 _insert_before_phone_item(genlist, ad);
617 static Evas_Object *_get_icon_cb(void *data, Evas_Object *obj, const char *part)
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);
634 static void _append_phone_icon(Evas_Object *genlist, appdata_s *ad)
636 Elm_Genlist_Item_Class *itc = NULL;
637 Elm_Object_Item *item = NULL;
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;
646 item = elm_genlist_item_append(genlist, itc, ad, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
648 if(itc) elm_genlist_item_class_free(itc);
651 static Evas_Object* create_genlist(appdata_s *ad, Evas_Object *layout)
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);
662 void add_contact_to_phone_book(appdata_s *ad)
667 char* phone_num = NULL;
668 char* first_name = NULL;
669 char* last_name = NULL;
670 char* profile_pic_path = NULL;
672 Evas_Object *phone_num_entry = evas_object_data_get(ad->nf, "add_contact_phone_number");
674 phone_num = elm_entry_markup_to_utf8(elm_object_text_get(phone_num_entry));
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));
680 Evas_Object *last_name_entry = evas_object_data_get(ad->nf, "add_contact_last_name");
682 last_name = elm_entry_markup_to_utf8(elm_object_text_get(last_name_entry));
684 if ((phone_num && strlen(phone_num) > 0) && (first_name && strlen(first_name) > 0) && (last_name && strlen(last_name) > 0)) {
686 contacts_record_h contact = NULL;
687 contacts_record_create(_contacts_contact._uri, &contact);
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);
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);
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);
708 // insert to database
710 contacts_db_insert_record(contact, &contact_id);
713 contacts_record_destroy(contact, true);
721 static Eina_Bool on_contacts_reloaded(void *data)
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;
730 void on_new_contact_added_response_received(appdata_s *ad, int buddy_id, Eina_Bool is_success)
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);
743 load_main_list_data(ad);
744 ecore_timer_add(1, on_load_main_view_requested, ad);
746 // add new buddy to list
747 Evas_Object *peer_list = evas_object_data_get(ad->nf, "search_list");
749 elm_genlist_clear(peer_list);
750 clear_search_list(ad);
751 free_contact_list(ad->contact_list);
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();
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);
762 ecore_timer_add(5, on_contacts_reloaded, ad);
765 // show failed message
769 static void on_new_contact_done_clicked(void *data, Evas_Object *obj, void *event_info)
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;
777 Evas_Object *phone_num_entry = evas_object_data_get(ad->nf, "add_contact_phone_number");
779 phone_num = elm_entry_markup_to_utf8(elm_object_text_get(phone_num_entry));
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));
785 Evas_Object *last_name_entry = evas_object_data_get(ad->nf, "add_contact_last_name");
787 last_name = elm_entry_markup_to_utf8(elm_object_text_get(last_name_entry));
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);
798 static void on_new_contact_cancel_clicked(void *data, Evas_Object *obj, void *event_info)
800 appdata_s* ad = data;
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;
808 ad->current_app_state = TG_PEER_SEARCH_VIEW_STATE;
809 show_floating_button(ad);
813 void on_create_new_contact(appdata_s* ad)
818 delete_floating_button(ad);
819 ad->current_app_state = TG_ADD_CONTACT_STATE;
821 char edj_path[PATH_MAX] = {0, };
822 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
824 Elm_Theme *theme = elm_theme_new();
825 elm_theme_ref_set(theme, NULL);
826 elm_theme_extension_add(theme, edj_path);
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);
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);
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);
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);
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);
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);
853 evas_object_data_set(ad->nf, "name_done_btn", (void*)done_btn);
854 //elm_object_disabled_set(done_btn, EINA_TRUE);
858 static void on_invite_friends_clicked(void *data, Evas_Object *obj, void *event_info)
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) {
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) {
875 app_control_destroy(app_control);
878 static void on_group_chat_clicked(void *data, Evas_Object *obj, void *event_info)
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");
884 if (ad && ad->buddy_list && eina_list_count(ad->buddy_list) > 0) {
885 delete_floating_button(ad);
886 launch_contact_selction_view(ad);
888 char msg_str[512]={0,};
890 snprintf(msg_str, sizeof(msg_str) - 1, i18n_get_text("IDS_TGRAM_BODY_PD_PARTICIPANTS"), size);
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);
900 static void on_secret_chat_clicked(void *data, Evas_Object *obj, void *event_info)
902 Elm_Object_Item *it = event_info;
903 elm_genlist_item_selected_set(it, EINA_FALSE);
905 show_toast(data, "on_secret_chat_clicked");
908 static void on_peer_item_clicked(void *data, Evas_Object *obj, void *event_info)
910 Elm_Object_Item *it = event_info;
911 elm_genlist_item_selected_set(it, EINA_FALSE);
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");
917 user_data_with_pic_s* sel_item = eina_list_nth(list, item_id);
918 ad->buddy_in_cahtting_data = sel_item;
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;
925 if (item->peer_id == sel_item->use_data->user_id.id) {
926 ad->peer_in_cahtting_data = pic_item;
933 ad->peer_in_cahtting_data = NULL;
934 ad->buddy_in_cahtting_data = NULL;
935 show_toast(ad, "Unable to retrieve buddy details");
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;
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;
957 elm_naviframe_item_pop(ad->nf);
958 delete_floating_button(ad);
959 launch_messaging_view_cb(ad, peer_id);
963 static void _update_index_item(void *data, void *item_data, int id, Eina_List *list)
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;
969 Evas_Object *index = evas_object_data_get(ad->nf, "fs_index");
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);
977 index_text = strndup(user->print_name, lang_byte);
980 char *index_text = _util_get_first_char(user->print_name);
982 Elm_Object_Item *it = elm_index_item_append(index, index_text, NULL, NULL);
984 elm_object_item_data_set(it, item_data);
989 void _append_peer_item(Evas_Object *genlist, appdata_s *ad, Eina_List* item_list)
992 static Elm_Genlist_Item_Class itc;
993 Elm_Object_Item* item = NULL;
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;
1001 int count = eina_list_count(item_list);
1003 evas_object_data_set(genlist, "result_list", item_list);
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);
1012 static void on_contact_item_clicked(void *data, Evas_Object *obj, void *event_info)
1014 Elm_Object_Item *it = event_info;
1015 elm_genlist_item_selected_set(it, EINA_FALSE);
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");
1021 contact_data_s* contact = eina_list_nth(list, item_id);
1026 app_control_h app_control;
1027 int ret = app_control_create(&app_control);
1028 if (ret != APP_CONTROL_ERROR_NONE) {
1031 app_control_set_operation(app_control, APP_CONTROL_OPERATION_COMPOSE);
1032 app_control_set_uri(app_control, "sms:");
1034 char phone_num[512] = {0,};
1035 strcpy(phone_num, "sms:");
1036 strcat(phone_num, contact->phone_number);
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
1044 app_control_destroy(app_control);
1049 char* on_contact_list_name_requested(void *data, Evas_Object *obj, const char *part)
1051 int id = (int) data;
1053 appdata_s* ad = evas_object_data_get(obj, "app_data");
1054 Eina_List *list = evas_object_data_get(obj, "contact_list");
1057 list = ad->contact_list;
1060 contact_data_s* contact = eina_list_nth(list, id);
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")) {
1074 Evas_Object* on_contact_list_image_requested(void *data, Evas_Object *obj, const char *part)
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");
1082 list = ad->contact_list;
1084 int size = eina_list_count(list);
1088 contact_data_s* contact = eina_list_nth(list, id);
1089 if (!contact || !contact->pic_url) {
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);
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);
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);
1115 void _append_contact_item(Evas_Object *genlist, appdata_s *ad, Eina_List* item_list)
1118 if (!genlist || !ad || !item_list) {
1123 static Elm_Genlist_Item_Class itc;
1124 Elm_Object_Item* item = NULL;
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;
1132 int count = eina_list_count(item_list);
1134 evas_object_data_set(genlist, "contact_list", item_list);
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);
1143 void _append_command_item(Evas_Object *genlist, appdata_s *ad)
1146 static Elm_Genlist_Item_Class itc;
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;
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);
1162 static void _append_index_item(Evas_Object *genlist, appdata_s *ad)
1165 static Elm_Genlist_Item_Class itc;
1166 Elm_Object_Item* item = NULL;
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;
1175 int count = eina_list_count(ad->search_peer_list);
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);
1183 elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, NULL, (void*) i);
1188 void _group_index_selected_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
1190 Elm_Object_Item *it = (Elm_Object_Item*)event_info;
1191 elm_genlist_item_selected_set(it, EINA_FALSE);
1193 Evas_Object *check = elm_object_item_part_content_get(it, "elm.swallow.end");
1195 check = elm_object_item_part_content_get(it, "elm.icon.right");
1199 elm_check_state_set(check, !elm_check_state_get(check));
1200 evas_object_smart_callback_call(check, "changed", NULL);
1205 char* _group_index_text_get_cb(void *data, Evas_Object *obj, const char *part)
1207 char *text = (char*)data;
1209 if (!strcmp(part, "elm.text.main")) {
1210 return strdup(text);
1214 void _append_gl_group_index(Evas_Object *genlist, char* text) {
1215 static Elm_Genlist_Item_Class itc;
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;
1223 elm_genlist_item_append(genlist, &itc, strdup(text), NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
1226 static void _on_search_entry_changed(void *data, Evas_Object *obj, void *event_info)
1228 appdata_s* ad = data;
1229 char* entry_text = NULL;
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");
1235 user_data_with_pic_s *item;
1236 user_data_s* user; // = item->use_data;
1239 DBG("search_list is null");
1243 elm_genlist_clear(search_list);
1245 entry_text = trim(elm_entry_markup_to_utf8(elm_object_text_get(obj)));
1247 Eina_List *result_list = NULL;
1248 Eina_List *l = NULL;
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) {
1254 user = item->use_data;
1255 result = ucol_compare_first_letters(user->print_name, entry_text);
1257 result_list = eina_list_append(result_list, item);
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;
1265 if (ucol_search(user->print_name, entry_text) != -ENOENT) {
1266 result_list = eina_list_append(result_list, item);
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);
1276 LOGD("count of result_list is %d", eina_list_count(result_list));
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");
1281 elm_object_part_content_unset(main_layout, "elm.swallow.content");
1282 elm_object_part_content_set(main_layout, "elm.swallow.content", no_contents);
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);
1290 elm_object_part_content_set(main_layout, "elm.swallow.content", fs_layout);
1293 elm_index_level_go(index, 0);
1294 elm_genlist_realized_items_update(search_list);
1300 static void _on_search_entry_focused(void *data, Evas_Object *obj, void *event_info)
1302 Evas_Object *layout = data;
1303 if (elm_object_focus_get(layout)) {
1304 elm_object_signal_emit(layout, "elm,state,focused", "");
1306 elm_object_signal_emit(layout, "elm,state,unfocused", "");
1311 static Evas_Object *_create_searchbar(Evas_Object* parent, void* data)
1313 char edj_path[PATH_MAX] = {0, };
1314 app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
1316 Evas_Object* layout = elm_layout_add(parent);
1317 elm_layout_file_set(layout, edj_path, "");
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);
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);
1340 limit_filter_data.max_char_count = 255;
1341 elm_entry_markup_filter_append(searchbar_entry, elm_entry_filter_limit_size, &limit_filter_data);
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);
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);
1353 elm_object_part_content_set(searchbar_layout, "elm.swallow.content", searchbar_entry);
1354 return searchbar_layout;
1357 static void _index_selected_cb(void *data, Evas_Object *obj, void *event_info)
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);
1363 user_data_with_pic_s* gl_item = NULL;//eina_list_nth(ad->search_peer_list, 0);
1365 //tg_peer_info_s* user = item->use_data;
1366 Eina_List* list = ad->search_peer_list;
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) {
1377 if (eina_list_count(list) == index) {
1381 if (list == ad->search_peer_list) {
1385 Elm_Object_Item *item = elm_genlist_nth_item_get(search_list, index);
1386 elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1389 static Evas_Object* create_fastscroll(appdata_s *ad)
1391 Evas_Object *parent = ad->nf;
1395 char buf[PATH_MAX] = {0, };
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);
1402 /* 1. Special character & Numbers */
1403 elm_index_item_append(index, "#", NULL, NULL);
1405 /* 2. Local language */
1406 str = i18n_get_text("IDS_COM_BODY_ABCDEFGHIJKLMNOPQRSTUVWXYZ");
1411 eina_unicode_utf8_next_get(str, &i);
1412 snprintf(buf, i - j + 1, "%s", str + j);
1415 elm_index_item_append(index, buf, NULL, NULL);
1417 elm_index_level_go(index, 0);
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);
1426 void launch_start_peer_search_view(appdata_s* ad)
1431 ad->current_app_state = TG_PEER_SEARCH_VIEW_STATE;
1433 clear_search_list(ad);
1435 free_contact_list(ad->contact_list);
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();
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);
1446 Evas_Object* searchbar_layout = _create_searchbar(layout, ad);
1447 elm_object_part_content_set(layout, "searchbar", searchbar_layout);
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);
1455 Evas_Object* index = create_fastscroll(ad);
1456 elm_object_part_content_set(fs_layout, "elm.swallow.fastscroll", index);
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);
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);
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);
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);
1482 elm_naviframe_item_push(ad->nf, i18n_get_text("IDS_TGRAM_HEADER_CONTACTS_ABB"), NULL, NULL, layout, NULL);