diff options
Diffstat (limited to 'lib/list')
-rwxr-xr-x | lib/list/CMakeLists.txt | 18 | ||||
-rw-r--r-- | lib/list/contacts-list-efl.xml | 29 | ||||
-rwxr-xr-x | lib/list/ct-list-contact-view.c | 359 | ||||
-rwxr-xr-x | lib/list/ct-list-contact-view.h | 22 | ||||
-rwxr-xr-x | lib/list/ct-list-edit-view.c | 562 | ||||
-rwxr-xr-x | lib/list/ct-list-edit-view.h | 28 | ||||
-rwxr-xr-x | lib/list/ct-list-main.c | 514 | ||||
-rwxr-xr-x | lib/list/ct-list-utils.c | 514 | ||||
-rwxr-xr-x | lib/list/ct-list-utils.h | 31 | ||||
-rwxr-xr-x | lib/list/ct-list-view-ug.c | 505 | ||||
-rw-r--r-- | lib/list/ct-list-view-ug.h | 25 |
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__ + |