summaryrefslogtreecommitdiff
path: root/lib/common/ct-list-view-common.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/common/ct-list-view-common.c')
-rwxr-xr-xlib/common/ct-list-view-common.c1459
1 files changed, 1459 insertions, 0 deletions
diff --git a/lib/common/ct-list-view-common.c b/lib/common/ct-list-view-common.c
new file mode 100755
index 0000000..8531e3e
--- /dev/null
+++ b/lib/common/ct-list-view-common.c
@@ -0,0 +1,1459 @@
+/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.tizenopensource.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <aul.h>
+#include <ui-gadget-module.h>
+
+#include "phone.h"
+#include "phone-common.h"
+#include "ct-list.h"
+
+#include <unicode/ulocdata.h>
+#include <unicode/uset.h>
+#include <unicode/ustring.h>
+#include <vconf.h>
+#include <vconf-keys.h>
+
+static char pre_search_str[CT_LIST_MAX_SEARCH_STR];
+
+// for removing build warning ///////////////////////////////////////
+int contacts_svc_normalized_strstr(const char *str, const char *search_str, int *len);
+int contacts_svc_normalize_str(const char *src, char *dest, const int dest_len);
+///////////////////////////////////////////////////////////////////
+
+void ctui_list_free_contacts(Eina_List* list)
+{
+ ct_contact_list *data;
+ Eina_List* l;
+
+ EINA_LIST_FOREACH(list, l, data) {
+ if (data) {
+ free(data->img_path);
+ free(data->display);
+ free(data->normalize);
+ free(data->number);
+ free(data);
+ }
+ }
+ eina_list_free(list);
+}
+
+void ctui_list_free_index(Eina_List* list)
+{
+ ct_list_index_data *data;
+ Eina_List* l;
+
+ EINA_LIST_FOREACH(list, l, data) {
+ if (data) {
+ free(data);
+ }
+ }
+ eina_list_free(list);
+}
+
+
+char* ct_list_get_display_name(CTSvalue *list_info)
+{
+ const char *first, *last;
+ const char *display;
+ char name[PH_TEXT_MAX_LEN];
+
+ display = contacts_svc_value_get_str(list_info, CTS_LIST_CONTACT_DISPLAY_STR);
+ if (display) return strdup(display);
+
+ first = contacts_svc_value_get_str(list_info, CTS_LIST_CONTACT_FIRST_STR);
+ last = contacts_svc_value_get_str(list_info, CTS_LIST_CONTACT_LAST_STR);
+
+ if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY))
+ snprintf(name, sizeof(name), "%s%s%s", SAFE_STR(first), STR_BLANK(first, last));
+ else
+ snprintf(name, sizeof(name), "%s%s%s", SAFE_STR(last), STR_BLANK(last, first));
+
+ return strdup(name);
+}
+
+static inline int list_get_grp_contact_id(Eina_List *list)
+{
+ ct_contact_list *info;
+ if (NULL == list) return 0;
+ info = list->data;
+ return info->id;
+}
+
+int ct_list_get_contacts(ct_list_data *clist_d, Eina_List **list)
+{
+ PH_FN_CALL;
+ int ct_id;
+ int ret = CTS_SUCCESS;
+ CTSiter *iter;
+ CTSfilter *filter = NULL;
+ Eina_List *result = NULL;
+
+ switch (clist_d->list_op) {
+ case CT_GET_LIST_ALL_CONTACTS:
+ ret = contacts_svc_get_list(CTS_LIST_ALL_CONTACT, &iter);
+ break;
+ case CT_GET_LIST_ALL_CONTACT_HAD_NUMBER:
+ ret = contacts_svc_get_list(CTS_LIST_ALL_CONTACT_HAD_NUMBER, &iter);
+ break;
+ case CT_GET_LIST_ALL_CONTACT_HAD_EMAIL:
+ ret = contacts_svc_get_list(CTS_LIST_ALL_CONTACT_HAD_EMAIL, &iter);
+ break;
+ default:
+ ERR("Invalid op");
+ return -1;
+ }
+ p_retvm_if(CTS_SUCCESS != ret, ret, "contacts_svc_get_list...() Failed(%d)", ret);
+ PH_DBG("end cotnacts_svc_get_list, start iter");
+
+ if (filter) {
+ contacts_svc_get_list_with_filter(filter, &iter);
+ contacts_svc_list_filter_free(filter);
+ }
+
+ clist_d->cnt_list = 0;
+
+ while (CTS_SUCCESS == (ret = contacts_svc_iter_next(iter))) {
+ ct_contact_list *info;
+ CTSvalue *value;
+
+ value = contacts_svc_iter_get_info(iter);
+ ct_id = contacts_svc_value_get_int(value, CTS_LIST_CONTACT_ID_INT);
+
+ if (ct_id == clist_d->ct_id_caller) {
+ contacts_svc_value_free(value);
+ continue;
+ }
+
+ info = calloc(1, sizeof(ct_contact_list));
+ if (NULL == info) {
+ ERR("calloc() return NULL");
+ contacts_svc_value_free(value);
+ break;
+ }
+ info->id = ct_id;
+ info->display = ct_list_get_display_name(value);
+ info->normalize = contacts_svc_value_steal_str(value, CTS_LIST_CONTACT_NORMALIZED_STR);
+ info->id_ab = contacts_svc_value_get_int(value, CTS_LIST_CONTACT_ADDRESSBOOK_ID_INT);
+ info->id_person = contacts_svc_value_get_int(value, CTS_LIST_CONTACT_PERSON_ID_INT);
+ result = eina_list_append(result, info);
+ clist_d->cnt_list++;
+ contacts_svc_value_free(value);
+ }
+ contacts_svc_iter_remove(iter);
+ *list = result;
+
+ if (CTS_ERR_FINISH_ITER != ret) {
+ ERR("contacts_svc_iter_next() Failed(%d)", ret);
+ return ret;
+ }
+ return 0;
+}
+
+static inline int list_check_utf8(char c)
+{
+ if (c < 128)
+ return 1;
+ else if ((c & 0xe0) == 0xc0)
+ return 2;
+ else if ((c & 0xf0) == 0xe0)
+ return 3;
+ else if ((c & 0xf8) == 0xf0)
+ return 4;
+ else if ((c & 0xfc) == 0xf8)
+ return 5;
+ else if ((c & 0xfe) == 0xfc)
+ return 6;
+ else
+ return CTS_ERR_FAIL;
+}
+
+static inline void list_clean_ecore_task(ct_list_data *clist_d)
+{
+ if (clist_d->list_idler) {
+ ecore_idler_del(clist_d->list_idler);
+ clist_d->list_idler = NULL;
+ }
+}
+
+static void list_searchbar_entry_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_list_data *clist_d = data;
+ p_retm_if(NULL == clist_d, "parameter(clist_d) is NULL");
+
+ if (clist_d->last_sweep_item) {
+ elm_genlist_item_decorate_mode_set(clist_d->last_sweep_item, "slide", EINA_FALSE);
+ elm_genlist_item_select_mode_set(clist_d->last_sweep_item, ELM_OBJECT_SELECT_MODE_DEFAULT);
+ clist_d->last_sweep_item = NULL;
+ }
+}
+
+
+static void list_searchbar_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ ct_list_data *clist_d;
+ elm_object_focus_set(data, EINA_TRUE);
+
+ clist_d = evas_object_data_get(data, "clist_d");
+ p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL");
+
+ list_searchbar_entry_clicked_cb(clist_d, NULL, NULL);
+}
+
+static char *list_group_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ char *group_index = data;
+ if (0 == strcmp(part, "elm.text") && group_index && *group_index)
+ return strdup(group_index);
+ else
+ return NULL;
+}
+
+static Elm_Genlist_Item_Class group_index =
+{
+ .item_style = "grouptitle",
+ .func.text_get = list_group_label_get,
+};
+
+static void __list_get_group_letter(char* src, char* dest, int dest_size)
+{
+
+ char normalized_str[PH_TEXT_MAX_LEN] = {0};
+ char firtst_str[10] = {0};
+ int length = 0;
+
+ dest[0] = '\0';
+ firtst_str[0] = '\0';
+ length = list_check_utf8(src[0]);
+ p_retm_if(length < 0, "__list_get_group_letter() - (%s) is not UTF-8 type", src);
+
+ snprintf(firtst_str, length+1, "%s", &(src[0]));
+
+ contacts_svc_normalize_str(firtst_str, normalized_str, PH_TEXT_MAX_LEN);
+ length = list_check_utf8(normalized_str[0]);
+
+ if ('a' <= normalized_str[0] && normalized_str[0] <= 'z' )
+ snprintf(dest, length+1, "%c", toupper((int)normalized_str[0]));
+ else
+ snprintf(dest, length+1, "%s", &(normalized_str[0]));
+
+ //PH_DBG("src(%s), dest(%s), length(%d)", src, dest, length);
+}
+
+static void __list_set_index_letter(ct_list_data *clist_d)
+{
+ ULocaleData* uld;
+ USet *indexChars;
+ UErrorCode error = U_ZERO_ERROR;
+ int32_t itemCount;
+ int32_t j;
+ const char *language;
+ bool is_alphabet = true;
+
+ ctui_list_free_index(clist_d->list_index);
+
+ language = vconf_get_str(VCONFKEY_LANGSET);
+ PH_DBG("__list_set_index_letter - language is %s", language);
+ uld = ulocdata_open(language, &error);
+ indexChars = uset_openEmpty();
+
+ ulocdata_getExemplarSet(uld, indexChars, 0, ULOCDATA_ES_INDEX, &error);
+ ulocdata_close(uld);
+
+ if (U_FAILURE(error))
+ return;
+
+ if (error == U_USING_DEFAULT_WARNING)
+ uset_clear(indexChars);
+
+ itemCount = uset_size(indexChars);
+
+ //temporarily set number charactors
+ clist_d->list_index = NULL;
+ ct_list_index_data *index_0 = calloc(1, sizeof(ct_list_index_data));
+ snprintf(index_0->index, sizeof(index_0->index), "0");
+ index_0->item = elm_index_item_append(clist_d->fast_index, index_0->index, NULL, NULL);
+ clist_d->list_index = eina_list_append(clist_d->list_index, index_0);
+ //PH_DBG("list count %d, letter 0", eina_list_count(clist_d->list_index));
+
+ //set primary language charactors
+ for (j = 0; j < itemCount; j++)
+ {
+ UChar ch[2] = {0};
+ int size;
+ ct_list_index_data *index_list = calloc(1, sizeof(ct_list_index_data));
+ ch[0] = uset_charAt(indexChars, j);
+ u_strToUTF8(index_list->index, sizeof(index_list->index)-1, &size, ch, -1, &error);
+
+ Elm_Object_Item *item = elm_index_item_append(clist_d->fast_index, index_list->index, NULL, NULL);
+
+ index_list->item = item;
+ clist_d->list_index = eina_list_append(clist_d->list_index, index_list);
+
+ //PH_DBG("%d th letter is %s", j, index_list->index);
+
+ if(j == 0)
+ {
+ if(strcmp(index_list->index, "A") != 0)
+ is_alphabet = false;
+ }
+
+ }
+
+ //set spcial charactor
+ ct_list_index_data *index_S = calloc(1, sizeof(ct_list_index_data));
+ snprintf(index_S->index, sizeof(index_S->index), "#");
+ index_S->item = elm_index_item_append(clist_d->fast_index, index_S->index, NULL, NULL);
+ clist_d->list_index = eina_list_append(clist_d->list_index, index_S);
+ //PH_DBG("list count %d, letter #", eina_list_count(clist_d->list_index));
+
+ return;
+}
+
+static bool __is_in_primary_letter(char* letter, ct_list_data *clist_d)
+{
+ unsigned int count = eina_list_count(clist_d->list_index);
+ ct_list_index_data *first_data;
+ ct_list_index_data *last_data;
+ first_data = (ct_list_index_data*)eina_list_nth(clist_d->list_index, 1);// first letter
+ last_data = (ct_list_index_data*)eina_list_nth(clist_d->list_index, count-2);// last letter
+ //PH_DBG("list count %d, first %d, letter %d, last %d", count, *first_data->index, *letter, *last_data->index);
+ if(*letter >= *first_data->index && *letter <= *last_data->index)
+ {
+ return true;
+ }
+
+ return false;
+}
+
+static inline void list_append_item(ct_list_data *clist_d, ct_contact_list *item_data)
+{
+ Elm_Object_Item *item;
+ // append group title if condition is accepted
+ if(CT_GET_LIST_VCARD != clist_d->list_op)
+ {
+ //ct_list_index_data *skipped_index = clist_d->list_skipped_index;
+ char cur_index[10] = {0,};
+ __list_get_group_letter(item_data->display, cur_index, sizeof(cur_index));
+
+ if(isdigit(cur_index[0]))
+ {
+ cur_index[0] = '0';
+ cur_index[1] = '\0';
+ }
+ else if(__is_in_primary_letter(cur_index, clist_d) == false)
+ {
+ cur_index[0] = '#';
+ cur_index[1] = '\0';
+ }
+
+ if (strcmp(clist_d->group_index, cur_index))
+ {
+ item = elm_genlist_item_append(clist_d->genlist, &group_index, strdup(cur_index), NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL);
+ elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ snprintf(clist_d->group_index, sizeof(clist_d->group_index), "%s", cur_index);
+ clist_d->group_item = item;
+
+ //PH_DBG("list_append_item - group letter is %s", cur_index);
+ //link to fastscroll
+ Eina_List* l;
+ ct_list_index_data *data;
+ bool matched = false;
+ EINA_LIST_FOREACH(clist_d->list_index, l, data)
+ {
+ if(strcmp(cur_index, data->index) == 0)
+ {
+ //PH_DBG("list_append_item - matched letter is %s", cur_index);
+ matched = true;
+ }
+
+ if(matched == true)
+ {
+ //PH_DBG("list_append_item - %s mapping to %s", data->index, cur_index);
+ elm_object_item_data_set(data->item, item);
+ }
+ }
+ }
+ }
+
+ if (clist_d->search_str && *clist_d->search_str)
+ item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[2], item_data, clist_d->group_item,
+ ELM_GENLIST_ITEM_NONE, clist_d->gl_sel, clist_d->gl_sel_data);
+ else
+ item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[0], item_data, clist_d->group_item,
+ ELM_GENLIST_ITEM_NONE, clist_d->gl_sel, clist_d->gl_sel_data);
+
+ item_data->item = item;
+
+ clist_d->cnt_total++;
+ if (item_data->checked) clist_d->cnt_checked++;
+
+}
+
+#define N_S 10
+
+static Eina_Bool list_searched_list_append_part(void *user_data)
+{
+ int ret, i=0;
+ int readed = 0;
+ Eina_List *cursor;
+ ct_contact_list *item_data;
+ ct_list_data *clist_d = user_data;
+ int len;
+
+ cursor = eina_list_nth_list(clist_d->list, clist_d->readed_n);
+ EINA_LIST_FOREACH(cursor, cursor, item_data) {
+ if (NULL == item_data) continue;
+ ret = contacts_svc_normalized_strstr(item_data->normalize, clist_d->search_normalize, &len);
+ if (0 <= ret) {
+ if (i++ == N_S) break;
+ list_append_item(clist_d, item_data);
+ }
+ readed++;
+ }
+ if (N_S < i) {
+ clist_d->readed_n += readed;
+ return ECORE_CALLBACK_RENEW;
+ }
+ else {
+ clist_d->list_idler = NULL;
+ if (EINA_FALSE == elm_genlist_decorate_mode_get(clist_d->genlist)) {
+ clist_d->count_item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[4],
+ (void *)clist_d->cnt_total, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ elm_object_item_disabled_set(clist_d->count_item, EINA_TRUE);
+ }
+ return ECORE_CALLBACK_CANCEL;
+ }
+}
+
+void ctui_list_handle_search(ct_list_data *clist_d)
+{
+ int ret, i=0;
+ int readed = 0;
+ int len;
+ Eina_List *cursor;
+ ct_contact_list *item_data;
+ char normalized_str[PH_TEXT_MAX_LEN] = {0};
+
+ ret = contacts_svc_normalize_str(clist_d->search_str, normalized_str, PH_TEXT_MAX_LEN);
+ p_retm_if(ret < CTS_SUCCESS, "contacts_svc_normalize_str() Failed(%d)", ret);
+ free(clist_d->search_normalize);
+ clist_d->search_normalize = strdup(normalized_str);
+
+ elm_genlist_clear(clist_d->genlist);
+ elm_index_item_clear(clist_d->fast_index);
+ clist_d->group_index[0] = '\0';
+ clist_d->group_item = NULL;
+ clist_d->cnt_total = 0;
+ clist_d->cnt_checked = 0;
+
+ if (clist_d->list_idler) {
+ ecore_idler_del(clist_d->list_idler);
+ clist_d->list_idler = NULL;
+ }
+
+ EINA_LIST_FOREACH(clist_d->list, cursor, item_data) {
+ if (NULL == item_data) continue;
+ ret = contacts_svc_normalized_strstr(item_data->normalize, normalized_str, &len);
+ if (0 <= ret) {
+ if (i++ == N_S) break;
+ list_append_item(clist_d, item_data);
+ }
+ readed++;
+ }
+ if (N_S < i) {
+ clist_d->readed_n = readed;
+ clist_d->list_idler = ecore_idler_add(list_searched_list_append_part, clist_d);
+ }
+ else {
+ if (EINA_FALSE == elm_genlist_decorate_mode_get(clist_d->genlist)) {
+ clist_d->count_item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[4],
+ (void *)clist_d->cnt_total, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ elm_object_item_disabled_set(clist_d->count_item, EINA_TRUE);
+ }
+ }
+}
+#undef N_S
+
+#define N 20
+static Eina_Bool list_append_part(void *user_data)
+{
+
+ int i = 0;
+ Eina_List *cursor;
+ ct_contact_list *item_data;
+ ct_list_data *clist_d = user_data;
+
+ cursor = eina_list_nth_list(clist_d->list, clist_d->readed_n);
+ EINA_LIST_FOREACH(cursor, cursor, item_data) {
+ if (i++ == N) break;
+ list_append_item(clist_d, item_data);
+ }
+ if (N < i) {
+ clist_d->readed_n += N;
+ return ECORE_CALLBACK_RENEW;
+ }
+ else {
+ clist_d->list_idler = NULL;
+ if (EINA_FALSE == elm_genlist_decorate_mode_get(clist_d->genlist)) {
+ clist_d->count_item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[4],
+ (void *)clist_d->cnt_total, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ elm_object_item_disabled_set(clist_d->count_item, EINA_TRUE);
+ }
+ return ECORE_CALLBACK_CANCEL;
+ }
+}
+
+static void list_append_all(ct_list_data *clist_d)
+{
+ int i = 0;
+ Eina_List *cursor;
+ ct_contact_list *item_data;
+
+ if (clist_d->list_idler) {
+ ecore_idler_del(clist_d->list_idler);
+ clist_d->list_idler = NULL;
+ }
+
+ __list_set_index_letter(clist_d);
+
+ EINA_LIST_FOREACH(clist_d->list, cursor, item_data) {
+ if (i++ == N) break;
+ list_append_item(clist_d, item_data);
+ }
+ if (N < i) {
+ clist_d->readed_n = N;
+ clist_d->list_idler = ecore_idler_add(list_append_part, clist_d);
+ }
+ else {
+ if (EINA_FALSE == elm_genlist_decorate_mode_get(clist_d->genlist)) {
+ clist_d->count_item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[4],
+ (void *)clist_d->cnt_total, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ elm_object_item_disabled_set(clist_d->count_item, EINA_TRUE);
+ }
+ }
+}
+#undef N
+
+void ctui_list_refresh_genlist(ct_list_data *clist_d)
+{
+ PH_FN_CALL;
+ elm_genlist_clear(clist_d->genlist);
+ elm_index_item_clear(clist_d->fast_index);
+ clist_d->group_index[0] = '\0';
+ clist_d->group_item = NULL;
+ clist_d->cnt_total = 0;
+ clist_d->cnt_checked = 0;
+ list_append_all(clist_d);
+}
+
+static void list_searchbar_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ PH_FN_CALL;
+ Evas_Object *en;
+ Evas_Object *sb = data;
+ ct_list_data *clist_d;
+ char *search_str;
+
+ clist_d = evas_object_data_get(sb, "clist_d");
+ p_retm_if(NULL == sb, "evas_object_data_get() return NULL");
+
+ en = elm_object_part_content_get(sb, "elm.swallow.content");
+ p_retm_if(NULL == en, "elm_object_part_content_get() return NULL");
+
+ if (!elm_entry_is_empty(en))
+ elm_object_signal_emit(sb, "elm,state,guidetext,hide", "elm");
+
+ if (elm_object_focus_get(sb)) {
+ if (elm_entry_is_empty(en))
+ elm_object_signal_emit(sb, "elm,state,eraser,hide", "elm");
+ else
+ elm_object_signal_emit(sb, "elm,state,eraser,show", "elm");
+ }
+
+ search_str = ctui_entry_markup_to_utf8(elm_entry_entry_get(en));
+ p_retm_if(NULL == search_str, "ctui_entry_markup_to_utf8() return NULL");
+ p_ret_if('\0' == search_str[0] && NULL == clist_d->search_str);
+
+ if (search_str && clist_d->search_str)
+ p_ret_if(0 == strcmp(search_str, clist_d->search_str));
+
+ PH_DBG("search string is %s", search_str);
+ if(NULL != search_str){
+ if(strlen(search_str)>0) {
+ if(NULL !=clist_d->select_all_layout){
+ elm_box_unpack(clist_d->box, clist_d->select_all_layout);
+ evas_object_del(clist_d->select_all_layout);
+ clist_d->select_all_layout = NULL;
+ }
+ }
+ else {
+ ctui_list_set_selectall(clist_d);
+ }
+ }
+
+ free(clist_d->search_str);
+ clist_d->search_str = search_str;
+
+ if (search_str && strcmp(pre_search_str, search_str)) {
+ if (*search_str) {
+ elm_genlist_mode_set(clist_d->genlist, ELM_LIST_COMPRESS);
+ ctui_list_handle_search(clist_d);
+ }
+ else {
+ elm_genlist_homogeneous_set(clist_d->genlist, EINA_TRUE);
+ elm_genlist_mode_set(clist_d->genlist, ELM_LIST_SCROLL);
+ ctui_list_refresh_genlist(clist_d);
+ }
+ }
+ snprintf(pre_search_str, sizeof(pre_search_str), "%s", search_str);
+
+ if (elm_genlist_decorate_mode_get(clist_d->genlist) && clist_d->edit_sel_update)
+ clist_d->edit_sel_update(clist_d);
+}
+
+static void list_searchbar_focused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm");
+ elm_object_signal_emit(data, "cancel,in", "");
+
+ if (!elm_entry_is_empty(obj))
+ elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
+}
+
+static void list_searchbar_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *cancel_btn;
+
+ elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
+
+ if (elm_entry_is_empty(obj)) {
+ elm_object_signal_emit(data, "elm,state,guidetext,show", "elm");
+
+ cancel_btn = elm_object_part_content_get(data, "button_cancel");
+ evas_object_hide(cancel_btn);
+ elm_object_signal_emit(data, "cancel,out", "");
+ }
+}
+
+static void list_searchbar_cancel_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *sb = data;
+ Evas_Object *en;
+ ct_list_data *clist_d;
+ const char *text;
+
+ p_retm_if(NULL == sb, "parameter(sb) is NULL");
+
+ clist_d = evas_object_data_get(sb, "clist_d");
+ p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL");
+
+ en = elm_object_part_content_get(sb, "elm.swallow.content");
+ p_retm_if(NULL == en, "elm_object_part_content_get() return NULL");
+
+ free(clist_d->search_str);
+ clist_d->search_str = NULL;
+
+ free(clist_d->search_normalize);
+ clist_d->search_normalize = NULL;
+
+ text = elm_entry_entry_get(en);
+ if (text && *text)
+ elm_entry_entry_set(en, NULL);
+ elm_object_focus_set(en, EINA_FALSE);
+
+ ctui_list_refresh_genlist(clist_d);
+
+ // problem of set focus automatically on searchbar when resumed app
+ elm_object_focus_set(clist_d->genlist, EINA_TRUE);
+}
+
+static void list_searchbar_eraser_cb(void *data, Evas_Object *obj, const char *emission,
+ const char *source)
+{
+ elm_entry_entry_set(data, "");
+}
+
+static Evas_Object* list_create_searchbar(Evas_Object* parent, ct_list_data *clist_d)
+{
+ Evas_Object *sb;
+ Evas_Object *en;
+ Evas_Object *cancel_btn;
+
+ sb = elm_layout_add(parent);
+ p_retvm_if(NULL == sb, NULL, "elm_layout_add() return NULL");
+ evas_object_data_set(sb, "clist_d", clist_d);
+
+ elm_layout_theme_set(sb, "layout", "searchbar", "cancel_button");
+
+ en = elm_entry_add(sb);
+ elm_entry_scrollable_set(en, EINA_TRUE);
+ elm_entry_single_line_set(en, EINA_TRUE);
+ elm_object_part_content_set(sb, "elm.swallow.content", en);
+ elm_object_part_text_set(sb, "elm.guidetext", S_(CT_SYS_BODY_SEARCH));
+
+ ctui_entry_limit_size_set(en);
+ elm_entry_input_panel_layout_set(en, ELM_INPUT_PANEL_LAYOUT_NORMAL);
+
+ cancel_btn = elm_button_add(sb);
+ elm_object_part_content_set(sb, "button_cancel", cancel_btn);
+ elm_object_style_set(cancel_btn, "searchbar/default");
+ elm_object_text_set(cancel_btn, "Cancel");
+
+ evas_object_smart_callback_add(en, "focused", list_searchbar_focused_cb, sb);
+ evas_object_smart_callback_add(en, "unfocused", list_searchbar_unfocused_cb, sb);
+ evas_object_smart_callback_add(en, "changed", list_searchbar_changed_cb, sb);
+ evas_object_smart_callback_add(en, "preedit,changed", list_searchbar_changed_cb, sb);
+ evas_object_smart_callback_add(en, "clicked", list_searchbar_entry_clicked_cb, clist_d);
+ elm_object_signal_callback_add(sb, "elm,bg,clicked", "elm", list_searchbar_clicked_cb, en);
+ elm_object_signal_callback_add(sb, "elm,eraser,clicked", "elm", list_searchbar_eraser_cb, en);
+ evas_object_smart_callback_add(cancel_btn, "clicked", list_searchbar_cancel_cb, sb);
+
+ return sb;
+}
+
+static Evas_Object* list_create_navi_content_genlist(Evas_Object* parent)
+{
+ Evas_Object *genlist = elm_genlist_add(parent);
+
+ elm_genlist_scroller_policy_set(genlist, ELM_SCROLLER_POLICY_OFF,
+ ELM_SCROLLER_POLICY_OFF);
+ elm_genlist_block_count_set(genlist, 20);
+ elm_genlist_homogeneous_set(genlist, EINA_TRUE);
+
+ evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ return genlist;
+}
+
+static void list_fast_delayed_changed(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ // called on a change but delayed in case multiple changes happen in a
+ // short timespan
+ elm_genlist_item_bring_in(elm_object_item_data_get(event_info),
+ ELM_GENLIST_ITEM_SCROLLTO_TOP);
+}
+
+static void list_fast_selected(void *data, Evas_Object *obj, void *event_info)
+{
+ // called on final select
+ elm_genlist_item_bring_in(elm_object_item_data_get(event_info),
+ ELM_GENLIST_ITEM_SCROLLTO_TOP);
+}
+
+static void list_start_sweep_effect(void *data)
+{
+ elm_genlist_item_decorate_mode_set(data, "slide", EINA_TRUE);
+ elm_genlist_item_select_mode_set(data, ELM_OBJECT_SELECT_MODE_NONE);
+}
+
+char* ct_list_get_number(int id)
+{
+ int ret;
+ char *number;
+ CTSvalue *value;
+
+ ret = contacts_svc_get_contact_value(CTS_GET_DEFAULT_NUMBER_VALUE, id, &value);
+ p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_get_contact_value() Failed(%d)", ret);
+
+ number = contacts_svc_value_steal_str(value, CTS_NUM_VAL_NUMBER_STR);
+ contacts_svc_value_free(value);
+
+ return number;
+}
+
+static void list_gl_sweep(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_contact_list *item_info;
+ ct_list_data *clist_d = data;
+ Elm_Object_Item *item = event_info;
+ Elm_Genlist_Item_Class *itc;
+ Elm_Genlist_Item_Type type;
+
+ p_ret_if(!item);
+ p_ret_if(CT_GET_LIST_VCARD == clist_d->list_op);
+ p_ret_if(CT_LIST_MODE_EDIT == clist_d->list_mode);
+
+ type = elm_genlist_item_type_get(item);
+ p_ret_if(ELM_GENLIST_ITEM_GROUP == type);
+ p_ret_if(&clist_d->itcs[4] == elm_genlist_item_item_class_get(item));
+
+ item_info = elm_object_item_data_get(item);
+ p_retm_if(NULL == item_info, "ct_contact_list is null");
+ if (!item_info->number_loaded) {
+ item_info->number = ct_list_get_number(item_info->id_person);
+ item_info->number_loaded = true;
+ }
+
+ itc = (Elm_Genlist_Item_Class *)elm_genlist_item_item_class_get(item);
+ p_retm_if(NULL == itc, "item class is null");
+ if ((NULL == item_info->number || '\0' == *item_info->number)
+ && strcmp(itc->decorate_item_style, clist_d->itcs[1].decorate_item_style)){
+ if (clist_d->search_str && *clist_d->search_str)
+ elm_genlist_item_item_class_update(item, &clist_d->itcs[3]);
+ else
+ elm_genlist_item_item_class_update(item, &clist_d->itcs[1]);
+ ecore_job_add(list_start_sweep_effect, item);
+ clist_d->last_sweep_item = item;
+ return;
+ }
+ else if ((item_info->number && *item_info->number)
+ && strcmp(itc->decorate_item_style, clist_d->itcs[0].decorate_item_style)) {
+ if (clist_d->search_str && *clist_d->search_str)
+ elm_genlist_item_item_class_update(item, &clist_d->itcs[2]);
+ else
+ elm_genlist_item_item_class_update(item, &clist_d->itcs[0]);
+ ecore_job_add(list_start_sweep_effect, item);
+ clist_d->last_sweep_item = item;
+ return;
+ }
+
+ clist_d->last_sweep_item = item;
+ elm_genlist_item_decorate_mode_set(event_info, "slide", EINA_TRUE);
+ elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_NONE);
+}
+
+static void list_gl_unsweep(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_list_data *clist_d = data;
+ if (NULL == clist_d->last_sweep_item) return;
+
+ elm_genlist_item_decorate_mode_set(clist_d->last_sweep_item, "slide", EINA_FALSE);
+ elm_genlist_item_select_mode_set(clist_d->last_sweep_item, ELM_OBJECT_SELECT_MODE_DEFAULT);
+ clist_d->last_sweep_item = NULL;
+}
+
+static void list_gl_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ elm_object_focus_set(obj, EINA_TRUE);
+}
+
+static Evas_Object* list_create_contact_list(Evas_Object *parent, ct_list_data *clist_d)
+{
+ Evas_Object *layout, *fast_index, *searchbar, *genlist, *conform;
+
+ elm_win_conformant_set(clist_d->win, EINA_TRUE);
+
+ conform = elm_conformant_add(parent);
+ p_retvm_if(NULL == conform, NULL, "elm_conformant_add() return NULL");
+
+ elm_object_style_set(conform, "internal_layout");
+ evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(conform);
+
+ layout = elm_layout_add(conform);
+ elm_layout_file_set(layout, CONTACTS_EDJ, "genlist");
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ clist_d->layout = layout;
+
+ searchbar = list_create_searchbar(layout, clist_d);
+ elm_object_part_content_set(layout, "searchbar", searchbar);
+ evas_object_show(searchbar);
+ clist_d->searchbar = searchbar;
+
+ clist_d->box = elm_box_add(layout);
+ evas_object_size_hint_weight_set(clist_d->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(clist_d->box);
+ elm_object_part_content_set(layout, "content", clist_d->box);
+
+ // Create genlist
+ genlist = list_create_navi_content_genlist(clist_d->box);
+ evas_object_show(genlist);
+ elm_object_theme_set(genlist, clist_d->th);
+
+ evas_object_smart_callback_add(genlist, "drag,start,right", list_gl_sweep, clist_d);
+ evas_object_smart_callback_add(genlist, "drag,start,left", list_gl_unsweep, clist_d);
+ evas_object_smart_callback_add(genlist, "drag,start,up", list_gl_unsweep, clist_d);
+ evas_object_smart_callback_add(genlist, "drag,start,down", list_gl_unsweep, clist_d);
+ evas_object_event_callback_add(genlist, EVAS_CALLBACK_MOUSE_DOWN, list_gl_mouse_down_cb, clist_d);
+
+ clist_d->genlist = genlist;
+
+ elm_box_pack_end(clist_d->box, genlist);
+ evas_object_data_set(genlist, "clist_d", clist_d);
+
+ if (CT_GET_LIST_VCARD != clist_d->list_op) {
+ // Create fast scroll
+ fast_index = elm_index_add(layout);
+ elm_object_part_content_set(layout, "fastscroll", fast_index);
+ evas_object_show(fast_index);
+ clist_d->fast_index = fast_index;
+ evas_object_smart_callback_add(fast_index, "delay,changed", list_fast_delayed_changed,
+ fast_index);
+ evas_object_smart_callback_add(fast_index, "selected", list_fast_selected, NULL);
+ elm_index_level_go(fast_index, 0);
+ }
+
+ // Genlist item append
+ pre_search_str[0] = '\0';
+
+ evas_object_show(layout);
+
+ elm_object_content_set(conform, layout);
+
+ return conform;
+}
+
+static void list_fill_contact_view(Evas_Object *parent, ct_list_data *clist_d)
+{
+ Evas_Object *content = NULL;
+
+ if (clist_d->list) {
+ if (NULL == clist_d->genlist) {
+ content = list_create_contact_list(parent, clist_d);
+ list_append_all(clist_d);
+
+ if (CT_LIST_MODE_EDIT == clist_d->list_mode)
+ ctui_list_edit_mode_start(clist_d);
+ elm_object_part_content_set(parent, "elm.swallow.content", content);
+ }
+ else {
+ if (clist_d->search_str && *clist_d->search_str)
+ ctui_list_handle_search(clist_d);
+ else
+ ctui_list_refresh_genlist(clist_d);
+ }
+ }
+ else {
+ list_clean_ecore_task(clist_d);
+
+ content = phone_create_nocontents(parent, T_(CT_GET_TEXT_ERR, CTTEXT_NO_CONTACTS));
+ p_retm_if(NULL == content, "phone_create_nocontents() return NULL");
+
+ elm_object_part_content_set(parent, "elm.swallow.content", content);
+
+ clist_d->genlist = NULL;
+ clist_d->group_index[0] = '\0';
+ clist_d->group_item = NULL;
+
+ free(clist_d->search_str);
+ clist_d->search_str = NULL;
+ clist_d->searchbar = NULL;
+ clist_d->cnt_total = 0;
+ }
+}
+
+API Eina_Bool ctui_list_genlist_update(void *data)
+{
+ PH_FN_CALL;
+ char buf[PH_TEXT_SHORT_LEN];
+ Evas_Object *content;
+ ct_list_data *clist_d = data;
+
+ if (clist_d->update_timer) {
+ ecore_timer_del(clist_d->update_timer);
+ clist_d->update_timer = NULL;
+ }
+
+ p_retvm_if(NULL == clist_d->navi_item, ECORE_CALLBACK_CANCEL, "navi_item is NULL");
+
+ ctui_list_free_contacts(clist_d->list);
+ ct_list_get_contacts(clist_d, &clist_d->list);
+ clist_d->cnt_total = 0;
+
+ if(CT_LIST_IN_MULTI_TAB != clist_d->tab_mode && CT_UG_REQUEST_SELECT_CONTACT <= clist_d->ug_request) {
+ snprintf(buf, sizeof(buf), "%s (%d)", clist_d->title, clist_d->cnt_list);
+ elm_object_item_text_set(clist_d->navi_item, buf);
+ }
+
+ content = clist_d->content;
+ list_fill_contact_view(content, clist_d);
+ if (clist_d->list_cbar_update_fn)
+ clist_d->list_cbar_update_fn(clist_d);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+void ct_list_clear_pdata(ct_list_data *clist_d)
+{
+ int ret;
+ p_ret_if(NULL == clist_d);
+ p_ret_if(NULL == clist_d->p_info);
+
+ clist_d->p_info->alive = false;
+ pthread_join(clist_d->p_info->thread, NULL);
+
+ ret = contacts_svc_end_trans(false);
+ p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret);
+ ecore_timer_del(clist_d->p_info->timer);
+
+ if (clist_d->popup) {
+ evas_object_del(clist_d->popup);
+ clist_d->popup = NULL;
+ }
+
+ free(clist_d->p_info);
+ clist_d->p_info = NULL;
+}
+
+static void list_set_group_index_item(Eina_List *list_index, const char *cur_index, Elm_Object_Item *cur_item)
+{
+ Eina_List* l;
+ ct_list_index_data *data;
+
+ EINA_LIST_FOREACH(list_index, l, data) {
+ if (0 == strcmp(cur_index, data->index)) {
+ //PH_DBG("list_append_item - %s mapping to %s", data->index, cur_index);
+ elm_object_item_data_set(data->item, cur_item);
+ break;
+ }
+ }
+}
+
+static Elm_Object_Item* list_genlist_update_group_item_get(Evas_Object *genlist, Eina_List *list_index,
+ Elm_Object_Item *gal_item, Elm_Object_Item *item, const char *cur_index)
+{
+ int cmp;
+ char *item_index;
+ Elm_Object_Item *next_item;
+ Elm_Object_Item *item_ret;
+
+ if (NULL == item) {
+ item_ret = elm_genlist_item_append(genlist, &group_index, strdup(cur_index), NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL);
+ list_set_group_index_item(list_index, cur_index, item_ret);
+ return item_ret;
+ }
+ else if (gal_item == item) {
+ item_ret = elm_genlist_item_insert_before(genlist, &group_index, strdup(cur_index), NULL, item, ELM_GENLIST_ITEM_GROUP, NULL, NULL);
+ list_set_group_index_item(list_index, cur_index, item_ret);
+ return item_ret;
+ }
+ if (ELM_GENLIST_ITEM_GROUP != elm_genlist_item_type_get(item)) {
+ next_item = elm_genlist_item_next_get(item);
+ item_ret = list_genlist_update_group_item_get(genlist, list_index, gal_item, next_item, cur_index);
+ elm_object_item_del(item);
+ return item_ret;
+ }
+
+ item_index = elm_object_item_data_get(item);
+ cmp = strcmp(item_index, cur_index);
+
+ if (0 == cmp) {
+ return item;
+ }
+ else if (0 < cmp) {
+ item_ret = elm_genlist_item_insert_before(genlist, &group_index, strdup(cur_index), NULL, item, ELM_GENLIST_ITEM_GROUP, NULL, NULL);
+ list_set_group_index_item(list_index, cur_index, item_ret);
+ return item_ret;
+ }
+ else {
+ next_item = elm_genlist_item_next_get(item);
+ item_ret = list_genlist_update_group_item_get(genlist, list_index, gal_item, next_item, cur_index);
+ elm_object_item_del(item);
+ return item_ret;
+ }
+}
+
+static Eina_Bool list_genlist_update(void *data)
+{
+ int len;
+ int ret;
+ char buf[PH_TEXT_MAX_LEN];
+ char cur_index[10];
+ char group_index[10];
+ Eina_List *list_new;
+ Eina_List *l;
+ Elm_Object_Item *gal_item = NULL;
+ Elm_Object_Item *item = NULL;
+ Elm_Object_Item *item_cur;
+ Elm_Object_Item *next_item;
+ Elm_Object_Item *group_item = NULL;
+
+ ct_contact_list *item_data;
+ ct_list_data *clist_d = data;
+ ct_list_index_data *skipped_index = clist_d->list_skipped_index;
+
+ if (clist_d->list_idler) {
+ ecore_idler_del(clist_d->list_idler);
+ clist_d->list_idler = NULL;
+ }
+
+ if (clist_d->update_timer) {
+ ecore_timer_del(clist_d->update_timer);
+ clist_d->update_timer = NULL;
+ }
+
+ p_retvm_if(NULL == clist_d->navi_item, ECORE_CALLBACK_CANCEL, "navi_item is NULL");
+
+ list_new = NULL;
+ ret = ct_list_get_contacts(clist_d, &list_new);
+ if (0 != ret) {
+ ERR("ct_list_get_contacts() Failed(%d)", ret);
+ ctui_list_free_contacts(list_new);
+ clist_d->need_update = true;
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ clist_d->cnt_total = 0;
+
+ if (!list_new) {
+ Evas_Object *content;
+ list_clean_ecore_task(clist_d);
+
+ content = phone_create_nocontents(clist_d->content, T_(CT_GET_TEXT_ERR, CTTEXT_NO_CONTACTS));
+ p_retvm_if(NULL == content, ECORE_CALLBACK_CANCEL, "phone_create_nocontents() return NULL");
+
+ elm_object_part_content_set(clist_d->content, "elm.swallow.content", content);
+
+ clist_d->genlist = NULL;
+ clist_d->group_index[0] = '\0';
+ clist_d->group_item = NULL;
+
+ free(clist_d->search_str);
+ clist_d->search_str = NULL;
+ clist_d->searchbar = NULL;
+ clist_d->cnt_total = 0;
+ }
+ else {
+ if (NULL == clist_d->genlist) {
+ Evas_Object *content = NULL;
+ content = list_create_contact_list(clist_d->content, clist_d);
+
+ if (CT_LIST_MODE_EDIT == clist_d->list_mode)
+ ctui_list_edit_mode_start(clist_d);
+
+ elm_object_part_content_set(clist_d->content, "elm.swallow.content", content);
+ __list_set_index_letter(clist_d);
+ }
+ else {
+ if (clist_d->last_sweep_item) {
+ elm_genlist_item_decorate_mode_set(clist_d->last_sweep_item, "slide", EINA_FALSE);
+ elm_genlist_item_select_mode_set(clist_d->last_sweep_item, ELM_OBJECT_SELECT_MODE_DEFAULT);
+ clist_d->last_sweep_item = NULL;
+ }
+
+ if (clist_d->count_item)
+ elm_object_item_del(clist_d->count_item);
+ }
+
+ clist_d->group_index[0] = '\0';
+ clist_d->group_item = NULL;
+ clist_d->cnt_total = 0;
+ if (NULL == skipped_index) {
+ skipped_index = calloc(1, sizeof(ct_list_index_data));
+ clist_d->list_skipped_index = skipped_index;
+ }
+ else
+ memset(skipped_index, 0x0, sizeof(ct_list_index_data));
+
+ item_cur = elm_genlist_first_item_get(clist_d->genlist);
+ group_index[0] = '\0';
+
+ EINA_LIST_FOREACH(list_new, l, item_data) {
+ if (NULL == item_data)
+ continue;
+
+ if (clist_d->search_str && *clist_d->search_str) {
+ ret = contacts_svc_normalized_strstr(item_data->normalize, clist_d->search_normalize, &len);
+ if (ret < 0)
+ continue;
+ }
+
+ cur_index[0] = '\0';
+ __list_get_group_letter(item_data->display, cur_index, sizeof(cur_index));
+ if(isdigit(cur_index[0]))
+ snprintf(cur_index, sizeof(cur_index), "0");
+ else if(__is_in_primary_letter(cur_index, clist_d) == false)
+ snprintf(cur_index, sizeof(cur_index), "#");
+
+ if ('\0' == group_index[0] || 0 != strcmp(cur_index, group_index)) {
+ group_item = list_genlist_update_group_item_get(clist_d->genlist, clist_d->list_index, gal_item, item_cur, cur_index);
+ if (NULL == group_item) {
+ ERR("list_genlist_update_group_item_get() return NULL");
+ break;
+ }
+ snprintf(group_index, sizeof(group_index), "%s", cur_index);
+ item_cur = elm_genlist_item_next_get(group_item);
+ }
+
+ if (NULL == item_cur) {
+ if (clist_d->search_str && *clist_d->search_str)
+ item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[2], item_data, group_item,
+ ELM_GENLIST_ITEM_NONE, clist_d->gl_sel, clist_d->gl_sel_data);
+ else
+ item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[0], item_data, group_item,
+ ELM_GENLIST_ITEM_NONE, clist_d->gl_sel, clist_d->gl_sel_data);
+ }
+ else if (ELM_GENLIST_ITEM_NONE == elm_genlist_item_type_get(item_cur)) {
+ elm_object_item_data_set(item_cur, item_data);
+ item = item_cur;
+ item_cur = elm_genlist_item_next_get(item_cur);
+ }
+ else {
+ if (clist_d->search_str && *clist_d->search_str)
+ item = elm_genlist_item_insert_before(clist_d->genlist, &clist_d->itcs[2], item_data, group_item, item_cur,
+ ELM_GENLIST_ITEM_NONE, clist_d->gl_sel, clist_d->gl_sel_data);
+ else
+ item = elm_genlist_item_insert_before(clist_d->genlist, &clist_d->itcs[0], item_data, group_item, item_cur,
+ ELM_GENLIST_ITEM_NONE, clist_d->gl_sel, clist_d->gl_sel_data);
+ }
+
+ clist_d->cnt_total++;
+ }
+
+ if (item_cur) {
+ while (gal_item != (next_item = elm_genlist_item_next_get(item_cur))) {
+ elm_object_item_del(next_item);
+ }
+ elm_object_item_del(item_cur);
+ }
+
+ if(CT_LIST_IN_MULTI_TAB != clist_d->tab_mode && CT_UG_REQUEST_SELECT_CONTACT <= clist_d->ug_request) {
+ snprintf(buf, sizeof(buf), "%s (%d)", clist_d->title, clist_d->cnt_list);
+ elm_object_item_text_set(clist_d->navi_item, buf);
+ }
+ }
+
+ ctui_list_free_contacts(clist_d->list);
+ clist_d->list = list_new;
+
+ if (clist_d->genlist) {
+ elm_genlist_realized_items_update(clist_d->genlist);
+ if (EINA_FALSE == elm_genlist_decorate_mode_get(clist_d->genlist)) {
+ if (gal_item)
+ clist_d->count_item = elm_genlist_item_insert_before(clist_d->genlist, &clist_d->itcs[4],
+ (void *)clist_d->cnt_total, NULL, gal_item, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ else
+ clist_d->count_item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[4],
+ (void *)clist_d->cnt_total, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ elm_object_item_disabled_set(clist_d->count_item, EINA_TRUE);
+ }
+ }
+
+ if (clist_d->list_cbar_update_fn)
+ clist_d->list_cbar_update_fn(clist_d);
+
+ PH_FN_END;
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool list_genlist_update_queue_timer_cb(void *data)
+{
+ ct_list_data *clist_d = data;
+ p_retvm_if(NULL == clist_d, ECORE_CALLBACK_CANCEL, "parameter(clist_d) is NULL");
+
+ if (clist_d->need_update) {
+ clist_d->need_update = false;
+ list_genlist_update(clist_d);
+ return ECORE_CALLBACK_RENEW;
+ }
+ clist_d->update_queue_timer = NULL;
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void list_lazy_update(void *data)
+{
+ int ui_updated;
+ ct_list_data *clist_d = data;
+
+ if (clist_d->update_timer) {
+ ecore_timer_del(clist_d->update_timer);
+ clist_d->update_timer = NULL;
+ }
+
+ PH_DBG("is_background = %d", clist_d->is_background);
+
+ if (clist_d->is_background) {
+ clist_d->need_update = false;
+ clist_d->update_timer = ecore_timer_add(3.0, list_genlist_update, clist_d);
+ return;
+ }
+
+ ui_updated = (int)evas_object_data_del(clist_d->navi, "ct_list_update_ui");
+ if (0 == ui_updated && clist_d->update_queue_timer) {
+ clist_d->need_update = true;
+ }
+ else {
+ list_genlist_update(clist_d);
+ clist_d->update_queue_timer = ecore_timer_add(1.0, list_genlist_update_queue_timer_cb, clist_d);
+ p_warn_if(NULL == clist_d->update_queue_timer, "ecore_timer_add() return NULL");
+ }
+}
+
+static void list_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ ct_list_data *clist_d = data;
+
+ ct_list_clear_pdata(clist_d);
+ list_clean_ecore_task(clist_d);
+
+ if (CT_GET_LIST_VCARD != clist_d->list_op) {
+ ret = contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_CONTACT_CHANGE,
+ list_lazy_update, clist_d);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_unsubscribe_change_with_data() Failed(%d)", ret);
+
+ ret = contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_LINK_CHANGE,
+ list_lazy_update, clist_d);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_unsubscribe_change_with_data() Failed(%d)", ret);
+ }
+
+ ctui_list_free_contacts(clist_d->list);
+
+ ctui_list_free_index(clist_d->list_index);
+
+ if (clist_d->update_timer)
+ ecore_timer_del(clist_d->update_timer);
+
+ if (clist_d->update_queue_timer)
+ ecore_timer_del(clist_d->update_queue_timer);
+
+ if (clist_d->popup) {
+ evas_object_del(clist_d->popup);
+ clist_d->popup = NULL;
+ }
+
+ if (clist_d->th) {
+ elm_theme_extension_del(clist_d->th, CONTACTS_EDJ);
+ elm_theme_free(clist_d->th);
+ }
+
+ if (clist_d->child_ug)
+ ug_destroy(clist_d->child_ug);
+
+ evas_object_data_del(clist_d->navi, "gadd_list_d");
+ evas_object_data_del(clist_d->navi, "favor_list_d");
+ eina_list_free(clist_d->list_ab);
+ free(clist_d->search_str);
+ free(clist_d->search_normalize);
+ free(clist_d->sub_title);
+ free(clist_d->title);
+ free(clist_d);
+}
+
+static char* list_get_highlight_text(ct_list_data *clist_d, const char *src, const char *normalize)
+{
+ int len;
+ int ret;
+ char display[PH_TEXT_MAX_LEN];
+
+ if (NULL == clist_d->search_str || '\0' == clist_d->search_str[0])
+ return strdup(src);
+
+ ret = contacts_svc_normalized_strstr(normalize, clist_d->search_normalize, &len);
+ if (0 <= ret) {
+ char middle[PH_TEXT_MAX_LEN] = {0};
+ char first[PH_TEXT_MAX_LEN] = {0};
+ snprintf(first, sizeof(first), "%s", src);
+ snprintf(middle, len+1, "%s", src + ret);
+ first[ret] = '\0';
+ //PH_DBG("%s -> %s, %s, %s", src, first, middle, src + ret + len);
+
+ snprintf(display, sizeof(display), "%s<match>%s</>%s", first, middle, src + ret + len);
+ return strdup(display);
+ }
+ return strdup(src);
+}
+
+static int list_handle_noname(int op, int sub_op, ct_contact_list *item)
+{
+ int ret;
+ CTSvalue *value = NULL;
+ char normalized_str[PH_TEXT_MAX_LEN];
+
+ ret = contacts_svc_get_contact_value(op, item->id, &value);
+ if (CTS_SUCCESS == ret) {
+ free(item->display);
+ free(item->normalize);
+ item->display = SAFE_STRDUP(contacts_svc_value_get_str(value, sub_op));
+
+ ret = contacts_svc_normalize_str(item->display, normalized_str,
+ sizeof(normalized_str));
+ if (CTS_SUCCESS <= ret)
+ item->normalize = strdup(normalized_str);
+ else
+ item->normalize = NULL;
+
+ contacts_svc_value_free(value);
+ return TRUE;
+ }
+ else {
+ PH_DBG("op(%d) is NO DATA", op);
+ return FALSE;
+ }
+}
+
+char* ct_list_gl_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ ct_contact_list *item = data;
+ p_retvm_if(NULL == item, NULL, "The parameter(data) is NULL");
+
+ p_retvm_if(0 != strcmp(part, "elm.text") && 0 != strcmp(part, "elm.slide.text.1"),
+ NULL, "unknown part(%s)", part);
+
+ if (NULL == item->display || '\0' == item->display[0]) {
+ int ret;
+ ret = list_handle_noname(CTS_GET_COMPANY_VALUE, CTS_COMPANY_VAL_NAME_STR, item);
+ if (TRUE != ret) {
+ ret = list_handle_noname(CTS_GET_DEFAULT_NUMBER_VALUE, CTS_NUM_VAL_NUMBER_STR, item);
+ if (TRUE != ret)
+ list_handle_noname(CTS_GET_DEFAULT_EMAIL_VALUE, CTS_EMAIL_VAL_ADDR_STR, item);
+ }
+ }
+
+ if (item->display && *item->display) {
+ ct_list_data *clist_d = evas_object_data_get(obj, "clist_d");
+ p_retvm_if(NULL == clist_d, strdup(item->display),
+ "evas_object_data_get() return NULL");
+
+ if (0 == strcmp(part, "elm.slide.text.1"))
+ return strdup(item->display);
+ else
+ return list_get_highlight_text(clist_d, item->display, item->normalize);
+ }
+ else
+ return strdup(T_(CT_GET_TEXT_ERR, CTTEXT_NONAME));
+}
+
+char* ct_list_count_gl_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ char buf[PH_TEXT_SHORT_LEN];
+ int count = (int)data;
+ snprintf(buf, sizeof(buf), T_(CT_GET_TEXT_BASIC, CTTEXT_COUNT_CONTACTS), count);
+ return strdup(buf);
+}
+
+Evas_Object* ct_list_create_contact_layout(ct_list_data *clist_d)
+{
+ PH_FN_CALL;
+ int ret;
+ Elm_Theme *th;
+ Evas_Object *layout;
+
+ th = elm_theme_new();
+ elm_theme_ref_set(th, NULL);
+ elm_theme_extension_add(th, LIST_THEME_EDJ);
+ clist_d->th = th;
+
+ layout = phone_create_base_layout(clist_d->navi, false);
+ list_fill_contact_view(layout, clist_d);
+
+ if (CT_GET_LIST_VCARD != clist_d->list_op) {
+ ret = contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE,
+ list_lazy_update, clist_d);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_subscribe_change() Failed(%d)", ret);
+
+ ret = contacts_svc_subscribe_change(CTS_SUBSCRIBE_LINK_CHANGE,
+ list_lazy_update, clist_d);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_subscribe_change() Failed(%d)", ret);
+ }
+
+ evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, list_view_delete_cb, clist_d);
+ return layout;
+}
+