summaryrefslogtreecommitdiff
path: root/lib/list
diff options
context:
space:
mode:
Diffstat (limited to 'lib/list')
-rwxr-xr-xlib/list/CMakeLists.txt18
-rw-r--r--lib/list/contacts-list-efl.xml29
-rwxr-xr-xlib/list/ct-list-contact-view.c359
-rwxr-xr-xlib/list/ct-list-contact-view.h22
-rwxr-xr-xlib/list/ct-list-edit-view.c562
-rwxr-xr-xlib/list/ct-list-edit-view.h28
-rwxr-xr-xlib/list/ct-list-main.c514
-rwxr-xr-xlib/list/ct-list-utils.c514
-rwxr-xr-xlib/list/ct-list-utils.h31
-rwxr-xr-xlib/list/ct-list-view-ug.c505
-rw-r--r--lib/list/ct-list-view-ug.h25
11 files changed, 2607 insertions, 0 deletions
diff --git a/lib/list/CMakeLists.txt b/lib/list/CMakeLists.txt
new file mode 100755
index 0000000..b2e29d1
--- /dev/null
+++ b/lib/list/CMakeLists.txt
@@ -0,0 +1,18 @@
+LINK_DIRECTORIES(${CMAKE_BINARY_DIR})
+
+SET(TARGET ${CT_LIST})
+
+FILE(GLOB SRCS *.c)
+
+ADD_LIBRARY(${TARGET} SHARED ${SRCS})
+SET_TARGET_PROPERTIES(${TARGET} PROPERTIES SOVERSION ${VERSION_MAJOR})
+SET_TARGET_PROPERTIES(${TARGET} PROPERTIES VERSION ${VERSION})
+
+SET_TARGET_PROPERTIES(${TARGET} PROPERTIES COMPILE_FLAGS ${EXTRA_CFLAGS})
+TARGET_LINK_LIBRARIES(${TARGET} ${COMMON_LIB} ${ug_pkgs_LDFLAGS} ${CT_DETAILS})
+
+ADD_DEPENDENCIES(${TARGET} contacts_edj_build contacts_theme_build list_theme_edj_build)
+
+INSTALL(TARGETS ${TARGET} DESTINATION ${UGLIBDIR})
+
+INSTALL(FILES ${CMAKE_BINARY_DIR}/lib/list/contacts-list-efl.xml DESTINATION "/usr/share/packages")
diff --git a/lib/list/contacts-list-efl.xml b/lib/list/contacts-list-efl.xml
new file mode 100644
index 0000000..fc1a2bc
--- /dev/null
+++ b/lib/list/contacts-list-efl.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns="http://tizen.org/ns/packages" package="contacts-list-efl" version="0.1.0-0" install-location="internal-only">
+ <label>contacts-list-efl</label>
+ <author email="ensung.park@samsung.com" href="www.samsung.com">ensung park</author>
+ <description>contacts-list-efl Application</description>
+ <ui-application appid="contacts-list-efl" exec="/opt/ug/bin/contacts-list-efl" nodisplay="true" multiple="true" type="capp" taskmanage="false">
+ <icon>org.tizen.contacts.png</icon>
+ <label>Contacts</label>
+ <label xml:lang="en-us">Contacts</label>
+ <label xml:lang="nl-nl">Contacten</label>
+ <label xml:lang="de-de">Kontakte</label>
+ <label xml:lang="en-gb">Contacts</label>
+ <label xml:lang="zh-hk">聯絡人</label>
+ <label xml:lang="zh-cn">联系人</label>
+ <label xml:lang="ru-ru">Контакты</label>
+ <label xml:lang="zh-tw">聯絡人</label>
+ <label xml:lang="ja-jp">電話帳</label>
+ <label xml:lang="es-es">Contacts</label>
+ <label xml:lang="el-gr">Επαφές</label>
+ <label xml:lang="it-it">Rubrica</label>
+ <label xml:lang="tr-tr">Rehber</label>
+ <label xml:lang="pt-pt">Contactos</label>
+ <label xml:lang="fr-fr">Contacts</label>
+ <label xml:lang="ko-kr">전화번호부</label>
+ <application-service>
+ <operation name="http://tizen.org/ns/packages"/>
+ </application-service>
+ </ui-application>
+</manifest>
diff --git a/lib/list/ct-list-contact-view.c b/lib/list/ct-list-contact-view.c
new file mode 100755
index 0000000..2d4166e
--- /dev/null
+++ b/lib/list/ct-list-contact-view.c
@@ -0,0 +1,359 @@
+/*
+ * 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.
+ */
+
+#define _GNU_SOURCE
+#include <string.h>
+#include <pthread.h>
+#include <ui-gadget-module.h>
+
+#include "phone.h"
+#include "ct-detail.h"
+#include "ct-list.h"
+#include "ct-list-utils.h"
+#include "ct-list-view-ug.h"
+#include "ct-list-edit-view.h"
+#include "ct-list-contact-view.h"
+
+API void ctui_list_new_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_list_data *clist_d = data;
+ ct_detail_data *cdetail_d;
+ ph_view_info *view_info;
+
+ switch (clist_d->ug_request)
+ {
+ //case PH_UG_REQUEST_SET_WITH_NUM:
+ //case PH_UG_REQUEST_SET_WITH_EMAIL:
+ //case PH_UG_REQUEST_SET_WITH_WEB:
+ case PH_UG_REQUEST_SET_WITH_IMG:
+ case PH_UG_REQUEST_SET_WITH_RINGTONE:
+ case CT_UG_REQUEST_UPDATE_WITH_NUM:
+ case CT_UG_REQUEST_UPDATE_WITH_EMAIL:
+ case CT_UG_REQUEST_UPDATE_WITH_WEB:
+ case CT_UG_REQUEST_SAVE_IMG:
+ case CT_UG_REQUEST_SAVE_RINGTONE:
+ view_info = calloc(1, sizeof(ph_view_info));
+ phone_set_view_info(view_info, clist_d->win, clist_d->navi, clist_d->ug, clist_d->ug_request, clist_d->cnt_max, clist_d->ug_data);
+ ctui_list_update_with_data(view_info, clist_d, 0, clist_d->base_grp, clist_d->base_ab);
+ free(view_info);
+ break;
+ default:
+ cdetail_d = calloc(1, sizeof(ct_detail_data));
+ p_retm_if(!cdetail_d, "cdetail_d is NULL, Not enough memory");
+
+ ctui_ld_to_dd(clist_d, cdetail_d);
+ cdetail_d->base_ab_mode = CTS_ADDRESSBOOK_MODE_NONE;
+ cdetail_d->base_ab_name = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_PHONE));
+ ctui_create_input_view(cdetail_d);
+
+ break;
+ }
+}
+
+static void list_cbar_update(void *data)
+{
+ Elm_Object_Item *edit_item;
+ Elm_Object_Item *new_item;
+ Elm_Object_Item *add_item;
+ Elm_Object_Item *null_item;
+
+ ct_list_data *clist_d = data;
+ p_retm_if(NULL == clist_d, "parameter(clist_d) is NULL");
+
+ new_item = evas_object_data_get(clist_d->cbar, "new_item");
+ edit_item = evas_object_data_get(clist_d->cbar, "edit_item");
+
+ if (!clist_d->ug) {
+ if (NULL == clist_d->list && edit_item) {
+ elm_object_item_del(edit_item);
+ evas_object_data_del(clist_d->cbar, "edit_item");
+ phone_toolbar_disabled_item_append(clist_d->cbar, 1);
+ }
+ else if (clist_d->list && NULL == edit_item) {
+ add_item = evas_object_data_get(clist_d->cbar, "add_item");
+ p_retm_if(NULL == add_item, "evas_object_data_get() return NULL");
+ null_item = elm_toolbar_item_next_get(add_item);
+ if (null_item)
+ elm_object_item_del(null_item);
+ null_item = elm_toolbar_last_item_get(clist_d->cbar);
+ if (null_item) {
+ edit_item = elm_toolbar_item_insert_before(clist_d->cbar, null_item, PH_IMG_ICON_EDIT, NULL, ct_list_edit_button_cb, clist_d);
+ evas_object_data_set(clist_d->cbar, "edit_item", edit_item);
+ }
+ }
+
+ }
+}
+
+static void list_make_cbar(ct_list_data *clist_d)
+{
+ Evas_Object *l_btn;
+ Elm_Object_Item *item;
+
+ if (NULL == clist_d->list_cbar_update_fn)
+ clist_d->list_cbar_update_fn = list_cbar_update;
+
+ // FIXME : should be rearragned accoring to new UX
+ if (CT_GET_LIST_VCARD == clist_d->list_op) {
+ l_btn = elm_button_add(clist_d->navi);
+ p_retm_if(NULL == l_btn, "elm_button_add() return NULL");
+
+ elm_object_style_set(l_btn, "naviframe/back_btn/default");
+ evas_object_smart_callback_add(l_btn, "clicked", phone_back_btn_clicked_cb, clist_d->win);
+ elm_object_item_part_content_set(clist_d->navi_item, "prev_btn", l_btn);
+ }
+ else if (clist_d->navi_item != elm_naviframe_bottom_item_get(clist_d->navi)) {
+ l_btn = elm_button_add(clist_d->navi);
+ elm_object_style_set(l_btn, "naviframe/back_btn/default");
+ evas_object_smart_callback_add(l_btn, "clicked", phone_view_back_btn_cb, clist_d->navi);
+ elm_object_item_part_content_set(clist_d->navi_item, "prev_btn", l_btn);
+ }
+ else if (clist_d->ug && (PH_UG_REQUEST_LAUNCH_VOICECALL == clist_d->ug_request ||
+ CT_UG_REQUEST_LIST == clist_d->ug_request)) {
+ l_btn = phone_create_navi_btn(clist_d->navi, S_(PH_SYS_SK_CANCEL));
+ evas_object_smart_callback_add(l_btn, "clicked", phone_ug_destroy_me_cb, clist_d->ug);
+ elm_object_item_part_content_set(clist_d->navi_item, "prev_btn", l_btn);
+ }
+ else {
+ /* create button */
+ item = elm_toolbar_item_append(clist_d->cbar, CTUI_IMG_ICON_ADD_TO_CONTACTS, NULL, ctui_list_new_btn_clicked_cb, clist_d);
+ evas_object_data_set(clist_d->cbar, "new_item", item);
+
+ /* edit, view button */
+ if (!clist_d->ug) {
+ if (clist_d->list) {
+ item = elm_toolbar_item_append(clist_d->cbar, PH_IMG_ICON_EDIT, NULL, ct_list_edit_button_cb, clist_d);
+ evas_object_data_set(clist_d->cbar, "edit_item", item);
+ }
+ }
+ else
+ phone_toolbar_disabled_item_append(clist_d->cbar, 3);
+
+ /* back or cancel button */
+ if (NULL == clist_d->ug || clist_d->ug_request < CT_UG_REQUEST_SELECT_CONTACT) {
+ l_btn = elm_button_add(clist_d->navi);
+ p_retm_if(NULL == l_btn, "elm_button_add() return NULL");
+
+ elm_object_style_set(l_btn, "naviframe/back_btn/default");
+ if (clist_d->ug_request) {
+ evas_object_smart_callback_add(l_btn, "clicked", phone_ug_destroy_me_cb, clist_d->ug);
+ phone_toolbar_disabled_item_append(clist_d->cbar, 1);
+ }
+ else
+ evas_object_smart_callback_add(l_btn, "clicked", phone_back_btn_clicked_cb, clist_d->win);
+ elm_object_item_part_content_set(clist_d->navi_item, "prev_btn", l_btn);
+ }
+ else {
+ l_btn = phone_create_navi_btn(clist_d->navi, S_(PH_SYS_SK_CANCEL));
+ evas_object_smart_callback_add(l_btn, "clicked", phone_ug_destroy_me_cb, clist_d->ug);
+ elm_object_item_part_content_set(clist_d->navi_item, "prev_btn", l_btn);
+ }
+ }
+}
+
+static Evas_Object* list_gl_icon_get(void *data, Evas_Object *obj,
+ const char *part)
+{
+ ct_contact_list* ct_info = data;
+ ct_list_data *clist_d = evas_object_data_get(obj, "clist_d");
+
+ p_retvm_if(NULL == ct_info, NULL, "ct_info is NULL");
+
+ if (strcmp(part, "elm.slide.swallow.1") == 0) {
+ Evas_Object *btn;
+
+ if (NULL == ct_info->number || '\0' == *ct_info->number) {
+ btn = phone_create_list_sweep_btn(obj, PH_IMG_ICON_DELETE);
+ p_retvm_if(NULL == btn, NULL, "phone_create_list_sweep_btn() return NULL");
+
+ evas_object_data_set(btn, "clist_d", clist_d);
+ evas_object_smart_callback_add(btn, "clicked", ct_list_sweep_del_cb,
+ (void *)ct_info->id);
+ if (0 == ct_info->id || 0 == ct_info->id_person)
+ elm_object_disabled_set(btn, EINA_TRUE);
+ }
+ else {
+ btn = phone_create_list_sweep_btn(obj, PH_IMG_ICON_CALL);
+ p_retvm_if(NULL == btn, NULL, "phone_create_list_sweep_btn() return NULL");
+
+ if(clist_d->ug)
+ evas_object_smart_callback_add(btn, "clicked", NULL, ct_info);
+ else
+ evas_object_smart_callback_add(btn, "clicked", ct_list_call, ct_info);
+
+ }
+
+ return btn;
+ }
+ else if (strcmp(part, "elm.slide.swallow.2") == 0) {
+ Evas_Object *btn;
+
+ if (NULL == ct_info->number || '\0' == *ct_info->number)
+ return NULL;
+
+ btn = phone_create_list_sweep_btn(obj, PH_IMG_ICON_MESSAGE);
+ p_retvm_if(NULL == btn, NULL, "phone_create_list_sweep_btn() return NULL");
+
+ evas_object_data_set(btn, "clist_d", clist_d);
+
+ if(clist_d->ug)
+ evas_object_smart_callback_add(btn, "clicked", NULL, ct_info);
+ else
+ evas_object_smart_callback_add(btn, "clicked", ct_list_msg, ct_info);
+
+
+ return btn;
+ }
+ else if (strcmp(part, "elm.slide.swallow.3") == 0) {
+ Evas_Object *btn;
+
+ btn = phone_create_list_sweep_btn(obj, PH_IMG_ICON_VIDEOCALL);
+ p_retvm_if(NULL == btn, NULL, "phone_create_list_sweep_btn() return NULL");
+
+ elm_object_disabled_set(btn, EINA_TRUE);
+
+ return btn;
+ }
+ else if (strcmp(part, "elm.slide.swallow.4") == 0) {
+ Evas_Object *btn;
+
+ btn = phone_create_list_sweep_btn(obj, PH_IMG_ICON_DELETE);
+ p_retvm_if(NULL == btn, NULL, "phone_create_list_sweep_btn() return NULL");
+
+ evas_object_data_set(btn, "clist_d", clist_d);
+ evas_object_smart_callback_add(btn, "clicked", ct_list_sweep_del_cb,
+ (void *)ct_info->id);
+
+ if (0 == ct_info->id || 0 == ct_info->id_person)
+ elm_object_disabled_set(btn, EINA_TRUE);
+
+ return btn;
+ }
+ else if (0 == strcmp(part, "elm.icon.1")) {
+ const char *path;
+ Evas_Object *icon;
+
+ if (!ct_info->img_loaded) {
+ contacts_svc_get_image(CTS_IMG_NORMAL, ct_info->id, &ct_info->img_path);
+ ct_info->img_loaded = true;
+ }
+
+ path = ct_info->img_path;
+ if (NULL == path) return NULL;
+
+ icon = elm_icon_add(obj);
+ if (icon) {
+ elm_icon_prescale_set(icon, CT_LIST_ICON_SIZE);
+ elm_icon_file_set(icon, path, NULL);
+ evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ evas_object_show(icon);
+ }
+ return icon;
+ }
+ else if (0 == strcmp(part, "elm.edit.icon.1")) {
+ Evas_Object *check;
+ check = ct_list_edit_add_check(obj, &ct_info->checked, clist_d);
+ p_retvm_if(NULL == check, NULL, "ct_list_edit_add_check() return NULL");
+ evas_object_data_set(check, "ct_info", ct_info);
+ return check;
+ }
+ return NULL;
+}
+
+static void list_create_itcs(ct_list_data *clist_d)
+{
+ clist_d->itcs[0].item_style = "link_list";
+ clist_d->itcs[0].decorate_item_style = "mode/slide4";
+ clist_d->itcs[0].func.text_get = ct_list_gl_label_get;
+ clist_d->itcs[0].func.content_get = list_gl_icon_get;
+ clist_d->itcs[0].decorate_all_item_style = "edit_default";
+
+ clist_d->itcs[1].item_style = "link_list";
+ clist_d->itcs[1].decorate_item_style = "mode/slide";
+ clist_d->itcs[1].func.text_get = ct_list_gl_label_get;
+ clist_d->itcs[1].func.content_get = list_gl_icon_get;
+ clist_d->itcs[1].decorate_all_item_style = "edit_default";
+
+ clist_d->itcs[2].item_style = "link_list.tb";
+ clist_d->itcs[2].decorate_item_style = "mode/slide4";
+ clist_d->itcs[2].func.text_get = ct_list_gl_label_get;
+ clist_d->itcs[2].func.content_get = list_gl_icon_get;
+ clist_d->itcs[2].decorate_all_item_style = "edit_default";
+
+ clist_d->itcs[3].item_style = "link_list.tb";
+ clist_d->itcs[3].decorate_item_style = "mode/slide";
+ clist_d->itcs[3].func.text_get = ct_list_gl_label_get;
+ clist_d->itcs[3].func.content_get = list_gl_icon_get;
+ clist_d->itcs[3].decorate_all_item_style = "edit_default";
+
+ clist_d->itcs[4].item_style= "1text_center";
+ clist_d->itcs[4].func.text_get = ct_list_count_gl_label_get;
+}
+
+API void ctui_list_navi_set(int mode, ct_list_data *clist_d)
+{
+ clist_d->cbar = elm_object_item_part_content_get(clist_d->navi_item, "controlbar");
+ if (NULL == clist_d->cbar) {
+ clist_d->cbar = elm_toolbar_add(clist_d->navi);
+ p_retm_if(NULL == clist_d->cbar, "elm_toolbar_add() return NULL");
+ elm_toolbar_shrink_mode_set(clist_d->cbar, ELM_TOOLBAR_SHRINK_EXPAND);
+ elm_object_item_part_content_set(clist_d->navi_item, "controlbar", clist_d->cbar);
+ }
+ else {
+ evas_object_data_del(clist_d->cbar, "done_item");
+ evas_object_data_del(clist_d->cbar, "edit_item");
+ evas_object_data_del(clist_d->cbar, "new_item");
+ evas_object_data_del(clist_d->cbar, "delete_item");
+ evas_object_data_del(clist_d->cbar, "share_item");
+ evas_object_data_del(clist_d->cbar, "add_item");
+ phone_cbar_item_clear(clist_d->cbar);
+ }
+
+ switch (mode) {
+ case CT_LIST_MODE_DEFAULT:
+ list_make_cbar(clist_d);
+ break;
+ case CT_LIST_MODE_EDIT:
+ ct_list_edit_make_edit_cbar(clist_d);
+ if (!clist_d->gadd_mode)
+ ctui_cbar_btn_disabled_set(clist_d->cbar, EINA_TRUE);
+ break;
+ default:
+ return;
+ }
+}
+
+Evas_Object* ct_list_create_contact_view(ct_list_data *clist_d)
+{
+ PH_FN_CALL;
+ list_create_itcs(clist_d);
+ clist_d->gl_sel = ct_list_ug_gl_sel;
+ clist_d->gl_sel_data = clist_d;
+ clist_d->edit_sel_update = ct_list_edit_update_selection_info;
+ return ct_list_create_contact_layout(clist_d);
+}
+
+API void ctui_list_set_search_text(ct_list_data *clist_d, const char *text)
+{
+ p_retm_if(!clist_d, "clist_d is NULL");
+ if (clist_d->searchbar) {
+ Evas_Object *en;
+ en = elm_object_part_content_get(clist_d->searchbar, "elm.swallow.content");
+ elm_entry_entry_set(en, text);
+ }
+}
+
+
diff --git a/lib/list/ct-list-contact-view.h b/lib/list/ct-list-contact-view.h
new file mode 100755
index 0000000..a500370
--- /dev/null
+++ b/lib/list/ct-list-contact-view.h
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+
+#ifndef __CONTACTS_LIST_CONTACT_VIEW_H__
+#define __CONTACTS_LIST_CONTACT_VIEW_H__
+
+Evas_Object* ct_list_create_contact_view(ct_list_data *clist_d);
+
+#endif //__CONTACTS_LIST_CONTACT_VIEW_H__
diff --git a/lib/list/ct-list-edit-view.c b/lib/list/ct-list-edit-view.c
new file mode 100755
index 0000000..7e3f392
--- /dev/null
+++ b/lib/list/ct-list-edit-view.c
@@ -0,0 +1,562 @@
+/*
+ * 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 <pthread.h>
+#include <ui-gadget-module.h>
+#include <app.h>
+#include <fcntl.h>
+
+#include "phone.h"
+#include "ct-list.h"
+#include "ct-list-utils.h"
+#include "ct-list-view-ug.h"
+#include "ct-list-contact-view.h"
+
+#define TIMER_DURATION 0.2
+
+static inline void list_edit_realized_items_checked_set(Evas_Object *genlist,
+ Eina_Bool checked)
+{
+ Elm_Object_Item *item;
+
+ item = elm_genlist_first_item_get(genlist);
+ while (item) {
+ ct_contact_list *info = elm_object_item_data_get(item);
+ Elm_Genlist_Item_Type type = elm_genlist_item_type_get(item);
+ item = elm_genlist_item_next_get(item);
+ if (ELM_GENLIST_ITEM_GROUP == type) continue;
+ if (NULL == info) {
+ ERR("elm_object_item_data_get() return NULL");
+ continue;
+ }
+ info->checked = checked;
+ }
+ elm_genlist_realized_items_update(genlist);
+}
+
+static inline void list_edit_all_items_checked_set(Eina_List *list,
+ Eina_Bool checked)
+{
+ Eina_List *l;
+ ct_contact_list *info;
+
+ EINA_LIST_FOREACH(list, l, info) {
+ if (NULL == info) {
+ ERR("elm_object_item_data_get() return NULL");
+ continue;
+ }
+ info->checked = checked;
+ }
+}
+
+void ct_list_edit_mode_end(ct_list_data *clist_d)
+{
+ Evas_Object *en;
+ char buf[PH_TEXT_SHORT_LEN];
+
+ clist_d->list_mode = CT_LIST_MODE_DEFAULT;
+ ct_list_clear_pdata(clist_d);
+
+ if (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;
+ }
+ clist_d->cnt_checked = 0;
+ list_edit_all_items_checked_set(clist_d->list, EINA_FALSE);
+
+ if (NULL == clist_d->count_item && clist_d->cnt_total) {
+ 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);
+ }
+
+ elm_genlist_decorate_mode_set(clist_d->genlist, EINA_FALSE);
+ ctui_list_navi_set(CT_LIST_MODE_DEFAULT, clist_d);
+
+ 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);
+ }
+
+ en = elm_object_part_content_get(clist_d->searchbar, "elm.swallow.content");
+ elm_entry_entry_set(en, NULL);
+
+ phone_hide_notify(clist_d->navi);
+}
+
+static void list_edit_cancel_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_list_data *clist_d = data;
+ ct_list_edit_mode_end(clist_d);
+}
+
+static PTHREAD_FN list_edit_del_contacts(void *data)
+{
+ Elm_Object_Item *item;
+ ct_list_data *clist_d = data;
+ ph_progress_info *p_info = clist_d->p_info;
+
+ item = elm_genlist_first_item_get(clist_d->genlist);
+ while (item) {
+ ct_contact_list *info;
+ Elm_Genlist_Item_Type type;
+
+ if (!p_info->alive) {
+ p_info->result = FALSE;
+ break;
+ }
+ type = elm_genlist_item_type_get(item);
+ info = elm_object_item_data_get(item);
+ if (info && info->checked && ELM_GENLIST_ITEM_GROUP != type) {
+ int ret;
+ int person_id = ctui_get_person_id(info->id);
+ ret = contacts_svc_delete_person(person_id);
+
+ if (CTS_SUCCESS != ret) {
+ p_info->result = FALSE;
+ p_info->completed = true;
+ break;
+ }
+ if (++p_info->cnt == p_info->cnt_checked_total)
+ break;
+ }
+
+ item = elm_genlist_item_next_get(item);
+ }
+ pthread_exit(NULL);
+}
+
+static void list_edit_process_end(void *data)
+{
+ ct_list_data *clist_d = data;
+ ph_progress_info *p_info = clist_d->p_info;
+
+ clist_d->p_info = NULL;
+
+ if (p_info->result)
+ ct_list_edit_mode_end(clist_d);
+
+ free(p_info);
+}
+
+static Eina_Bool list_edit_del_timer_cb(void *data)
+{
+ ct_list_data *clist_d = data;
+ ph_progress_info *p_info = clist_d->p_info;
+
+ p_retvm_if(NULL == p_info, ECORE_CALLBACK_CANCEL, "parameter(clist_d) is NULL");
+
+ if (!p_info->completed) {
+ char count[PH_TEXT_SHORT_LEN];
+ char percent[PH_TEXT_SHORT_LEN];
+ double value = (double)p_info->cnt / (double)p_info->cnt_checked_total;
+
+ if (!p_info->alive) {
+ p_info->result = FALSE;
+ p_info->completed = true;
+ return ECORE_CALLBACK_RENEW;
+ }
+
+ elm_progressbar_value_set(p_info->progressbar, value);
+ snprintf(percent, sizeof(percent), "%d%%", (int)(100.0 * (double)p_info->cnt/(double)p_info->cnt_checked_total));
+ snprintf(count, sizeof(count), "%d/%d", p_info->cnt, p_info->cnt_checked_total);
+ edje_object_part_text_set(elm_layout_edje_get(p_info->layout), "elm.text.subtext1", percent);
+ edje_object_part_text_set(elm_layout_edje_get(p_info->layout), "elm.text.subtext2", count);
+
+ if (p_info->cnt == p_info->cnt_checked_total)
+ p_info->completed = true;
+
+ return ECORE_CALLBACK_RENEW;
+ }
+ else {
+ int ret;
+
+ pthread_join(p_info->thread, NULL);
+
+ if (clist_d->popup) {
+ evas_object_del(clist_d->popup);
+ clist_d->popup = NULL;
+ }
+
+ if (TRUE == p_info->result) {
+ ret = contacts_svc_end_trans(true);
+ phone_show_tickernoti(S_(PH_SYS_POP_DELETED));
+ }
+ else {
+ ret = contacts_svc_end_trans(false);
+ phone_show_tickernoti(S_(PH_SYS_POP_FAILED));
+ }
+ p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret);
+ list_edit_process_end(clist_d);
+
+ return ECORE_CALLBACK_CANCEL;
+ }
+}
+
+static void list_edit_del_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ ct_list_data *clist_d = data;
+ ph_progress_info *p_info;
+
+ p_info = calloc(1, sizeof(ph_progress_info));
+ p_retm_if(NULL == p_info, "calloc return NULL");
+
+ clist_d->p_info = p_info;
+ p_info->cnt_checked_total = clist_d->cnt_checked;
+ p_info->alive = true;
+ p_info->result = TRUE;
+
+ ret = contacts_svc_begin_trans();
+ if (CTS_SUCCESS != ret) {
+ ERR("contacts_svc_begin_trans() Failed(%d)", ret);
+ free(p_info);
+ clist_d->p_info = NULL;
+ return;
+ }
+
+ ret = pthread_create(&p_info->thread, NULL, list_edit_del_contacts, clist_d);
+ if (0 != ret) {
+ ERR("Thread creation failed(%d)", ret);
+ free(p_info);
+ clist_d->p_info = NULL;
+
+ ret = contacts_svc_end_trans(false);
+ p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret);
+
+ return;
+ }
+
+ p_info->timer = ecore_timer_add(TIMER_DURATION, list_edit_del_timer_cb, clist_d);
+ if (NULL == p_info->timer) {
+ ERR("ecore_timer_add() return NULL");
+
+ p_info->alive = false;
+ pthread_join(p_info->thread, NULL);
+
+ free(p_info);
+ clist_d->p_info = NULL;
+
+ ret = contacts_svc_end_trans(false);
+ p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret);
+
+ return;
+ }
+
+ clist_d->popup = phone_progressbar_popup(clist_d->win, p_info, T_(CT_GET_TEXT_BASIC, CTTEXT_DELETING_CONTACTS));
+}
+
+struct list_ginfo{
+ int id_grp;
+ int id_ab;
+};
+
+static int list_edit_checked_cnt_get(Eina_List *list) {
+ int cnt = 0;
+ Eina_List *l;
+ ct_contact_list *contact;
+
+ EINA_LIST_FOREACH(list, l, contact) {
+ if (NULL == contact) continue;
+ if (contact->checked)
+ cnt++;
+ }
+ return cnt;
+}
+
+static void list_edit_check_done(void *data, Evas_Object *obj, void *event_info)
+{
+ int i = 0;
+ int cnt_checked;
+ int *list_result;
+ Eina_List *l;
+ ct_contact_list *contact;
+ ct_list_data *clist_d = data;
+
+ // called by setting - import contacts (list - vcard contacts)
+ if (CT_GET_LIST_VCARD == clist_d->list_op) {
+ clist_d->select_result_cb(clist_d->select_result_cb_data, NULL, 0);
+ phone_hide_notify(clist_d->navi);
+ return;
+ }
+ cnt_checked = list_edit_checked_cnt_get(clist_d->list);
+
+ list_result = calloc(cnt_checked, sizeof(int));
+ EINA_LIST_FOREACH(clist_d->list, l, contact) {
+ if (NULL == contact || !contact->checked) continue;
+
+ if (CT_UG_REQUEST_CHECK_FOR_NUMBER == clist_d->ug_request)
+ list_result[i++] = contact->id_ret;
+ else if (CT_UG_REQUEST_CHECK_FOR_EMAIL == clist_d->ug_request)
+ list_result[i++] = contact->id_ret;
+ else
+ list_result[i++] = contact->id;
+ }
+
+ // setting - import,export
+ if (clist_d->select_result_cb) { // called by setting view - check contact
+ if (0 < cnt_checked) {
+ clist_d->select_result_cb(clist_d->select_result_cb_data, list_result, cnt_checked);
+ phone_hide_notify(clist_d->navi);
+ }
+ elm_naviframe_item_pop(clist_d->navi);
+ return;
+ }
+
+ if (clist_d->contact_add_cb) { // called by favorite view - check contact
+ if (0 < cnt_checked) {
+ clist_d->contact_add_cb(clist_d->win, clist_d->navi, cnt_checked);
+ phone_hide_notify(clist_d->navi);
+ }
+ else
+ elm_naviframe_item_pop_to(evas_object_data_get(clist_d->navi, "navi_it_pop_to"));
+ return;
+ }
+
+ if (CT_UG_REQUEST_CHECK_FOR_NUMBER == clist_d->ug_request)
+ phone_list_ug_return_ids(clist_d->ug, list_result, cnt_checked, CT_UG_BUNDLE_RESULT_NUMBER_ID_LIST);
+ else if (CT_UG_REQUEST_CHECK_FOR_EMAIL == clist_d->ug_request)
+ phone_list_ug_return_ids(clist_d->ug, list_result, cnt_checked, CT_UG_BUNDLE_RESULT_EMAIL_ID_LIST);
+ else
+ phone_list_ug_return_ids(clist_d->ug, list_result, cnt_checked, CT_UG_BUNDLE_RESULT_CONTACT_ID_LIST);
+
+ free(list_result);
+ ug_destroy_me(clist_d->ug);
+}
+
+static void list_gadd_view_cancel_btn_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ evas_object_smart_callback_del(obj, "clicked", list_gadd_view_cancel_btn_cb);
+ phone_hide_notify(data);
+ elm_naviframe_item_pop_to(evas_object_data_get(data, "navi_it_pop_to"));
+}
+
+void ct_list_edit_make_edit_cbar(ct_list_data *clist_d)
+{
+ Elm_Object_Item *delete_item = NULL;
+ Elm_Object_Item *done_item = NULL;
+ Evas_Object *l_btn;
+
+ if (CT_UG_REQUEST_CHECK == clist_d->ug_request ||
+ CT_UG_REQUEST_CHECK_FOR_NUMBER == clist_d->ug_request ||
+ CT_UG_REQUEST_CHECK_FOR_EMAIL == clist_d->ug_request) {
+ done_item = elm_toolbar_item_append(clist_d->cbar, PH_IMG_ICON_DONE, NULL, list_edit_check_done, clist_d);
+ evas_object_data_set(clist_d->cbar, "done_item", done_item);
+ phone_toolbar_disabled_item_append(clist_d->cbar, 3);
+
+ if (clist_d->navi_item != elm_naviframe_bottom_item_get(clist_d->navi)) { // setting view : CHECK MODE
+ if (clist_d->select_result_cb || clist_d->ug) {
+ l_btn = elm_button_add(clist_d->navi);
+ elm_object_style_set(l_btn, "naviframe/back_btn/default");
+ evas_object_smart_callback_add(l_btn, "clicked", phone_view_back_btn_cb, clist_d->navi);
+ }
+ else {
+ l_btn = phone_create_navi_btn(clist_d->navi, S_(PH_SYS_SK_CANCEL));
+ evas_object_smart_callback_add(l_btn, "clicked", list_gadd_view_cancel_btn_cb, clist_d->navi);
+ }
+ }
+ else { // check UG
+ l_btn = phone_create_navi_btn(clist_d->navi, S_(PH_SYS_SK_CANCEL));
+ evas_object_smart_callback_add(l_btn, "clicked", phone_ug_destroy_me_cb, clist_d->ug);
+ }
+ elm_object_item_part_content_set(clist_d->navi_item, "prev_btn", l_btn);
+ }
+ else if (!clist_d->ug) {
+ // do not display del button
+ if (clist_d->navi_item == elm_naviframe_bottom_item_get(clist_d->navi) || clist_d->base_grp) {
+ delete_item = elm_toolbar_item_append(clist_d->cbar, PH_IMG_ICON_DELETE, NULL, list_edit_del_cb, clist_d);
+ evas_object_data_set(clist_d->cbar, "delete_item", delete_item);
+ phone_toolbar_disabled_item_append(clist_d->cbar, 1);
+ }
+
+ if (delete_item)
+ phone_toolbar_disabled_item_append(clist_d->cbar, 2);
+ else
+ phone_toolbar_disabled_item_append(clist_d->cbar, 3);
+
+ l_btn = phone_create_navi_btn(clist_d->navi, S_(PH_SYS_SK_CANCEL));
+ evas_object_smart_callback_add(l_btn, "clicked", list_edit_cancel_cb, clist_d);
+ elm_object_item_part_content_set(clist_d->navi_item, "prev_btn", l_btn);
+ }
+}
+
+void ct_list_edit_update_selection_info(void *data)
+{
+ ct_list_data *clist_d = data;
+ int checked_cnt = 0;
+ char buf[PH_TEXT_SHORT_LEN];
+
+ if (clist_d->ug_request && NULL == clist_d->select_all_layout) {
+ checked_cnt = list_edit_checked_cnt_get(clist_d->list);
+ }
+ else {
+ Evas_Object *check = elm_object_part_content_get(clist_d->select_all_layout, "elm.icon");
+ p_retm_if(NULL == check, "elm_object_part_content_get() return NULL");
+
+ if (0 != clist_d->cnt_total && clist_d->cnt_checked == clist_d->cnt_total)
+ elm_check_state_set(check, EINA_TRUE);
+ else if (0 == clist_d->cnt_total || clist_d->cnt_checked != clist_d->cnt_total)
+ elm_check_state_set(check, EINA_FALSE);
+ checked_cnt = clist_d->cnt_checked;
+ }
+
+ if (0 == checked_cnt) {
+ phone_show_notify(clist_d->navi, T_(CT_GET_TEXT_BASIC, CTTEXT_SELECT_CONTACTS));
+ if (!clist_d->gadd_mode)
+ ctui_cbar_btn_disabled_set(clist_d->cbar, EINA_TRUE);
+ }
+ else {
+ ctui_cbar_btn_disabled_set(clist_d->cbar, EINA_FALSE);
+ if (clist_d->cnt_max)
+ snprintf(buf, sizeof(buf), "%s (%d/%d)", S_(PH_SYS_POP_SELECTED), clist_d->cnt_checked, clist_d->cnt_max);
+ else
+ snprintf(buf, sizeof(buf), "%s (%d)", S_(PH_SYS_POP_SELECTED), clist_d->cnt_checked);
+ phone_show_notify(clist_d->navi, buf);
+ }
+}
+
+static void list_edit_select_all(void *data, Eina_Bool checked)
+{
+ ct_list_data *clist_d = data;
+
+ list_edit_realized_items_checked_set(clist_d->genlist, checked);
+ elm_genlist_realized_items_update(clist_d->genlist);
+
+ if (checked)
+ clist_d->cnt_checked = clist_d->cnt_total;
+ else
+ clist_d->cnt_checked = 0;
+
+ ct_list_edit_update_selection_info(clist_d);
+}
+
+void ct_list_item_checked_set(Elm_Object_Item *item, ct_list_data *clist_d)
+{
+ ct_contact_list *contact = elm_object_item_data_get(item);
+ p_retm_if(NULL == contact, "elm_object_item_data_get() returns NULL");
+
+ if (contact->checked) {
+ if (clist_d->cnt_max) {
+ if (clist_d->cnt_max <= clist_d->cnt_checked) {
+ phone_show_popup(clist_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_EXCEED_LIMIT), 2.0);
+ contact->checked = EINA_FALSE;
+ return;
+ }
+ }
+ clist_d->cnt_checked++;
+ }
+ else
+ clist_d->cnt_checked--;
+ elm_genlist_item_fields_update(item, "elm.edit.icon.1", ELM_GENLIST_ITEM_FIELD_CONTENT);
+}
+
+static void list_edit_item_check_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ Elm_Object_Item *item;
+ ct_contact_list *ct_info;
+ ct_list_data *clist_d = data;
+
+ ct_info = evas_object_data_get(obj, "ct_info");
+ p_retm_if(NULL == ct_info, "evas_object_data_get() return NULL");
+
+ item = ct_info->item;
+ p_retm_if(NULL == item, "ct_info->item is NULL");
+
+ ct_list_item_checked_set(ct_info->item, clist_d);
+ if (!ct_info->checked) {
+ ct_list_edit_update_selection_info(clist_d);
+ return;
+ }
+ if (CT_UG_REQUEST_CHECK_FOR_NUMBER == clist_d->ug_request)
+ ct_list_ug_handle_check_for_number(item, clist_d);
+ else if (CT_UG_REQUEST_CHECK_FOR_EMAIL == clist_d->ug_request)
+ ct_list_ug_handle_check_for_email(item, clist_d);
+ else
+ ct_list_edit_update_selection_info(clist_d);
+}
+
+Evas_Object* ct_list_edit_add_check(Evas_Object *parent, Eina_Bool *checked,
+ ct_list_data *clist_d)
+{
+ Evas_Object *check = elm_check_add(parent);
+ elm_check_state_pointer_set(check, checked);
+ evas_object_propagate_events_set(check, EINA_FALSE);
+ evas_object_smart_callback_add(check, "changed", list_edit_item_check_cb, clist_d);
+ return check;
+}
+
+API void ctui_list_edit_mode_start(ct_list_data *clist_d)
+{
+ //Sweep Off in Edit mode
+ 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;
+ }
+
+ clist_d->list_mode = CT_LIST_MODE_EDIT;
+
+ // Append 'Select All' layout
+ if((CT_UG_REQUEST_CHECK_FOR_NUMBER != clist_d->ug_request) && (CT_UG_REQUEST_CHECK_FOR_EMAIL != clist_d->ug_request))
+ if (((!clist_d->ug_request || clist_d->select_result_cb) || (clist_d->base_grp > 0 && clist_d->contact_add_cb)) &&
+ (0 == clist_d->cnt_max || clist_d->cnt_total <= clist_d->cnt_max)) {
+ clist_d->select_all_layout = phone_create_select_all(clist_d->box, S_(PH_SYS_BODY_SELECT_ALL), list_edit_select_all, clist_d);
+ elm_box_pack_start(clist_d->box, clist_d->select_all_layout);
+ }
+
+ if (clist_d->count_item) {
+ elm_object_item_del(clist_d->count_item);
+ clist_d->count_item = NULL;
+ }
+ elm_genlist_decorate_mode_set(clist_d->genlist, EINA_TRUE);
+
+ if (CT_LIST_IN_MULTI_TAB != clist_d->tab_mode && !clist_d->title
+ && CT_UG_REQUEST_SELECT_CONTACT <= clist_d->ug_request) {
+ elm_object_item_text_set(clist_d->navi_item, T_(CT_GET_TEXT_BASIC, CTTEXT_SELECT_CONTACTS));
+ }
+ phone_show_notify(clist_d->navi, T_(CT_GET_TEXT_BASIC, CTTEXT_SELECT_CONTACTS));
+
+ ctui_list_navi_set(CT_LIST_MODE_EDIT, clist_d);
+}
+
+void ct_list_edit_button_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_list_data *clist_d = data;
+
+ p_retm_if(NULL == clist_d->navi_item, "parameter(navi_item) is NULL");
+
+ if(!clist_d->ug)
+ ctui_list_edit_mode_start(clist_d);
+
+}
+
+API void ctui_list_set_selectall(ct_list_data *clist_d)
+{
+ PH_DBG("ctui_list_set_selectall");
+ if(NULL!=clist_d->select_all_layout
+ || CT_LIST_MODE_DEFAULT== clist_d->list_mode)
+ return;
+ // Append 'Select All' layout
+ if((CT_UG_REQUEST_CHECK_FOR_NUMBER != clist_d->ug_request) && (CT_UG_REQUEST_CHECK_FOR_EMAIL != clist_d->ug_request))
+ if (((!clist_d->ug_request || clist_d->select_result_cb) || (clist_d->base_grp > 0 && clist_d->contact_add_cb)) &&
+ (0 == clist_d->cnt_max || clist_d->cnt_total <= clist_d->cnt_max)) {
+ clist_d->select_all_layout = phone_create_select_all(clist_d->box, S_(PH_SYS_BODY_SELECT_ALL), list_edit_select_all, clist_d);
+ elm_box_pack_start(clist_d->box, clist_d->select_all_layout);
+ }
+
+}
+
diff --git a/lib/list/ct-list-edit-view.h b/lib/list/ct-list-edit-view.h
new file mode 100755
index 0000000..86259a7
--- /dev/null
+++ b/lib/list/ct-list-edit-view.h
@@ -0,0 +1,28 @@
+/*
+ * 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.
+ */
+
+#ifndef __CONTACTS_LIST_EDIT_VIEW_H__
+#define __CONTACTS_LIST_EDIT_VIEW_H__
+
+void ct_list_edit_mode_end(ct_list_data *clist_d);
+void ct_list_edit_button_cb(void *data, Evas_Object *obj, void *event_info);
+void ct_list_edit_make_edit_cbar(ct_list_data *clist_d);
+void ct_list_edit_update_selection_info(void *data);
+Evas_Object* ct_list_edit_add_check(Evas_Object *parent, Eina_Bool *checked, ct_list_data *clist_d);
+void ct_list_item_checked_set(Elm_Object_Item *item, ct_list_data *clist_d);
+
+#endif //__CONTACTS_LIST_EDIT_VIEW_H__
+
diff --git a/lib/list/ct-list-main.c b/lib/list/ct-list-main.c
new file mode 100755
index 0000000..e20cc68
--- /dev/null
+++ b/lib/list/ct-list-main.c
@@ -0,0 +1,514 @@
+/*
+ * 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 <ui-gadget-module.h>
+#include "phone.h"
+#include "ct-list.h"
+#include "ct-detail.h"
+#include "ct-list-utils.h"
+#include "ct-list-view-ug.h"
+#include "ct-list-contact-view.h"
+#include "ct-list-edit-view.h"
+
+API void ctui_list_view_reset(ct_list_data *clist_d)
+{
+ Evas_Object *cbar;
+ evas_object_data_del(clist_d->cbar, "done_item");
+ evas_object_data_del(clist_d->cbar, "edit_item");
+ evas_object_data_del(clist_d->cbar, "new_item");
+
+ cbar = clist_d->cbar;
+ clist_d->cbar = elm_toolbar_add(clist_d->navi);
+ elm_toolbar_shrink_mode_set(cbar, ELM_TOOLBAR_SHRINK_EXPAND);
+
+ if (CT_UG_REQUEST_CHECK != clist_d->ug_request &&
+ CT_UG_REQUEST_CHECK_FOR_NUMBER != clist_d->ug_request &&
+ CT_UG_REQUEST_CHECK_FOR_EMAIL != clist_d->ug_request)
+ if (CT_LIST_MODE_EDIT == clist_d->list_mode)
+ ct_list_edit_mode_end(clist_d);
+
+ if (!clist_d->ug && CT_GET_LIST_ALL_CONTACTS != clist_d->list_op) {
+ clist_d->base_ab = -1;
+ clist_d->base_ab_mode = CTS_ADDRESSBOOK_MODE_NONE;
+ clist_d->base_grp = 0;
+ clist_d->list_op = CT_GET_LIST_ALL_CONTACTS;
+
+ ctui_list_genlist_update(clist_d);
+ }
+
+ if (elm_naviframe_top_item_get(clist_d->navi) != clist_d->navi_item)
+ elm_naviframe_item_pop_to(clist_d->navi_item);
+ 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->child_ug) {
+ ug_destroy(clist_d->child_ug);
+ clist_d->child_ug = NULL;
+ }
+
+ evas_object_del(clist_d->cbar);
+ clist_d->cbar = cbar;
+}
+
+static int create_list_view(Evas_Object *base, ct_list_data *clist_d)
+{
+ char buf[PH_TEXT_SHORT_LEN];
+
+ if (NULL == clist_d->navi) {
+ p_retvm_if(NULL == base, FALSE, "base is NULL");
+ clist_d->navi = elm_naviframe_add(base);
+ p_retvm_if(NULL == clist_d->navi, FALSE, "navi is NULL");
+ elm_naviframe_prev_btn_auto_pushed_set(clist_d->navi, EINA_FALSE);
+ elm_object_part_content_set(base, "elm.swallow.content", clist_d->navi);
+ evas_object_show(clist_d->navi);
+ }
+ if (CT_GET_LIST_VCARD != clist_d->list_op)
+ ct_list_get_contacts(clist_d, &clist_d->list);
+ clist_d->content = ct_list_create_contact_view(clist_d);
+
+ FREEandSTRDUP(clist_d->title, T_(CT_GET_TEXT_BASIC, CTTEXT_ALL_CONTACTS));
+ snprintf(buf, sizeof(buf), "%s (%d)", clist_d->title, clist_d->cnt_list);
+ clist_d->navi_item = elm_naviframe_item_push(clist_d->navi, buf, NULL, NULL, clist_d->content, NULL);
+
+ return TRUE;
+}
+
+static int list_create_vcard_list_view(Evas_Object *base, ct_list_data *clist_d)
+{
+ char buf[PH_TEXT_SHORT_LEN];
+
+ p_retvm_if(NULL == base, FALSE, "base is NULL");
+
+ clist_d->navi = elm_naviframe_add(base);
+ p_retvm_if(NULL == clist_d->navi, FALSE, "navi is NULL");
+ elm_naviframe_prev_btn_auto_pushed_set(clist_d->navi, EINA_FALSE);
+ evas_object_show(clist_d->navi);
+
+ clist_d->content = ct_list_create_contact_view(clist_d);
+
+ clist_d->title = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_VCARD_CONTACTS));
+ snprintf(buf, sizeof(buf), "%s (%d)", clist_d->title, clist_d->cnt_list);
+ clist_d->navi_item = elm_naviframe_item_push(clist_d->navi, buf, NULL, NULL, clist_d->content, NULL);
+ if (clist_d->select_result_cb)
+ ctui_list_edit_mode_start(clist_d);
+ else
+ ctui_list_navi_set(CT_LIST_MODE_DEFAULT, clist_d);
+
+ elm_object_part_content_set(base, "elm.swallow.content", clist_d->navi);
+
+ return TRUE;
+}
+
+static void *list_on_create(ui_gadget_h ug, enum ug_mode mode,
+ service_h service, void *priv)
+{
+ int ret;
+ Evas_Object *bg, *base;
+ Evas_Object *parent;
+ ct_list_data *clist_d = priv;
+
+ p_retvm_if(NULL == ug || NULL == priv, NULL,
+ "The parameter is invalid(ug=%p, priv=%p)", ug, priv);
+
+ clist_d->win = ug_get_window();
+ parent = ug_get_parent_layout(ug);
+ p_retvm_if(NULL == parent, NULL, "ug_get_parent_layout() return NULL");
+ clist_d->ug = ug;
+
+ bindtextdomain(PACKAGE, LOCALEDIR);
+
+ ret = contacts_svc_connect();
+ p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_connect() Failed(%d)", ret);
+
+ if (UG_MODE_FULLVIEW == mode)
+ base = phone_create_base_layout(parent, true);
+ else
+ base = phone_create_base_layout(parent, false);
+
+ ret = ct_list_parse_bundle(service, clist_d);
+ if (-2 == ret) {
+ Evas_Object *popup;
+ popup = elm_popup_add(base);
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_text_set(popup, S_(CT_SYS_POP_FILE_NOT_FOUND));
+ elm_popup_timeout_set(popup, 1.5);
+ evas_object_show(popup);
+ evas_object_smart_callback_add(popup, "timeout", ctui_list_ug_hide_cb, clist_d->ug);
+ return base;
+ }
+ p_retvm_if(-1 == ret, NULL, "ct_list_parse_bundle() Failed");
+ clist_d->base_ab = -1;
+
+ bg = phone_create_bg(base);
+ if (NULL == bg) {
+ ERR("phone_create_bg() return NULL");
+ evas_object_del(base);
+ ret = contacts_svc_disconnect();
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_disconnect() Failed(%d)", ret);
+ return NULL;
+ }
+
+ if (FALSE == create_list_view(base, clist_d)) {
+ evas_object_del(base);
+ ret = contacts_svc_disconnect();
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_disconnect() Failed(%d)", ret);
+ }
+ else {
+ if (CT_UG_REQUEST_CHECK == clist_d->ug_request ||
+ CT_UG_REQUEST_CHECK_FOR_NUMBER == clist_d->ug_request ||
+ CT_UG_REQUEST_CHECK_FOR_EMAIL == clist_d->ug_request)
+ ctui_list_edit_mode_start(clist_d);
+ else
+ ctui_list_navi_set(CT_LIST_MODE_DEFAULT, clist_d);
+ }
+
+ return base;
+}
+
+static void list_on_message(ui_gadget_h ug, service_h msg, service_h service, void *priv)
+{
+}
+
+static void list_on_pause(ui_gadget_h ug, service_h service, void *priv)
+{
+ PH_FN_CALL;
+ ct_list_data *clist_d = priv;
+ clist_d->order_sorting = contacts_svc_get_order(CTS_ORDER_OF_SORTING);
+ clist_d->order_display = contacts_svc_get_order(CTS_ORDER_OF_DISPLAY);
+ clist_d->is_background = true;
+}
+
+static void list_on_resume(ui_gadget_h ug, service_h service, void *priv)
+{
+ ct_list_data *clist_d = priv;
+ ct_detail_data *cdetail_d;
+
+ clist_d->is_background = false;
+
+ if (clist_d->order_display != contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) {
+ ctui_list_genlist_update(clist_d);
+ cdetail_d = evas_object_data_get(clist_d->navi, "cdetail_d");
+ if (cdetail_d)
+ ctui_detail_genlist_update(cdetail_d);
+ }
+ else if (clist_d->order_sorting != contacts_svc_get_order(CTS_ORDER_OF_SORTING)) {
+ ctui_list_genlist_update(clist_d);
+ }
+
+ if (clist_d->update_timer) {
+ ecore_timer_del(clist_d->update_timer);
+ clist_d->update_timer = NULL;
+ ctui_list_genlist_update(clist_d);
+ }
+}
+
+static void list_on_event(ui_gadget_h ug, enum ug_event event, service_h service, void *priv)
+{
+ ct_list_data *clist_d = priv;
+ Evas_Object *notify;
+ switch (event) {
+ case UG_EVENT_ROTATE_PORTRAIT:
+ case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN:
+ phone_resize_notify(clist_d->navi, 0);
+ evas_object_data_set(clist_d->navi, "phone_rotate", (void *)0);
+ notify = phone_get_notify(clist_d->navi);
+ elm_layout_theme_set(elm_object_content_get(notify), "standard", "selectioninfo", "vertical/bottom_64");
+ break;
+ case UG_EVENT_ROTATE_LANDSCAPE:
+ case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN:
+ phone_resize_notify(clist_d->navi, 90);
+ evas_object_data_set(clist_d->navi, "phone_rotate", (void *)90);
+ notify = phone_get_notify(clist_d->navi);
+ elm_layout_theme_set(elm_object_content_get(notify), "standard", "selectioninfo", "horizontal/bottom_64");
+ break;
+ default:
+ break;
+ }
+}
+
+static void list_on_destroy(ui_gadget_h ug, service_h service, void *priv)
+{
+ int ret;
+ ct_list_data *clist_d = priv;
+ p_retm_if(NULL == ug, "The parameter is invalid(ug=%p)", ug);
+
+ free(clist_d->ug_data);
+ if (clist_d && !clist_d->navi)
+ free(clist_d);
+
+ evas_object_del(ug_get_layout(ug));
+ ret = contacts_svc_disconnect();
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_disconnect() Failed(%d)", ret);
+}
+
+API int UG_MODULE_INIT(struct ug_module_ops *ops)
+{
+ ct_list_data *clist_d;
+
+ p_retvm_if(!ops, -1, "ops is NULL");
+
+ clist_d = calloc(1, sizeof(ct_list_data));
+ p_retvm_if(!clist_d, -1, "UG data is NULL, Not enough memory");
+
+ ops->create = list_on_create;
+ ops->start = NULL;
+ ops->pause = list_on_pause;
+ ops->resume = list_on_resume;
+ ops->destroy = list_on_destroy;
+ ops->message = list_on_message;
+ ops->event = list_on_event;
+ ops->key_event = NULL;
+ ops->priv = clist_d;
+ ops->opt = UG_OPT_INDICATOR_ENABLE;
+
+ return 0;
+}
+
+API void UG_MODULE_EXIT(struct ug_module_ops *ops)
+{
+ p_retm_if(!ops, "ops is NULL");
+
+ ops->priv = NULL;
+}
+
+// Setting - export,import
+API Evas_Object* ctui_create_list_select_view(Evas_Object *navi,
+ ct_select_result_cb result_cb, void *result_cb_data, int list_op, int id_ab, int id_grp)
+{
+ PH_DBG("list_op = %d, id_ab = %d, id_grp = %d", list_op, id_ab, id_grp);
+
+ ct_list_data *clist_d;
+
+ clist_d = calloc(1, sizeof(ct_list_data));
+ p_retvm_if(!clist_d, NULL, "clist_d is NULL, Not enough memory");
+
+ clist_d->navi = navi;
+ clist_d->select_result_cb = result_cb;
+ clist_d->select_result_cb_data = result_cb_data;
+ clist_d->list_op = list_op;
+ clist_d->base_ab = id_ab;
+ clist_d->base_grp = id_grp;
+
+ switch(list_op) {
+ case CT_GET_LIST_ALL_CONTACT_HAD_NUMBER:
+ clist_d->ug_request = CT_UG_REQUEST_CHECK_FOR_NUMBER;
+ break;
+ case CT_GET_LIST_ALL_CONTACT_HAD_EMAIL:
+ clist_d->ug_request = CT_UG_REQUEST_CHECK_FOR_EMAIL;
+ break;
+ default:
+ clist_d->ug_request = CT_UG_REQUEST_CHECK;
+ break;
+ }
+
+ ct_list_get_contacts(clist_d, &clist_d->list);
+ clist_d->content = ct_list_create_contact_view(clist_d);
+
+ ct_list_get_title(clist_d, list_op, id_ab, id_grp);
+
+ if (clist_d->sub_title) {
+ clist_d->navi_item = elm_naviframe_item_push(clist_d->navi, clist_d->title, NULL,
+ NULL, clist_d->content, "2line");
+ elm_object_item_part_text_set(clist_d->navi_item, "subtitle", clist_d->sub_title);
+ }
+ else
+ clist_d->navi_item = elm_naviframe_item_push(clist_d->navi, clist_d->title, NULL,
+ NULL, clist_d->content, NULL);
+ ctui_list_edit_mode_start(clist_d);
+
+ return clist_d->navi;
+}
+
+API void ctui_create_favorite_list_select_view(Evas_Object *win, Evas_Object *navi, Eina_List *list)
+{
+ ct_list_data *clist_d;
+ char buf[PH_TEXT_SHORT_LEN];
+ clist_d = calloc(1, sizeof(ct_list_data));
+ p_retm_if(!clist_d, "clist_d is NULL, Not enough memory");
+
+ clist_d->win = win;
+ clist_d->navi = navi;
+ clist_d->contact_add_cb = ct_list_add_contacts_to_favorite;
+ clist_d->ug_request = CT_UG_REQUEST_CHECK;
+ clist_d->list = list;
+ clist_d->content = ct_list_create_contact_view(clist_d);
+ clist_d->title = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_SELECT_CONTACTS)); // TODO: Add favorite
+ clist_d->cnt_list = eina_list_count(list);
+ snprintf(buf, sizeof(buf), "%s (%d)", clist_d->title, clist_d->cnt_list);
+
+ clist_d->navi_item = elm_naviframe_item_push(clist_d->navi, buf, NULL, NULL, clist_d->content, NULL);
+ ctui_list_edit_mode_start(clist_d);
+ evas_object_data_set(clist_d->navi, "favor_list_d", clist_d);
+}
+
+// Show vcard contact list check view to importing contacts from vcf file
+API Evas_Object* ctui_create_vcard_list_select_view(Evas_Object *navi, Eina_List *list, const char *path,
+ ct_select_result_cb result_cb, void *result_cb_data)
+{
+ ct_list_data *clist_d;
+ char buf[PH_TEXT_SHORT_LEN];
+
+ clist_d = calloc(1, sizeof(ct_list_data));
+ p_retvm_if(!clist_d, NULL, "clist_d is NULL, Not enough memory");
+
+ clist_d->navi = navi;
+ clist_d->list = list;
+ clist_d->cnt_list = eina_list_count(list);
+ clist_d->vcard_path = path;
+ clist_d->select_result_cb = result_cb;
+ clist_d->select_result_cb_data = result_cb_data;
+ clist_d->list_op = CT_GET_LIST_VCARD;
+ clist_d->ug_request = CT_UG_REQUEST_CHECK;
+ clist_d->base_ab = -1;
+
+ clist_d->content = ct_list_create_contact_view(clist_d);
+ clist_d->title = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_VCARD_CONTACTS));
+ snprintf(buf, sizeof(buf), "%s (%d)", clist_d->title, clist_d->cnt_list);
+
+ clist_d->navi_item = elm_naviframe_item_push(clist_d->navi, buf, NULL, NULL, clist_d->content, NULL);
+ ctui_list_edit_mode_start(clist_d);
+
+ evas_object_data_set(clist_d->navi, "clist_d", clist_d);
+ return clist_d->navi;
+}
+
+// Show contact list view from vcf file
+API Evas_Object* ctui_create_vcard_list_view(Evas_Object *win, Eina_List *list, const char *path)
+{
+ ct_list_data *clist_d;
+ Evas_Object *bg, *base;
+
+ clist_d = calloc(1, sizeof(ct_list_data));
+ p_retvm_if(!clist_d, NULL, "clist_d is NULL, Not enough memory");
+
+ clist_d->win = win;
+ clist_d->list = list;
+ clist_d->cnt_list = eina_list_count(list);
+ clist_d->vcard_path = path;
+ clist_d->base_ab = -1;
+
+ base = phone_create_base_layout(win, true);
+ if (base) {
+ clist_d->list_op = CT_GET_LIST_VCARD;
+ list_create_vcard_list_view(base, clist_d);
+
+ bg = phone_create_bg(base);
+ if (NULL == bg) {
+ ERR("phone_create_bg() return NULL");
+ evas_object_del(base);
+ free(clist_d);
+ return NULL;
+ }
+
+ evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, base);
+ evas_object_show(base);
+ evas_object_data_set(clist_d->navi, "clist_d", clist_d);
+
+ return base;
+ }
+ else {
+ free(clist_d);
+ return NULL;
+ }
+}
+
+API Evas_Object* ctui_create_phone_list_view(ph_view_info *view_info)
+{
+ ct_list_data *clist_d;
+
+ clist_d = calloc(1, sizeof(ct_list_data));
+ p_retvm_if(!clist_d, NULL, "clist_d is NULL, Not enough memory");
+
+ clist_d->ug = view_info->ug;
+ clist_d->win = view_info->win;
+ clist_d->navi = view_info->navi;
+ clist_d->tab_mode = CT_LIST_IN_MULTI_TAB;
+ clist_d->navi_item = elm_naviframe_bottom_item_get(view_info->navi);
+ clist_d->cbar = elm_object_item_part_content_get(clist_d->navi_item,
+ "controlbar");
+
+ switch (view_info->ug_request) {
+ case PH_UG_REQUEST_CHECK_FOR_EMAIL:
+ clist_d->list_op = CT_GET_LIST_ALL_CONTACT_HAD_EMAIL;
+ break;
+ case PH_UG_REQUEST_SELECT_EMAIL:
+ clist_d->list_op = CT_GET_LIST_ALL_CONTACT_HAD_EMAIL;
+ break;
+ case PH_UG_REQUEST_CHECK_FOR_NUMBER:
+ clist_d->list_op = CT_GET_LIST_ALL_CONTACT_HAD_NUMBER;
+ break;
+ case PH_UG_REQUEST_SELECT_NUMBER:
+ clist_d->list_op = CT_GET_LIST_ALL_CONTACT_HAD_NUMBER;
+ break;
+ default:
+ clist_d->list_op = CT_GET_LIST_ALL_CONTACTS;
+ break;
+ }
+ clist_d->base_ab = -1;
+
+ clist_d->ug_request = view_info->ug_request;
+ clist_d->ug_data = view_info->ug_data;
+ clist_d->cnt_max = view_info->ug_cnt_max;
+
+ ct_list_get_contacts(clist_d, &clist_d->list);
+ clist_d->content = ct_list_create_contact_view(clist_d);
+ evas_object_data_set(clist_d->navi, "clist_d", clist_d);
+
+ return clist_d->content;
+}
+
+API void ctui_list_view_resume(Evas_Object *navi)
+{
+ PH_FN_CALL;
+ ct_list_data *clist_d;
+ ct_detail_data *cdetail_d;
+
+ clist_d = evas_object_data_get(navi, "clist_d");
+ p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL");
+
+ clist_d->is_background = false;
+
+ if (clist_d->order_sorting != contacts_svc_get_order(CTS_ORDER_OF_SORTING) ||
+ clist_d->order_display != contacts_svc_get_order(CTS_ORDER_OF_DISPLAY))
+ ctui_list_genlist_update(clist_d);
+
+ cdetail_d = evas_object_data_get(navi, "cdetail_d");
+ if (cdetail_d)
+ ctui_detail_genlist_update(cdetail_d);
+
+ if (clist_d->update_timer) {
+ ecore_timer_del(clist_d->update_timer);
+ clist_d->update_timer = NULL;
+ ctui_list_genlist_update(clist_d);
+ }
+}
+
+API void ctui_list_view_pause(Evas_Object *navi)
+{
+ PH_FN_CALL;
+
+ ct_list_data *clist_d;
+ clist_d = evas_object_data_get(navi, "clist_d");
+ p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL");
+ clist_d->order_sorting = contacts_svc_get_order(CTS_ORDER_OF_SORTING);
+ clist_d->order_display = contacts_svc_get_order(CTS_ORDER_OF_DISPLAY);
+ clist_d->is_background = true;
+}
+
diff --git a/lib/list/ct-list-utils.c b/lib/list/ct-list-utils.c
new file mode 100755
index 0000000..de6eb07
--- /dev/null
+++ b/lib/list/ct-list-utils.c
@@ -0,0 +1,514 @@
+/*
+ * 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 <errno.h>
+#include <fcntl.h>
+#include <ui-gadget-module.h>
+#include "phone.h"
+#include "ct-detail.h"
+#include "ct-list.h"
+#include "ct-list-contact-view.h"
+#include "ct-list-utils.h"
+
+int ct_list_parse_bundle(service_h service, ct_list_data* clist_d)
+{
+ char* val = NULL;
+
+ if (service) {
+ service_get_extra_data(service, CT_UG_BUNDLE_TYPE, &val);
+ if (val) clist_d->ug_request = atoi(val);
+ PH_DBG("type = %d", clist_d->ug_request);
+ free(val);
+
+ switch (clist_d->ug_request) {
+ case CT_UG_REQUEST_LIST:
+ case CT_UG_REQUEST_LIST_WITH_BACK:
+ case CT_UG_REQUEST_SELECT_CONTACT:
+ case CT_UG_REQUEST_SELECT_VCARD:
+ break;
+ case CT_UG_REQUEST_SELECT_NUMBER:
+ clist_d->list_op = CT_GET_LIST_ALL_CONTACT_HAD_NUMBER;
+ break;
+ case CT_UG_REQUEST_SELECT_EMAIL:
+ clist_d->list_op = CT_GET_LIST_ALL_CONTACT_HAD_EMAIL;
+ break;
+ case CT_UG_REQUEST_UPDATE_CONTACT:
+ service_get_extra_data(service, CT_UG_BUNDLE_NUM, &clist_d->ug_data);
+ if(clist_d->ug_data)
+ break;
+ service_get_extra_data(service, CT_UG_BUNDLE_EMAIL, &clist_d->ug_data);
+ if(clist_d->ug_data)
+ break;
+ service_get_extra_data(service, CT_UG_BUNDLE_WEB, &clist_d->ug_data);
+ if(clist_d->ug_data)
+ break;
+ break;
+ case CT_UG_REQUEST_UPDATE_WITH_NUM:
+ service_get_extra_data(service, CT_UG_BUNDLE_NUM, &clist_d->ug_data);
+ break;
+ case CT_UG_REQUEST_UPDATE_WITH_EMAIL:
+ service_get_extra_data(service, CT_UG_BUNDLE_EMAIL, &clist_d->ug_data);
+ break;
+ case CT_UG_REQUEST_UPDATE_WITH_WEB:
+ service_get_extra_data(service, CT_UG_BUNDLE_WEB, &clist_d->ug_data);
+ break;
+ case CT_UG_REQUEST_CHECK:
+ val = NULL;
+ service_get_extra_data(service, CT_UG_BUNDLE_MAX, &val);
+ if (val) clist_d->cnt_max = atoi(val);
+ free(val);
+ break;
+ case CT_UG_REQUEST_CHECK_FOR_NUMBER:
+ val = NULL;
+ clist_d->list_op = CT_GET_LIST_ALL_CONTACT_HAD_NUMBER;
+ service_get_extra_data(service, CT_UG_BUNDLE_MAX, &val);
+ if (val) clist_d->cnt_max = atoi(val);
+ free(val);
+ break;
+ case CT_UG_REQUEST_CHECK_FOR_EMAIL:
+ val = NULL;
+ clist_d->list_op = CT_GET_LIST_ALL_CONTACT_HAD_EMAIL;
+ service_get_extra_data(service, CT_UG_BUNDLE_MAX, &val);
+ if (val) clist_d->cnt_max = atoi(val);
+ free(val);
+ break;
+ case PH_UG_REQUEST_SET_WITH_IMG:
+ case PH_UG_REQUEST_SET_WITH_RINGTONE:
+ case CT_UG_REQUEST_SAVE_IMG:
+ case CT_UG_REQUEST_SAVE_RINGTONE:
+ service_get_extra_data(service, CT_UG_BUNDLE_PATH, &clist_d->ug_data);
+ if (-1 == access(clist_d->ug_data, R_OK)) {
+ ERR("Invalid filepath(%s)", clist_d->ug_data);
+ return -2;
+ }
+ break;
+ default:
+ ERR("Invalid request(%d)", clist_d->ug_request);
+ return -1;
+ }
+ }
+ return 0;
+}
+
+static void list_img_crop_result_for_add(ui_gadget_h ug,service_h service, void *data)
+{
+ CTSvalue *ct_val;
+ ct_detail_data *cdetail_d = data;
+
+ p_retm_if(NULL == ug || NULL == data, "ug or data is NULL");
+
+ if (service) {
+ char *normal = NULL;
+ char *full = NULL;
+
+ service_get_extra_data(service, "crop_image_path", &normal);
+ p_retm_if(!normal, "return value is NULL.\n");
+
+ service_get_extra_data(service, "image_path", &full);
+
+ contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_BASE_INFO_VALUE, &ct_val);
+ if (NULL == ct_val)
+ ct_val = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO);
+ contacts_svc_value_set_str(ct_val, CTS_BASE_VAL_IMG_PATH_STR, normal);
+ contacts_svc_value_set_str(ct_val, CTS_BASE_VAL_FULL_IMG_PATH_STR, full);
+ contacts_svc_struct_store_value(cdetail_d->contact, CTS_CF_BASE_INFO_VALUE, ct_val);
+
+ free(normal);
+ free(full);
+ }
+
+ ug_destroy(ug);
+ cdetail_d->child_ug = NULL;
+ ctui_create_input_view(cdetail_d);
+}
+
+static void list_destory_detail_child_ug(ui_gadget_h ug, void *priv)
+{
+ ct_detail_data *cdetail_d = priv;
+ p_retm_if(NULL == ug, "ug is NULL");
+ ug_destroy(ug);
+
+ p_retm_if(NULL == priv, "priv is NULL");
+ cdetail_d->child_ug = NULL;
+}
+
+void ct_list_destroy_child_ug(void *data)
+{
+ ct_list_data *clist_d = (ct_list_data*)data;
+ clist_d->child_ug = NULL;
+}
+
+API void ctui_list_update_with_data(ph_view_info *view_info, void *data,
+ int ct_id, int grp_id, int ab_id)
+{
+ int ret;
+ ct_detail_data *cdetail_d;
+ GSList *ct_list;
+ CTSvalue *ct_val;
+ struct ug_cbs cbs = {0};
+
+ cdetail_d = calloc(1, sizeof(ct_detail_data));
+ p_retm_if(!cdetail_d, "cdetail_d is NULL, Not enough memory");
+
+ cdetail_d->win = view_info->win;
+ cdetail_d->navi = view_info->navi;
+ cdetail_d->ug = view_info->ug;
+ cdetail_d->prev_navi_item = elm_naviframe_top_item_get(view_info->navi);
+ cdetail_d->prev_view_data = data;
+ cdetail_d->contact_id = ct_id;
+ cdetail_d->base_grp = grp_id;
+ cdetail_d->base_ab = ab_id;
+ cdetail_d->ug_request = view_info->ug_request;
+
+ if (ct_id)
+ ret = contacts_svc_get_contact(ct_id, &(cdetail_d->contact));
+ else
+ ret = -1;
+
+ if (CTS_SUCCESS != ret) {
+ ERR("contacts_svc_get_contact() Failed(%d)", ret);
+ cdetail_d->contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT);
+ }
+
+ switch (view_info->ug_request) {
+ //case PH_UG_REQUEST_SET_WITH_NUM:
+ case CT_UG_REQUEST_UPDATE_WITH_NUM:
+ ct_list = NULL;
+ ct_val = contacts_svc_value_new(CTS_VALUE_NUMBER);
+ contacts_svc_value_set_str(ct_val, CTS_NUM_VAL_NUMBER_STR, view_info->ug_data);
+ ct_list = g_slist_append(ct_list, ct_val);
+ contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_NUMBER_LIST, ct_list);
+ g_slist_free(ct_list);
+ break;
+ //case PH_UG_REQUEST_SET_WITH_EMAIL:
+ case CT_UG_REQUEST_UPDATE_WITH_EMAIL:
+ ct_list = NULL;
+ ct_val = contacts_svc_value_new(CTS_VALUE_EMAIL);
+ contacts_svc_value_set_str(ct_val, CTS_EMAIL_VAL_ADDR_STR, view_info->ug_data);
+ ct_list = g_slist_append(ct_list, ct_val);
+ contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_EMAIL_LIST, ct_list);
+ g_slist_free(ct_list);
+ break;
+ //case PH_UG_REQUEST_SET_WITH_WEB:
+ case CT_UG_REQUEST_UPDATE_WITH_WEB:
+ ct_list = NULL;
+ ct_val = contacts_svc_value_new(CTS_VALUE_WEB);
+ contacts_svc_value_set_str(ct_val, CTS_WEB_VAL_ADDR_STR, view_info->ug_data);
+ ct_list = g_slist_append(ct_list, ct_val);
+ contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_WEB_ADDR_LIST, ct_list);
+ g_slist_free(ct_list);
+ break;
+ case CT_UG_REQUEST_UPDATE_CONTACT:
+ break;
+ case PH_UG_REQUEST_SET_WITH_IMG:
+ case CT_UG_REQUEST_SAVE_IMG: //only handle for add
+ cbs.result_cb = list_img_crop_result_for_add;
+ cbs.destroy_cb = list_destory_detail_child_ug;
+ cbs.priv = cdetail_d;
+
+ cdetail_d->child_ug = phone_image_crop_ug(cdetail_d->ug, view_info->ug_data, &cbs);
+ return;
+ case PH_UG_REQUEST_SET_WITH_RINGTONE:
+ case CT_UG_REQUEST_SAVE_RINGTONE: //only handle for add
+ contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_BASE_INFO_VALUE, &ct_val);
+ if (NULL == ct_val)
+ ct_val = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO);
+ contacts_svc_value_set_str(ct_val, CTS_BASE_VAL_RINGTONE_PATH_STR, view_info->ug_data);
+ contacts_svc_struct_store_value(cdetail_d->contact, CTS_CF_BASE_INFO_VALUE, ct_val);
+ break;
+ default:
+ ERR("Invalid type(%d)", view_info->ug_request);
+ break;
+ }
+ ctui_create_input_view(cdetail_d);
+}
+
+void ct_list_call(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_contact_list *item = data;
+ p_retm_if(NULL == item, "parameter(item) is NULL");
+ p_retm_if(NULL == item->number || '\0' == *item->number, "number is NULL");
+ phone_launch_voice_call(item->id, item->number);
+}
+
+void ct_list_msg(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_list_data *clist_d;
+ ct_contact_list *item = data;
+
+ p_retm_if(NULL == data, "parameter(item) is NULL");
+ p_retm_if(NULL == item->number || '\0' == *item->number, "number is NULL");
+
+ clist_d = (ct_list_data *)evas_object_data_get(obj, "clist_d");
+ p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL");
+
+ clist_d->child_ug = ctui_msg_ug(clist_d->ug, item->number, item->id, NULL,
+ ct_list_destroy_child_ug, clist_d);
+}
+
+void ct_list_popup_hide_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_list_data *clist_d;
+ Elm_Object_Item *item;
+ ct_contact_list *contact;
+
+ clist_d = evas_object_data_get(data, "clist_d");
+ p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL");
+ evas_object_del(clist_d->popup);
+ clist_d->popup = NULL;
+
+ if (NULL != obj) { // Click "Close"
+ item = evas_object_data_get(data, "item");
+ p_retm_if(NULL == item, "evas_object_data_get() return NULL");
+
+ contact = elm_object_item_data_get(item);
+ p_retm_if(NULL == contact, "elm_object_item_data_get() return NULL");
+
+ contact->checked = EINA_FALSE;
+ clist_d->cnt_checked--;
+ elm_genlist_item_update(item);
+ }
+}
+
+static void list_sweep_delete_contact(void *data, Evas_Object *obj, void *event_info)
+{
+ int person_id;
+ int ret;
+ ct_list_data *clist_d;
+
+ clist_d = evas_object_data_get(obj, "clist_d");
+ p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL");
+ evas_object_del(clist_d->popup);
+ clist_d->popup = NULL;
+
+ person_id = ctui_get_person_id((int)data);
+ evas_object_data_set(clist_d->navi, "ct_list_update_ui", (void *)1);
+
+ ret = contacts_svc_delete_person(person_id);
+
+ if (CTS_SUCCESS == ret)
+ phone_show_tickernoti(S_(CT_SYS_POP_SUCCESS));
+ else
+ phone_show_tickernoti(S_(PH_SYS_POP_FAILED));
+}
+
+
+void ct_list_sweep_del_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int id;
+ ct_list_data *clist_d;
+ Evas_Object *btn;
+
+ clist_d = evas_object_data_get(obj, "clist_d");
+ p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL");
+
+ id = (int)data;
+ btn = phone_create_confirm_popup(&clist_d->popup, clist_d->win, T_(CT_GET_TEXT_BASE_OP,
+ CTTEXT_CONFIRM_DELETE_CONTACT), list_sweep_delete_contact, (void *)id);
+ evas_object_data_set(btn,"clist_d", clist_d);
+}
+
+void ct_list_get_title(ct_list_data *clist_d, int list_op, int id_ab, int id_grp)
+{
+ switch(list_op) {
+ case CT_GET_LIST_ALL_CONTACTS:
+ case CT_GET_LIST_ALL_CONTACT_HAD_EMAIL:
+ case CT_GET_LIST_ALL_CONTACT_HAD_NUMBER:
+ {
+ char buf[PH_TEXT_SHORT_LEN];
+ snprintf(buf, sizeof(buf), "%s (%d)", T_(CT_GET_TEXT_BASIC, CTTEXT_ALL_CONTACTS), clist_d->cnt_list);
+ clist_d->title = strdup(buf);
+ }
+ break;
+ }
+}
+
+static PTHREAD_FN list_add_contacts_to_favorite(void *data)
+{
+ int ret;
+ ct_list_data *clist_d = data;
+ ph_progress_info *p_info = clist_d->p_info;
+ Eina_List *l;
+ ct_contact_list *contact;
+
+ EINA_LIST_FOREACH(clist_d->list, l, contact) {
+ if (!p_info->alive) {
+ p_info->result = FALSE;
+ break;
+ }
+ if (contact && contact->checked) {
+ ret = contacts_svc_set_favorite(CTS_FAVOR_CONTACT, contact->id);
+ if (ret < CTS_SUCCESS) {
+ p_info->result = FALSE;
+ p_info->completed = true;
+ break;
+ }
+ p_info->cnt++;
+ }
+ }
+ pthread_exit(NULL);
+}
+
+static Eina_Bool list_add_contacts_timer_cb(void *data)
+{
+ ct_list_data *clist_d = data;
+ ph_progress_info *p_info = clist_d->p_info;
+
+ p_retvm_if(NULL == p_info, ECORE_CALLBACK_CANCEL, "parameter(clist_d) is NULL");
+
+ if (!p_info->completed) {
+ char count[PH_TEXT_SHORT_LEN];
+ char percent[PH_TEXT_SHORT_LEN];
+ double value = (double)p_info->cnt / (double)p_info->cnt_checked_total;
+
+ if (!p_info->alive) {
+ p_info->result = FALSE;
+ p_info->completed = true;
+ return ECORE_CALLBACK_RENEW;
+ }
+
+ elm_progressbar_value_set(p_info->progressbar, value);
+ snprintf(percent, sizeof(percent), "%d%%", (int)(100.0 * (double)p_info->cnt/(double)p_info->cnt_checked_total));
+ snprintf(count, sizeof(count), "%d/%d", p_info->cnt, p_info->cnt_checked_total);
+ edje_object_part_text_set(elm_layout_edje_get(p_info->layout), "elm.text.subtext1", percent);
+ edje_object_part_text_set(elm_layout_edje_get(p_info->layout), "elm.text.subtext2", count);
+
+ if (p_info->cnt == p_info->cnt_checked_total)
+ p_info->completed = true;
+
+ return ECORE_CALLBACK_RENEW;
+ }
+ else {
+ int ret;
+ const char *message;
+
+ pthread_join(p_info->thread, NULL);
+
+ if (TRUE == p_info->result) {
+ message = S_(CT_SYS_POP_SUCCESS);
+ ret = contacts_svc_end_trans(true);
+ }
+ else {
+ message = S_(PH_SYS_POP_FAILED);
+ ret = contacts_svc_end_trans(false);
+ }
+ p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret);
+
+ evas_object_del(clist_d->popup);
+ clist_d->popup = NULL;
+
+ phone_show_tickernoti(message);
+ elm_naviframe_item_pop_to(evas_object_data_get(clist_d->navi, "navi_it_pop_to"));
+ return ECORE_CALLBACK_CANCEL;
+ }
+}
+
+void ct_list_add_contacts_to_favorite(Evas_Object *win, Evas_Object *navi, int cnt)
+{
+ int ret;
+ ct_list_data *clist_d;
+ ph_progress_info *p_info;
+
+ clist_d = evas_object_data_get(navi, "favor_list_d");
+ p_retm_if(NULL == clist_d, "evas_object_data_get return NULL");
+
+ p_retm_if(clist_d->p_info, "thread is running");
+
+ p_info = calloc(1, sizeof(ph_progress_info));
+ p_retm_if(NULL == p_info, "calloc return NULL");
+
+ clist_d->p_info = p_info;
+ p_info->cnt_checked_total = cnt;
+ p_info->alive = true;
+ p_info->result = TRUE;
+
+ ret = contacts_svc_begin_trans();
+ if (CTS_SUCCESS != ret) {
+ ERR("contacts_svc_begin_trans() Failed(%d)", ret);
+ free(p_info);
+ clist_d->p_info = NULL;
+ return;
+ }
+
+ ret = pthread_create(&p_info->thread, NULL, list_add_contacts_to_favorite, clist_d);
+ if (0 != ret) {
+ ERR("Thread creation failed(%d)", ret);
+ free(p_info);
+ clist_d->p_info = NULL;
+ ret = contacts_svc_end_trans(false);
+ p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret);
+ return;
+ }
+
+ p_info->timer = ecore_timer_add(0.2, list_add_contacts_timer_cb, clist_d);
+ if (NULL == p_info->timer) {
+ p_info->alive = false;
+ pthread_join(p_info->thread, NULL);
+ free(p_info);
+ clist_d->p_info = NULL;
+ ret = contacts_svc_end_trans(false);
+ p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret);
+ return;
+ }
+ clist_d->popup = phone_progressbar_popup(win, p_info, T_(CT_GET_TEXT_BASIC, CTTEXT_ADDING_ING));
+}
+
+bool ct_list_make_vcard(int contactid, char *path, int path_length)
+{
+ int ret, fd;
+ char display[PH_TEXT_MAX_LEN];
+ char *vcard = NULL;
+ CTSvalue *name;
+ CTSstruct *contact;
+ ret = contacts_svc_get_contact(contactid, &contact);
+ if (ret < CTS_SUCCESS) {
+ ERR("contacts_svc_get_contact() Failed(%d)", ret);
+ return false;
+ }
+
+ ret = contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &name);
+ if (ret < CTS_SUCCESS) {
+ ERR("contacts_svc_struct_get_value() Failed(%d)", ret);
+ return false;
+ }
+ //display = contacts_svc_value_get_str(name, CTS_NAME_VAL_DISPLAY_STR);
+
+ ctui_get_display_name(name, display, sizeof(display));
+
+ if (display && '\0' == display[0]) {
+ snprintf(display, sizeof(display), "%s", T_(CT_GET_TEXT_ERR, CTTEXT_NONAME));
+ }
+ snprintf(path, path_length, "%s/%s.vcf", UGDATAIDR, display);
+
+ ret = contacts_svc_get_vcard_from_contact(contact, &vcard);
+ if (ret < CTS_SUCCESS) {
+ ERR("contacts_svc_get_vcard_from_contact() Failed(%d)", ret);
+ return false;
+ }
+ contacts_svc_struct_free(contact);
+
+ fd = open(path, O_WRONLY|O_CREAT|O_TRUNC, 0644);
+
+ if (-1 == write(fd, vcard, strlen(vcard))) {
+ ERR("write()... Failed(%s)", strerror(errno));
+ free(vcard);
+ return false;
+ }
+ free(vcard);
+ return true;
+
+
+}
+
diff --git a/lib/list/ct-list-utils.h b/lib/list/ct-list-utils.h
new file mode 100755
index 0000000..cf5c002
--- /dev/null
+++ b/lib/list/ct-list-utils.h
@@ -0,0 +1,31 @@
+/*
+ * 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.
+ */
+
+#ifndef __CONTACTS_LIST_UTILS_H__
+#define __CONTACTS_LIST_UTILS_H__
+
+int ct_list_parse_bundle(service_h service, ct_list_data* clist_d);
+void ct_list_call(void *data, Evas_Object *obj, void *event_info);
+void ct_list_msg(void *data, Evas_Object *obj, void *event_info);
+void ct_list_popup_hide_cb(void *data, Evas_Object *obj, void *event_info);
+void ct_list_sweep_del_cb(void *data, Evas_Object *obj, void *event_info);
+void ct_list_get_title(ct_list_data *data, int list_op, int id_ab, int id_grp);
+void ct_list_add_contacts_to_favorite(Evas_Object *win, Evas_Object *navi, int cnt);
+void ct_list_destroy_child_ug(void *data);
+bool ct_list_make_vcard(int contactid, char *path, int path_length);
+
+
+#endif //__CONTACTS_LIST_UTILS_H__
diff --git a/lib/list/ct-list-view-ug.c b/lib/list/ct-list-view-ug.c
new file mode 100755
index 0000000..cee8ac4
--- /dev/null
+++ b/lib/list/ct-list-view-ug.c
@@ -0,0 +1,505 @@
+/*
+ * 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 <ui-gadget-module.h>
+
+#include "phone.h"
+#include "ct-list.h"
+#include "ct-detail.h"
+#include "ct-list-utils.h"
+#include "ct-list-edit-view.h"
+#include "ct-list-contact-view.h"
+#include "phone-common.h"
+
+static void list_ug_nums_popup_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_list_data *clist_d = evas_object_data_get(obj, "clist_d");
+ int contact_id = (int)evas_object_data_get(obj, "ct_id");
+
+ if (CT_UG_REQUEST_CHECK_FOR_NUMBER == clist_d->ug_request) {
+ Elm_Object_Item *item;
+ ct_contact_list *contact;
+
+ item = evas_object_data_get(obj, "item");
+ p_retm_if(NULL == item, "evas_object_data_get() return NULL");
+
+ contact = elm_object_item_data_get(item);
+ p_retm_if(NULL == contact, "elm_object_item_data_get() return NULL");
+
+ contact->id_ret = (int)data;
+ ct_list_edit_update_selection_info(clist_d);
+ ct_list_popup_hide_cb(obj, NULL, NULL);
+ }
+ else if (PH_UG_REQUEST_LAUNCH_VOICECALL == clist_d->ug_request) {
+ char *num_info = (char*)elm_object_item_text_get(event_info);
+ char *number;
+ strtok(num_info, " ");
+ number = strtok(NULL, " ");
+ PH_DBG("%s", number);
+ ct_list_popup_hide_cb(obj, NULL, NULL);
+ phone_launch_voice_call(contact_id, number);
+ }
+ else {
+ phone_ug_return_id(clist_d->ug, contact_id, (int)data, 0);
+ ug_destroy_me(clist_d->ug);
+ }
+}
+
+static void list_ug_emails_popup_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_list_data *clist_d = evas_object_data_get(obj, "clist_d");
+ int contact_id = (int)evas_object_data_get(obj, "ct_id");
+
+ if (CT_UG_REQUEST_CHECK_FOR_EMAIL == clist_d->ug_request) {
+ Elm_Object_Item *item;
+ ct_contact_list *contact;
+
+ item = evas_object_data_get(obj, "item");
+ p_retm_if(NULL == item, "evas_object_data_get() return NULL");
+
+ contact = elm_object_item_data_get(item);
+ p_retm_if(NULL == contact, "elm_object_item_data_get() return NULL");
+
+ contact->id_ret = (int)data;
+ ct_list_edit_update_selection_info(clist_d);
+ ct_list_popup_hide_cb(obj, NULL, NULL);
+ }
+ else {
+ phone_ug_return_id(clist_d->ug, contact_id, 0, (int)data);
+ ug_destroy_me(clist_d->ug);
+ }
+}
+
+API Evas_Object* ctui_list_create_values_list(int type, Evas_Object *popup,
+ GSList *values, void(*cb)(void *, Evas_Object *, void *))
+{
+ GSList *cursor;
+ Evas_Object *list;
+
+ list = elm_list_add(popup);
+ evas_object_size_hint_max_set(list, -1, 600 * elm_config_scale_get()); // TODO : should be revise
+
+ for (cursor=values;cursor;cursor=cursor->next) {
+ int id, val_type;
+ const char *value, *type_str;
+ char buf[PH_TEXT_MAX_LEN];
+ if (CTS_VALUE_EMAIL == type) {
+ id = contacts_svc_value_get_int(cursor->data, CTS_EMAIL_VAL_ID_INT);
+ val_type = contacts_svc_value_get_int(cursor->data, CTS_EMAIL_VAL_TYPE_INT);
+ type_str = T_(CT_GET_TEXT_EMAIL_TYPE, val_type);
+ value = contacts_svc_value_get_str(cursor->data, CTS_EMAIL_VAL_ADDR_STR);
+
+ snprintf(buf, sizeof(buf), "%s %s", type_str, value);
+ }
+ else{
+ char num_type_str[PH_TEXT_SHORT_LEN];
+ id = contacts_svc_value_get_int(cursor->data, CTS_NUM_VAL_ID_INT);
+ val_type = contacts_svc_value_get_int(cursor->data, CTS_NUM_VAL_TYPE_INT);
+ ctui_get_number_type_str(val_type, num_type_str, sizeof(num_type_str));
+ value = contacts_svc_value_get_str(cursor->data, CTS_NUM_VAL_NUMBER_STR);
+
+ snprintf(buf, sizeof(buf), "%s %s", num_type_str, value);
+ }
+ elm_list_item_append(list, buf, NULL, NULL, cb, (void *)id);
+ }
+
+ elm_list_mode_set(list, ELM_LIST_EXPAND);
+
+ return list;
+}
+
+static Evas_Object* list_ug_create_popup_values_list(int type, ct_list_data *clist_d,
+ int contact_id, GSList *values)
+{
+ Evas_Object *popup;
+ Evas_Object *list;
+ Evas_Object *btn;
+
+ popup = elm_popup_add(clist_d->navi);
+ elm_object_style_set(popup, "min_liststyle");
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ if (CTS_VALUE_EMAIL == type)
+ list = ctui_list_create_values_list(type, popup, values, list_ug_emails_popup_sel);
+ else
+ list = ctui_list_create_values_list(type, popup, values, list_ug_nums_popup_sel);
+
+ elm_object_content_set(popup, list);
+ evas_object_data_set(list, "clist_d", clist_d);
+ evas_object_data_set(list, "ct_id", (void *)contact_id);
+
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, S_(PH_SYS_POP_CLOSE));
+ elm_object_part_content_set(popup, "button1", btn);
+ elm_object_style_set(btn, "popup_button/default");
+ evas_object_smart_callback_add(btn, "clicked", ct_list_popup_hide_cb, list);
+
+ clist_d->popup = popup;
+ evas_object_show(popup);
+ return list;
+}
+
+static inline void list_ug_handle_select_number(ct_list_data *clist_d, int contact_id)
+{
+ GSList *list=NULL;
+ CTSstruct *contact = NULL;
+ int ret = contacts_svc_get_contact(contact_id, &contact);
+ p_retm_if(ret<CTS_SUCCESS, "contacts_svc_get_contact() Failed(%d)", ret);
+
+ contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &list);
+
+ if (list) {
+ if (1 == g_slist_length(list)) {
+ if (PH_UG_REQUEST_LAUNCH_VOICECALL == clist_d->ug_request)
+ phone_launch_voice_call(contact_id, contacts_svc_value_get_str(list->data, CTS_NUM_VAL_NUMBER_STR));
+ else {
+ int num_id = contacts_svc_value_get_int(list->data, CTS_NUM_VAL_ID_INT);
+ phone_ug_return_id(clist_d->ug, contact_id, num_id, 0);
+ ug_destroy_me(clist_d->ug);
+ }
+ }
+ else
+ list_ug_create_popup_values_list(CTS_VALUE_NUMBER, clist_d, contact_id, list);
+ }
+ else {
+ phone_show_popup(clist_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_NO_NUMBER), 1.5);
+ }
+ contacts_svc_struct_free(contact);
+}
+
+static inline void list_ug_handle_select_email(ct_list_data *clist_d, int contact_id)
+{
+ GSList *list=NULL;
+ CTSstruct *contact = NULL;
+ int ret = contacts_svc_get_contact(contact_id, &contact);
+ p_retm_if(ret<CTS_SUCCESS, "contacts_svc_get_contact() Failed(%d)", ret);
+
+ contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &list);
+
+ if (list) {
+ if (1 == g_slist_length(list)) {
+ int email_id = contacts_svc_value_get_int(list->data, CTS_EMAIL_VAL_ID_INT);
+ phone_ug_return_id(clist_d->ug, contact_id, 0, email_id);
+ ug_destroy_me(clist_d->ug);
+ }
+ else
+ list_ug_create_popup_values_list(CTS_VALUE_EMAIL, clist_d, contact_id, list);
+ }
+ else {
+ phone_show_popup(clist_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_NO_EMAIL), 1.5);
+ }
+ contacts_svc_struct_free(contact);
+}
+
+static inline void ct_list_ug_handle_select_vcard(ct_list_data *clist_d, int contact_id)
+{
+ bool result = false;
+ char vcard_path[PH_TEXT_SHORT_LEN];
+
+ result = ct_list_make_vcard(contact_id, vcard_path, sizeof(vcard_path));
+ PH_DBG("%d, %s", contact_id, vcard_path);
+ if(result == true) {
+ phone_ug_return_vcard(clist_d->ug, contact_id, vcard_path);
+ ug_destroy_me(clist_d->ug);
+ }
+ else {
+ phone_show_popup(clist_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_NO_CONTACTS), 1.5);
+ }
+}
+
+static void list_ug_img_crop_result(ui_gadget_h ug, service_h service, void *data)
+{
+ ct_list_data *clist_d = data;
+
+ p_retm_if(NULL == ug || NULL == data, "ug or data is NULL");
+
+ if (service) {
+ char *normal = NULL;
+ char *full = NULL;
+
+ service_get_extra_data(service, "crop_image_path", &normal);
+ p_retm_if(!normal, "return value is NULL.\n");
+ contacts_svc_save_image(CTS_IMG_NORMAL, clist_d->selected_contact, (char *)normal);
+
+ service_get_extra_data(service, "image_path", &full);
+ contacts_svc_save_image(CTS_IMG_FULL, clist_d->selected_contact, (char *)full);
+
+ free(normal);
+ free(full);
+ }
+
+ ug_destroy(ug);
+ clist_d->child_ug = NULL;
+ ug_destroy_me(clist_d->ug);
+}
+
+void ct_list_ug_handle_check_for_number(Elm_Object_Item *item, ct_list_data *clist_d)
+{
+ int ret;
+ GSList *list =NULL;
+ ct_contact_list *ct_info;
+ CTSstruct* contact;
+ Evas_Object *list_nums;
+ Eina_Bool all_check;
+
+ ct_info = elm_object_item_data_get(item);
+ p_retm_if(NULL == ct_info, "elm_object_item_data_get() return NULL");
+
+ ret = contacts_svc_get_contact(ct_info->id, &contact);
+ p_retm_if(ret<CTS_SUCCESS, "contacts_svc_get_contact() Failed(%d)", ret);
+
+ contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &list);
+
+ if (NULL == list) {
+ Evas_Object *check;
+ ERR("contacts_svc_struct_get_list() return NULL");
+ contacts_svc_struct_free(contact);
+ phone_show_popup(clist_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_NO_NUMBER), 1.5);
+
+ ct_info->checked = EINA_FALSE;
+ clist_d->cnt_checked--;
+
+ check = elm_object_part_content_get(clist_d->select_all_layout, "elm.icon");
+ p_retm_if(NULL == check, "elm_object_part_content_get() return NULL");
+
+ if (clist_d->cnt_total == clist_d->cnt_checked)
+ all_check = EINA_TRUE;
+ else
+ all_check = EINA_FALSE;
+
+ elm_check_state_set(check, all_check);
+ elm_genlist_item_update(item);
+ return;
+ }
+
+ if (1 == g_slist_length(list)) {
+ ct_info->id_ret = contacts_svc_value_get_int(list->data, CTS_NUM_VAL_ID_INT);
+ ct_list_edit_update_selection_info(clist_d);
+ }
+ else {
+ list_nums = list_ug_create_popup_values_list(CTS_VALUE_NUMBER, clist_d, ct_info->id, list);
+ p_retm_if(NULL == list, "list_ug_create_popup_values_list() return NULL");
+ evas_object_data_set(list_nums, "item", item);
+ }
+
+ contacts_svc_struct_free(contact);
+}
+
+void ct_list_ug_handle_check_for_email(Elm_Object_Item *item, ct_list_data *clist_d)
+{
+ int ret;
+ GSList *list = NULL;
+ CTSstruct *contact;
+ Evas_Object *list_emails;
+ ct_contact_list *ct_info;
+ Eina_Bool all_check;
+
+ ct_info = elm_object_item_data_get(item);
+ p_retm_if(NULL == ct_info, "elm_object_item_data_get() return NULL");
+
+ ret = contacts_svc_get_contact(ct_info->id, &contact);
+ p_retm_if(ret<CTS_SUCCESS, "contacts_svc_get_contact() Failed(%d)", ret);
+
+ contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &list);
+
+ if (NULL == list) {
+ Evas_Object *check;
+ ERR("contacts_svc_struct_get_list() return NULL");
+ contacts_svc_struct_free(contact);
+ phone_show_popup(clist_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_NO_EMAIL), 1.5);
+ ct_info->checked = EINA_FALSE;
+ clist_d->cnt_checked--;
+
+ check = elm_object_part_content_get(clist_d->select_all_layout, "elm.icon");
+ p_retm_if(NULL == check, "elm_object_part_content_get() return NULL");
+
+ if (clist_d->cnt_total == clist_d->cnt_checked)
+ all_check = EINA_TRUE;
+ else
+ all_check = EINA_FALSE;
+
+ elm_check_state_set(check, all_check);
+ elm_genlist_item_update(item);
+ return;
+ }
+
+ if (1 == g_slist_length(list)) {
+ ct_info->id_ret = contacts_svc_value_get_int(list->data, CTS_EMAIL_VAL_ID_INT);
+ ct_list_edit_update_selection_info(clist_d);
+ }
+ else {
+ list_emails = list_ug_create_popup_values_list(CTS_VALUE_EMAIL, clist_d, ct_info->id, list);
+ p_retm_if(NULL == list_emails, "list_ug_create_popup_values_list() return NULL");
+ evas_object_data_set(list_emails, "item", item);
+ }
+
+ contacts_svc_struct_free(contact);
+
+}
+
+static int idx_temp;
+static int list_sel_vcard(const char *vcard_stream, void *data)
+{
+ Evas_Object *content;
+ ct_list_data *clist_d = data;
+
+ if (++idx_temp != clist_d->idx_vcard)
+ return CTS_SUCCESS;
+
+ content = ctui_contacts_viewer(clist_d->win, clist_d->navi, 0, vcard_stream);
+ if (NULL == content) {
+ ERR("ctui_contacts_viewer() return NULL");
+ elm_exit();
+ }
+ return CTS_ERR_FAIL;
+}
+
+static void list_destory_child_ug(ui_gadget_h ug, void *priv)
+{
+ ct_list_data *clist_d = priv;
+ p_retm_if(NULL == ug, "ug is NULL");
+ ug_destroy(ug);
+
+ p_retm_if(NULL == priv, "priv is NULL");
+ clist_d->child_ug = NULL;
+}
+
+void ct_list_ug_gl_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ const char *err_msg;
+ struct ug_cbs cbs = {0};
+ CTSvalue *value;
+ ct_list_data *clist_d = data;
+ ct_contact_list *contact;
+ ph_view_info *view_info;
+ Elm_Object_Item *item = event_info;
+ Evas_Object *popup;
+
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+
+ if (CT_GET_LIST_VCARD == clist_d->list_op && CT_UG_REQUEST_CHECK != clist_d->ug_request) {
+ p_retm_if(NULL == clist_d->vcard_path, "vcard_path is NULL");
+
+ contact = elm_object_item_data_get(item);
+ p_retm_if(NULL == contact, "elm_object_item_data_get() returns NULL");
+
+ idx_temp = 0;
+ clist_d->idx_vcard = contact->id;
+
+ contacts_svc_vcard_foreach(clist_d->vcard_path, list_sel_vcard, clist_d);
+ return;
+ }
+
+ PH_DBG("%d", clist_d->ug_request);
+
+ if (CT_LIST_MODE_EDIT == clist_d->list_mode) {
+ contact = elm_object_item_data_get(item);
+ p_retm_if(NULL == contact, "elm_object_item_data_get() returns NULL");
+
+ contact->checked = !contact->checked;
+ ct_list_item_checked_set(item, clist_d);
+ if (!contact->checked) {
+ ct_list_edit_update_selection_info(clist_d);
+ return;
+ }
+
+ if (CT_UG_REQUEST_CHECK_FOR_NUMBER == clist_d->ug_request)
+ ct_list_ug_handle_check_for_number(item, clist_d);
+ else if (CT_UG_REQUEST_CHECK_FOR_EMAIL == clist_d->ug_request)
+ ct_list_ug_handle_check_for_email(item, clist_d);
+ else
+ ct_list_edit_update_selection_info(clist_d);
+
+ return;
+ }
+
+ contact = elm_object_item_data_get(item);
+ p_retm_if(NULL == contact, "elm_object_item_data_get() returns NULL");
+
+ switch (clist_d->ug_request) {
+ case CT_UG_REQUEST_LIST:
+ case CT_UG_REQUEST_LIST_WITH_BACK:
+ ret = ctui_create_detail_view(clist_d, contact);
+ p_warn_if(ret < 0, "ctui_create_detail_view() Failed");
+ break;
+ case CT_UG_REQUEST_SELECT_CONTACT:
+ if (clist_d->ug) {
+ phone_ug_return_id(clist_d->ug, contact->id, 0, 0);
+ ug_destroy_me(clist_d->ug);
+ clist_d->ug = NULL;
+ }
+ break;
+ case CT_UG_REQUEST_SELECT_NUMBER:
+ case PH_UG_REQUEST_LAUNCH_VOICECALL:
+ list_ug_handle_select_number(clist_d, contact->id);
+ break;
+ case CT_UG_REQUEST_SELECT_EMAIL:
+ list_ug_handle_select_email(clist_d, contact->id);
+ break;
+ case CT_UG_REQUEST_SELECT_VCARD:
+ ct_list_ug_handle_select_vcard(clist_d, contact->id);
+ break;
+ case CT_UG_REQUEST_UPDATE_CONTACT:
+ case CT_UG_REQUEST_UPDATE_WITH_NUM:
+ case CT_UG_REQUEST_UPDATE_WITH_EMAIL:
+ case CT_UG_REQUEST_UPDATE_WITH_WEB:
+ view_info = calloc(1, sizeof(ph_view_info));
+ phone_set_view_info(view_info, clist_d->win, clist_d->navi, clist_d->ug, clist_d->ug_request, clist_d->cnt_max, clist_d->ug_data);
+ ctui_list_update_with_data(view_info, clist_d, contact->id, clist_d->base_grp, clist_d->base_ab);
+ free(view_info);
+ break;
+ case PH_UG_REQUEST_SET_WITH_IMG:
+ case CT_UG_REQUEST_SAVE_IMG:
+ clist_d->selected_contact = contact->id;
+
+ cbs.result_cb = list_ug_img_crop_result;
+ cbs.destroy_cb = list_destory_child_ug;
+ cbs.priv = clist_d;
+ clist_d->child_ug = phone_image_crop_ug(clist_d->ug, clist_d->ug_data, &cbs);
+ break;
+ case PH_UG_REQUEST_SET_WITH_RINGTONE:
+ case CT_UG_REQUEST_SAVE_RINGTONE:
+ value = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO);
+
+ err_msg = S_(CT_SYS_POP_SUCCESS);
+ if (value) {
+ contacts_svc_value_set_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR, clist_d->ug_data);
+ ret = contacts_svc_put_contact_value(CTS_PUT_VAL_REPLACE_RINGTONE, contact->id, value);
+ contacts_svc_value_free(value);
+ if (CTS_SUCCESS != ret) {
+ ERR("contacts_svc_put_contact_value() Failed(%d)", ret);
+ if (CTS_ERR_DB_LOCK == ret)
+ err_msg = T_(CT_GET_TEXT_ERR, CTTEXT_ERR_DB_LOCKED);
+ else if (CTS_ERR_NO_SPACE == ret)
+ err_msg = S_(CT_SYS_POP_NOT_ENOUGH_MEMORY);
+ else
+ err_msg = S_(PH_SYS_POP_FAILED);
+ break;
+ }
+ }
+ else
+ err_msg = S_(PH_SYS_POP_FAILED);
+
+ popup = phone_show_popup(clist_d->navi, err_msg, 1.5);
+ evas_object_smart_callback_add(popup, "timeout", ctui_list_ug_hide_cb, clist_d->ug);
+ break;
+ default:
+ ERR("Invalid ug_request(%d)", clist_d->ug_request);
+ break;
+ }
+}
+
diff --git a/lib/list/ct-list-view-ug.h b/lib/list/ct-list-view-ug.h
new file mode 100644
index 0000000..572be7e
--- /dev/null
+++ b/lib/list/ct-list-view-ug.h
@@ -0,0 +1,25 @@
+/*
+ * 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.
+ */
+
+#ifndef __CONTACTS_LIST_VIEW_UG_H__
+#define __CONTACTS_LIST_VIEW_UG_H__
+
+void ct_list_ug_gl_sel(void *data, Evas_Object *obj, void *event_info);
+void ct_list_ug_handle_check_for_email(Elm_Object_Item *item, ct_list_data *clist_d);
+void ct_list_ug_handle_check_for_number(Elm_Object_Item *item, ct_list_data *clist_d);
+
+#endif //__CONTACTS_LIST_VIEW_UG_H__
+