diff options
author | Sunggoo Kim <sung.goo.kim@samsung.com> | 2012-08-21 18:17:42 +0900 |
---|---|---|
committer | Sunggoo Kim <sung.goo.kim@samsung.com> | 2012-08-21 18:17:42 +0900 |
commit | 41b2478dc578156bb904201f8f6e2d9d35c26f9f (patch) | |
tree | 88f4757f2e2bf498b67889f0901bf9f0fcb13057 /lib/details | |
parent | e9d80f84b140bb86fe9e7bc025ec1de25f6b1cad (diff) | |
download | phone-contacts-41b2478dc578156bb904201f8f6e2d9d35c26f9f.tar.gz phone-contacts-41b2478dc578156bb904201f8f6e2d9d35c26f9f.tar.bz2 phone-contacts-41b2478dc578156bb904201f8f6e2d9d35c26f9f.zip |
migration
Diffstat (limited to 'lib/details')
-rwxr-xr-x | lib/details/CMakeLists.txt | 24 | ||||
-rw-r--r-- | lib/details/contacts-details-efl.xml | 29 | ||||
-rwxr-xr-x | lib/details/ct-detail-history.c | 665 | ||||
-rwxr-xr-x | lib/details/ct-detail-history.h | 32 | ||||
-rwxr-xr-x | lib/details/ct-detail-main.c | 420 | ||||
-rwxr-xr-x | lib/details/ct-detail-utils.c | 1261 | ||||
-rwxr-xr-x | lib/details/ct-detail-utils.h | 69 | ||||
-rwxr-xr-x | lib/details/ct-detail-view.c | 1833 | ||||
-rwxr-xr-x | lib/details/ct-detail-view.h | 32 | ||||
-rwxr-xr-x | lib/details/ct-input-change-name.c | 147 | ||||
-rwxr-xr-x | lib/details/ct-input-change-name.h | 24 | ||||
-rwxr-xr-x | lib/details/ct-input-num-email.c | 1125 | ||||
-rwxr-xr-x | lib/details/ct-input-num-email.h | 24 | ||||
-rwxr-xr-x | lib/details/ct-input-utils.c | 997 | ||||
-rwxr-xr-x | lib/details/ct-input-utils.h | 53 | ||||
-rwxr-xr-x | lib/details/ct-input-view.c | 2634 | ||||
-rwxr-xr-x | lib/details/ct-input-view.h | 24 |
17 files changed, 9393 insertions, 0 deletions
diff --git a/lib/details/CMakeLists.txt b/lib/details/CMakeLists.txt new file mode 100755 index 0000000..26cc19f --- /dev/null +++ b/lib/details/CMakeLists.txt @@ -0,0 +1,24 @@ +LINK_DIRECTORIES(${CMAKE_BINARY_DIR}) + +SET(TARGET ${CT_DETAILS}) + +FILE(GLOB SRCS *.c) + +INCLUDE(FindPkgConfig) +pkg_check_modules(details_pkgs REQUIRED icu-i18n) + +FOREACH(flag ${details_pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +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} ${details_pkgs_LDFLAGS}) + +ADD_DEPENDENCIES(${TARGET} contacts_edj_build detail_theme_edj_build) + +INSTALL(TARGETS ${TARGET} DESTINATION ${UGLIBDIR}) + +INSTALL(FILES ${CMAKE_BINARY_DIR}/lib/details/contacts-details-efl.xml DESTINATION "/usr/share/packages") diff --git a/lib/details/contacts-details-efl.xml b/lib/details/contacts-details-efl.xml new file mode 100644 index 0000000..eb768ce --- /dev/null +++ b/lib/details/contacts-details-efl.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns="http://tizen.org/ns/packages" package="contacts-details-efl" version="0.1.0-0" install-location="internal-only"> + <label>contacts-details-efl</label> + <author email="ensung.park@samsung.com" href="www.samsung.com">ensung park</author> + <description>contacts-details-efl Application</description> + <ui-application appid="contacts-details-efl" exec="/opt/ug/bin/contacts-details-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/details/ct-detail-history.c b/lib/details/ct-detail-history.c new file mode 100755 index 0000000..9bac296 --- /dev/null +++ b/lib/details/ct-detail-history.c @@ -0,0 +1,665 @@ +/* + * 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 "phone.h" +#include "ct-detail-history.h" +#include "ct-detail-utils.h" +#include "ct-detail-view.h" + +typedef struct +{ + int plog_id; + int plog_type; + int plog_time; + int plog_duration; + int plog_msgid; + int group_index; + char *plog_number; + char *plog_shortmsg; + Eina_Bool checked; +}ct_detail_history_info; + +enum HISTORY_ITC_TYPE { + HISTORY_ITC_NUM_UTIL_BTN = 0, + HISTORY_ITC_RCS_NUM_UTIL_BTN = 1, + HISTORY_ITC_HISTORY = 2, + HISTORY_ITC_DATE = 3, + HISTORY_ITC_SELECT_ALL = 4, + HISTORY_ITC_MAX, +}; + +static Elm_Genlist_Item_Class history_itcs[] = { + {.item_style="detail.3icon"}, + {.item_style="detail.5icon"}, + {.item_style="history_list"}, + {.item_style="grouptitle"}, + {.item_style="dialogue/bg/1icon"}, +}; + +static PTHREAD_FN detail_history_check_del(void *data) +{ + ct_detail_data *cdetail_d = data; + ph_progress_info *p_info = cdetail_d->p_info; + Eina_List *l; + ct_detail_history_info *l_info; + + EINA_LIST_FOREACH(cdetail_d->list, l, l_info) { + if (!p_info->alive) { + p_info->completed = true; + break; + } + if (!l_info) continue; + + if (TRUE == l_info->checked) { + if (CTS_SUCCESS != contacts_svc_delete_phonelog(CTS_PLOG_DEL_BY_ID, l_info->plog_id)) { + p_info->completed = true; + break; + } + p_info->cnt++; + } + if (p_info->cnt == p_info->cnt_checked_total) + break; + } + + pthread_exit(NULL); +} + +static Eina_Bool detail_history_check_del_timer(void *data) +{ + ct_detail_data *cdetail_d = data; + ph_progress_info *p_info = cdetail_d->p_info; + + p_retvm_if(NULL == p_info, ECORE_CALLBACK_CANCEL, "parameter(ph_progress_info) is NULL"); + + if (!p_info->completed) { + char count[PH_TEXT_SHORT_LEN]; + char percent[5]; + double value = (double)p_info->cnt / (double)p_info->cnt_checked_total; + + 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 (p_info->cnt == p_info->cnt_checked_total) { + message = S_(PH_SYS_POP_DELETED); + ret = contacts_svc_end_trans(true); + } + else { + message = S_(PH_SYS_POP_FAILED); + ret = contacts_svc_end_trans(false); + } + + if (ret < CTS_SUCCESS) { + ERR("contacts_svc_end_trans() Failed(%d)", ret); + message = S_(PH_SYS_POP_FAILED); + } + + evas_object_del(cdetail_d->popup); + cdetail_d->popup = NULL; + + if (NULL != p_info) { + free(p_info); + cdetail_d->p_info = NULL; + } + + elm_genlist_decorate_mode_set(cdetail_d->history_genlist, EINA_FALSE); + cdetail_d->view_mode = DETAIL_VIEW_MODE_HISTORY; + phone_show_tickernoti(message); + + return ECORE_CALLBACK_CANCEL; + } +} + +void ct_detail_history_del_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + ct_detail_data *cdetail_d = data; + ph_progress_info *p_info; + + p_info = calloc(1, sizeof(ph_progress_info)); + p_retm_if(NULL == p_info, "calloc return NULL"); + + cdetail_d->p_info = p_info; + p_info->cnt_checked_total = cdetail_d->cnt_checked; + p_info->alive = true; + + ret = contacts_svc_begin_trans(); + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_begin_trans() Failed(%d)", ret); + free(p_info); + cdetail_d->p_info = NULL; + return; + } + + ret = pthread_create(&p_info->thread, NULL, detail_history_check_del, cdetail_d); + if (0 != ret) { + ERR("Thread creation failed(%d)", ret); + free(p_info); + cdetail_d->p_info = NULL; + + ret = contacts_svc_end_trans(false); + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans(%d) Failed", ret); + return; + } + + p_info->timer = ecore_timer_add(0.2, detail_history_check_del_timer, cdetail_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); + cdetail_d->p_info = NULL; + + ret = contacts_svc_end_trans(false); + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans(%d) Failed", ret); + return; + } + + cdetail_d->popup = phone_progressbar_popup(cdetail_d->win, p_info, T_(PH_GET_TEXT_BASIC, PHTEXT_DELETING_LOGS)); +} + +static void detail_history_all_items_checked_set(Eina_List *list, + Eina_Bool checked) +{ + Eina_List *l; + ct_detail_history_info *info; + + EINA_LIST_FOREACH(list, l, info) { + if (NULL == info) { + ERR("elm_object_item_data_get() return NULL"); + continue; + } + info->checked = checked; + } +} + +static void detail_history_check_update_selection_info(ct_detail_data *cdetail_d) +{ + if (cdetail_d->cnt_checked == 0) + phone_hide_notify(cdetail_d->navi); + else { + char info_text[PH_TEXT_SHORT_LEN]={0}; + snprintf(info_text, sizeof(info_text), "%s (%d)", S_(PH_SYS_POP_SELECTED), + cdetail_d->cnt_checked); + phone_show_notify(cdetail_d->navi, info_text); + } +} + +static void detail_history_check_update_button_status(ct_detail_data *cdetail_d) +{ + Eina_Bool disabled; + p_retm_if(NULL == cdetail_d, "parameter is NULL"); + p_retm_if(NULL == cdetail_d->ctrl_item, "ctrl_item is NULL"); + + if (0 == cdetail_d->list_count) + disabled = EINA_TRUE; + else if (cdetail_d->history_genlist && elm_genlist_decorate_mode_get(cdetail_d->history_genlist)) { + if (0 < cdetail_d->cnt_checked) + disabled = EINA_FALSE; + else + disabled = EINA_TRUE; + } + else + disabled = EINA_FALSE; + + elm_object_item_disabled_set(cdetail_d->ctrl_item, disabled); +} + +static void detail_history_check_select_all(void *data, Eina_Bool checked) +{ + Eina_List *l; + Elm_Object_Item *item; + ct_detail_history_info *l_info; + ct_detail_data *cdetail_d = data; + + if (checked) + cdetail_d->cnt_checked = cdetail_d->list_count; + else + cdetail_d->cnt_checked = 0; + + EINA_LIST_FOREACH(cdetail_d->list, l, l_info) { + if (!l_info) continue; + l_info->checked = checked; + } + + item = elm_genlist_item_next_get(cdetail_d->select_all_item); + while (item) { + elm_genlist_item_update(item); + item = elm_genlist_item_next_get(item); + } + + detail_history_check_update_selection_info(cdetail_d); + detail_history_check_update_button_status(cdetail_d); +} + +void ct_detail_history_edit_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_detail_data *cdetail_d = data; + elm_genlist_decorate_mode_set(cdetail_d->history_genlist, EINA_TRUE); + if (cdetail_d->util_item) { + elm_object_item_del(cdetail_d->util_item); + cdetail_d->util_item = NULL; + } + + cdetail_d->select_all_item = elm_genlist_item_insert_after(cdetail_d->history_genlist, &history_itcs[HISTORY_ITC_SELECT_ALL], + cdetail_d, NULL, cdetail_d->base_item, ELM_GENLIST_ITEM_NONE, NULL, NULL); + ct_detail_set_navi(cdetail_d, DETAIL_VIEW_MODE_CHECK); +} + +static void detail_history_insert_util_btn(Evas_Object *genlist, ct_detail_data *cdetail_d) +{ + CTSvalue *value; + GSList *list; + CTSstruct *contact = cdetail_d->contact; + list = NULL; + + contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &list); + + value = ct_detail_get_default_number(list); + if (value) { + cdetail_d->util_item = elm_genlist_item_insert_after(genlist, &history_itcs[HISTORY_ITC_NUM_UTIL_BTN], value, + NULL, cdetail_d->base_item, ELM_GENLIST_ITEM_NONE, NULL, NULL); +#ifdef _CT_RCS + cdetail_d->util_item = elm_genlist_item_insert_after(genlist, &history_itcs[HISTORY_ITC_RCS_NUM_UTIL_BTN], value, + NULL, cdetail_d->base_item, ELM_GENLIST_ITEM_NONE, NULL, NULL); +#endif + } +} + +void ct_detail_history_cancel_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_detail_data *cdetail_d = data; + phone_hide_notify(cdetail_d->navi); + if (!cdetail_d->util_item) + detail_history_insert_util_btn(cdetail_d->history_genlist, cdetail_d); + if (cdetail_d->select_all_item) { + elm_object_item_del(cdetail_d->select_all_item); + cdetail_d->select_all_item = NULL; + } + detail_history_all_items_checked_set(cdetail_d->list, EINA_FALSE); + elm_genlist_decorate_mode_set(cdetail_d->history_genlist, EINA_FALSE); + ct_detail_set_navi(cdetail_d, DETAIL_VIEW_MODE_HISTORY); +} + +static void detail_history_append_separate_date_index(ct_detail_data *cdetail_d, void *data, int index) +{ + ct_detail_history_info *l_info = data; + int type = phone_detail_log_get_date_type(l_info->plog_time, l_info->plog_duration); + + if (0 == index || cdetail_d->pre_date_type != type) { + cdetail_d->pre_date_type = type; + l_info->group_index = type; + elm_genlist_item_append(cdetail_d->history_genlist, &history_itcs[HISTORY_ITC_DATE], data, NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL); + } +} + +static void detail_history_gl_sel(void *data, Evas_Object *obj, void *event_info) +{ + Elm_Object_Item *item = event_info; + ct_detail_history_info *l_info = data; + ct_detail_data *cdetail_d = evas_object_data_get(obj, "cdetail_d"); + + elm_genlist_item_selected_set(item, EINA_FALSE); + + if (elm_genlist_decorate_mode_get(cdetail_d->history_genlist)) { + l_info->checked = !l_info->checked; + if (l_info->checked) + cdetail_d->cnt_checked++; + else + cdetail_d->cnt_checked--; + + elm_genlist_item_fields_update(event_info, "elm.edit.icon.1", ELM_GENLIST_ITEM_FIELD_CONTENT); + + if (cdetail_d->select_all_layout) { + Evas_Object *check; + check = elm_object_part_content_get(cdetail_d->select_all_layout, "elm.icon"); + if (cdetail_d->cnt_checked == cdetail_d->list_count) + elm_check_state_set(check, EINA_TRUE); + else + elm_check_state_set(check, EINA_FALSE); + } + detail_history_check_update_selection_info(cdetail_d); + detail_history_check_update_button_status(cdetail_d); + } +} + +static void detail_history_fill_genlist(ct_detail_data *cdetail_d) +{ + Evas_Object *genlist; + Eina_List *l; + int count; + ct_detail_history_info *l_info; + + if (NULL == cdetail_d->history_genlist) { + genlist = elm_genlist_add(cdetail_d->layout); + elm_object_style_set(genlist, "dialogue"); + elm_object_theme_set(genlist, cdetail_d->th); + cdetail_d->history_genlist = genlist; + evas_object_data_set(genlist, "cdetail_d", cdetail_d); + } + else { + genlist = cdetail_d->history_genlist; + elm_genlist_clear(genlist); + } + + cdetail_d->base_item = elm_genlist_item_append(genlist, ct_detail_get_baseinfo_item_class(cdetail_d->contact), cdetail_d, NULL, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + detail_history_insert_util_btn(genlist, cdetail_d); + count = 0; + EINA_LIST_FOREACH(cdetail_d->list, l, l_info) { + detail_history_append_separate_date_index(cdetail_d, l_info, count); + elm_genlist_item_append(genlist, &history_itcs[HISTORY_ITC_HISTORY], l_info, NULL, + ELM_GENLIST_ITEM_NONE, detail_history_gl_sel, l_info); + count++; + } +} + +static void detail_history_check_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_detail_data *cdetail_d = data; + + if (elm_check_state_get(obj)) + cdetail_d->cnt_checked++; + else + cdetail_d->cnt_checked--; + + if (cdetail_d->select_all_layout) { + Evas_Object *check; + check = elm_object_part_content_get(cdetail_d->select_all_layout, "elm.icon"); + if (cdetail_d->cnt_checked == cdetail_d->list_count) + elm_check_state_set(check, EINA_TRUE); + else + elm_check_state_set(check, EINA_FALSE); + } + detail_history_check_update_selection_info(cdetail_d); + detail_history_check_update_button_status(cdetail_d); +} + +static char* detail_history_gl_sep_date_label_get(void *data, Evas_Object *obj, const char *part) +{ + ct_detail_history_info * history_info = data; + const char *when; + int index = history_info->group_index; + + if (0 == strcmp(part, "elm.text")) { + char *date_temp; + ct_detail_data *cdetail_d; + + if (0 == index) + when = S_(PH_SYS_BODY_TODAY); + else if (1 == index) + when = S_(PH_SYS_BODY_YESTERDAY); + else + when = S_(PH_SYS_BODY_PREVIOUS); + + cdetail_d = evas_object_data_get(obj, "cdetail_d"); + date_temp = phone_detail_log_get_date(cdetail_d->hformatter, history_info->plog_time); + if (date_temp) { + char buf[PATH_MAX]={0}; + snprintf(buf, sizeof(buf), " %s (%s)", when, date_temp); + free(date_temp); + return strdup(buf); + } + else + return strdup(when); + } + else + return NULL; +} + +static Evas_Object *detail_history_gl_select_all_icon_get(void *data, Evas_Object *obj, + const char *part) +{ + Evas_Object *check; + ct_detail_data *cdetail_d = data; + + p_retvm_if(NULL == cdetail_d, NULL, "evas_object_data_get() return NULL"); + if (0 == strcmp(part, "elm.icon")) { + cdetail_d->select_all_layout = phone_create_select_all(cdetail_d->history_genlist, S_(PH_SYS_BODY_SELECT_ALL), detail_history_check_select_all, cdetail_d); + check = elm_object_part_content_get(cdetail_d->select_all_layout, "elm.icon"); + if (cdetail_d->cnt_checked == cdetail_d->list_count) + elm_check_state_set(check, EINA_TRUE); + return cdetail_d->select_all_layout; + } + return NULL; +} + +static void detail_history_gl_select_all_del(void *data, Evas_Object *obj) +{ + ct_detail_data *cdetail_d = data; + cdetail_d->select_all_layout = NULL; +} + + +static Evas_Object *detail_history_gl_icon_get(void *data, Evas_Object *obj, const char *part) +{ + ct_detail_history_info * l_detail_info = data; + char buf[PATH_MAX]={0}; + Evas_Object *ic; + + if (0 == strcmp(part, "elm.icon.2")) { + char *made_data = phone_detail_log_get_icon_type(l_detail_info->plog_type); + snprintf(buf, sizeof(buf), "%s", made_data); + free(made_data); + } + else if (0 == strcmp(part, "elm.icon.1")) { + char *made_data = phone_detail_log_get_icon_path_with_action(l_detail_info->plog_type); + snprintf(buf, sizeof(buf), "%s", made_data); + free(made_data); + } + else if (0 == strcmp(part, "elm.edit.icon.1")) { + ct_detail_data *cdetail_d = evas_object_data_get(obj, "cdetail_d"); + Evas_Object *check; + check = elm_check_add(obj); + p_retvm_if(NULL == check, NULL, "elm_check_add() return NULL"); + elm_check_state_pointer_set(check, &l_detail_info->checked); + evas_object_propagate_events_set(check, EINA_FALSE); + evas_object_smart_callback_add(check, "changed", detail_history_check_changed_cb, cdetail_d); + return check; + } + else + return NULL; + ic = elm_icon_add(obj); + p_retvm_if(NULL == ic, NULL, "elm_icon_add() return NULL"); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + return ic; +} + +static char* detail_history_gl_label_get(void *data, Evas_Object *obj, const char *part) +{ + ct_detail_history_info * history_info = data; + ct_detail_data *cdetail_d; + char *time; + char *duration; + char buf[PATH_MAX] = {0}; + cdetail_d = evas_object_data_get(obj, "cdetail_d"); + + if (0 == strcmp(part, "elm.text.1")) { + return strdup(history_info->plog_number); + } + else if (0 == strcmp(part, "elm.text.2")) { + if (TRUE == phone_detail_log_is_call_ing_type(history_info->plog_type)) { + duration = phone_detail_log_get_duration_from_number(history_info->plog_duration); + snprintf(buf, sizeof(buf), "%s", duration); + free(duration); + return strdup(buf); + } + else if (TRUE == phone_detail_log_is_sms_type(history_info->plog_type) + || TRUE == phone_detail_log_is_mms_type(history_info->plog_type)) { + if (history_info->plog_shortmsg && *history_info->plog_shortmsg) { + snprintf(buf, sizeof(buf), "%s", history_info->plog_shortmsg); + return strdup(buf); + } + } + else if (TRUE == phone_detail_log_is_email_type(history_info->plog_type)) { + if (history_info->plog_shortmsg && *history_info->plog_shortmsg) { + snprintf(buf, sizeof(buf), "%s", history_info->plog_shortmsg); + return strdup(buf); + } + } + } + else if (0 == strcmp(part, "elm.text.3")) { + time = phone_detail_log_get_time(cdetail_d->hformatter, history_info->plog_time); + snprintf(buf, sizeof(buf), "%s", time); + free(time); + return strdup(buf); + } + return NULL; +} + +void ct_detail_history_create_itcs() +{ + history_itcs[HISTORY_ITC_SELECT_ALL].func.content_get = detail_history_gl_select_all_icon_get; + history_itcs[HISTORY_ITC_SELECT_ALL].func.del = detail_history_gl_select_all_del; + history_itcs[HISTORY_ITC_SELECT_ALL].decorate_all_item_style = NULL; + + history_itcs[HISTORY_ITC_NUM_UTIL_BTN].func.content_get = ct_detail_gl_number_util_icon_get; + + history_itcs[HISTORY_ITC_RCS_NUM_UTIL_BTN].func.content_get = ct_detail_gl_number_util_icon_get; + + history_itcs[HISTORY_ITC_DATE].func.text_get = detail_history_gl_sep_date_label_get; + + history_itcs[HISTORY_ITC_HISTORY].func.text_get = detail_history_gl_label_get; + history_itcs[HISTORY_ITC_HISTORY].func.content_get = detail_history_gl_icon_get; + history_itcs[HISTORY_ITC_HISTORY].decorate_all_item_style = "edit_default"; +} + +void ct_detail_history_load_data(ct_detail_data *cdetail_d) +{ + int ret; + CTSiter *iter; + int count = 0; + Eina_List *list = NULL; + + ret = contacts_svc_get_list_with_int(CTS_LIST_PLOG_OF_PERSON_ID, cdetail_d->person_id, &iter); + p_retm_if(CTS_SUCCESS != ret, "contacts_svc_get_list_with_int() Failed(%d)", ret); + + while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { + CTSvalue *plog = NULL; + char *msg = NULL; + char *number; + ct_detail_history_info *history_info = calloc(1, sizeof(ct_detail_history_info)); + plog = contacts_svc_iter_get_info(iter); + number = (char*)contacts_svc_value_get_str(plog, CTS_LIST_PLOG_NUMBER_STR); + history_info->plog_id = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_ID_INT); + history_info->plog_type = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_LOG_TYPE_INT); + history_info->plog_time = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_LOG_TIME_INT); + history_info->plog_duration = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_DURATION_INT); + history_info->plog_msgid = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_MSGID_INT); + history_info->plog_number = SAFE_STRDUP(number); + msg = (char *)contacts_svc_value_get_str(plog, CTS_LIST_PLOG_SHORTMSG_STR); + if (msg) { + int i; + char temp[PH_TEXT_MAX_LEN]; + for (i=0;i<strlen(msg);i++) { + if (msg[i] =='\n') + temp[i] = ' '; + else + temp[i] = msg[i]; + } + temp[i] = '\0'; + history_info->plog_shortmsg = strdup(temp); + } + list = eina_list_append(list, (void*)history_info); + count++; + contacts_svc_value_free(plog); + } + contacts_svc_iter_remove(iter); + cdetail_d->list = list; + cdetail_d->list_count = count; + + detail_history_fill_genlist(cdetail_d); +} + +static Eina_Bool detail_history_refresh_view(void *data) +{ + ct_detail_data *cdetail_d = data; + phone_hide_notify(cdetail_d->navi); + if (cdetail_d->select_all_item && DETAIL_VIEW_MODE_CHECK != cdetail_d->view_mode) { + elm_object_item_del(cdetail_d->select_all_item); + cdetail_d->select_all_item = NULL; + } + elm_genlist_clear(cdetail_d->history_genlist); + ct_detail_history_load_data(cdetail_d); + if (DETAIL_VIEW_MODE_HISTORY == cdetail_d->view_mode || DETAIL_VIEW_MODE_CHECK == cdetail_d->view_mode) + ct_detail_history_fill_layout(cdetail_d); + cdetail_d->idler = NULL; + return ECORE_CALLBACK_CANCEL; +} + +void ct_detail_history_changed_cb(void *data) +{ + ct_detail_data *cdetail_d = data; + if (cdetail_d->idler) { + ecore_idler_del(cdetail_d->idler); + cdetail_d->idler = NULL; + } + cdetail_d->idler = ecore_idler_add(detail_history_refresh_view, cdetail_d); +} + +void ct_detail_history_free_list(ct_detail_data *cdetail_d) +{ + ct_detail_history_info *l_info; + + EINA_LIST_FREE(cdetail_d->list, l_info) { + if (NULL == l_info) continue; + free(l_info->plog_number); + free(l_info->plog_shortmsg); + free(l_info); + } + cdetail_d->list = NULL; +} + +void ct_detail_history_fill_layout(ct_detail_data *cdetail_d) +{ + Evas_Object *content; + content = elm_object_part_content_unset(cdetail_d->layout, "elm.swallow.content"); + evas_object_hide(content); + if (0 < cdetail_d->list_count) + elm_object_part_content_set(cdetail_d->layout, "elm.swallow.content", cdetail_d->history_genlist); + else { + if (!cdetail_d->noc) { + Evas_Object *noc; + noc = phone_create_nocontents(cdetail_d->layout, T_(CT_GET_TEXT_BASIC, CTTEXT_NO_HISTORIES)); + p_retm_if(NULL == noc, "phone_create_nocontents() return NULL"); + cdetail_d->noc = noc; + evas_object_size_hint_weight_set(cdetail_d->noc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(cdetail_d->noc, EVAS_HINT_FILL, EVAS_HINT_FILL); + } + else + elm_object_part_text_set(cdetail_d->noc, "elm.text", T_(CT_GET_TEXT_BASIC, CTTEXT_NO_HISTORIES)); + evas_object_show(cdetail_d->noc); + elm_object_part_content_set(cdetail_d->layout, "elm.swallow.content", cdetail_d->noc); + } + ct_detail_set_navi(cdetail_d, DETAIL_VIEW_MODE_HISTORY); +} + diff --git a/lib/details/ct-detail-history.h b/lib/details/ct-detail-history.h new file mode 100755 index 0000000..7836b4b --- /dev/null +++ b/lib/details/ct-detail-history.h @@ -0,0 +1,32 @@ +/* + * 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_DETAIL_HISTORY_H__ +#define __CONTACTS_DETAIL_HISTORY_H__ + +#include "phone-common.h" + +void ct_detail_history_create_itcs(); +void ct_detail_history_load_data(ct_detail_data *cdetail_d); +void ct_detail_history_del_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info); +void ct_detail_history_edit_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info); +void ct_detail_history_cancel_btn_cb(void *data, Evas_Object *obj, void *event_info); +void ct_detail_history_changed_cb(void *data); +void ct_detail_history_free_list(ct_detail_data *cdetail_d); +void ct_detail_history_fill_layout(ct_detail_data *cdetail_d); + +#endif //__CONTACTS_DETAIL_HISTORY_H__ + diff --git a/lib/details/ct-detail-main.c b/lib/details/ct-detail-main.c new file mode 100755 index 0000000..1df1621 --- /dev/null +++ b/lib/details/ct-detail-main.c @@ -0,0 +1,420 @@ +/* + * 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-detail.h" +#include "ct-detail-utils.h" +#include "ct-detail-view.h" +#include "ct-input-view.h" +#include "ct-input-utils.h" + +static int create_ug_detail_view(Evas_Object *base, int request, ct_detail_data *cdetail_d) +{ + p_retvm_if(NULL == base, FALSE, "base is NULL"); + + cdetail_d->navi = elm_naviframe_add(base); + p_retvm_if (NULL == cdetail_d->navi, FALSE, "elm_naviframe_add() return NULL"); + elm_naviframe_prev_btn_auto_pushed_set(cdetail_d->navi, EINA_FALSE); + evas_object_show(cdetail_d->navi); + elm_object_part_content_set(base, "elm.swallow.content", cdetail_d->navi); + + cdetail_d->ug_detail = true; + if (CT_UG_REQUEST_DETAIL == request) { + Evas_Object *content; + + content = ct_detail_create_content(cdetail_d); + if (NULL == content) + return FALSE; + + cdetail_d->navi_item = elm_naviframe_item_push(cdetail_d->navi, + T_(CT_GET_TEXT_BASIC, CTTEXT_DETAILS), NULL, NULL, content, NULL); + ct_detail_set_navi(cdetail_d, DETAIL_VIEW_MODE_INFO); + } + else { + CTSstruct *contact_dup = NULL; + if (cdetail_d->contact) + contact_dup = contacts_svc_struct_duplicate(cdetail_d->contact); + ct_input_push_navi_content(cdetail_d, contact_dup, cdetail_d->contact_id); + } + + return TRUE; +} + +static void *detail_on_create(ui_gadget_h ug, enum ug_mode mode, + service_h service, void *priv) +{ + int ret, request; + Evas_Object *bg; + Evas_Object *base; + Evas_Object *parent; + ct_detail_data *cdetail_d = priv; + + p_retvm_if(NULL == ug || NULL == priv, NULL, + "The parameter is invalid(ug=%p, priv=%p)", ug, priv); + + cdetail_d->win = ug_get_window(); + parent = ug_get_parent_layout(ug); + p_retvm_if(NULL == parent, NULL, "ug_get_parent_layout() return NULL"); + cdetail_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); + + request = ct_detail_parse_bundle(service, cdetail_d); + if (-2 == request) { + 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_(PH_SYS_BODY_SELECTED_DATA_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, cdetail_d->ug); + return base; + } + p_retvm_if(request < 0, NULL, "ct_detail_parse_bundle() Failed(%d)", request); + + 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 (!create_ug_detail_view(base, request, cdetail_d)) { + evas_object_del(base); + ret = contacts_svc_disconnect(); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_disconnect() Failed(%d)", ret); + } + return base; +} + +static void detail_on_destroy(ui_gadget_h ug, service_h service, void *priv) +{ + int ret; + ct_detail_data *cdetail_d = priv; + p_retm_if(NULL == ug, "The parameter is invalid(ug=%p)", ug); + + if (cdetail_d && !cdetail_d->navi) + free(cdetail_d); + + evas_object_del(ug_get_layout(ug)); + ret = contacts_svc_disconnect(); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_disconnect() Failed(%d)", ret); +} + +static void detail_on_key_event(ui_gadget_h ug, enum ug_key_event event, service_h service, void *priv) +{ + PH_FN_CALL; + ct_detail_data *cdetail_d = priv; + + if (!ug) + return; + + switch (event) { + case UG_KEY_EVENT_END: + if (cdetail_d->popup) { + ct_detail_popup_hide_cb(cdetail_d, NULL, NULL); + } + else { + if (elm_naviframe_top_item_get(cdetail_d->navi) + == cdetail_d->navi_item) { + ug_destroy_me(ug); + } + else + elm_naviframe_item_pop(cdetail_d->navi); + } + break; + default: + break; + } +} + +static void detail_on_message(ui_gadget_h ug, service_h msg, service_h service, void *priv) +{ + char* val = NULL; + ct_detail_data *cdetail_d = priv; + + if (UG_MODE_FRAMEVIEW == ug_get_mode(ug)) { + if (msg) { + service_get_extra_data(service, "key_event", &val); + if (val && CTUG_MSG_KEY_END == atoi(val)) { + if (cdetail_d->popup) { + ct_detail_popup_hide_cb(cdetail_d, NULL, NULL); + } + else { + if (elm_naviframe_top_item_get(cdetail_d->navi) + == cdetail_d->navi_item) { + ug_destroy_me(ug); + } + else + elm_naviframe_item_pop(cdetail_d->navi); + } + } + free(val); + } + } +} + +static void detail_on_pause(ui_gadget_h ug, service_h service, void *priv) +{ + ct_detail_data *cdetail_d = priv; + cdetail_d->order_display = contacts_svc_get_order(CTS_ORDER_OF_DISPLAY); +} + +static void detail_on_resume(ui_gadget_h ug, service_h service, void *priv) +{ + ct_detail_data *cdetail_d = priv; + if (cdetail_d->order_display != contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) + ctui_detail_genlist_update(cdetail_d); +} + +static void detail_on_event(ui_gadget_h ug, enum ug_event event, service_h service, void *priv) +{ + Evas_Object *notify; + ct_detail_data *cdetail_d = priv; + + switch (event) { + case UG_EVENT_ROTATE_PORTRAIT: + case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN: + phone_resize_notify(cdetail_d->navi, 0); + evas_object_data_set(cdetail_d->navi, "phone_rotate", (void *)0); + notify = phone_get_notify(cdetail_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(cdetail_d->navi, 90); + evas_object_data_set(cdetail_d->navi, "phone_rotate", (void *)90); + notify = phone_get_notify(cdetail_d->navi); + elm_layout_theme_set(elm_object_content_get(notify), "standard", "selectioninfo", "horizontal/bottom_64"); + break; + default: + break; + } +} + + +API int UG_MODULE_INIT(struct ug_module_ops *ops) +{ + ct_detail_data *cdetail_d; + + p_retvm_if(!ops, -1, "ops is NULL"); + + cdetail_d = calloc(1, sizeof(ct_detail_data)); + p_retvm_if(!cdetail_d, -1, "UG data is NULL, Not enough memory"); + + ops->create = detail_on_create; + ops->start = NULL; + ops->pause = detail_on_pause; + ops->resume = detail_on_resume; + ops->destroy = detail_on_destroy; + ops->message = detail_on_message; + ops->event = detail_on_event; + ops->key_event = detail_on_key_event; + ops->priv = cdetail_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; +} + +API int ctui_create_detail_view(ct_list_data *clist_d, ct_contact_list *info) +{ + PH_FN_CALL; + PH_START_TIME_CHECK; + ct_detail_data *cdetail_d; + Evas_Object *content; + + cdetail_d = calloc(1, sizeof(ct_detail_data)); + p_retvm_if(!cdetail_d, -1, "cdetail_d is NULL, Not enough memory"); + + ctui_ld_to_dd(clist_d, cdetail_d); + cdetail_d->contact_id = info->id; + cdetail_d->person_id = info->id_person; + cdetail_d->titem = NULL; + cdetail_d->ctrl_item = NULL; + cdetail_d->contact = contacts_svc_struct_duplicate(info->contact); + + content = ct_detail_create_content(cdetail_d); + if (NULL == content) { + ERR("ct_detail_create_content() Failed"); + free(cdetail_d); + return -1; + } + + cdetail_d->navi_item = elm_naviframe_item_push(cdetail_d->navi, + T_(CT_GET_TEXT_BASIC, CTTEXT_DETAILS), NULL, NULL, content, NULL); + + ct_detail_set_navi(cdetail_d, DETAIL_VIEW_MODE_INFO); + + PH_END_TIME_CHECK(); + return 0; +} + +API int ctui_create_input_view(ct_detail_data *cdetail_d) +{ + CTSstruct *contact_dup = NULL; + PH_FN_CALL; + PH_START_TIME_CHECK; + + p_retvm_if(!cdetail_d, -1, "cdetail_d is NULL"); + + if (cdetail_d->contact) { + contact_dup = contacts_svc_struct_duplicate(cdetail_d->contact); + p_retvm_if(NULL == contact_dup, -1, "contacts_svc_struct_duplicate() return NULL"); + } + ct_input_push_navi_content(cdetail_d, contact_dup, cdetail_d->contact_id); + + PH_END_TIME_CHECK("ct_input_push_navi_content"); + return 0; +} + +API Evas_Object* ctui_contacts_viewer(Evas_Object *win, Evas_Object *navi, int ct_id, const char *vcard_stream) +{ + int ret; + ct_detail_data *cdetail_d; + Evas_Object *bg; + Evas_Object *base = NULL; + Evas_Object *content; + + cdetail_d = calloc(1, sizeof(ct_detail_data)); + p_retvm_if(!cdetail_d, NULL, "cdetail_d is NULL, Not enough memory"); + + cdetail_d->win = win; + if (navi) + cdetail_d->navi = navi; + else { + base = phone_create_base_layout(win, true); + cdetail_d->navi = elm_naviframe_add(base); + evas_object_show(cdetail_d->navi); + + bg = phone_create_bg(base); + if (NULL == bg) { + ERR("phone_create_bg() return NULL"); + evas_object_del(base); + free(cdetail_d); + return NULL; + } + elm_object_style_set(bg, "group_list"); + } + + if (ct_id) { + cdetail_d->is_shortcut = true; + cdetail_d->contact_id = ct_id; + cdetail_d->person_id = ctui_get_person_id(ct_id); + ret = contacts_svc_get_contact(ct_id, &(cdetail_d->contact)); + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_get_contact() Failed(%d)", ret); + if (base) + evas_object_del(base); + free(cdetail_d); + return NULL; + } + } + else { + cdetail_d->vcard = (char *)vcard_stream; + ret = contacts_svc_get_contact_from_vcard(vcard_stream, &(cdetail_d->contact)); + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_get_contact_from_vcard() Failed(%d)", ret); + if (base) + evas_object_del(base); + free(cdetail_d); + return NULL; + } + } + + if (cdetail_d->contact_id <= 0) + cdetail_d->base_ab = -1; + + content = ct_detail_create_content(cdetail_d); + if (NULL == content) { + ERR("ct_detail_create_content() Failed"); + if (base) + evas_object_del(base); + ret = contacts_svc_struct_free(cdetail_d->contact); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_struct_free() Failed(%d)", ret); + free(cdetail_d); + return NULL; + } + + cdetail_d->navi_item = elm_naviframe_item_push(cdetail_d->navi, + T_(CT_GET_TEXT_BASIC, CTTEXT_DETAILS), NULL, NULL, content, NULL); + + if (ct_id) + ct_detail_set_navi(cdetail_d, DETAIL_VIEW_MODE_INFO); + else + ct_detail_set_navi(cdetail_d, DETAIL_VIEW_MODE_VCARD); + + if (navi) + return navi; + else { + elm_object_part_content_set(base, "elm.swallow.content", cdetail_d->navi); + evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, base); + evas_object_show(base); + return base; + } +} + +API int ctui_create_detail_view_from_phone(Evas_Object *win, Evas_Object *navi, ui_gadget_h ug, int id) +{ + PH_FN_CALL; + PH_START_TIME_CHECK; + ct_detail_data *cdetail_d; + Evas_Object *content; + + cdetail_d = calloc(1, sizeof(ct_detail_data)); + p_retvm_if(!cdetail_d, -1, "cdetail_d is NULL, Not enough memory"); + + cdetail_d->win = win; + cdetail_d->navi = navi; + cdetail_d->ug = ug; + cdetail_d->prev_navi_item = elm_naviframe_top_item_get(navi); + cdetail_d->contact_id = id; + cdetail_d->person_id = ctui_get_person_id(id); + + content = ct_detail_create_content(cdetail_d); + if (NULL == content) { + ERR("ct_detail_create_content() Failed"); + free(cdetail_d); + return -1; + } + + cdetail_d->navi_item = elm_naviframe_item_push(cdetail_d->navi, + T_(CT_GET_TEXT_BASIC, CTTEXT_DETAILS), NULL, NULL, content, NULL); + + ct_detail_set_navi(cdetail_d, DETAIL_VIEW_MODE_INFO); + + PH_END_TIME_CHECK(); + return 0; +} diff --git a/lib/details/ct-detail-utils.c b/lib/details/ct-detail-utils.c new file mode 100755 index 0000000..648a463 --- /dev/null +++ b/lib/details/ct-detail-utils.c @@ -0,0 +1,1261 @@ +/* + * 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 <fcntl.h> +#include <vconf.h> +#include <Ecore_X.h> +#include <ui-gadget-module.h> + +#include "phone.h" +#include "ct-list.h" +#include "ct-detail.h" +#include "ct-detail-view.h" +#include "ct-detail-utils.h" + +int ct_detail_parse_bundle(service_h service, ct_detail_data* cdetail_d) +{ + int type = CT_UG_REQUEST_DETAIL; + char* val = NULL; + + if (service) { + service_get_extra_data(service, CT_UG_BUNDLE_TYPE, &val); + if (val) type = atoi(val); + PH_DBG("type = %d", type); + free(val); + + switch (type) { + case CT_UG_REQUEST_DETAIL: + val = NULL; + service_get_extra_data(service, CT_UG_BUNDLE_ID, &val); + if (val) { + cdetail_d->contact_id = atoi(val); + cdetail_d->person_id = ctui_get_person_id(cdetail_d->contact_id); + free(val); + break; + } + + val = NULL; + service_get_extra_data(service, CT_UG_BUNDLE_VCARD, &val); + if (val) { + if(ct_detail_load_vcard_contact(cdetail_d, val) < 0) + PH_DBG("ct_detail_load_vcard_contact fail"); + free(val); + break; + } + break; + case CT_UG_REQUEST_EDIT: + val = NULL; + service_get_extra_data(service, CT_UG_BUNDLE_ID, &val); + if (val) { + cdetail_d->contact_id = atoi(val); + cdetail_d->person_id = ctui_get_person_id(cdetail_d->contact_id); + free(val); + } + //number + val = NULL; + service_get_extra_data(service, CT_UG_BUNDLE_NUM, &val); + if (val) { + if (NULL == cdetail_d->contact) { + int ret; + ret = contacts_svc_get_contact(cdetail_d->contact_id, &(cdetail_d->contact)); + if(ret != CTS_SUCCESS) + ERR("contacts_svc_get_contact %d", cdetail_d->contact_id); + } + GSList *nums = NULL; + CTSvalue *num = contacts_svc_value_new(CTS_VALUE_NUMBER); + //contacts_svc_value_set_int(num, CTS_NUM_VAL_TYPE_INT, CTS_NUM_TYPE_CELL); + contacts_svc_value_set_str(num, CTS_NUM_VAL_NUMBER_STR, val); + nums = g_slist_append(nums, num); + contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_NUMBER_LIST, nums); + g_slist_free(nums); + free(val); + } + + //email + val = NULL; + service_get_extra_data(service, CT_UG_BUNDLE_EMAIL, &val); + if (val) { + if (NULL == cdetail_d->contact) { + int ret; + ret = contacts_svc_get_contact(cdetail_d->contact_id, &(cdetail_d->contact)); + if(ret != CTS_SUCCESS) + ERR("contacts_svc_get_contact %d", cdetail_d->contact_id); + } + GSList *emails = NULL; + CTSvalue *email = contacts_svc_value_new(CTS_VALUE_EMAIL); + contacts_svc_value_set_int(email, CTS_EMAIL_VAL_TYPE_INT, CTS_EMAIL_TYPE_HOME); + contacts_svc_value_set_str(email, CTS_EMAIL_VAL_ADDR_STR, val); + emails = g_slist_append(emails, email); + contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_EMAIL_LIST, emails); + g_slist_free(emails); + free(val); + } + //url + val = NULL; + service_get_extra_data(service, CT_UG_BUNDLE_WEB, &val); + if (val) { + if (NULL == cdetail_d->contact) { + int ret; + ret = contacts_svc_get_contact(cdetail_d->contact_id, &(cdetail_d->contact)); + if(ret != CTS_SUCCESS) + ERR("contacts_svc_get_contact %d", cdetail_d->contact_id); + } + GSList *webs = NULL; + CTSvalue *web = contacts_svc_value_new(CTS_VALUE_WEB); + contacts_svc_value_set_int(web, CTS_WEB_VAL_TYPE_INT, CTS_WEB_TYPE_HOME); + contacts_svc_value_set_str(web, CTS_WEB_VAL_ADDR_STR, val); + webs = g_slist_append(webs, web); + contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_WEB_ADDR_LIST, webs); + g_slist_free(webs); + free(val); + } + break; + case CT_UG_REQUEST_ADD: + val = NULL; + service_get_extra_data(service, CT_UG_BUNDLE_VCARD, &val); + if (val) { + contacts_svc_get_contact_from_vcard(val, &(cdetail_d->contact)); + free(val); + break; + } + + //number + val = NULL; + service_get_extra_data(service, CT_UG_BUNDLE_NUM, &val); + if (val) { + if (NULL == cdetail_d->contact) { + cdetail_d->contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT); + } + GSList *nums = NULL; + CTSvalue *num = contacts_svc_value_new(CTS_VALUE_NUMBER); + //contacts_svc_value_set_int(num, CTS_NUM_VAL_TYPE_INT, CTS_NUM_TYPE_CELL); + contacts_svc_value_set_str(num, CTS_NUM_VAL_NUMBER_STR, val); + nums = g_slist_append(nums, num); + contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_NUMBER_LIST, nums); + g_slist_free(nums); + free(val); + } + + //email + val = NULL; + service_get_extra_data(service, CT_UG_BUNDLE_EMAIL, &val); + if (val) { + if (NULL == cdetail_d->contact) { + cdetail_d->contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT); + } + GSList *emails = NULL; + CTSvalue *email = contacts_svc_value_new(CTS_VALUE_EMAIL); + contacts_svc_value_set_int(email, CTS_EMAIL_VAL_TYPE_INT, CTS_EMAIL_TYPE_HOME); + contacts_svc_value_set_str(email, CTS_EMAIL_VAL_ADDR_STR, val); + emails = g_slist_append(emails, email); + contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_EMAIL_LIST, emails); + g_slist_free(emails); + free(val); + } + + //url + val = NULL; + service_get_extra_data(service, CT_UG_BUNDLE_WEB, &val); + if (val) { + if (NULL == cdetail_d->contact) { + cdetail_d->contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT); + } + GSList *webs = NULL; + CTSvalue *web = contacts_svc_value_new(CTS_VALUE_WEB); + contacts_svc_value_set_int(web, CTS_WEB_VAL_TYPE_INT, CTS_WEB_TYPE_HOME); + contacts_svc_value_set_str(web, CTS_WEB_VAL_ADDR_STR, val); + webs = g_slist_append(webs, web); + contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_WEB_ADDR_LIST, webs); + g_slist_free(webs); + free(val); + } + break; + case CT_UG_REQUEST_ADD_WITH_NUM: + val = NULL; + service_get_extra_data(service, CT_UG_BUNDLE_NUM, &val); + if (val) { + if (NULL == cdetail_d->contact) + cdetail_d->contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT); + GSList *nums = NULL; + CTSvalue *num = contacts_svc_value_new(CTS_VALUE_NUMBER); + contacts_svc_value_set_int(num, CTS_NUM_VAL_TYPE_INT, CTS_NUM_TYPE_CELL); + contacts_svc_value_set_str(num, CTS_NUM_VAL_NUMBER_STR, val); + nums = g_slist_append(nums, num); + contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_NUMBER_LIST, nums); + g_slist_free(nums); + } + free(val); + break; + case CT_UG_REQUEST_ADD_WITH_EMAIL: + val = NULL; + service_get_extra_data(service, CT_UG_BUNDLE_EMAIL, &val); + if (val) { + if (NULL == cdetail_d->contact) + cdetail_d->contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT); + GSList *emails = NULL; + CTSvalue *email = contacts_svc_value_new(CTS_VALUE_EMAIL); + contacts_svc_value_set_int(email, CTS_EMAIL_VAL_TYPE_INT, CTS_EMAIL_TYPE_HOME); + contacts_svc_value_set_str(email, CTS_EMAIL_VAL_ADDR_STR, val); + emails = g_slist_append(emails, email); + contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_EMAIL_LIST, emails); + g_slist_free(emails); + } + free(val); + break; + case CT_UG_REQUEST_ADD_WITH_WEB: + val = NULL; + service_get_extra_data(service, CT_UG_BUNDLE_WEB, &val); + if (val) { + if (NULL == cdetail_d->contact) + cdetail_d->contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT); + GSList *webs = NULL; + CTSvalue *web = contacts_svc_value_new(CTS_VALUE_WEB); + contacts_svc_value_set_int(web, CTS_WEB_VAL_TYPE_INT, CTS_WEB_TYPE_HOME); + contacts_svc_value_set_str(web, CTS_WEB_VAL_ADDR_STR, val); + webs = g_slist_append(webs, web); + contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_WEB_ADDR_LIST, webs); + g_slist_free(webs); + } + free(val); + break; + } + } + + // FIXME : improve performance + if (cdetail_d->contact_id) { + int ret; + CTSstruct *contact; + ret = contacts_svc_get_contact(cdetail_d->contact_id, &contact); + p_retvm_if(ret != CTS_SUCCESS, -2, "contact id is not valid"); + contacts_svc_struct_free(contact); + } + return type; +} + +static inline bool detail_is_usable_char(char c) +{ + switch (c) { + case '\\': + case '/': + case ':': + case '*': + case '?': + case '\"': + case '<': + case '>': + case '|': + case ';': + return false; + default: + return true; + } +} + +static inline bool detail_is_blank_str(char *display) +{ + int i; + for (i = 0 ; i < strlen(display); i++) + if (' ' != display[i]) return false; + return true; +} + +static void detail_get_vcard_filepath(ct_detail_data *cdetail_d, char* path_buf, int buf_size) +{ + int ret; + char display[PH_TEXT_MAX_LEN]; + char temp[PH_TEXT_MAX_LEN]; + CTSvalue *name; + + temp[0] = '\0'; + ret = contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_NAME_VALUE, &name); + if (CTS_SUCCESS == ret) + ctui_get_display_name(name, temp, sizeof(temp)); + + display[0] = '\0'; + if (*temp) { + int i; + int idx = 0; + for (i = 0 ; i < strlen(temp); i++) { + if (detail_is_usable_char(temp[i])) + display[idx++] = temp[i]; + } + display[idx] = '\0'; + } + + if ('\0' == display[0] || detail_is_blank_str(display)) { + snprintf(display, sizeof(display), "%s", T_(CT_GET_TEXT_ERR, CTTEXT_NONAME)); + } + snprintf(path_buf, buf_size, "%s/%s.vcf", UGDATAIDR, display); +} + +static int detail_make_vcard(ct_detail_data *cdetail_d, char *path_buf, int buf_size) +{ + int ret, fd; + char* vcard; + + detail_get_vcard_filepath(cdetail_d, path_buf, buf_size); + p_retvm_if(NULL == path_buf, FALSE, "detail_get_vcard_filepath() return NULL"); + + ret = contacts_svc_get_vcard_from_contact(cdetail_d->contact, &vcard); + p_retvm_if(NULL == vcard, FALSE, + "contacts_svc_get_vcard_from_contact() Failed(%d)", ret); + + fd = open(path_buf, O_WRONLY|O_CREAT|O_TRUNC, 0644); + if (fd < 0) { + ERR("Open(%s) Failed", path_buf); + free(vcard); + return FALSE; + } + + if (-1 == write(fd, vcard, strlen(vcard))) + ERR("write()... Failed(%s)", strerror(errno)); + close(fd); + + free(vcard); + return TRUE; +} + +void ct_detail_delete_namecards(ct_detail_data *cdetail_d) +{ + int ret; + int fd; + char file_path[FILENAME_MAX]; + + detail_get_vcard_filepath(cdetail_d, file_path, sizeof(file_path)); + + fd = open(file_path, O_RDONLY); + if (fd < 0) return; + + close(fd); + + ret = unlink(file_path); + p_warn_if(ret < 0, "unlink(%s) failed(%d)", file_path, ret); +} + +static void __detail_destroy_child_ug(ui_gadget_h ug, void *priv) +{ + ct_detail_data *cdetail_d = priv; + p_retm_if(NULL == priv, "priv is NULL"); + p_retm_if(NULL == cdetail_d->child_ug, "ug is NULL"); + + ug_destroy(cdetail_d->child_ug); + cdetail_d->child_ug = NULL; +} + +static void detail_destroy_child_ug(void *priv) +{ + ct_detail_data *cdetail_d = priv; + p_retm_if(NULL == priv, "priv is NULL"); + p_retm_if(NULL == cdetail_d->child_ug, "ug is NULL"); + + ug_destroy(cdetail_d->child_ug); + cdetail_d->child_ug = NULL; +} + +void* ct_detail_email_ug(ui_gadget_h parent, const char *to, const char *attach, + void(*destroy_cb)(void *), void *cb_param) +{ + struct ug_cbs cbs = {0}; + ui_gadget_h ug; + service_h service; + + service_create(&service); + service_add_extra_data(service, "RUN_TYPE", "5"); + + if (to) + service_add_extra_data(service, "TO", to); + + if (attach) { + service_add_extra_data(service, "ATTACHMENT", attach); + service_add_extra_data(service, "SUBJECT", "Contacts name card"); + } + + cbs.layout_cb = ug_common_layout_cb; + cbs.result_cb = NULL; + cbs.destroy_cb = __detail_destroy_child_ug; + cbs.priv = NULL; + + ug = ug_create(parent, EMAIL_COMPOSER_UG, UG_MODE_FULLVIEW, service, &cbs); + p_warn_if(NULL == ug, "ug_create() Failed"); + + service_destroy(service); + return ug; +} + +void ct_detail_make_vcard(ct_detail_data *cdetail_d) +{ + int ret; + char file_path[FILENAME_MAX] = {0,}; + + ret = detail_make_vcard(cdetail_d, file_path, sizeof(file_path)); + if(TRUE != ret) + cdetail_d->vcard = NULL; + else + cdetail_d->vcard = strdup(file_path); + PH_DBG("vcf path %s", file_path); +} + +void ct_detail_send_via_msg(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + char file_path[FILENAME_MAX]; + ct_detail_data *cdetail_d = data; + + ret = detail_make_vcard(cdetail_d, file_path, sizeof(file_path)); + p_retm_if(TRUE != ret, "detail_make_vcard() Failed"); + + cdetail_d->child_ug = ctui_msg_ug(cdetail_d->ug, NULL, 0, file_path, detail_destroy_child_ug, cdetail_d); + ct_detail_popup_hide_cb(cdetail_d, NULL, NULL); +} + +void ct_detail_send_via_email(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + char file_path[FILENAME_MAX]; + ct_detail_data *cdetail_d = data; + + ret = detail_make_vcard(cdetail_d, file_path, sizeof(file_path)); + p_retm_if(TRUE != ret, "detail_make_vcard() Failed"); + + cdetail_d->child_ug = ct_detail_email_ug(cdetail_d->ug, NULL, file_path, + detail_destroy_child_ug, cdetail_d); + ct_detail_popup_hide_cb(cdetail_d, NULL, NULL); +} + +void ct_detail_send_via_bluetooth(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + service_h service; + ct_detail_data *cdetail_d = data; + char file_path[FILENAME_MAX]; + struct ug_cbs cbs = {0}; + + ret = detail_make_vcard(cdetail_d, file_path, sizeof(file_path)); + p_retm_if(TRUE != ret, "detail_make_vcard() Failed"); + + service_create(&service); + service_add_extra_data(service, "launch-type", "send"); + service_add_extra_data(service, "filecount", "1"); + service_add_extra_data(service, "files", file_path); + + cbs.layout_cb = ug_common_layout_cb; + cbs.result_cb = NULL; + cbs.destroy_cb = __detail_destroy_child_ug; + cbs.priv = NULL; + + cdetail_d->child_ug = ug_create(cdetail_d->ug, BLUETOOTH_UG, UG_MODE_FULLVIEW, service, &cbs); + + service_destroy(service); + ct_detail_popup_hide_cb(cdetail_d, NULL, NULL); +} + +void ct_detail_get_nicknames(CTSvalue *value, char *dest, int dest_len) +{ + int ret; + char temp[dest_len]; + const char* nickname = NULL; + + p_ret_if(NULL == dest); + + nickname = contacts_svc_value_get_str(value, CTS_NICKNAME_VAL_NAME_STR); + if (NULL == nickname) return; + + if (*dest) { + ret = snprintf(temp, dest_len, "%s, %s", dest, nickname); + if (0 < ret) + memcpy(dest, temp, ret+1); + } + else { + snprintf(dest, dest_len, "%s", nickname); + } +} + +void ct_detail_get_company_str(CTSvalue *value, char *dest, int dest_len) +{ + int ret; + const char *company, *job, *department; + char temp[dest_len]; + + p_ret_if(NULL == dest); + + company = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_NAME_STR); + department = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_DEPARTMENT_STR); + job = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_JOB_TITLE_STR); + + if (company) + snprintf(dest, dest_len, "%s", company); + + if (department) { + if (*dest) { + ret = snprintf(temp, dest_len, "%s, %s", dest, department); + if (0 < ret) + memcpy(dest, temp, ret+1); + } + else { + snprintf(dest, dest_len, "%s", department); + } + } + + if (job) { + if (*dest) { + ret = snprintf(temp, dest_len, "%s, %s", dest, job); + if (0 < ret) + memcpy(dest, temp, ret+1); + } + else { + snprintf(dest, dest_len, "%s", job); + } + } +} + +CTSvalue* ct_detail_get_default_number(GSList *list) +{ + GSList *cursor; + CTSvalue* ret_val; + + p_retvm_if(NULL == list, NULL, "parameter(GSList) is NULL"); + + ret_val = list->data; + + for (cursor=list;cursor;cursor=cursor->next) { + if (contacts_svc_value_get_bool(cursor->data, CTS_NUM_VAL_DEFAULT_BOOL)) { + ret_val = cursor->data; + break; + } + } + + return ret_val; +} + +void ct_detail_get_first_mid_last_name(CTSvalue *value, char *dest, int dest_len) +{ + const char *first, *last, *mid; + + first = contacts_svc_value_get_str(value, CTS_NAME_VAL_FIRST_STR); + last = contacts_svc_value_get_str(value, CTS_NAME_VAL_LAST_STR); + mid = contacts_svc_value_get_str(value, CTS_NAME_VAL_ADDITION_STR); + + if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) + snprintf(dest, dest_len, "%s%s%s%s%s", SAFE_STR(first), STR_BLANK(first, mid), STR_BLANK(mid, last)); + else + snprintf(dest, dest_len, "%s%s%s%s%s", SAFE_STR(last), STR_BLANK(first, mid), STR_BLANK(mid, first)); +} + +void ct_detail_get_extra_name(CTSstruct *contact, char *dest, int dest_len) +{ + CTSvalue *value; + GSList *list; + const char *suffix; + + contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &value); + if (value) { + suffix = contacts_svc_value_get_str(value, CTS_NAME_VAL_SUFFIX_STR); + if (suffix) + snprintf(dest, dest_len, "%s", suffix); + } + contacts_svc_struct_get_list(contact, CTS_CF_NICKNAME_LIST, &list); + if (list) + ct_detail_get_nicknames(list->data, dest, dest_len); +} + +char *ct_detail_gl_base_info_label_get(void *data, Evas_Object *obj, const char *part) +{ + char display[PH_TEXT_MAX_LEN]; + CTSvalue *value; + const char *display_name = NULL; + ct_detail_data *cdetail_d = data; + p_retvm_if(NULL == cdetail_d, NULL, "parameter(cdetail_d) is NULL"); + + display[0] = '\0'; + value = NULL; + + if (0 == strcmp(part, "elm.text.name")) { + contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_NAME_VALUE, &value); + if (value) { + ct_detail_get_first_mid_last_name(value, display, sizeof(display)); + if (*display) + return strdup(display); + + display_name = contacts_svc_value_get_str(value, CTS_NAME_VAL_DISPLAY_STR); + if (display_name) + return strdup(display_name); + } + } + else if (0 == strcmp(part, "elm.text.subname")) { + ct_detail_get_extra_name(cdetail_d->contact, display, sizeof(display)); + if (*display) + return strdup(display); + + contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_COMPANY_VALUE, &value); + if (value) + ct_detail_get_company_str(value, display, sizeof(display)); + return strdup(display); + } + else if (0 == strcmp(part, "elm.text.subname2")) { + contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_COMPANY_VALUE, &value); + if (value) + ct_detail_get_company_str(value, display, sizeof(display)); + return strdup(display); + } + return NULL; +} + + +static bool detail_set_favorite(CTSstruct *contact, int contact_id, bool is_set) +{ + int ret; + CTSvalue *baseinfo; + + if (is_set) + ret = contacts_svc_set_favorite(CTS_FAVOR_CONTACT, contact_id); + else + ret = contacts_svc_unset_favorite(CTS_FAVOR_CONTACT, contact_id); + p_retvm_if(CTS_SUCCESS != ret, false, "contacts_svc_set(unset)_favorite() failed(%d)", ret); + + ret = contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &baseinfo); + p_retvm_if(CTS_SUCCESS != ret, false, "contacts_svc_struct_get_value() Failed(%d)", ret); + + ret = contacts_svc_value_set_bool(baseinfo, CTS_BASE_VAL_FAVORITE_BOOL, is_set); + p_retvm_if(CTS_SUCCESS != ret, false, "contacts_svc_value_set_bool() Failed(%d)", ret); + + return true; +} + +static void detail_favorite_mouseup_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + int ret; + bool is_favorite; + bool success; + int x,y,w,h; + CTSvalue *baseinfo; + const char* result_msg; + ct_detail_data *cdetail_d = data; + Elm_Object_Item *item_baseinfo; + Evas_Event_Mouse_Up *ev = event_info; + + p_retm_if(NULL == cdetail_d, "evas_object_data_get() return NULL"); + + if (ev && ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) + return; + + evas_object_geometry_get(obj, &x, &y, &w, &h); + if (ev->output.y < y || y + h < ev->output.y || ev->output.x < x || x + w < ev->output.x) + return; + + ret = contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_BASE_INFO_VALUE, &baseinfo); + p_retm_if(CTS_SUCCESS != ret, "contacts_svc_struct_get_value() Failed(%d)", ret); + + is_favorite = !contacts_svc_value_get_bool(baseinfo, CTS_BASE_VAL_FAVORITE_BOOL); + success = detail_set_favorite(cdetail_d->contact, cdetail_d->person_id, is_favorite); + + if (is_favorite && success) + result_msg = S_(CT_SYS_POP_ADDED); + else if (!is_favorite && success) + result_msg = S_(PH_SYS_POP_REMOVED); + else + result_msg = S_(PH_SYS_POP_FAILED); + + phone_show_tickernoti(result_msg); + + item_baseinfo = evas_object_data_get(cdetail_d->genlist, "base_info"); + p_retm_if(NULL == item_baseinfo, "evas_object_data_get() return NULL"); + + elm_genlist_item_update(item_baseinfo); +} + +Evas_Object *ct_detail_gl_base_info_icon_get(void *data, Evas_Object *obj, + const char *part) +{ + int ret; + CTSvalue *base_info; + ct_detail_data *cdetail_d = data; + + ret = contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_BASE_INFO_VALUE, &base_info); + p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_struct_get_value() Failed(%d)", ret); + + if (0 == strcmp(part, "elm.icon.image")) { + const char *value_data; + Evas_Object *img; + + value_data = contacts_svc_value_get_str(base_info, CTS_BASE_VAL_IMG_PATH_STR); + if (NULL == value_data) + value_data = ctui_get_default_contact_img(CT_VIEW_DETAIL); + img = elm_image_add(obj); + p_retvm_if(NULL == img, NULL, "elm_image_add() return NULL"); + evas_object_size_hint_aspect_set(img, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + elm_image_file_set(img, value_data, NULL); + + return img; + } + else if (0 == strcmp(part, "elm.icon.favorite")) { + Evas_Object *icon; + + icon = elm_icon_add(obj); + p_retvm_if(NULL == icon, NULL, "elm_icon_add() return NULL"); + + evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_UP, detail_favorite_mouseup_cb, cdetail_d); + elm_icon_resizable_set(icon, EINA_FALSE, EINA_FALSE); + + if (!contacts_svc_value_get_bool(base_info, CTS_BASE_VAL_FAVORITE_BOOL)) + elm_icon_file_set(icon, CTUI_IMG_ICON_FAVORITE, NULL); + else + elm_icon_file_set(icon, CTUI_IMG_ICON_FAVORITE_ON, NULL); + + return icon; + } + return NULL; +} + +Evas_Object *ct_detail_gl_number_util_icon_get(void *data, Evas_Object *obj, + const char *part) +{ + char *fullpath; + const char *number; + CTSvalue *value = data; + ct_detail_data *cdetail_d; + Evas_Object *btn; + Evas_Object *icon; + Evas_Smart_Cb clicked_fn; + + p_retv_if(NULL == data, NULL); + + if (0 == strcmp(part, "elm.icon.1")) { + fullpath = PH_IMG_ICON_CALL; + clicked_fn = ct_detail_voice_call_cb; + } + else if (0 == strcmp(part, "elm.icon.2")) { + fullpath = PH_IMG_ICON_MESSAGE; + clicked_fn = ct_detail_msg_ug_cb; + } + else if (0 == strcmp(part, "elm.icon.3")) { + return NULL; + } +#ifdef _CT_RCS + else if (0 == strcmp(part, "elm.icon.4")) { + fullpath = PH_IMG_ICON_CHAT_ON; + clicked_fn = ct_detail_chat_on_cb; + } + else if (0 == strcmp(part, "elm.icon.5")) { + fullpath = PH_IMG_ICON_FILETRANSFER; + clicked_fn = ct_detail_filetransfer_cb; + } +#endif + else { + return NULL; + } + + cdetail_d = evas_object_data_get(obj, "cdetail_d"); + p_retvm_if(NULL == cdetail_d, NULL, "evas_object_data_get() return NULL"); + + + if(cdetail_d->ug) + clicked_fn = NULL; + + number = contacts_svc_value_get_str(value, CTS_NUM_VAL_NUMBER_STR); + + btn = elm_button_add(obj); + p_retvm_if(NULL == btn, NULL, "elm_button_add() return NULL"); + + icon = elm_icon_add(btn); + p_retvm_if(NULL == icon, NULL, "phone_create_icon_with_img() return NULL"); + elm_icon_resizable_set(icon, EINA_FALSE, EINA_FALSE); + elm_icon_file_set(icon, fullpath, NULL); + elm_object_part_content_set(btn, "icon", icon); + + evas_object_data_set(btn, "cdetail_d", cdetail_d); + evas_object_smart_callback_add(btn, "clicked", clicked_fn, number); + + return btn; +} + +void ct_detail_msg_ug_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_detail_data *cdetail_d; + + cdetail_d = evas_object_data_get(obj, "cdetail_d"); + p_retm_if(NULL == cdetail_d, "evas_object_data_get() return NULL"); + + if (cdetail_d->popup) + ct_detail_popup_hide_cb(cdetail_d, NULL, NULL); + cdetail_d->child_ug = ctui_msg_ug(cdetail_d->ug, data, cdetail_d->contact_id, NULL, + detail_destroy_child_ug, cdetail_d); +} + +void ct_detail_voice_call_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_detail_data *cdetail_d; + + cdetail_d = evas_object_data_get(obj, "cdetail_d"); + p_retm_if(NULL == cdetail_d, "evas_object_data_get() return NULL"); + + if (cdetail_d->popup) + ct_detail_popup_hide_cb(cdetail_d, NULL, NULL); + + phone_launch_voice_call(cdetail_d->contact_id, data); +} + +#ifdef _CT_RCS +void ct_detail_chat_on_cb(void *data, Evas_Object *obj, void *event_info) +{ + // FIXME : need to fill +} + +void ct_detail_filetransfer_cb(void *data, Evas_Object *obj, void *event_info) +{ + // FIXME : need to fill +} +#endif + +void ct_detail_popup_hide_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_detail_data *cdetail_d = data; + evas_object_del(cdetail_d->popup); + cdetail_d->popup = NULL; +} + +const char* ct_detail_get_ringtone_display_name(const char *real_data) +{ + const char *data; + + if (NULL == real_data) + data = T_(CT_GET_TEXT_BASIC, CTTEXT_DEFAULT); + else { + data = strrchr(real_data, '/'); + if (NULL == data) + data = real_data; + else + data = data + 1; + } + return data; +} + +static void detail_refresh_view(ct_detail_data *cdetail_d) +{ + PH_FN_CALL; + int ret; + + contacts_svc_struct_free(cdetail_d->contact); + cdetail_d->contact = NULL; + + if (cdetail_d->contact_id) { + g_slist_free(cdetail_d->person_list); + cdetail_d->person_list = ct_detail_get_person_list(cdetail_d->person_id); + + contacts_svc_begin_trans(); + cdetail_d->view_creat_ver = contacts_svc_end_trans(true); + + ret = contacts_svc_get_person(cdetail_d->person_id, &(cdetail_d->contact)); + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_get_person() Failed(%d)", ret); + elm_naviframe_item_pop(cdetail_d->navi); + return; + } + } + else { + ret = contacts_svc_get_contact_from_vcard(cdetail_d->vcard, &(cdetail_d->contact)); + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_get_contact_from_vcard() Failed(%d)", ret); + elm_exit(); + } + } + ctui_detail_genlist_update(cdetail_d); +} + +void ct_detail_contacts_changed(void *user_data) +{ + PH_FN_CALL; + int changed_id; + int id_ab, ret, type = 0; + bool changed = false; + CTSiter *iter; + CTSvalue *value; + ct_detail_data *cdetail_d = user_data; + + contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_BASE_INFO_VALUE, &value); + id_ab = contacts_svc_value_get_int(value, CTS_BASE_VAL_ADDRESSBOOK_ID_INT); + + if (!cdetail_d->person_list || g_slist_length(cdetail_d->person_list) <= 1) { + ret = contacts_svc_get_updated_contacts(id_ab, cdetail_d->view_creat_ver, &iter); + p_retm_if(CTS_SUCCESS != ret, "contacts_svc_get_updated_contacts() Failed(%d)", ret); + + while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { + value = contacts_svc_iter_get_info(iter); + changed_id = contacts_svc_value_get_int(value, CTS_LIST_CHANGE_ID_INT); + + if (changed_id == cdetail_d->contact_id) { + changed = true; + type = contacts_svc_value_get_int(value, CTS_LIST_CHANGE_TYPE_INT); + contacts_svc_value_free(value); + break; + } + contacts_svc_value_free(value); + } + contacts_svc_iter_remove(iter); + } + else { + GSList *cursor; + + contacts_svc_get_updated_contacts(0, cdetail_d->view_creat_ver, &iter); + while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { + value = contacts_svc_iter_get_info(iter); + changed_id = contacts_svc_value_get_int(value, CTS_LIST_CHANGE_ID_INT); + for (cursor=cdetail_d->person_list;cursor;cursor=cursor->next) { + if (changed_id == (int)cursor->data) { + changed = true; + type = contacts_svc_value_get_int(value, CTS_LIST_CHANGE_TYPE_INT); + contacts_svc_value_free(value); + break; + } + } + if (changed) + break; + contacts_svc_value_free(value); + } + contacts_svc_iter_remove(iter); + } + + p_ret_if(!changed); + + if (cdetail_d->updated) + cdetail_d->updated = false; + + if (CTS_OPERATION_DELETED == type) { + if (cdetail_d->is_shortcut) + elm_exit(); + else if (NULL == cdetail_d->prev_view_data && cdetail_d->ug) + ug_destroy_me(cdetail_d->ug); + else + elm_naviframe_item_pop_to(cdetail_d->prev_navi_item); + } + else { + detail_refresh_view(cdetail_d); + } +} + +void ct_detail_link_changed(void *user_data) +{ + int exist = false; + GSList *person_list, *cur1, *cur2; + ct_detail_data *cdetail_d = user_data; + + p_retm_if(NULL == cdetail_d, "parameter(cdetail_d) is NULL"); + + person_list = ct_detail_get_person_list(cdetail_d->person_id); + + if (NULL == person_list || g_slist_length(person_list) != g_slist_length(cdetail_d->person_list)) + detail_refresh_view(cdetail_d); + + /* compare person list and old person list */ + for (cur1=person_list;cur1;cur1=cur1->next) { + exist = false; + for (cur2=cdetail_d->person_list;cur2;cur2=cur2->next) { + if ((int)cur1->data == (int)cur2->data) { + exist = true; + break; + } + } + if (!exist) + break; + } + + if (!exist) + detail_refresh_view(cdetail_d); +} + +static inline void detail_append_str_with_linebreak(const char *src, char *dest, int dest_len) +{ + char temp[PH_TEXT_MAX_LEN]; + if (src && '\0' != src[0]) { + if ('\0' == dest[0]) + snprintf(dest, dest_len, "%s", src); + else { + snprintf(temp, sizeof(temp), "%s\n%s", src, dest); + snprintf(dest, dest_len, "%s", temp); + } + } +} + +int ct_detail_get_full_addr(CTSvalue *postal, char *buf, int buf_len) +{ + const char *code; + const char *region; + const char *locality; + const char *street; + const char *extended; + const char *country; + const char *pobox; + + code = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_POSTALCODE_STR); + extended = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_EXTENDED_STR); + pobox = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_POBOX_STR); + street = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_STREET_STR); + locality = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_LOCALITY_STR); + region = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_REGION_STR); + country = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_COUNTRY_STR); + + detail_append_str_with_linebreak(country, buf, buf_len); + detail_append_str_with_linebreak(region, buf, buf_len); + detail_append_str_with_linebreak(locality, buf, buf_len); + detail_append_str_with_linebreak(street, buf, buf_len); + detail_append_str_with_linebreak(pobox, buf, buf_len); + detail_append_str_with_linebreak(extended, buf, buf_len); + detail_append_str_with_linebreak(code, buf, buf_len); + + return 0; +} + +void ct_detail_mouseup(void *data, Evas *evas, Evas_Object *obj, + void *event_info) +{ + Evas_Event_Mouse_Up *ev = event_info; + ct_detail_data *cdetail_d = data; + cdetail_d->touch_x = ev->canvas.x; + cdetail_d->touch_y = ev->canvas.y; +} + + +CTSvalue* ct_detail_get_baseinfo_value(CTSstruct* contact) +{ + int ret; + CTSvalue *baseinfo; + + baseinfo = NULL; + ret = contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &baseinfo); + p_retvm_if(CTS_SUCCESS != ret && CTS_ERR_NO_DATA != ret, NULL, "contacts_svc_struct_get_value() failed(%d)", ret); + + if (NULL == baseinfo) { + baseinfo = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO); + ret = contacts_svc_struct_store_value(contact, CTS_CF_BASE_INFO_VALUE, baseinfo); + p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_struct_store_value() failed(%d)", ret); + } + + return baseinfo; +} + +GSList* ct_detail_get_person_list(int person_id) +{ + GSList *person_list = NULL; + CTSiter *iter; + if (person_id) { + contacts_svc_get_list_with_int(CTS_LIST_MEMBERS_OF_PERSON_ID, person_id, &iter); + + while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { + int ct_id; + CTSvalue *val_temp; + + val_temp = contacts_svc_iter_get_info(iter); + ct_id = contacts_svc_value_get_int(val_temp, CTS_LIST_CONTACT_ID_INT); + + if (-1 < ct_id) + person_list = g_slist_append(person_list, (void *)ct_id); + } + contacts_svc_iter_remove(iter); + } + return person_list; +} + +static void detail_myfile_ringtone_result(ui_gadget_h ug, service_h service, void *data) +{ + ct_detail_data *cdetail_d = data; + + p_retm_if(NULL == ug || NULL == data, "ug or data is NULL"); + + if (service) { + const char* display; + CTSvalue *base_info = NULL; + CTSstruct *contact = cdetail_d->contact; + + char *val = NULL; + service_get_extra_data(service, "result", &val); + p_retm_if(!val, "return value is NULL"); + + contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &base_info); + if (NULL == base_info) { + base_info = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO); + contacts_svc_struct_store_value(contact, CTS_CF_BASE_INFO_VALUE, base_info); + } + contacts_svc_value_set_str(base_info, CTS_BASE_VAL_RINGTONE_PATH_STR, val); + cdetail_d->updated = true; + + display = ct_detail_get_ringtone_display_name(val); + elm_genlist_item_update(cdetail_d->ringtone_item); + free(val); + } + + ug_destroy(ug); + cdetail_d->child_ug = NULL; +} + + +void ct_detail_myfile_ringtone(ct_detail_data *cdetail_d) +{ + if(cdetail_d->ug) + return; + + struct ug_cbs cbs = {0}; + + service_h service; + + service_create(&service); + service_add_extra_data(service, "path", "/opt/share/settings/Ringtones"); + service_add_extra_data(service, "select_type", "SINGLE_FILE"); + service_add_extra_data(service, "file_type", "SOUND"); + + cbs.result_cb = detail_myfile_ringtone_result; + cbs.destroy_cb = __detail_destroy_child_ug; + cbs.layout_cb = ug_common_layout_cb; + cbs.priv = cdetail_d; + + cdetail_d->child_ug = ug_create(cdetail_d->ug, MYFILES_UG, UG_MODE_FULLVIEW, service, &cbs); + p_warn_if(NULL == cdetail_d->child_ug, "ug_create() Failed"); + + service_destroy(service); +} + + +CTSvalue* ct_detail_get_relationship(CTSstruct *contact) +{ + int ret; + CTSvalue *value; + + ret = contacts_svc_find_custom_type(CTS_TYPE_CLASS_EXTEND_DATA, "Relationship"); + if (ret <= 0) return NULL; + + contacts_svc_struct_get_value(contact, ret, &value); + return value; +} + +static Evas_Object* detail_list_gl_icon_get(void *data, Evas_Object *obj, + const char *part) +{ + ct_contact_list* ct_info = data; + p_retvm_if(NULL == ct_info, NULL, "ct_info is NULL"); + + 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; + } + return NULL; +} + +static void detial_list_create_itcs(ct_list_data *clist_d) +{ + clist_d->itcs[0].item_style = "link_list"; + clist_d->itcs[0].func.text_get = ct_list_gl_label_get; + clist_d->itcs[0].func.content_get = detail_list_gl_icon_get; + + clist_d->itcs[1].item_style = "link_list"; + clist_d->itcs[1].func.text_get = ct_list_gl_label_get; + clist_d->itcs[1].func.content_get = detail_list_gl_icon_get; + + clist_d->itcs[2].item_style = "link_list.tb"; + clist_d->itcs[2].func.text_get = ct_list_gl_label_get; + clist_d->itcs[2].func.content_get = detail_list_gl_icon_get; + + clist_d->itcs[3].item_style = "link_list.tb"; + clist_d->itcs[3].func.text_get = ct_list_gl_label_get; + clist_d->itcs[3].func.content_get = detail_list_gl_icon_get; + + clist_d->itcs[4].item_style="1text_center"; + clist_d->itcs[4].func.text_get = ct_list_count_gl_label_get; +} + +void ct_detail_create_list_view(ct_detail_data *cdetail_d, Evas_Smart_Cb sel_cb, void *cb_data, int id_caller) +{ + ct_list_data *clist_d; + char buf[PH_TEXT_SHORT_LEN]; + Evas_Object *btn; + + clist_d = calloc(1, sizeof(ct_list_data)); + clist_d->list_op = CT_GET_LIST_ALL_CONTACTS; + clist_d->ct_id_caller = id_caller; + clist_d->navi = cdetail_d->navi; + clist_d->win = cdetail_d->win; + clist_d->ug = cdetail_d->ug; + clist_d->gl_sel = sel_cb; + clist_d->gl_sel_data = cb_data; + + ct_list_get_contacts(clist_d, &clist_d->list); + detial_list_create_itcs(clist_d); + clist_d->content = ct_list_create_contact_layout(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); + + elm_toolbar_add(clist_d->navi); + 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); + + btn = elm_button_add(clist_d->navi); + elm_object_style_set(btn, "naviframe/back_btn/default"); + evas_object_smart_callback_add(btn, "clicked", phone_view_back_btn_cb, clist_d->navi); + elm_object_item_part_content_set(clist_d->navi_item, "prev_btn", btn); +} + + + +int ct_detail_load_vcard_contact(ct_detail_data *cdetail_d, char *path) +{ + int ret; + FILE *fp; + char vcard_stream[1024*100]; + PH_DBG("path = %s", path); + + fp = fopen(path, "r"); + if (NULL == fp) { + ERR("fopen() return NULL"); + elm_exit(); + return -1; + } + ret = fread(vcard_stream, 1, sizeof(vcard_stream), fp); + if (0 < ret && ret < sizeof(vcard_stream)) { + vcard_stream[ret] = '\0'; + + cdetail_d->vcard = strdup(vcard_stream); + ret = contacts_svc_get_contact_from_vcard(vcard_stream, &(cdetail_d->contact)); + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_get_contact_from_vcard() Failed(%d)", ret); + fclose(fp); + return -1; + } + } + else { + Evas_Object *popup; + ERR("vcard is invalid(%d)", ret); + cdetail_d->popup = phone_show_popup(cdetail_d->win, S_(CT_SYS_POP_ERROR), 1.5); + evas_object_smart_callback_add(cdetail_d->popup, "timeout", ct_detail_popup_hide_cb, NULL); + } + fclose(fp); + return 0; +} diff --git a/lib/details/ct-detail-utils.h b/lib/details/ct-detail-utils.h new file mode 100755 index 0000000..c13db79 --- /dev/null +++ b/lib/details/ct-detail-utils.h @@ -0,0 +1,69 @@ +/* + * 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_DETAIL_UTILS_H__ +#define __CONTACTS_DETAIL_UTILS_H__ + +enum { + RELATIONSHIP_TYPE_ASSISTANT = 0, + RELATIONSHIP_TYPE_BROTHER, + RELATIONSHIP_TYPE_CHILD, + RELATIONSHIP_TYPE_DOMESTIC_PARTNER, + RELATIONSHIP_TYPE_FATHER, + RELATIONSHIP_TYPE_FRIEND, + RELATIONSHIP_TYPE_MANAGER, + RELATIONSHIP_TYPE_MOTHER, + RELATIONSHIP_TYPE_PARENT, + RELATIONSHIP_TYPE_PARTNER, + RELATIONSHIP_TYPE_REFERRED_BY, + RELATIONSHIP_TYPE_RELATIVE, + RELATIONSHIP_TYPE_SISTER, + RELATIONSHIP_TYPE_SPOUSE, + RELATIONSHIP_TYPE_CUSTOM, + RELATIONSHIP_TYPE_MAX, +}; + +void ct_detail_make_vcard(ct_detail_data *cdetail_d); +void ct_detail_send_via_msg(void *data, Evas_Object *obj, void *event_info); +void ct_detail_send_via_email(void *data, Evas_Object *obj, void *event_info); +void ct_detail_send_via_bluetooth(void *data, Evas_Object *obj, void *event_info); +void* ct_detail_email_ug(ui_gadget_h parent, const char *to, const char *attach, void(*destroy_cb)(void*), void *cb_param); +void ct_detail_delete_namecards(ct_detail_data *cdetail_d); +void ct_detail_popup_hide_cb(void *data, Evas_Object *obj, void *event_info); +void ct_detail_contacts_changed(void *user_data); +void ct_detail_mouseup(void *data, Evas *evas, Evas_Object *obj, void *event_info); +const char* ct_detail_get_ringtone_display_name(const char *real_data); +void ct_detail_get_nicknames(CTSvalue *value, char *dest, int dest_len); +void ct_detail_get_company_str(CTSvalue *value, char *dest, int dest_len); +int ct_detail_get_full_addr(CTSvalue *postal, char *buf, int buf_len); +int ct_detail_parse_bundle(service_h service, ct_detail_data* cdetail_d); +CTSvalue* ct_detail_get_baseinfo_value(CTSstruct* contact); +GSList* ct_detail_get_person_list(int person_id); +void ct_detail_link_changed(void *user_data); +void ct_detail_myfile_ringtone(ct_detail_data *cdetail_d); +CTSvalue* ct_detail_get_relationship(CTSstruct *contact); +void ct_detail_get_first_mid_last_name(CTSvalue *value, char *dest, int dest_len); +void ct_detail_get_extra_name(CTSstruct *contact, char *dest, int dest_len); +char *ct_detail_gl_base_info_label_get(void *data, Evas_Object *obj, const char *part); +Evas_Object *ct_detail_gl_base_info_icon_get(void *data, Evas_Object *obj, const char *part); +Evas_Object *ct_detail_gl_number_util_icon_get(void *data, Evas_Object *obj, const char *part); +CTSvalue* ct_detail_get_default_number(GSList *list); +void ct_detail_voice_call_cb(void *data, Evas_Object *obj, void *event_info); +void ct_detail_msg_ug_cb(void *data, Evas_Object *obj, void *event_info); +void ct_detail_create_list_view(ct_detail_data *cdetail_d, Evas_Smart_Cb sel_cb, void *cb_data, int id_caller); +int ct_detail_load_vcard_contact(ct_detail_data *cdetail_d, char *path); + +#endif //__CONTACTS_DETAIL_UTILS_H__ diff --git a/lib/details/ct-detail-view.c b/lib/details/ct-detail-view.c new file mode 100755 index 0000000..9f89e00 --- /dev/null +++ b/lib/details/ct-detail-view.c @@ -0,0 +1,1833 @@ +/* + * 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 <errno.h> +#include <string.h> +#include <vconf.h> +#include <vconf-keys.h> +#include <app.h> +#include <unicode/udatpg.h> +#include <unicode/ucal.h> +#include <unicode/ustring.h> +#include "phone.h" +#include "ct-detail.h" +#include "ct-detail-utils.h" +#include "ct-detail-view.h" +#include "ct-detail-history.h" +#include "ct-input-view.h" + +enum DETAIL_ITC_TYPE { + DETAIL_ITC_NOTE = 0, + DETAIL_ITC_NUM_UTIL_BTN = 1, + DETAIL_ITC_RCS_NUM_UTIL_BTN = 2, + DETAIL_ITC_UTIL_BTN = 3, + DETAIL_ITC_ADDRBOOK = 4, + DETAIL_ITC_TYPED_DATA = 5, + DETAIL_ITC_NUMBER = DETAIL_ITC_TYPED_DATA, + DETAIL_ITC_EMAIL = DETAIL_ITC_TYPED_DATA, + DETAIL_ITC_URL = DETAIL_ITC_TYPED_DATA, + DETAIL_ITC_TITLE_BIG_TEXT = 6, + DETAIL_ITC_MESSENGER = DETAIL_ITC_TITLE_BIG_TEXT, + DETAIL_ITC_BIRTH = DETAIL_ITC_TITLE_BIG_TEXT, + DETAIL_ITC_RINGTONE = 7, + DETAIL_ITC_RELATIONSHIP, + DETAIL_ITC_NUMBER_DEF, + DETAIL_ITC_ADDRESS, + DETAIL_ITC_LINK_UNLINK, + DETAIL_ITC_UNLINK_POPUP, + DETAIL_ITC_EDIT_POPUP, + DETAIL_ITC_LINK_LIST, + DETAIL_ITC_LINK_LIST_SUB, + DETAIL_ITC_TITLE, + DETAIL_ITC_UTIL_1BTN, + DETAIL_ITC_BASEINFO_1TEXT_1ICON, + DETAIL_ITC_BASEINFO_1TEXT_2ICON, + DETAIL_ITC_BASEINFO_2TEXT_1ICON, + DETAIL_ITC_BASEINFO_2TEXT_2ICON, + DETAIL_ITC_BASEINFO_3TEXT_1ICON, + DETAIL_ITC_BASEINFO_3TEXT_2ICON, + DETAIL_ITC_MAX, +}; + +static Elm_Genlist_Item_Class detail_itcs[] = { + {.item_style="multiline/dialogue/2text"}, + {.item_style="detail.3icon"}, + {.item_style="detail.5icon"}, + {.item_style="dialogue/bg/2icon"}, + {.item_style="detail.title"}, + {.item_style="dialogue.1title.1text"}, + {.item_style="dialogue/2text.2"}, + {.item_style="dialogue/2text.1icon.6"}, + {.item_style="dialogue/2text.2"}, + {.item_style="dialogue/1title.1text.1icon"}, + {.item_style="dialogue/1title.1text.2"}, + {.item_style="dialogue/bg/2icon"}, + {.item_style="1text.2icon.2"}, + {.item_style="1text.1icon.2"}, + {.item_style="dialogue/1text/expandable"}, + {.item_style="dialogue/1text.1icon.2/expandable2"}, + {.item_style="dialogue/title"}, + {.item_style="dialogue/bg/1icon"}, + {.item_style="baseinfo.1text.1icon"}, + {.item_style="baseinfo.1text.2icon"}, + {.item_style="baseinfo.2text.1icon"}, + {.item_style="baseinfo.2text.2icon"}, + {.item_style="baseinfo.3text.1icon"}, + {.item_style="baseinfo.3text.2icon"}, +}; + + +static char* detail_gl_2text_multiline_label_get(void *data, Evas_Object *obj, const char *part) +{ + int type; + CTSvalue *value = data; + + p_retv_if(NULL == value, NULL); + + type = contacts_svc_value_get_type(value); + p_retvm_if(CTS_VALUE_COMPANY != type && CTS_VALUE_CONTACT_BASE_INFO != type, NULL, "Invalid type(%d)", type); + + if (0 == strcmp(part, "elm.text.1")) { + if (CTS_VALUE_COMPANY == type) + return strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_COMPANY)); + else + return strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_NOTE)); + } + else if (0 == strcmp(part, "elm.text.2")) { + if (CTS_VALUE_COMPANY == type) + return SAFE_STRDUP(contacts_svc_value_get_str(value, CTS_COMPANY_VAL_NAME_STR)); + else + return elm_entry_utf8_to_markup(contacts_svc_value_get_str(value, CTS_BASE_VAL_NOTE_STR)); + } + + return NULL; +} + +static char* detail_gl_ringtone_label_get(void *data, Evas_Object *obj, const char *part) +{ + const char *str; + CTSvalue *value = data; + p_retv_if(NULL == value, NULL); + + if (0 == strcmp(part, "elm.text.1")) + return strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_RINGTONE)); + else if (0 == strcmp(part, "elm.text.2")) { + str = contacts_svc_value_get_str(value , CTS_BASE_VAL_RINGTONE_PATH_STR); + if (str && *str && 0 == access(str, F_OK)) + return SAFE_STRDUP(ct_detail_get_ringtone_display_name(str)); + else + return strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_DEFAULT)); + } + return NULL; +} + +static void detail_ringtone_gl_sel(void *data, Evas_Object *obj, void *event_info) +{ + ct_detail_data *cdetail_d = data; + elm_genlist_item_selected_set(event_info, EINA_FALSE); + ct_detail_myfile_ringtone(cdetail_d); +} + +static void detail_ringtone_cancel_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + ct_detail_data *cdetail_d = data; + CTSvalue *value; + p_retm_if(NULL == cdetail_d, "parameter(cdetail_d) is NULL"); + + ret = contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_BASE_INFO_VALUE, &value); + p_retm_if(CTS_SUCCESS != ret && CTS_ERR_NO_DATA != ret, "contacts_svc_struct_get_value() Failed(%d)", ret); + + ret = contacts_svc_value_set_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR, NULL); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() Failed(%d)", ret); + + cdetail_d->updated = true; + elm_genlist_item_update(cdetail_d->ringtone_item); +} + +static Evas_Object* detail_gl_ringtone_icon_get(void *data, Evas_Object *obj, const char *part) +{ + const char *temp; + Evas_Object *icon; + Evas_Object *btn; + CTSvalue *value = data; + ct_detail_data *cdetail_d; + double scale; + + cdetail_d = evas_object_data_get(obj, "cdetail_d"); + p_retvm_if(NULL == cdetail_d, NULL, "evas_object_data_get() return NULL"); + + if (0 == cdetail_d->contact_id) + return NULL; + + if (0 == strcmp(part, "elm.icon")) { + btn = elm_button_add(obj); + p_retvm_if(NULL == btn, NULL, "elm_button_add() return NULL"); + evas_object_propagate_events_set(btn, EINA_FALSE); + + scale = elm_scale_get(); + evas_object_size_hint_min_set(btn, CT_DETAIL_RESET_BUTTON_SIZE * scale, CT_DETAIL_RESET_BUTTON_SIZE * scale); + evas_object_size_hint_max_set(btn, CT_DETAIL_RESET_BUTTON_SIZE * scale, CT_DETAIL_RESET_BUTTON_SIZE * scale); + + icon = elm_icon_add(btn); + p_retvm_if(NULL == icon, NULL, "elm_icon_add() return NULL"); + elm_icon_resizable_set(icon, EINA_FALSE, EINA_FALSE); + elm_icon_file_set(icon, CTUI_IMG_ICON_RESET, NULL); + elm_object_part_content_set(btn, "icon", icon); + + if(!cdetail_d->ug) + evas_object_smart_callback_add(btn, "clicked", detail_ringtone_cancel_cb, cdetail_d); + + temp = contacts_svc_value_get_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR); + if (NULL == temp || '\0' == *temp) + elm_object_disabled_set(btn, EINA_TRUE); + + return btn; + } + return NULL; +} + +static char* detail_gl_relationship_label_get(void *data, Evas_Object *obj, const char *part) +{ + CTSvalue *value = data; + if (0 == strcmp(part, "elm.text.1")) { + int type; + char *str_type = NULL; + const char *str_name = NULL; + char buf[PH_TEXT_SHORT_LEN]; + + type = contacts_svc_value_get_int(value, CTS_EXTEND_VAL_DATA1_INT); + if (RELATIONSHIP_TYPE_CUSTOM == type) + str_type = (char *)contacts_svc_value_get_str(value, CTS_EXTEND_VAL_DATA3_STR); + if (NULL == str_type || '\0' == str_type) + str_type = (char *)T_(CT_GET_TEXT_RELATIONSHIP_TYPE, type); + + str_name = contacts_svc_value_get_str(value, CTS_EXTEND_VAL_DATA2_STR); + if (str_name && *str_name) + snprintf(buf, sizeof(buf), "%s %s", str_type, str_name); + else + snprintf(buf, sizeof(buf), "%s", str_type); + return strdup(buf); + } + else if (0 == strcmp(part, "elm.text.2")) { + return strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_RELATIONSHIP)); + } + return NULL; +} + +static char *detail_gl_address_label_get(void *data, Evas_Object *obj, const char *part) +{ + int val_type; + char buf[PH_TEXT_MAX_LEN]; + const char *ret_str; + CTSvalue *value = data; + + p_retv_if(NULL == data, NULL); + + ret_str = NULL; + if (0 == strcmp(part, "elm.title")) { + val_type = contacts_svc_value_get_int(value, CTS_POSTAL_VAL_TYPE_INT); + return strdup(T_(CT_GET_TEXT_POSTAL_TYPE, val_type)); + } + else if (0 == strcmp(part, "elm.text")) { + buf[0] = '\0'; + ct_detail_get_full_addr(value, buf, sizeof(buf)); + return elm_entry_utf8_to_markup(buf); + } + return NULL; +} + +static char* detail_get_datetime_str(UDateFormat* formatter, int year, int mon, int day) +{ + time_t timer; + struct tm stime; + char *ret_str = NULL; + char formatted_str[PH_TEXT_SHORT_LEN]; + int32_t formattedCapacity; + UChar formatted[PH_TEXT_SHORT_LEN]; + UErrorCode status = U_ZERO_ERROR; + + memset(&stime, 0, sizeof(struct tm)); + stime.tm_year = year-1900; + stime.tm_mon = mon-1; + stime.tm_mday = day; + timer = mktime(&stime); + + formattedCapacity = (int32_t)(sizeof(formatted)/sizeof((formatted)[0])); + udat_format(formatter, (UDate)timer*1000, formatted, formattedCapacity, NULL, &status); + p_retvm_if(U_FAILURE(status), NULL, "udat_format() Failed()"); + + u_austrcpy(formatted_str, formatted); + ret_str = g_strdup(formatted_str); + + return ret_str; +} + +static char* detail_gl_title_big_text_label_get(void *data, Evas_Object *obj, const char *part) +{ + int type; + const char *ret_str; + CTSvalue *value = data; + ct_detail_data *cdetail_d = evas_object_data_get(obj, "cdetail_d"); + + p_retv_if(NULL == data, NULL); + + type = contacts_svc_value_get_type(value); + p_retvm_if(CTS_ERR_ARG_NULL == type, NULL, + "contacts_svc_value_get_type() return CTS_ERR_ARG_NULL"); + + ret_str = NULL; + if (0 == strcmp(part, "elm.text.1")) { + int date, day, mon, year; + + switch (type) { + case CTS_VALUE_EVENT: + date = contacts_svc_value_get_int(value, CTS_EVENT_VAL_DATE_INT); + + day = date%100; + mon = (date%10000)/100; + year = date/10000; + + p_retvm_if(mon < 1 || 12 < mon || day < 1 || 31 < day, NULL, "Invalid date(mon=%d,day=%d)",mon,day); + return detail_get_datetime_str(cdetail_d->formatter, year, mon, day); + + case CTS_VALUE_MESSENGER: + ret_str = contacts_svc_value_get_str(value, CTS_MESSENGER_VAL_IM_ID_STR); + break; + + default: + ERR("unknown type(%d)", type); + ret_str = NULL; + break; + + } + } + else if (0 == strcmp(part, "elm.text.2")) { + int val_type; + + switch (type) { + case CTS_VALUE_EVENT: + val_type = contacts_svc_value_get_int(value, CTS_EVENT_VAL_TYPE_INT); + ret_str = T_(CT_GET_TEXT_EVENT_TYPE, val_type); + break; + + case CTS_VALUE_MESSENGER: + val_type = contacts_svc_value_get_int(value, CTS_MESSENGER_VAL_TYPE_INT); + ret_str = T_(CT_GET_TEXT_IM_TYPE, val_type); + break; + + default: + ERR("unknown type(%d)", type); + ret_str = NULL; + break; + + } + } + return SAFE_STRDUP(ret_str); +} + +static Evas_Object *detail_gl_number_default_icon_get(void *data, Evas_Object *obj, const char *part) +{ + Evas_Object *ret_obj; + + ret_obj = NULL; + if (0 == strcmp(part, "elm.icon")) { + Evas_Object *ico; + + ico = elm_icon_add(obj); + p_retvm_if(NULL == ico, NULL, "elm_icon_add() return NULL"); + + elm_icon_file_set(ico, CTUI_IMG_CHECK, NULL); + evas_object_size_hint_aspect_set(ico, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + ret_obj = ico; + } + return ret_obj; +} + +static char *detail_gl_typed_data_label_get(void *data, Evas_Object *obj, const char *part) +{ + int type; + int val_type; + char buf[PH_TEXT_MAX_LEN]; + const char *ret_str; + CTSvalue *value = data; + + p_retv_if(NULL == data, NULL); + + type = contacts_svc_value_get_type(value); + p_retvm_if(CTS_ERR_ARG_NULL == type, NULL, + "contacts_svc_value_get_type() return CTS_ERR_ARG_NULL"); + + ret_str = NULL; + if (0 == strcmp(part, "elm.title")) { + int num_type_int; + switch (type) { + case CTS_VALUE_NUMBER: + num_type_int = contacts_svc_value_get_int(value, CTS_NUM_VAL_TYPE_INT); + ctui_get_number_type_str(num_type_int, buf, sizeof(buf)); + ret_str = buf; + break; + + case CTS_VALUE_EMAIL: + val_type = contacts_svc_value_get_int(value, CTS_EMAIL_VAL_TYPE_INT); + ret_str = T_(CT_GET_TEXT_EMAIL_TYPE, val_type); + break; + + case CTS_VALUE_WEB: + val_type = contacts_svc_value_get_int(value, CTS_WEB_VAL_TYPE_INT); + ret_str = T_(CT_GET_TEXT_WEBSITE_TYPE, val_type); + break; + + default: + ERR("unknown type(%d)", type); + ret_str = NULL; + break; + + } + } + else if (0 == strcmp(part, "elm.text")) { + switch (type) { + case CTS_VALUE_NUMBER: + ret_str = contacts_svc_value_get_str(value, CTS_NUM_VAL_NUMBER_STR); + break; + case CTS_VALUE_EMAIL: + ret_str = contacts_svc_value_get_str(value, CTS_EMAIL_VAL_ADDR_STR); + break; + case CTS_VALUE_WEB: + ret_str = contacts_svc_value_get_str(value, CTS_WEB_VAL_ADDR_STR); + break; + default: + ERR("unknown type(%d)", type); + ret_str = NULL; + break; + } + } + + return SAFE_STRDUP(ret_str); +} + +static void detail_number_cb(CTSvalue *value, ct_detail_data *cdetail_d) +{ + const char *num_str; + + if (cdetail_d->popup) + ct_detail_popup_hide_cb(cdetail_d, NULL, NULL); + + num_str = contacts_svc_value_get_str(value, CTS_NUM_VAL_NUMBER_STR); + if (num_str && *num_str) { + int rotate; + cdetail_d->popup = elm_ctxpopup_add(cdetail_d->navi); + p_retm_if(NULL == cdetail_d->popup, "elm_ctxpopup_add() return NULL"); + + rotate = (int)evas_object_data_get(cdetail_d->navi, "phone_rotate"); + if (0 == rotate || 180 == rotate) + elm_ctxpopup_direction_priority_set(cdetail_d->popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT); + + evas_object_smart_callback_add(cdetail_d->popup, "dismissed", ct_detail_popup_hide_cb, cdetail_d); + evas_object_data_set(cdetail_d->popup, "cdetail_d", cdetail_d); + + elm_ctxpopup_item_append(cdetail_d->popup, S_(PH_SYS_BODY_CALL), NULL, + ct_detail_voice_call_cb, num_str); + elm_ctxpopup_item_append(cdetail_d->popup, S_(PH_SYS_BODY_MESSAGE), NULL, + ct_detail_msg_ug_cb, num_str); + evas_object_move(cdetail_d->popup, cdetail_d->touch_x, cdetail_d->touch_y); + evas_object_show(cdetail_d->popup); + } +} + +static void detail_gl_email_sel(void *data, Evas_Object *obj, void *event_info) +{ + const char *email; + ct_detail_data *cdetail_d; + CTSvalue *value = data; + Elm_Object_Item *item = event_info; + + elm_genlist_item_selected_set(item, EINA_FALSE); + + p_retm_if(NULL == value, "parameter(CTSstruct) is NULL"); + + cdetail_d = evas_object_data_get(obj, "cdetail_d"); + p_retm_if(NULL == cdetail_d, "evas_object_data_get() return NULL"); + + if(cdetail_d->ug) + return; + + email = contacts_svc_value_get_str(value, CTS_EMAIL_VAL_ADDR_STR); + cdetail_d->child_ug = ct_detail_email_ug(cdetail_d->ug, email, NULL, + ctui_destroy_child_ug, &cdetail_d->child_ug); +} + +static void detail_gl_messenger_sel(void *data, Evas_Object *obj, void *event_info) +{ + CTSvalue *value; + Elm_Object_Item *item = event_info; + + elm_genlist_item_selected_set(item, EINA_FALSE); + + value = data; + p_retm_if(NULL == value, "parameter(CTSstruct) is NULL"); + + ERR("detail_gl_messenger_sel() not implemented"); +} + +static char* detail_gl_ab_label_get(void *data, Evas_Object *obj, const char *part) +{ + ct_detail_data *cdetail_d = data; + char display[PH_TEXT_MAX_LEN]; + + if (0 == strcmp(part, "elm.text")) { + display[0] = '\0'; + if (cdetail_d->base_ab_name) + snprintf(display, sizeof(display), T_(CT_GET_TEXT_BASIC, CTTEXT_SAVED_IN), cdetail_d->base_ab_name); + return strdup(display); + } + return NULL; +} + + +static char* detail_gl_title_label_get(void *data, Evas_Object *obj, const char *part) +{ + char *display = data; + if (0 == strcmp(part, "elm.text") && display && *display) + return strdup(display); + return NULL; +} + +static void detail_gl_number_sel(void *data, Evas_Object *obj, void *event_info) +{ + CTSvalue *value; + ct_detail_data *cdetail_d; + Elm_Object_Item *item = event_info; + + elm_genlist_item_selected_set(item, EINA_FALSE); + + value = data; + p_retm_if(NULL == value, "parameter(CTSstruct) is NULL"); + + cdetail_d = evas_object_data_get(obj, "cdetail_d"); + p_retm_if(NULL == cdetail_d, "evas_object_data_get() return NULL"); + + if(cdetail_d->ug) + return; + + detail_number_cb(value, cdetail_d); +} + +static void detail_send_name_card_cb(void *data, Evas_Object *obj, void *event_info) +{ + int rotate; + ct_detail_data *cdetail_d = data; + p_retm_if(NULL == cdetail_d, "evas_object_data_get() return NULL"); + + if (cdetail_d->popup) + ct_detail_popup_hide_cb(cdetail_d, NULL, NULL); + + cdetail_d->popup = elm_ctxpopup_add(cdetail_d->navi); + p_retm_if(NULL == cdetail_d->popup, "elm_ctxpopup_add() return NULL"); + + rotate = (int)evas_object_data_get(cdetail_d->navi, "phone_rotate"); + if (0 == rotate || 180 == rotate) + elm_ctxpopup_direction_priority_set(cdetail_d->popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT); + + evas_object_smart_callback_add(cdetail_d->popup, "dismissed", ct_detail_popup_hide_cb, cdetail_d); + elm_ctxpopup_item_append(cdetail_d->popup, S_(PH_SYS_BODY_MESSAGE), NULL, + ct_detail_send_via_msg, cdetail_d); + elm_ctxpopup_item_append(cdetail_d->popup, S_(CT_SYS_BODY_EMAIL), NULL, + ct_detail_send_via_email, cdetail_d); + elm_ctxpopup_item_append(cdetail_d->popup, S_(CT_SYS_BODY_BLUETOOTH), NULL, + ct_detail_send_via_bluetooth, cdetail_d); + + phone_move_ctxpopup(cdetail_d->popup, obj); + evas_object_show(cdetail_d->popup); +} + +static void detail_list_gl_sel(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + ct_detail_data *cdetail_d = data; + ct_contact_list *contact; + Elm_Object_Item *item = event_info; + + elm_genlist_item_selected_set(item, EINA_FALSE); + + if (cdetail_d->person_id) { + contact = elm_object_item_data_get(item); + p_retm_if(NULL == contact, "elm_object_item_data_get() returns NULL"); + + ret = contacts_svc_link_person(cdetail_d->person_id, contact->id); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_link_person() Failed(%d)", ret); + + if (CTS_SUCCESS == ret) + phone_show_tickernoti(S_(CT_SYS_POP_SUCCESS)); + else + phone_show_tickernoti(S_(PH_SYS_POP_FAILED)); + + elm_naviframe_item_pop(cdetail_d->navi); + } +} + +static void detail_link_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_detail_data *cdetail_d = data; + ct_detail_create_list_view(cdetail_d, detail_list_gl_sel, cdetail_d, cdetail_d->person_id); +} + +typedef struct { + int ct_id; + Eina_Bool checked; + Elm_Object_Item *item; +} ct_detail_person_data; + +static void detail_unlink_popup_cancel_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_detail_data *cdetail_d = data; + ct_detail_popup_hide_cb(cdetail_d, NULL, NULL); +} + +static void detail_unlink_popup_ok_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret = CTS_SUCCESS; + Evas_Object *genlist; + Elm_Object_Item *item; + ct_detail_data *cdetail_d = data; + ct_detail_person_data *person_info; + + genlist = cdetail_d->genlist_unlink; + item = elm_genlist_first_item_get(genlist); + while (item) { + person_info = elm_object_item_data_get(item); + if (person_info && EINA_TRUE == person_info->checked) { + ret = contacts_svc_unlink_person(cdetail_d->person_id, person_info->ct_id); + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_unlink_person() Failed(%d)", ret); + break; + } + } + item = elm_genlist_item_next_get(item); + } + ct_detail_popup_hide_cb(cdetail_d, NULL, NULL); + + if (CTS_SUCCESS == ret) + phone_show_tickernoti(S_(CT_SYS_POP_SUCCESS)); + else + phone_show_tickernoti(S_(PH_SYS_POP_FAILED)); +} + +static void detail_unlink_select_all_update(Evas_Object *genlist) +{ + Eina_Bool checked; + Eina_Bool all_check; + Elm_Object_Item *item; + Evas_Object *select_all_check; + ct_detail_person_data *person_info; + + select_all_check = evas_object_data_get(genlist, "check"); + p_retm_if(NULL == select_all_check, "evas_object_data_get() return NULL"); + + all_check = elm_check_state_get(select_all_check); + + checked = EINA_TRUE; + item = elm_genlist_first_item_get(genlist); + while (item) { + person_info = elm_object_item_data_get(item); + p_retm_if(NULL == person_info, "elm_object_item_data_get() return NULL"); + if (EINA_FALSE == person_info->checked) { + checked = EINA_FALSE; + break; + } + item = elm_genlist_item_next_get(item); + } + + if (all_check != checked) + elm_check_state_set(select_all_check, checked); +} + +void detail_unlink_select_all(void *data, Eina_Bool checked) +{ + Elm_Object_Item *item; + ct_detail_person_data *person_info; + ct_detail_data *cdetail_d = data; + + item = elm_genlist_first_item_get(cdetail_d->genlist_unlink); + while (item) { + person_info = elm_object_item_data_get(item); + person_info->checked = checked; + item = elm_genlist_item_next_get(item); + } + elm_genlist_realized_items_update(cdetail_d->genlist_unlink); +} + +static void detail_gl_unlink_item_sel(void *data, Evas_Object *obj, void *event_info) +{ + ct_detail_person_data *person_info = data; + elm_genlist_item_selected_set(event_info, EINA_FALSE); + + person_info->checked = !person_info->checked; + if (person_info->item) + elm_genlist_item_update(person_info->item); + + detail_unlink_select_all_update(obj); +} + +static void detail_unlink_cb(void *data, Evas_Object *obj, void *event_info) +{ + GSList *cursor; + Evas_Object *box; + Evas_Object *check; + Evas_Object *genlist; + Evas_Object *popup; + Evas_Object *layout; + Elm_Object_Item *item; + ct_detail_data *cdetail_d = data; + ct_detail_person_data *person_info; + Evas_Object *btn1, *btn2; + + popup = elm_popup_add(cdetail_d->navi); + p_retm_if(NULL == popup, "elm_popup_add() return NULL"); + elm_object_style_set(popup, "liststyle"); + btn1 = elm_button_add(popup); + elm_object_text_set(btn1, S_(PH_SYS_SK_YES)); + elm_object_part_content_set(popup, "button1", btn1); + elm_object_style_set(btn1, "popup_button/default"); + evas_object_smart_callback_add(btn1, "clicked", detail_unlink_popup_ok_btn_cb, cdetail_d); + + btn2 = elm_button_add(popup); + elm_object_text_set(btn2, S_(PH_SYS_SK_NO)); + elm_object_part_content_set(popup, "button2", btn2); + elm_object_style_set(btn2, "popup_button/default"); + evas_object_smart_callback_add(btn2, "clicked", detail_unlink_popup_cancel_btn_cb, cdetail_d); + elm_object_part_text_set(popup, "title,text", T_(CT_GET_TEXT_BASE_OP, CTTEXT_UNLINK)); + evas_object_show(popup); + cdetail_d->popup = popup; + + box = elm_box_add(popup); + p_retm_if(NULL == box, "elm_box_add() return NULL"); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + + layout = phone_create_select_all(box, S_(PH_SYS_BODY_SELECT_ALL), detail_unlink_select_all, cdetail_d); + elm_box_pack_start(box, layout); + + check = elm_object_part_content_get(layout, "elm.icon"); + + genlist = elm_genlist_add(box); + p_retm_if(NULL == genlist, "elm_genlist_add() return NULL"); + evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL); + cdetail_d->genlist_unlink = genlist; + evas_object_data_set(genlist, "check", check); + + for (cursor=cdetail_d->person_list;cursor;cursor=cursor->next) { + int ct_id = (int)cursor->data; + + person_info = calloc(1, sizeof(ct_detail_person_data)); + person_info->ct_id = ct_id; + + item = elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_UNLINK_POPUP], person_info, + NULL, ELM_GENLIST_ITEM_NONE, detail_gl_unlink_item_sel, person_info); + + person_info->item = item; + } + + evas_object_show(genlist); + elm_box_pack_end(box, genlist); + elm_object_content_set(popup, box); +} + +static char* detail_gl_unlink_popup_label_get(void *data, Evas_Object *obj, const char *part) +{ + int ret; + CTSvalue *value; + + ct_detail_person_data *person_info = data; + p_retvm_if(NULL == person_info, NULL, "person_info is NULL"); + + if (0 == strcmp(part, "elm.text") || 0 == strcmp(part, "elm.text.1")) + { + char display[PH_TEXT_MAX_LEN]; + CTSstruct *contact; + + ret = contacts_svc_get_contact(person_info->ct_id, &contact); + p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_struct_get() Failed(%d)", ret); + + ret = contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &value); + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_struct_get_value() Failed(%d)", ret); + contacts_svc_struct_free(contact); + return NULL; + } + + ctui_get_display_name(value, display, sizeof(display)); + contacts_svc_struct_free(contact); + + if (*display) + return strdup(display); + } + else if (0 == strcmp(part, "elm.text.2")) + { + return SAFE_STRDUP(T_(CT_GET_TEXT_ACC_TYPE, 0)); + } + return NULL; +} + +static void detail_unlink_check_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + detail_unlink_select_all_update(data); +} + +static Evas_Object* detail_gl_unlink_popup_icon_get(void *data, Evas_Object *obj, const char *part) +{ + ct_detail_person_data *person_info = data; + p_retvm_if(NULL == person_info, NULL, "person_info is NULL"); + + if (0 == strcmp(part, "elm.icon.1")) { + Evas_Object *check; + check = elm_check_add(obj); + p_retvm_if(NULL == check, NULL, "elm_check_add() return NULL"); + + elm_check_state_pointer_set(check, &person_info->checked); + evas_object_propagate_events_set(check, EINA_FALSE); + evas_object_smart_callback_add(check, "changed", detail_unlink_check_changed_cb, obj); + + return check; + } + + else if (0 == strcmp(part, "elm.icon.2") || 0 == strcmp(part, "elm.icon")) { + int type; + char *icon_path; + Evas_Object *icon; + + type = CTS_ADDRESSBOOK_TYPE_INTERNAL; + icon_path = ctui_get_addrbook_icon_path(type); + if (icon_path && *icon_path) { + icon = elm_icon_add(obj); + p_retvm_if(NULL == icon, NULL, "elm_icon_add() return NULL"); + + elm_icon_file_set(icon, icon_path, NULL); + evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + return icon; + } + } + return NULL; +} +static void detail_gl_unlink_popup_del(void *data, Evas_Object *obj) +{ + ct_detail_person_data *person_info = data; + p_retm_if(NULL == person_info, "person_info is NULL"); + + free(person_info); +} + +static Evas_Object *detail_gl_link_unlink_icon_get(void *data, Evas_Object *obj, + const char *part) +{ + ct_detail_data *cdetail_d = data; + p_retvm_if(NULL == cdetail_d, NULL, "parameter(ct_detail_data) is NULL"); + + if (0 == strcmp(part, "elm.icon.1")) { + Evas_Object *btn; + + btn = ctui_create_btn(obj, T_(CT_GET_TEXT_BASE_OP, CTTEXT_LINK_CONTACTS)); + p_retvm_if(NULL == btn, NULL, "ctui_create_btn() return NULL"); + + if(!cdetail_d->ug) + evas_object_smart_callback_add(btn, "clicked", detail_link_cb, cdetail_d); + + return btn; + } + else if (0 == strcmp(part, "elm.icon.2")) { + Evas_Object *btn; + + btn = ctui_create_btn(obj, T_(CT_GET_TEXT_BASE_OP, CTTEXT_UNLINK)); + p_retvm_if(NULL == btn, NULL, "ctui_create_btn() return NULL"); + + if (cdetail_d->person_list && 1 < g_slist_length(cdetail_d->person_list)) { + + if(!cdetail_d->ug) + evas_object_smart_callback_add(btn, "clicked", detail_unlink_cb, cdetail_d); + + } + else + elm_object_disabled_set(btn, EINA_TRUE); + return btn; + } + return NULL; +} + + +static Evas_Object *detail_gl_util_btn_icon_get(void *data, Evas_Object *obj, + const char *part) +{ + Evas_Object *ret_obj; + ct_detail_data *cdetail_d = data; + p_retvm_if(NULL == cdetail_d, NULL, "parameter(ct_detail_data) is NULL"); + + ret_obj = NULL; + if (0 == strcmp(part, "elm.icon.1") || 0 == strcmp(part, "elm.icon")) { + return NULL; + } + else if (0 == strcmp(part, "elm.icon.2")) { + Evas_Object *btn; + btn = ctui_create_btn(obj, T_(CT_GET_TEXT_BASE_OP, CTTEXT_SEND_NAME_CARD)); + p_retvm_if(NULL == btn, NULL, "ctui_create_btn() return NULL"); + + if(!cdetail_d->ug) + evas_object_smart_callback_add(btn, "clicked", detail_send_name_card_cb, cdetail_d); + + ret_obj = btn; + } + return ret_obj; +} + +static void detail_gl_website_sel(void *data, Evas_Object *obj, void *event_info) +{ + const char *website; + CTSvalue *value = data; + Elm_Object_Item *item = event_info; + int ret; + service_h service; + + p_retm_if(NULL == value, "parameter(value) is NULL"); + + elm_genlist_item_selected_set(item, EINA_FALSE); + website = contacts_svc_value_get_str(value, CTS_WEB_VAL_ADDR_STR); + if (website && *website) { + ret = service_create(&service); + p_retm_if(SERVICE_ERROR_NONE != ret, "service_create() Failed(%d)", ret); + service_set_operation(service, SERVICE_OPERATION_VIEW ); + service_set_mime(service, "text/html"); + service_set_uri(service, website); + service_send_launch_request(service, NULL, NULL); + service_destroy(service); + } +} + +static char* detail_gl_link_list_label_get(void *data, Evas_Object *obj, const char *part) +{ + return strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_ALL_LINKED_CONTACTS)); +} + +static char* detail_gl_link_list_sub_label_get(void *data, Evas_Object *obj, const char *part) +{ + int contact_id = (int)data; + if (0 == strcmp(part, "elm.text")) { + int ret; + char buf[PH_TEXT_SHORT_LEN]; + CTSstruct *contact; + CTSvalue *value; + + ret = contacts_svc_get_contact(contact_id, &contact); + p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_get_contact() Failed(%d)", ret); + + ret = contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &value); + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_struct_get_value() Failed(%d)", ret); + contacts_svc_struct_free(contact); + return NULL; + } + + buf[0] = '\0'; + ctui_get_display_name(value, buf, sizeof(buf)); + contacts_svc_struct_free(contact); + + if (*buf) + return strdup(buf); + } + + return NULL; +} + +static Evas_Object* detail_gl_link_list_sub_icon_get(void *data, Evas_Object *obj, const char *part) +{ + if (0 == strcmp(part, "elm.icon")) { + int type; + char *icon_path; + Evas_Object *icon; + + type = CTS_ADDRESSBOOK_TYPE_INTERNAL; + icon_path = ctui_get_addrbook_icon_path(type); + if (icon_path && *icon_path) { + icon = elm_icon_add(obj); + p_retvm_if(NULL == icon, NULL, "elm_icon_add() return NULL"); + + elm_icon_file_set(icon, icon_path, NULL); + evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + return icon; + } + } + return NULL; +} + +static void detail_filemanager_status_changed_cb(keynode_t *key, void *data) +{ + Elm_Object_Item *item_ringtone = data; + p_retm_if(NULL == item_ringtone, "parameter(item_ringtone) is NULL"); + elm_genlist_item_update(item_ringtone); +} + +static void detail_view_delete_cb(void *data, Evas *e, Evas_Object *obj, + void *event_info) +{ + PH_FN_CALL; + int ret; + ct_detail_data *cdetail_d = data; + + if (cdetail_d->popup) + evas_object_del(cdetail_d->popup); + + if (cdetail_d->noc) + evas_object_del(cdetail_d->noc); + + if (cdetail_d->genlist) + evas_object_del(cdetail_d->genlist); + + if (cdetail_d->history_genlist) + evas_object_del(cdetail_d->history_genlist); + + if (cdetail_d->th) { + elm_theme_extension_del(cdetail_d->th, DETAIL_THEME_EDJ); + elm_theme_free(cdetail_d->th); + } + + ct_detail_history_free_list(cdetail_d); + + ct_detail_delete_namecards(cdetail_d); + + ret = contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_CONTACT_CHANGE, + ct_detail_contacts_changed, cdetail_d); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_unsubscribe_change_with_data() Failed(%d)", ret); + ret = contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_LINK_CHANGE, + ct_detail_link_changed, cdetail_d); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_unsubscribe_change_with_data() Failed(%d)", ret); + ret = contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_PLOG_CHANGE, + ct_detail_history_changed_cb, cdetail_d); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_unsubscribe_change_with_data() Failed(%d)", ret); + + ret = vconf_ignore_key_changed(VCONFKEY_FILEMANAGER_DB_STATUS, detail_filemanager_status_changed_cb); + p_warn_if(-1 == ret, "vconf_ignore_key_changed() Failed"); + + if (cdetail_d->updated) + contacts_svc_update_contact(cdetail_d->contact); + + contacts_svc_struct_free(cdetail_d->contact); + cdetail_d->contact = NULL; + + free(cdetail_d->vcard); + cdetail_d->vcard = NULL; + free(cdetail_d->base_ab_name); + cdetail_d->base_ab_name = NULL; + + evas_object_data_del(cdetail_d->navi, "cdetail_d"); + + g_slist_free(cdetail_d->person_list); + cdetail_d->person_list = NULL; + + if (cdetail_d->formatter) + udat_close(cdetail_d->formatter); + cdetail_d->formatter = NULL; + + if (cdetail_d->child_ug) + ug_destroy(cdetail_d->child_ug); + + if (cdetail_d->has_input) + cdetail_d->has_detail = false; + else + free(cdetail_d); + + PH_FN_END; +} + +static inline void detail_create_itcs() +{ + detail_itcs[DETAIL_ITC_TYPED_DATA].func.text_get = detail_gl_typed_data_label_get; + + detail_itcs[DETAIL_ITC_NUMBER_DEF].func.text_get = detail_gl_typed_data_label_get; + detail_itcs[DETAIL_ITC_NUMBER_DEF].func.content_get = detail_gl_number_default_icon_get; + + detail_itcs[DETAIL_ITC_TITLE_BIG_TEXT].func.text_get = detail_gl_title_big_text_label_get; + + detail_itcs[DETAIL_ITC_ADDRESS].func.text_get = detail_gl_address_label_get; + + detail_itcs[DETAIL_ITC_NOTE].func.text_get = detail_gl_2text_multiline_label_get; + + detail_itcs[DETAIL_ITC_RINGTONE].func.text_get = detail_gl_ringtone_label_get; + detail_itcs[DETAIL_ITC_RINGTONE].func.content_get = detail_gl_ringtone_icon_get; + + detail_itcs[DETAIL_ITC_RELATIONSHIP].func.text_get = detail_gl_relationship_label_get; + + detail_itcs[DETAIL_ITC_NUM_UTIL_BTN].func.content_get = ct_detail_gl_number_util_icon_get; + + detail_itcs[DETAIL_ITC_RCS_NUM_UTIL_BTN].func.content_get = ct_detail_gl_number_util_icon_get; + + detail_itcs[DETAIL_ITC_UTIL_BTN].func.content_get = detail_gl_util_btn_icon_get; + + detail_itcs[DETAIL_ITC_UTIL_1BTN].func.content_get = detail_gl_util_btn_icon_get; + + detail_itcs[DETAIL_ITC_ADDRBOOK].func.text_get = detail_gl_ab_label_get; + + detail_itcs[DETAIL_ITC_LINK_UNLINK].func.content_get = detail_gl_link_unlink_icon_get; + + detail_itcs[DETAIL_ITC_UNLINK_POPUP].func.text_get = detail_gl_unlink_popup_label_get; + detail_itcs[DETAIL_ITC_UNLINK_POPUP].func.content_get = detail_gl_unlink_popup_icon_get; + detail_itcs[DETAIL_ITC_UNLINK_POPUP].func.del = detail_gl_unlink_popup_del; + + detail_itcs[DETAIL_ITC_EDIT_POPUP].func.text_get = detail_gl_unlink_popup_label_get; + detail_itcs[DETAIL_ITC_EDIT_POPUP].func.content_get = detail_gl_unlink_popup_icon_get; + detail_itcs[DETAIL_ITC_EDIT_POPUP].func.del = detail_gl_unlink_popup_del; + + detail_itcs[DETAIL_ITC_LINK_LIST].func.text_get = detail_gl_link_list_label_get; + + detail_itcs[DETAIL_ITC_LINK_LIST_SUB].func.text_get = detail_gl_link_list_sub_label_get; + detail_itcs[DETAIL_ITC_LINK_LIST_SUB].func.content_get = detail_gl_link_list_sub_icon_get; + + detail_itcs[DETAIL_ITC_TITLE].func.text_get = detail_gl_title_label_get; + + detail_itcs[DETAIL_ITC_BASEINFO_1TEXT_1ICON].func.text_get = ct_detail_gl_base_info_label_get; + detail_itcs[DETAIL_ITC_BASEINFO_1TEXT_1ICON].func.content_get = ct_detail_gl_base_info_icon_get; + + detail_itcs[DETAIL_ITC_BASEINFO_2TEXT_1ICON].func.text_get = ct_detail_gl_base_info_label_get; + detail_itcs[DETAIL_ITC_BASEINFO_2TEXT_1ICON].func.content_get = ct_detail_gl_base_info_icon_get; + + detail_itcs[DETAIL_ITC_BASEINFO_3TEXT_1ICON].func.text_get = ct_detail_gl_base_info_label_get; + detail_itcs[DETAIL_ITC_BASEINFO_3TEXT_1ICON].func.content_get = ct_detail_gl_base_info_icon_get; + + detail_itcs[DETAIL_ITC_BASEINFO_1TEXT_2ICON].func.text_get = ct_detail_gl_base_info_label_get; + detail_itcs[DETAIL_ITC_BASEINFO_1TEXT_2ICON].func.content_get = ct_detail_gl_base_info_icon_get; + + detail_itcs[DETAIL_ITC_BASEINFO_2TEXT_2ICON].func.text_get = ct_detail_gl_base_info_label_get; + detail_itcs[DETAIL_ITC_BASEINFO_2TEXT_2ICON].func.content_get = ct_detail_gl_base_info_icon_get; + + detail_itcs[DETAIL_ITC_BASEINFO_3TEXT_2ICON].func.text_get = ct_detail_gl_base_info_label_get; + detail_itcs[DETAIL_ITC_BASEINFO_3TEXT_2ICON].func.content_get = ct_detail_gl_base_info_icon_get; +} + +#ifdef _CT_LINK +static void detail_genlist_append_separator_line_10px(Evas_Object *genlist) +{ + static Elm_Genlist_Item_Class itc = { .item_style="dialogue/separator/11/with_line" }; + + Elm_Object_Item *item; + item = elm_genlist_item_append(genlist, &itc, NULL, NULL, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); +} +#endif + +static void detail_genlist_append_separator_line(Evas_Object *genlist) +{ + static Elm_Genlist_Item_Class itc_separator_1px = { .item_style="dialogue/separator/1/with_line" }; + + Elm_Object_Item *item; + item = elm_genlist_item_append(genlist, &itc_separator_1px, NULL, NULL, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + +} + +static void detail_fill_list(Evas_Object *genlist, Elm_Genlist_Item_Class *itc, GSList *list, Evas_Smart_Cb func) +{ + GSList *cursor; + Elm_Object_Item *item; + + for (cursor=list;cursor;cursor=cursor->next) { + item = elm_genlist_item_append(genlist, itc, cursor->data, NULL, + ELM_GENLIST_ITEM_NONE, func, cursor->data); + if (NULL == func) + elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + } +} + +static void detail_fill_number_list(Evas_Object *genlist, GSList *list, int default_num_id) +{ + GSList *cursor; + + if (g_slist_length(list) < 2) + return; + + for (cursor=list;cursor;cursor=cursor->next) { + if (default_num_id != 0 && default_num_id == contacts_svc_value_get_int(cursor->data, CTS_NUM_VAL_ID_INT)) + continue; + + elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_NUMBER], cursor->data, NULL, + ELM_GENLIST_ITEM_NONE, detail_gl_number_sel, cursor->data); + } +} + +#ifdef _CT_LINK +static void detail_gl_link_list_item_sel(void *data, Evas_Object *obj, void *event_info) +{ + Elm_Object_Item *item = event_info; + elm_genlist_item_selected_set(item, EINA_FALSE); + + if (EINA_TRUE == elm_genlist_item_expanded_get(item)) + elm_genlist_item_expanded_set(item, EINA_FALSE); + else + elm_genlist_item_expanded_set(item, EINA_TRUE); +} +#endif + +static void detail_gl_link_list_exp(void *data, Evas_Object *obj, void *event_info) +{ + GSList *cursor; + Evas_Object *genlist = obj; + Elm_Object_Item *it_parent = event_info; + Elm_Object_Item *item; + ct_detail_data *cdetail_d = data; + + for (cursor=cdetail_d->person_list;cursor;cursor=cursor->next) { + item = elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_LINK_LIST_SUB], + cursor->data, it_parent, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_NONE); + } +} + +static void detail_gl_link_list_con(void *data, Evas_Object *obj, void *event_info) +{ + Elm_Object_Item *item = event_info; + elm_genlist_item_subitems_clear(item); +} + +Elm_Genlist_Item_Class* ct_detail_get_baseinfo_item_class(CTSstruct *contact) +{ + int cnt = 0; + const char *img = NULL; + char str_main[PH_TEXT_SHORT_LEN]; + char str_sub1[PH_TEXT_SHORT_LEN]; + char str_sub2[PH_TEXT_SHORT_LEN]; + CTSvalue *value; + + str_main[0] = '\0'; + value = NULL; + contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &value); + if (value) + ct_detail_get_first_mid_last_name(value, str_main, sizeof(str_main)); + + str_sub1[0] = '\0'; + ct_detail_get_extra_name(contact, str_sub1, sizeof(str_sub1)); + + str_sub2[0] = '\0'; + value = NULL; + contacts_svc_struct_get_value(contact, CTS_CF_COMPANY_VALUE, &value); + if (value) + ct_detail_get_company_str(value, str_sub2, sizeof(str_sub2)); + + value = NULL; + contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &value); + if (value) + img = contacts_svc_value_get_str(value, CTS_BASE_VAL_IMG_PATH_STR); + + if (*str_main) + cnt++; + if (*str_sub1) + cnt++; + if (*str_sub2) + cnt++; + if (img && *img) cnt += 10; + + switch (cnt) { + case 1: return &detail_itcs[DETAIL_ITC_BASEINFO_1TEXT_1ICON]; + case 2: return &detail_itcs[DETAIL_ITC_BASEINFO_2TEXT_1ICON]; + case 3: return &detail_itcs[DETAIL_ITC_BASEINFO_3TEXT_1ICON]; + case 11: return &detail_itcs[DETAIL_ITC_BASEINFO_1TEXT_2ICON]; + case 12: return &detail_itcs[DETAIL_ITC_BASEINFO_2TEXT_2ICON]; + case 13: return &detail_itcs[DETAIL_ITC_BASEINFO_3TEXT_2ICON]; + default: + if (10 <= cnt) + return &detail_itcs[DETAIL_ITC_BASEINFO_1TEXT_2ICON]; + else + return &detail_itcs[DETAIL_ITC_BASEINFO_1TEXT_1ICON]; + } +} + +API Evas_Object* ctui_detail_genlist_update(ct_detail_data *cdetail_d) +{ + PH_FN_CALL; + int ret; + GSList *list; + Evas_Object *genlist; + const char *value_data; + CTSvalue *baseinfo = NULL; + CTSstruct *contact = cdetail_d->contact; + Elm_Object_Item *item; + CTSvalue *value; + int default_num_id; + bool need_separator; + + // Create genlist + if (NULL == cdetail_d->genlist) { + genlist = elm_genlist_add(cdetail_d->layout); + elm_object_style_set(genlist, "dialogue"); + cdetail_d->genlist = genlist; + evas_object_event_callback_add(genlist, EVAS_CALLBACK_MOUSE_UP, ct_detail_mouseup, cdetail_d); + evas_object_data_set(genlist, "cdetail_d", cdetail_d); + elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS); + + evas_object_smart_callback_add(genlist, "expanded", detail_gl_link_list_exp, cdetail_d); + evas_object_smart_callback_add(genlist, "contracted", detail_gl_link_list_con, NULL); + elm_object_theme_set(genlist, cdetail_d->th); + } + else { + genlist = cdetail_d->genlist; + elm_genlist_clear(genlist); + + ret = vconf_ignore_key_changed(VCONFKEY_FILEMANAGER_DB_STATUS, detail_filemanager_status_changed_cb); + p_warn_if(-1 == ret, "vconf_ignore_key_changed() Failed"); + } + + item = elm_genlist_item_append(genlist, ct_detail_get_baseinfo_item_class(cdetail_d->contact), cdetail_d, NULL, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + evas_object_data_set(genlist, "base_info", item); + + contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &baseinfo); + + // number list + list = NULL; + contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &list); + value = ct_detail_get_default_number(list); + default_num_id = 0; + if (value) { + default_num_id = contacts_svc_value_get_int(value, CTS_NUM_VAL_ID_INT); + + elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_NUM_UTIL_BTN], value, NULL, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + detail_genlist_append_separator_line(genlist); +#ifdef _CT_RCS + elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_RCS_NUM_UTIL_BTN], value, NULL, + ELM_GENLIST_ITEM_NONE, NULL, NULL); +#endif + elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_NUMBER_DEF], value, NULL, + ELM_GENLIST_ITEM_NONE, detail_gl_number_sel, value); + } + detail_fill_number_list(genlist, list, default_num_id); + if (default_num_id) + cdetail_d->has_number = true; + + // email list + list=NULL; + contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &list); + + if(!cdetail_d->ug) + detail_fill_list(genlist, &detail_itcs[DETAIL_ITC_EMAIL], list, detail_gl_email_sel); + else + detail_fill_list(genlist, &detail_itcs[DETAIL_ITC_EMAIL], list, NULL); + + // POSTAL list + list=NULL; + contacts_svc_struct_get_list(contact, CTS_CF_POSTAL_ADDR_LIST, &list); + detail_fill_list(genlist, &detail_itcs[DETAIL_ITC_ADDRESS], list, NULL); + + // instant messenger list + list=NULL; + contacts_svc_struct_get_list(contact, CTS_CF_MESSENGER_LIST, &list); + if (list) + elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_TITLE], T_(CT_GET_TEXT_BASIC ,CTTEXT_INSTANT_MESSENGER), + NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + detail_fill_list(genlist, &detail_itcs[DETAIL_ITC_MESSENGER], list, detail_gl_messenger_sel); + + need_separator = true; + + // website + list=NULL; + contacts_svc_struct_get_list(contact, CTS_CF_WEB_ADDR_LIST, &list); + if (list) { + need_separator = false; + ctui_genlist_append_separator_20px_with_line(genlist); + + if(!cdetail_d->ug) + detail_fill_list(genlist, &detail_itcs[DETAIL_ITC_URL], list, detail_gl_website_sel); + else + detail_fill_list(genlist, &detail_itcs[DETAIL_ITC_URL], list, NULL); + + } + + value = ct_detail_get_relationship(contact); + if (value) { + if (need_separator) { + need_separator = false; + ctui_genlist_append_separator_20px_with_line(genlist); + } + elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_RELATIONSHIP], value, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + } + + // TODO: Fixme - Relationship + + // event list + list=NULL; + contacts_svc_struct_get_list(contact, CTS_CF_EVENT_LIST, &list); + if (list && need_separator) { + need_separator = false; + ctui_genlist_append_separator_20px_with_line(genlist); + } + detail_fill_list(genlist, &detail_itcs[DETAIL_ITC_BIRTH], list, NULL); + + // note + if (baseinfo) { + value_data = contacts_svc_value_get_str(baseinfo, CTS_BASE_VAL_NOTE_STR); + if (value_data && *value_data) { + if (need_separator) { + need_separator = false; + ctui_genlist_append_separator_20px_with_line(genlist); + } + item = elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_NOTE], baseinfo, NULL, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + } + } + + if (cdetail_d->contact_id) { + ctui_genlist_append_separator_20px_with_line(genlist); + + // Ringtone + cdetail_d->ringtone_item = elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_RINGTONE], baseinfo, NULL, + ELM_GENLIST_ITEM_NONE, detail_ringtone_gl_sel, cdetail_d); + if (0 == cdetail_d->contact_id) + elm_genlist_item_select_mode_set(cdetail_d->ringtone_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + + ret = vconf_notify_key_changed(VCONFKEY_FILEMANAGER_DB_STATUS, detail_filemanager_status_changed_cb, item); + p_warn_if(-1 == ret, "vconf_notify_key_changed() Failed"); + + // Addressbook + if (-1 != cdetail_d->base_ab) + elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_ADDRBOOK], cdetail_d, NULL, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + + elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_UTIL_BTN], cdetail_d, NULL, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + ctui_genlist_append_separator_10px(genlist); + +#ifdef _CT_LINK + elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_LINK_UNLINK], cdetail_d, NULL, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + + if (cdetail_d->person_list && 1 < g_slist_length(cdetail_d->person_list)) { + detail_genlist_append_separator_line_10px(genlist); + item = elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_LINK_LIST], + NULL, NULL, ELM_GENLIST_ITEM_TREE, detail_gl_link_list_item_sel, NULL); + } +#endif + } + + return genlist; +} + +static UDateFormat* detail_init_time_formatter() +{ + const char *locale; + int32_t pattern_capacity; + UChar pattern[PH_TEXT_SHORT_LEN]; + UChar customSkeleton[PH_TEXT_SHORT_LEN]; + UDateFormat *formatter = NULL; + UDateTimePatternGenerator generator; + UErrorCode status = U_ZERO_ERROR; + + u_uastrncpy(customSkeleton, UDAT_YEAR_MONTH_DAY, strlen(UDAT_YEAR_MONTH_DAY)); + + locale = uloc_getDefault(); + p_retvm_if(NULL == locale, NULL, "uloc_getDefault() return NULL"); + + generator = udatpg_open(locale, &status); + p_retvm_if(U_FAILURE(status), NULL, "udatpg_open() Failed()"); + + pattern_capacity = (int32_t) (sizeof(pattern) / sizeof((pattern)[0])); + udatpg_getBestPattern(generator, customSkeleton, 6, pattern, pattern_capacity, &status); + + if (!U_FAILURE(status)) + formatter = udat_open(UDAT_IGNORE, UDAT_IGNORE, locale, NULL, -1, pattern, -1, &status); + + udatpg_close(generator); + return formatter; +} + +static void detail_back_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *nf = (Evas_Object *)data; + elm_naviframe_item_pop(nf); +} + +static void detail_make_back_btn(ct_detail_data *cdetail_d) +{ + Evas_Object *back_btn; + Elm_Object_Item *item; + back_btn = elm_button_add(cdetail_d->navi); + p_retm_if(NULL == back_btn, "elm_button_add() return NULL"); + elm_object_style_set(back_btn, "naviframe/back_btn/default"); + elm_object_item_part_content_set(cdetail_d->navi_item, "prev_btn", back_btn); + item = elm_naviframe_bottom_item_get(cdetail_d->navi); + if (true == cdetail_d->ug_detail) + evas_object_smart_callback_add(back_btn, "clicked", phone_ug_destroy_me_cb, cdetail_d->ug); + else if (elm_naviframe_top_item_get(cdetail_d->navi) == item) + evas_object_smart_callback_add(back_btn, "clicked", phone_back_btn_clicked_cb, cdetail_d->win); + else + evas_object_smart_callback_add(back_btn, "clicked", detail_back_btn_cb, cdetail_d->navi); +} + +static void detail_delete_contact_response_cb(void *data, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; + int ret = CTS_ERR_FAIL; + ct_detail_data *cdetail_d = data; + + p_retm_if(NULL == cdetail_d, "parameter(cdetail_d) is NULL"); + ct_detail_popup_hide_cb(cdetail_d, NULL, NULL); + + evas_object_data_set(cdetail_d->navi, "ct_list_update_ui", (void *)1); + ret = contacts_svc_delete_person(cdetail_d->person_id); + if (CTS_SUCCESS == ret) { + // FIXME : Improve the logic + ret = contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_CONTACT_CHANGE, + ct_detail_contacts_changed, cdetail_d); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_unsubscribe_change_with_data() Failed(%d)", ret); + if (cdetail_d->is_shortcut) + elm_exit(); + else if (NULL == cdetail_d->prev_view_data && cdetail_d->ug) + ug_destroy_me(cdetail_d->ug); + else + elm_naviframe_item_pop_to(cdetail_d->prev_navi_item); + phone_show_tickernoti(S_(PH_SYS_POP_DELETED)); + } + else { + phone_show_tickernoti(S_(PH_SYS_POP_FAILED)); + ERR("contacts_svc_delete_person() Failed(%d)", ret); + } + + PH_FN_END; +} + +static void detail_gl_edit_item_sel(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + CTSstruct *contact; + ct_detail_data *cdetail_d; + ct_detail_person_data *person_info = data; + + cdetail_d = evas_object_data_get(obj, "cdetail_d"); + p_retm_if(NULL == cdetail_d, "evas_object_data_get() return NULL"); + + if (cdetail_d->popup) + ct_detail_popup_hide_cb(cdetail_d, NULL, NULL); + + ret = contacts_svc_get_contact(person_info->ct_id, &contact); + p_retm_if(NULL == contact, "contatcs_svc_get_contact() Failed(%d)", ret); + + ct_input_push_navi_content(cdetail_d, contact, person_info->ct_id); +} + +static void detail_edit_cb(void *data, Evas_Object *obj, void *event_info) +{ + GSList *cursor; + Evas_Object *genlist; + Evas_Object *popup; + Evas_Object *btn; + Elm_Object_Item *item; + ct_detail_person_data *person_info; + ct_detail_data *cdetail_d = data; + + p_ret_if(NULL == cdetail_d); + + if (cdetail_d->popup) + evas_object_del(cdetail_d->popup); + + if (NULL == cdetail_d->person_list || + (cdetail_d->person_list && 1 == g_slist_length(cdetail_d->person_list))) { + CTSstruct *contact_dup; + contact_dup = contacts_svc_struct_duplicate(cdetail_d->contact); + p_retm_if(NULL == contact_dup, "contacts_svc_struct_duplicate() return NULL"); + ct_input_push_navi_content(cdetail_d, contact_dup, cdetail_d->contact_id); + return; + } + + popup = elm_popup_add(cdetail_d->navi); + p_retm_if(NULL == popup, "elm_popup_add() return NULL"); + elm_object_style_set(popup, "liststyle"); + elm_object_part_text_set(popup, "title,text", T_(CT_GET_TEXT_BASIC, CTTEXT_LINKED_CONTACTS)); + cdetail_d->popup = popup; + + btn = elm_button_add(popup); + elm_object_text_set(btn, S_(PH_SYS_SK_CANCEL)); + elm_object_part_content_set(popup, "button1", btn); + elm_object_style_set(btn, "popup_button/default"); + evas_object_smart_callback_add(btn, "clicked", ct_detail_popup_hide_cb, cdetail_d); + evas_object_show(popup); + + genlist = elm_genlist_add(popup); + p_retm_if(NULL == genlist, "elm_genlist_add() return NULL"); + evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_data_set(genlist, "cdetail_d", cdetail_d); + + for (cursor=cdetail_d->person_list;cursor;cursor=cursor->next) { + int ct_id = (int)cursor->data; + + person_info = calloc(1, sizeof(ct_detail_person_data)); + if (NULL == person_info) { + ERR("calloc() return NULL"); + break; + } + person_info->ct_id = ct_id; + + item = elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_EDIT_POPUP], person_info, + NULL, ELM_GENLIST_ITEM_NONE, detail_gl_edit_item_sel, person_info); + + person_info->item = item; + } + + evas_object_show(genlist); + elm_object_content_set(popup, genlist); +} + +static void detail_delete_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_detail_data *cdetail_d = data; + if (cdetail_d->popup) + evas_object_del(cdetail_d->popup); + + if (cdetail_d->person_list && 1 < g_slist_length(cdetail_d->person_list)) + phone_create_confirm_popup(&cdetail_d->popup, cdetail_d->win, + T_(CT_GET_TEXT_BASE_OP, CTTEXT_ALL_LINKED_CONTACTS_WILL_BE_DELETED), + detail_delete_contact_response_cb, cdetail_d); + else + phone_create_confirm_popup(&cdetail_d->popup, cdetail_d->win, + T_(CT_GET_TEXT_BASE_OP, CTTEXT_CONFIRM_DELETE_CONTACT), + detail_delete_contact_response_cb, cdetail_d); +} + +static void detail_more_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + int rotate; + ct_detail_data *cdetail_d = data; + + if(cdetail_d->ug) + return; + + + if (cdetail_d->popup) + ct_detail_popup_hide_cb(cdetail_d, NULL, NULL); + + cdetail_d->popup = elm_ctxpopup_add(cdetail_d->navi); + p_retm_if(NULL == cdetail_d->popup, "elm_ctxpopup_add() return NULL"); + + rotate = (int)evas_object_data_get(cdetail_d->navi, "phone_rotate"); + if (0 == rotate || 180 == rotate) + elm_ctxpopup_direction_priority_set(cdetail_d->popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT); + + evas_object_smart_callback_add(cdetail_d->popup, "dismissed", ct_detail_popup_hide_cb, cdetail_d); + elm_ctxpopup_item_append(cdetail_d->popup, S_(PH_SYS_SK_DELETE), NULL, + detail_delete_cb, cdetail_d); + elm_ctxpopup_item_append(cdetail_d->popup, S_(PH_SYS_SK_EDIT), NULL, + detail_edit_cb, cdetail_d); + + evas_object_move(cdetail_d->popup, cdetail_d->touch_x, cdetail_d->touch_y); + evas_object_show(cdetail_d->popup); +} + +static void detail_seg_sel(void *data, Evas_Object *obj, void *event_info) +{ + ct_detail_data *cdetail_d = data; + Elm_Object_Item *sitem = event_info; + Evas_Object *content; + int index; + + index = elm_segment_control_item_index_get(sitem); + + if (0 == index) { + content = elm_object_part_content_unset(cdetail_d->layout, "elm.swallow.content"); + evas_object_hide(content); + elm_object_part_content_set(cdetail_d->layout, "elm.swallow.content", cdetail_d->genlist); + ct_detail_set_navi(cdetail_d, DETAIL_VIEW_MODE_INFO); + } + else if (1 == index) { + cdetail_d->view_mode = DETAIL_VIEW_MODE_HISTORY; + if (!cdetail_d->list) + ct_detail_history_load_data(cdetail_d); + ct_detail_history_fill_layout(cdetail_d); + } +} + +static void detail_make_segment_control(Evas_Object *toolbar, ct_detail_data *cdetail_d, int mode) +{ + Evas_Object *segment; + Evas_Object *box; + Elm_Object_Item *titem; + Elm_Object_Item *info; + Elm_Object_Item *history; + double scale = elm_scale_get(); + + box = elm_box_add(toolbar); + elm_box_horizontal_set(box, EINA_FALSE); + evas_object_size_hint_min_set(box, 350 * scale, 80 * scale); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box); + + segment = elm_segment_control_add(box); + evas_object_size_hint_weight_set(segment, EVAS_HINT_EXPAND, 0.5); + evas_object_size_hint_align_set(segment, EVAS_HINT_FILL, 0.5); + + info = elm_segment_control_item_add(segment, NULL, "Info"); + history = elm_segment_control_item_add(segment, NULL, "History"); + evas_object_show(segment); + elm_box_pack_end(box, segment); + + titem = elm_toolbar_item_append(toolbar, NULL, NULL, NULL, NULL); + elm_object_item_part_content_set(titem, "object", box); + + if (DETAIL_VIEW_MODE_INFO == mode) + elm_segment_control_item_selected_set(info, EINA_TRUE); + else if (DETAIL_VIEW_MODE_HISTORY== mode) + elm_segment_control_item_selected_set(history, EINA_TRUE); + evas_object_smart_callback_add(segment, "changed", detail_seg_sel, cdetail_d); + cdetail_d->titem = titem; +} + +void ct_detail_set_navi(ct_detail_data *cdetail_d, int mode) +{ + Evas_Object *back_btn; + Evas_Object *toolbar; + cdetail_d->cnt_checked = 0; + cdetail_d->view_mode = mode; + p_retm_if(NULL == cdetail_d->navi_item, "navi item is NULL"); + + toolbar = elm_object_item_part_content_get(cdetail_d->navi_item, "controlbar"); + if (toolbar) { + if (cdetail_d->ctrl_item) { + elm_object_item_del(cdetail_d->ctrl_item); + cdetail_d->ctrl_item = NULL; + } + } + else { + toolbar = elm_toolbar_add(cdetail_d->navi); + if (NULL == toolbar) { + ERR("elm_toolbar_add() Failed"); + free(cdetail_d); + evas_object_del(cdetail_d->layout); + return; + } + evas_object_event_callback_add(toolbar, EVAS_CALLBACK_MOUSE_UP, ct_detail_mouseup, cdetail_d); + elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND); + elm_toolbar_homogeneous_set(toolbar, EINA_FALSE); + elm_object_item_part_content_set(cdetail_d->navi_item, "controlbar", toolbar); + } + + switch (mode) { + case DETAIL_VIEW_MODE_INFO: + detail_make_back_btn(cdetail_d); + if (!cdetail_d->titem) + detail_make_segment_control(toolbar, cdetail_d, mode); + cdetail_d->ctrl_item = elm_toolbar_item_insert_before(toolbar, cdetail_d->titem, PH_IMG_ICON_MORE, NULL, + detail_more_btn_clicked_cb, cdetail_d); + break; + case DETAIL_VIEW_MODE_HISTORY: + detail_make_back_btn(cdetail_d); + if (!cdetail_d->titem) { + phone_cbar_item_clear(toolbar); + detail_make_segment_control(toolbar, cdetail_d, mode); + } + cdetail_d->ctrl_item = elm_toolbar_item_insert_before(toolbar, cdetail_d->titem, PH_IMG_ICON_DELETE, NULL, + ct_detail_history_edit_btn_clicked_cb, cdetail_d); + if (0 >= cdetail_d->list_count) + elm_object_item_disabled_set(cdetail_d->ctrl_item, EINA_TRUE); + break; + case DETAIL_VIEW_MODE_CHECK: + if (cdetail_d->titem) { + elm_object_item_del(cdetail_d->titem); + cdetail_d->titem = NULL; + } + back_btn = phone_create_navi_btn(cdetail_d->navi, S_(PH_SYS_SK_CANCEL)); + evas_object_smart_callback_add(back_btn, "clicked", ct_detail_history_cancel_btn_cb, cdetail_d); + elm_object_item_part_content_set(cdetail_d->navi_item, "prev_btn", back_btn); + cdetail_d->ctrl_item = elm_toolbar_item_append(toolbar, PH_IMG_ICON_DELETE, NULL, ct_detail_history_del_btn_clicked_cb, cdetail_d); + phone_toolbar_disabled_item_append(toolbar, 3); + elm_object_item_disabled_set(cdetail_d->ctrl_item, EINA_TRUE); + break; + case DETAIL_VIEW_MODE_VCARD: + detail_make_back_btn(cdetail_d); + elm_toolbar_item_append(toolbar, CTUI_IMG_ICON_ADD_TO_CONTACTS, NULL, detail_edit_cb, cdetail_d); + phone_toolbar_disabled_item_append(toolbar, 3); + break; + default: + break; + } +} + +Evas_Object* ct_detail_create_content(ct_detail_data *cdetail_d) +{ + Elm_Theme *th; + Evas_Object *bg; + Evas_Object *genlist; + cdetail_d->vcard = SAFE_STRDUP(cdetail_d->vcard); + + th = elm_theme_new(); + elm_theme_ref_set(th, NULL); + elm_theme_extension_add(th, DETAIL_THEME_EDJ); + cdetail_d->th = th; + + if (!cdetail_d->contact && cdetail_d->contact_id) { + int ret; + + contacts_svc_begin_trans(); + cdetail_d->view_creat_ver = contacts_svc_end_trans(true); + + if (cdetail_d->person_id) { + cdetail_d->person_list = ct_detail_get_person_list(cdetail_d->person_id); + ret = contacts_svc_get_person(cdetail_d->person_id, &(cdetail_d->contact)); + p_retvm_if(ret<CTS_SUCCESS, NULL, "contacts_svc_get_person() Failed(%d)", ret); + } + else { + ret = contacts_svc_get_contact(cdetail_d->contact_id, &(cdetail_d->contact)); + p_retvm_if(ret<CTS_SUCCESS, NULL, "contacts_svc_get_contact() Failed(%d)", ret); + } + + cdetail_d->base_ab_mode = CTS_ADDRESSBOOK_MODE_NONE; + cdetail_d->base_ab_name = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_PHONE)); + + ret = contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE, + ct_detail_contacts_changed, cdetail_d); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_subscribe_change() Failed(%d)", ret); + ret = contacts_svc_subscribe_change(CTS_SUBSCRIBE_LINK_CHANGE, + ct_detail_link_changed, cdetail_d); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_subscribe_change() Failed(%d)", ret); + ret = contacts_svc_subscribe_change(CTS_SUBSCRIBE_PLOG_CHANGE, + ct_detail_history_changed_cb, cdetail_d); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_subscribe_change() Failed(%d)", ret); + } + + detail_create_itcs(); + ct_detail_history_create_itcs(); + cdetail_d->formatter = detail_init_time_formatter(); + + cdetail_d->layout = phone_create_base_layout(cdetail_d->navi, false); + bg = phone_create_bg(cdetail_d->layout); + if (NULL == bg) { + ERR("phone_create_bg() return NULL"); + evas_object_del(cdetail_d->layout); + return NULL; + } + elm_object_style_set(bg, "group_list"); + phone_detail_log_init_time_format(); + phone_detail_log_generate_date_format(cdetail_d->hformatter); + genlist = ctui_detail_genlist_update(cdetail_d); + elm_object_part_content_set(cdetail_d->layout, "elm.swallow.content", genlist); + + evas_object_data_set(cdetail_d->navi, "cdetail_d", cdetail_d); + evas_object_event_callback_add(cdetail_d->layout, EVAS_CALLBACK_DEL, detail_view_delete_cb, cdetail_d); + cdetail_d->has_detail = true; + + return cdetail_d->layout; +} + diff --git a/lib/details/ct-detail-view.h b/lib/details/ct-detail-view.h new file mode 100755 index 0000000..1aaef71 --- /dev/null +++ b/lib/details/ct-detail-view.h @@ -0,0 +1,32 @@ +/* + * 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_DETAIL_VIEW_H__ +#define __CONTACTS_DETAIL_VIEW_H__ + +enum { + DETAIL_VIEW_MODE_INFO = 0, + DETAIL_VIEW_MODE_HISTORY, + DETAIL_VIEW_MODE_CHECK, + DETAIL_VIEW_MODE_VCARD, +}; + +void ct_detail_set_navi(ct_detail_data *cdetail_d, int mode); +Evas_Object* ct_detail_create_content(ct_detail_data *cdetail_d); +Elm_Genlist_Item_Class* ct_detail_get_baseinfo_item_class(CTSstruct *contact); + +#endif //__CONTACTS_DETAIL_VIEW_H__ + diff --git a/lib/details/ct-input-change-name.c b/lib/details/ct-input-change-name.c new file mode 100755 index 0000000..d5080d0 --- /dev/null +++ b/lib/details/ct-input-change-name.c @@ -0,0 +1,147 @@ +/*
+ * 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 "phone.h"
+#include "ct-input-change-name.h"
+
+typedef struct {
+ Evas_Object *navi;
+ Elm_Object_Item *navi_it;
+ Evas_Object *entry;
+ ct_change_name_cb change_name_cb;
+ void *cb_data;
+} ct_input_change_name_data;
+
+static void input_change_name_cancel_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_input_change_name_data *changename_d = data;
+ elm_naviframe_item_pop(changename_d->navi);
+}
+
+static void input_change_name_save_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_input_change_name_data *changename_d = data;
+ if (changename_d->change_name_cb) {
+ char *name = ctui_entry_markup_to_utf8(elm_entry_entry_get(changename_d->entry));
+ changename_d->change_name_cb(changename_d->cb_data, name);
+ free(name);
+ }
+ elm_naviframe_item_pop(changename_d->navi);
+}
+
+static void input_change_name_entry_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ char *text;
+ ct_input_change_name_data *changename_d = data;
+
+ text = ctui_entry_markup_to_utf8(elm_entry_entry_get(obj));
+ p_retm_if(NULL == text, "ctui_entry_markup_to_utf8() return NULL");
+
+ if (*text)
+ ctui_navi_left_btn_disabled_set(changename_d->navi_it, EINA_FALSE);
+ else
+ ctui_navi_left_btn_disabled_set(changename_d->navi_it, EINA_TRUE);
+ free(text);
+}
+
+static Evas_Object* input_change_name_gl_content_get(void *data, Evas_Object *obj, const char *part)
+{
+ static Elm_Entry_Filter_Limit_Size limit_filter_data;
+ Evas_Object *edit_field;
+ Evas_Object *entry;
+ ct_input_change_name_data *changename_d = data;
+
+ edit_field = ctui_create_editfield(obj, NULL, NULL, false);
+
+ entry = elm_object_part_content_get(edit_field, "elm.swallow.content");
+ elm_object_signal_emit(edit_field, "elm,state,guidetext,hide", "elm");
+ changename_d->entry = entry;
+
+ limit_filter_data.max_byte_count = CT_EDITFIELD_MAX_BYTE;
+ elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &limit_filter_data);
+ evas_object_smart_callback_add(entry, "changed", input_change_name_entry_changed_cb, changename_d);
+ evas_object_smart_callback_add(entry, "preedit,changed", input_change_name_entry_changed_cb, changename_d);
+
+ evas_object_show(entry);
+ elm_object_focus_set(entry, EINA_TRUE);
+ elm_entry_cursor_end_set(entry);
+
+ return edit_field;
+}
+
+static Elm_Genlist_Item_Class itc_change_name = { .item_style="1icon", .func.content_get=input_change_name_gl_content_get };
+
+static Evas_Object* input_change_name_create_view(ct_input_change_name_data *changename_d)
+{
+ Evas_Object *base, *bg;
+ Evas_Object *genlist;
+
+ base = phone_create_base_layout(changename_d->navi, false);
+ bg = phone_create_bg(base);
+ if (NULL == bg) {
+ ERR("phone_create_bg() return NULL");
+ evas_object_del(base);
+ return NULL;
+ }
+ elm_object_style_set(bg, "group_list");
+
+ genlist = elm_genlist_add(base);
+ elm_genlist_item_append(genlist, &itc_change_name, changename_d, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ elm_object_part_content_set(base, "elm.swallow.content", genlist);
+
+ return base;
+}
+
+static void input_change_name_del(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ ct_input_change_name_data *changename_d = data;
+ free(changename_d);
+}
+
+void ct_input_change_name_view(Evas_Object *navi, ct_change_name_cb cb, void *cb_data)
+{
+ Evas_Object *layout;
+ Evas_Object *l_btn;
+ Evas_Object *r_btn;
+ ct_input_change_name_data *changename_d;
+
+ changename_d = calloc(1, sizeof(ct_input_change_name_data));
+ p_retm_if(NULL == changename_d, "calloc() return NULL");
+ changename_d->navi = navi;
+ changename_d->change_name_cb = cb;
+ changename_d->cb_data = cb_data;
+
+ layout = input_change_name_create_view(changename_d);
+ if (NULL == layout) {
+ ERR("input_change_name_create_view() return NULL");
+ free(changename_d);
+ return;
+ }
+ evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, input_change_name_del, changename_d);
+
+ changename_d->navi_it = elm_naviframe_item_push(navi, T_(CT_GET_TEXT_BASIC, CTTEXT_RENAME), NULL, NULL, layout, NULL);
+
+ l_btn = phone_create_navi_btn(navi, S_(CT_SYS_SK_DONE));
+ evas_object_smart_callback_add(l_btn, "clicked", input_change_name_save_cb, changename_d);
+ elm_object_item_part_content_set(changename_d->navi_it, "title_left_btn", l_btn);
+ ctui_navi_left_btn_disabled_set(changename_d->navi_it, EINA_TRUE);
+
+ r_btn = phone_create_navi_btn(navi, S_(PH_SYS_SK_CANCEL));
+ evas_object_smart_callback_add(r_btn, "clicked", input_change_name_cancel_cb, changename_d);
+ elm_object_item_part_content_set(changename_d->navi_it, "title_right_btn", r_btn);
+
+}
+
diff --git a/lib/details/ct-input-change-name.h b/lib/details/ct-input-change-name.h new file mode 100755 index 0000000..4350ac7 --- /dev/null +++ b/lib/details/ct-input-change-name.h @@ -0,0 +1,24 @@ +/*
+ * 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 __CT_INPUT_CHANGE_NAME_H__
+#define __CT_INPUT_CHANGE_NAME_H__
+
+#include "phone-common.h"
+void ct_input_change_name_view(Evas_Object *navi, ct_change_name_cb cb, void *cb_data);
+
+#endif /* __CT_INPUT_CHANGE_NAME_H__ */
+
diff --git a/lib/details/ct-input-num-email.c b/lib/details/ct-input-num-email.c new file mode 100755 index 0000000..780b343 --- /dev/null +++ b/lib/details/ct-input-num-email.c @@ -0,0 +1,1125 @@ +/* + * 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 "phone.h" +#include "ct-detail.h" +#include "ct-detail-utils.h" +#include "ct-input-utils.h" +#include "ct-input-view.h" +#include "ct-input-num-email.h" +#include "ct-input-change-name.h" + +static Evas_Object* input_fill_layout_number(ct_input_data *cinput_d, CTSvalue *value); +static Evas_Object* input_fill_layout_email(ct_input_data *cinput_d, CTSvalue *value); +static Evas_Object* input_add_new_number(ct_input_data *cinput_d); +static Evas_Object* input_add_new_email(ct_input_data *cinput_d); + +static CTSvalue *input_new_number(ct_input_data *cinput_d) +{ + int ret; + int type; + int next_number_type; + GSList *list; + CTSvalue *value; + + value = contacts_svc_value_new(CTS_VALUE_NUMBER); + p_retvm_if(NULL == value, NULL, "contacts_svc_value_new() return NULL"); + + next_number_type = ct_input_next_number_type(cinput_d->contact); + + type = ct_input_get_number_type(next_number_type); + contacts_svc_value_set_int(value, CTS_NUM_VAL_TYPE_INT, type); + + list = NULL; + list = g_slist_append(list, value); + ret = contacts_svc_struct_store_list(cinput_d->contact, CTS_CF_NUMBER_LIST, list); + g_slist_free(list); + p_retvm_if(ret < CTS_SUCCESS, NULL, "contacts_svc_struct_store_list() failed(%d)", ret); + + ret = contacts_svc_value_set_bool(value, CTS_NUM_VAL_DELETE_BOOL, true); + p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_value_set_bool() failed(%d)", ret); + + return value; +} + +static inline CTSvalue* input_new_email(CTSstruct *contact) +{ + int ret; + int type; + GSList *list; + CTSvalue *value; + + value = contacts_svc_value_new(CTS_VALUE_EMAIL); + p_retvm_if(NULL == value, NULL, "contacts_svc_value_new() return NULL"); + + type = ct_input_next_email_type(contact); + contacts_svc_value_set_int(value, CTS_EMAIL_VAL_TYPE_INT, type); + + list = NULL; + list = g_slist_append(list, value); + ret = contacts_svc_struct_store_list(contact, CTS_CF_EMAIL_LIST, list); + g_slist_free(list); + p_retvm_if(ret < CTS_SUCCESS, NULL, "contacts_svc_struct_store_list() failed(%d)", ret); + + ret = contacts_svc_value_set_bool(value, CTS_EMAIL_VAL_DELETE_BOOL, true); + p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_value_set_bool() failed(%d)", ret); + + return value; + +} + +static void input_email_del(ct_input_data *cinput_d, ct_input_typed_data *typed_data) +{ + int ret; + int idx; + Eina_List *list = NULL; + + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + p_retm_if(NULL == typed_data, "parameter(typed_data) is NULL"); + + ret = contacts_svc_value_set_bool(typed_data->value, CTS_EMAIL_VAL_DELETE_BOOL, true); + p_retm_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret); + + if (typed_data->ly_main == cinput_d->ly_email_first) { + idx = ct_input_box_idx_get(cinput_d->box, typed_data->ly_main); + list = elm_box_children_get(cinput_d->box); + cinput_d->ly_email_first = eina_list_nth(list, idx + 1); + eina_list_free(list); + } + + elm_box_unpack(cinput_d->box, typed_data->ly_main); + evas_object_del(typed_data->ly_main); +} + +static void input_email_del_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_input_data *cinput_d = data; + ct_input_typed_data *typed_data; + + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + + typed_data = evas_object_data_get(obj, "typed_data"); + p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL"); + + input_email_del(cinput_d, typed_data); +} + +static void input_number_default_reset(ct_input_data *cinput_d) +{ + int cnt = 0; + int idx; + int ret; + Evas_Object *ly; + Eina_List *list; + ct_input_typed_data *typed_data; + + idx = ct_input_box_idx_get(cinput_d->box, cinput_d->ly_number_first); + list = elm_box_children_get(cinput_d->box); + ly = cinput_d->ly_number_first; + + cinput_d->ly_number_default = NULL; + + while (ly != cinput_d->ly_number_last) { + typed_data = evas_object_data_get(ly, "typed_data"); + + if (NULL == typed_data) { + ERR("elm_object_item_data_get return NULL"); + ly = eina_list_nth(list, ++cnt); + continue; + } + + if (!contacts_svc_value_get_bool(typed_data->value, CTS_NUM_VAL_DELETE_BOOL)) { + ret = contacts_svc_value_set_bool(typed_data->value, CTS_NUM_VAL_DEFAULT_BOOL, true); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() Failed(%d)", ret); + + cinput_d->ly_number_default = typed_data->ly_main; + edje_object_signal_emit(_EDJ(typed_data->ly_content), "elm,state,contact,default_number,enabled", "elm"); + break; + } + ly = eina_list_nth(list, ++cnt); + } + eina_list_free(list); +} + +static void input_set_default_num_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + ct_input_data *cinput_d; + ct_input_typed_data *typed_data = data; + + cinput_d = evas_object_data_get(obj, "cinput_d"); + p_retm_if(NULL == cinput_d, "evas_object_data_get() return NULL"); + + evas_object_del(obj); + cinput_d->cdetail_d->popup = NULL; + + if (cinput_d->ly_number_default) { + ct_input_typed_data *typed_data_temp; + typed_data_temp = evas_object_data_get(cinput_d->ly_number_default, "typed_data"); + p_retm_if(NULL == typed_data_temp, "evas_object_data_get() return NULL"); + + ret = contacts_svc_value_set_bool(typed_data_temp->value, CTS_NUM_VAL_DEFAULT_BOOL, false); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret); + + edje_object_signal_emit(_EDJ(typed_data_temp->ly_content), "elm,state,contact,default_number,disabled", "elm"); + } + + ret = contacts_svc_value_set_bool(typed_data->value, CTS_NUM_VAL_DEFAULT_BOOL, true); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret); + + cinput_d->ly_number_default = typed_data->ly_main; + edje_object_signal_emit(_EDJ(typed_data->ly_content), "elm,state,contact,default_number,enabled", "elm"); +} + +static void input_set_default_cb(void *data, Evas_Object *obj, void *event_info) +{ + int rotate; + unsigned int idx; + int num_type; + const char *num; + char buf[PH_TEXT_SHORT_LEN]; + char number_type[PH_TEXT_SHORT_LEN/2]; + Eina_List *list, *cursor; + Evas_Object *ly_main; + Evas_Object *popup; + ct_input_data *cinput_d = data; + ct_input_typed_data *typed_data; + + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + + popup = elm_ctxpopup_add(cinput_d->cdetail_d->win); + p_retm_if(NULL == popup, "elm_ctxpopup_add() return NULL"); + + rotate = (int)evas_object_data_get(cinput_d->cdetail_d->navi, "phone_rotate"); + if (0 == rotate || 180 == rotate) + elm_ctxpopup_direction_priority_set(popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT); + + evas_object_smart_callback_add(popup, "dismissed", ct_detail_popup_hide_cb, cinput_d->cdetail_d); + evas_object_data_set(popup, "cinput_d", cinput_d); + + idx = ct_input_box_idx_get(cinput_d->box, cinput_d->ly_number_first); + list = elm_box_children_get(cinput_d->box); + + EINA_LIST_FOREACH(eina_list_nth_list(list, idx), cursor, ly_main) { + if (NULL == ly_main) continue; + + if (ly_main == cinput_d->ly_number_last) + break; + + typed_data = evas_object_data_get(ly_main, "typed_data"); + if (NULL == typed_data) { + ERR("evas_object_data_get() return NULL"); + break; + } + + if (contacts_svc_value_get_bool(typed_data->value, CTS_NUM_VAL_DELETE_BOOL)) + continue; + + if (contacts_svc_value_get_bool(typed_data->value, CTS_NUM_VAL_DEFAULT_BOOL)) + continue; + + num_type = contacts_svc_value_get_int(typed_data->value, CTS_NUM_VAL_TYPE_INT); + num = contacts_svc_value_get_str(typed_data->value, CTS_NUM_VAL_NUMBER_STR); + + ctui_get_number_type_str(num_type, number_type, sizeof(number_type)); + snprintf(buf, sizeof(buf), "%s %s", number_type, num); + elm_ctxpopup_item_append(popup, buf, NULL, input_set_default_num_cb, typed_data); + } + eina_list_free(list); + + if (cinput_d->cdetail_d->popup) + ct_detail_popup_hide_cb(cinput_d->cdetail_d, NULL, NULL); + + cinput_d->cdetail_d->popup = popup; + phone_move_ctxpopup(popup, obj); + evas_object_show(popup); +} + + +static Evas_Object* input_fill_layout_set_default(ct_input_data *cinput_d) +{ + Evas_Object *btn; + Evas_Object *ly_content, *ly_main; + Evas_Object *box = cinput_d->box; + + ly_content = ct_input_create_dg_layout(box, "bg/1icon"); + p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL"); + + ly_main = ct_input_create_dg_layout(box, "edit/contact.3"); + p_retvm_if(NULL == ly_main, NULL, "ct_input_create_dg_layout() return NULL"); + elm_object_signal_emit(ly_main, "elm,state,decorate,enabled", "elm"); + elm_object_part_content_set(ly_main, "elm.swallow.decorate.content", ly_content); + + btn = ctui_create_btn(ly_content, T_(CT_GET_TEXT_BASE_OP, CTTEXT_SET_DEFAULT_NUM)); + p_retvm_if(NULL == btn, NULL, "ctui_create_btn() return NULL"); + + evas_object_smart_callback_add(btn, "clicked", input_set_default_cb, cinput_d); + p_retvm_if(NULL == btn, NULL, "elm_button_add() return NULL"); + elm_object_part_content_set(ly_content, "elm.icon", btn); + + return ly_main; +} + +static void input_number_set_default_button_reset(ct_input_data *cinput_d) +{ + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + + if (cinput_d->cnt_num < 2 && cinput_d->ly_number_set_default) { + elm_box_unpack(cinput_d->box, cinput_d->ly_number_set_default_separator_before); + evas_object_del(cinput_d->ly_number_set_default_separator_before); + + elm_box_unpack(cinput_d->box, cinput_d->ly_number_set_default); + evas_object_del(cinput_d->ly_number_set_default); + + elm_box_unpack(cinput_d->box, cinput_d->ly_number_set_default_separator_after); + evas_object_del(cinput_d->ly_number_set_default_separator_after); + cinput_d->ly_number_set_default = NULL; + } + else if (NULL == cinput_d->ly_number_set_default && 1 < cinput_d->cnt_num) { + /* 'Mark as default number' button */ + cinput_d->ly_number_set_default_separator_before = ct_input_fill_layout_separator(cinput_d, "separator/hd16"); + p_retm_if(NULL == cinput_d->ly_number_set_default_separator_before, "ct_input_fill_layout_separator() return NULL"); + elm_box_pack_after(cinput_d->box, cinput_d->ly_number_set_default_separator_before, cinput_d->ly_number_last); + + cinput_d->ly_number_set_default = input_fill_layout_set_default(cinput_d); + p_retm_if(NULL == cinput_d->ly_number_set_default, "input_fill_layout_set_default() return NULL"); + elm_box_pack_after(cinput_d->box, cinput_d->ly_number_set_default, cinput_d->ly_number_set_default_separator_before); + + cinput_d->ly_number_set_default_separator_after = ct_input_fill_layout_separator(cinput_d, "separator/hd18/with_line"); + p_retm_if(NULL == cinput_d->ly_number_set_default_separator_after, "ct_input_fill_layout_separator() return NULL"); + elm_box_pack_after(cinput_d->box, cinput_d->ly_number_set_default_separator_after, cinput_d->ly_number_set_default); + } +} + + +static void input_number_del(ct_input_data *cinput_d, ct_input_typed_data *typed_data) +{ + int ret; + int idx; + Eina_List *list = NULL; + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + p_retm_if(NULL == typed_data, "parameter(typed_data) is NULL"); + + if (!contacts_svc_value_get_bool(typed_data->value, CTS_NUM_VAL_DELETE_BOOL)) { + ret = contacts_svc_value_set_bool(typed_data->value, CTS_NUM_VAL_DELETE_BOOL, true); + p_retm_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret); + + cinput_d->cnt_num--; + input_number_set_default_button_reset(cinput_d); + } + + if (typed_data->ly_main == cinput_d->ly_number_first) { + idx = ct_input_box_idx_get(cinput_d->box, typed_data->ly_main); + list = elm_box_children_get(cinput_d->box); + cinput_d->ly_number_first = eina_list_nth(list, idx + 1); + eina_list_free(list); + } + + if (typed_data->ly_main == cinput_d->ly_number_default) + input_number_default_reset(cinput_d); + + elm_box_unpack(cinput_d->box, typed_data->ly_main); + evas_object_del(typed_data->ly_main); +} + +static void input_number_del_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_input_typed_data *typed_data; + ct_input_data *cinput_d = data; + + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + + typed_data = evas_object_data_get(obj, "typed_data"); + p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL"); + + input_number_del(cinput_d, typed_data); +} + + +static Evas_Object* input_add_new_email(ct_input_data *cinput_d) +{ + CTSvalue *value; + Evas_Object *layout; + + value = input_new_email(cinput_d->contact); + p_retvm_if(NULL == value, NULL, "input_new_email() return NULL"); + + layout = input_fill_layout_email(cinput_d, value); + p_retvm_if(NULL == layout, NULL, "input_fill_layout_email() return NULL"); + + if (NULL == cinput_d->ly_email_first) + cinput_d->ly_email_first = layout; + cinput_d->ly_email_last = layout; + + return layout; +} + +static void input_number_type_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + int type = (int)data; + char buf[PH_TEXT_SHORT_LEN]; + ct_input_typed_data *typed_data; + Evas_Object *ly_type; + + typed_data = evas_object_data_get(obj, "typed_data"); + p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL"); + + contacts_svc_value_set_int(typed_data->value, CTS_NUM_VAL_TYPE_INT, ct_input_get_number_type(type)); + ctui_get_number_type_str(ct_input_get_number_type(type), buf, sizeof(buf)); + + ly_type = elm_object_part_content_get(typed_data->ly_content, "elm.flip.content.title"); + p_retm_if(NULL == ly_type, "elm_object_part_content_get() return NULL"); + + elm_object_part_text_set(ly_type, "title.text", buf); + evas_object_del(obj); +} + +static void input_email_type_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + int type = (int)data; + ct_input_typed_data *typed_data; + Evas_Object *ly_type; + + typed_data = evas_object_data_get(obj, "typed_data"); + p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL"); + + contacts_svc_value_set_int(typed_data->value, CTS_EMAIL_VAL_TYPE_INT, type); + + ly_type = elm_object_part_content_get(typed_data->ly_content, "elm.flip.content.title"); + p_retm_if(NULL == ly_type, "elm_object_part_content_get() return NULL"); + + elm_object_part_text_set(ly_type, "title.text", T_(CT_GET_TEXT_EMAIL_TYPE, type)); + evas_object_del(obj); +} + +static void input_website_type_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + int type = (int)data; + ct_input_typed_data *typed_data; + Evas_Object *ly_type; + + typed_data = evas_object_data_get(obj, "typed_data"); + p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL"); + + contacts_svc_value_set_int(typed_data->value, CTS_WEB_VAL_TYPE_INT, type); + + ly_type = elm_object_part_content_get(typed_data->ly_content, "elm.flip.content.title"); + p_retm_if(NULL == ly_type, "elm_object_part_content_get() return NULL"); + + elm_object_part_text_set(ly_type, "title.text", T_(CT_GET_TEXT_WEBSITE_TYPE, type)); + evas_object_del(obj); +} + +static void input_messenger_type_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + int type = (int)data; + ct_input_typed_data *typed_data; + Evas_Object *ly_type; + + typed_data = evas_object_data_get(obj, "typed_data"); + p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL"); + + contacts_svc_value_set_int(typed_data->value, CTS_MESSENGER_VAL_TYPE_INT, type); + + ly_type = elm_object_part_content_get(typed_data->ly_content, "elm.flip.content.title"); + p_retm_if(NULL == ly_type, "elm_object_part_content_get() return NULL"); + + elm_object_part_text_set(ly_type, "title.text", T_(CT_GET_TEXT_IM_TYPE, type)); + evas_object_del(obj); +} + +static void input_relationship_type_rename_cb(void *data, char *str) +{ + Evas_Object *ly_type; + ct_input_typed_data *typed_data = data; + p_retm_if(NULL == typed_data, "parameter(typed_data)"); + + contacts_svc_value_set_str(typed_data->value, CTS_EXTEND_VAL_DATA3_STR, str); + + ly_type = elm_object_part_content_get(typed_data->ly_content, "elm.flip.content.title"); + p_retm_if(NULL == ly_type, "elm_object_part_content_get() return NULL"); + + if (str && *str) + elm_object_part_text_set(ly_type, "title.text", str); +} + +static void input_relationship_type_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + int type = (int)data; + ct_input_typed_data *typed_data; + Evas_Object *ly_type; + ct_input_data *cinput_d; + + typed_data = evas_object_data_get(obj, "typed_data"); + p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL"); + + cinput_d = evas_object_data_get(obj, "cinput_d"); + p_retm_if(NULL == cinput_d, "evas_object_data_get() return NULL"); + + if (RELATIONSHIP_TYPE_CUSTOM == type) + ct_input_change_name_view(cinput_d->cdetail_d->navi, input_relationship_type_rename_cb, typed_data); + + contacts_svc_value_set_int(typed_data->value, CTS_EXTEND_VAL_DATA1_INT, type); + ly_type = elm_object_part_content_get(typed_data->ly_content, "elm.flip.content.title"); + p_retm_if(NULL == ly_type, "elm_object_part_content_get() return NULL"); + + elm_object_part_text_set(ly_type, "title.text", T_(CT_GET_TEXT_RELATIONSHIP_TYPE, type)); + evas_object_del(obj); +} + +void ct_input_data_type_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + int i; + int type; + int type_int; + int rotate; + int x, y, w, h; + Evas_Object *popup; + ct_input_data *cinput_d; + ct_input_typed_data *typed_data = data; + Evas_Event_Mouse_Up *ev = (Evas_Event_Mouse_Up *)event_info; + + if (ev && ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) + return; + + evas_object_geometry_get(obj, &x, &y, &w, &h); + if (ev->output.y < y || y + h < ev->output.y) + return; + + p_retm_if(NULL == typed_data, "parameter(typed_data) is NULL"); + + cinput_d = evas_object_data_get(obj, "cinput_d"); + p_retm_if(NULL == cinput_d, "evas_object_data_get() return NULL"); + + popup = elm_ctxpopup_add(cinput_d->cdetail_d->navi); + p_retm_if(NULL == popup, "elm_ctxpopup_add() return NULL"); + cinput_d->cdetail_d->popup = popup; + + rotate = (int)evas_object_data_get(cinput_d->cdetail_d->navi, "phone_rotate"); + if (0 == rotate || 180 == rotate) + elm_ctxpopup_direction_priority_set(popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT); + + evas_object_smart_callback_add(popup, "dismissed", ct_detail_popup_hide_cb, cinput_d->cdetail_d); + evas_object_data_set(popup, "typed_data", typed_data); + evas_object_data_set(popup, "cinput_d", cinput_d); + + type = contacts_svc_value_get_type(typed_data->value); + switch (type) { + case CTS_VALUE_NUMBER: + type_int = contacts_svc_value_get_int(typed_data->value, CTS_NUM_VAL_TYPE_INT); + for (i=CTTEXT_TYPE_MOBILE;i<=CTTEXT_TYPE_OTHER;i++) { + if (type_int == ct_input_get_number_type(i)) continue; + elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_NUM_TYPE, i), NULL, + input_number_type_changed_cb, (void *)i); + } + break; + + case CTS_VALUE_EMAIL: + type_int = contacts_svc_value_get_int(typed_data->value, CTS_EMAIL_VAL_TYPE_INT); + + for (i=CTS_EMAIL_TYPE_HOME;i<=CTS_EMAIL_TYPE_WORK;i++) { + if (type_int == i) continue; + elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_EMAIL_TYPE, i), NULL, + input_email_type_changed_cb, (void *)i); + } + if (type_int != CTS_EMAIL_TYPE_NONE) { + elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_EMAIL_TYPE, CTS_EMAIL_TYPE_NONE), NULL, + input_email_type_changed_cb, (void *)CTS_EMAIL_TYPE_NONE); + } + break; + + case CTS_VALUE_WEB: + type_int = contacts_svc_value_get_int(typed_data->value, CTS_WEB_VAL_TYPE_INT); + for (i=CTS_WEB_TYPE_HOME;i<=CTS_WEB_TYPE_WORK;i++) { + if (type_int == i) continue; + elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_WEBSITE_TYPE, i), NULL, + input_website_type_changed_cb, (void *)i); + } + if (type_int != CTS_WEB_TYPE_NONE) { + elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_WEBSITE_TYPE, CTS_WEB_TYPE_NONE), NULL, + input_website_type_changed_cb, (void *)CTS_WEB_TYPE_NONE); + } + break; + case CTS_VALUE_MESSENGER: + type_int = contacts_svc_value_get_int(typed_data->value, CTS_MESSENGER_VAL_TYPE_INT); + + for (i=CTS_IM_TYPE_GOOGLE;i<=CTS_IM_TYPE_SKYPE;i++) { + if (type_int == i) continue; + elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_IM_TYPE, i), NULL, + input_messenger_type_changed_cb, (void *)i); + } + if (type_int != CTS_IM_TYPE_NONE) { + elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_IM_TYPE, CTS_IM_TYPE_NONE), NULL, + input_messenger_type_changed_cb, (void *)CTS_IM_TYPE_NONE); + } + break; + case CTS_VALUE_EXTEND: + type_int = contacts_svc_value_get_int(typed_data->value, CTS_EXTEND_VAL_DATA1_INT); + for (i=RELATIONSHIP_TYPE_ASSISTANT;i<RELATIONSHIP_TYPE_MAX;i++) { + if (type_int == i) continue; + elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_RELATIONSHIP_TYPE, i), NULL, + input_relationship_type_changed_cb, (void *)i); + } + break; + default: + ERR("Unknown type"); + return; + } + + phone_move_ctxpopup(popup, obj); + evas_object_show(popup); +} + +static Evas_Object* input_add_new_number(ct_input_data *cinput_d) +{ + CTSvalue *value; + Evas_Object *layout; + + value = input_new_number(cinput_d); + p_retvm_if(NULL == value, NULL, "input_new_number() return NULL"); + + layout = input_fill_layout_number(cinput_d, value); + p_retvm_if(NULL == layout, NULL, "input_fill_layout_number() return NULL"); + + if (NULL == cinput_d->ly_number_first) + cinput_d->ly_number_first = layout; + cinput_d->ly_number_last = layout; + + input_number_set_default_button_reset(cinput_d); + + return layout; +} + +static inline bool input_num_email_check_dirty_number(char digit) +{ + switch (digit) + { + case '0' ... '9': + case 'p': + case 'w': + case 'P': + case 'W': + case '#': + case '*': + return false; + case '+': //only first position + default: + return true; + } +} + +static inline int input_check_utf8(char c) +{ + if (c < 128) + return 1; + else if ((c & (char)0xe0) == (char)0xc0) + return 2; + else if ((c & (char)0xf0) == (char)0xe0) + return 3; + else if ((c & (char)0xf8) == (char)0xf0) + return 4; + else if ((c & (char)0xfc) == (char)0xf8) + return 5; + else if ((c & (char)0xfe) == (char)0xfc) + return 6; + else + return CTS_ERR_FAIL; +} + +static int input_num_email_clean_number(const char *src, char *dest, int dest_size) +{ + int s_pos=0, d_pos=0, char_type; + + if (NULL == src) + ERR("The parameter(src) is NULL"); + else + { + if ('+' == src[s_pos]) + dest[d_pos++] = src[s_pos++]; + + while (src[s_pos] != 0) + { + if (d_pos >= dest_size-2) break; + char_type = input_check_utf8(src[s_pos]); + if (char_type <= 1) { + if (input_num_email_check_dirty_number(src[s_pos])) { + s_pos++; + continue; + } + dest[d_pos++] = src[s_pos++]; + } + else + s_pos += char_type; + } + } + + dest[d_pos] = 0; + return d_pos; +} + +static void input_number_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + int len; + int ret; + char *tmp; + char buf[PH_TEXT_MAX_LEN]; + Evas_Object *btn_minus; + ct_input_data *cinput_d = data; + ct_input_typed_data *typed_data; + + p_retm_if(NULL == cinput_d, "parameter(ct_input_data) is NULL"); + + tmp = ctui_entry_markup_to_utf8(elm_entry_entry_get(obj)); + p_retm_if(NULL == tmp, "ctui_entry_markup_to_utf8() return NULL"); + len = input_num_email_clean_number(tmp, buf, sizeof(buf)); + + if (strlen(tmp) != len) { + ctui_entry_entry_set(obj, buf); + elm_entry_cursor_end_set(obj); + phone_show_popup(cinput_d->cdetail_d->win, T_(CT_GET_TEXT_ERR, CTTEXT_INVALID_NUMBER), 2.0); + free(tmp); + return; + } + free(tmp); + if (0 == len) + return; + + typed_data = evas_object_data_get(obj, "typed_data"); + p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL"); + + if (!contacts_svc_value_get_bool(typed_data->value, CTS_NUM_VAL_DELETE_BOOL)) + return; + + ret = contacts_svc_value_set_bool(typed_data->value, CTS_NUM_VAL_DELETE_BOOL, false); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret); + cinput_d->cnt_num++; + + if (typed_data->ly_main == cinput_d->ly_number_last) { + btn_minus = elm_button_add(typed_data->ly_main); + p_retm_if(NULL == btn_minus, "elm_button_add() return NULL"); + + elm_object_style_set(btn_minus, "icon_minus"); + evas_object_data_set(btn_minus, "typed_data", typed_data); + elm_object_part_content_set(typed_data->ly_main, "elm.edit.icon", btn_minus); + evas_object_smart_callback_add(btn_minus, "clicked", input_number_del_clicked_cb, cinput_d); + p_retm_if(NULL == input_add_new_number(cinput_d), "input_add_new_number() return NULL"); + return; + } + + input_number_set_default_button_reset(cinput_d); +} + + +static void input_email_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + ct_input_data *cinput_d = data; + Evas_Object *btn_minus; + ct_input_typed_data *typed_data; + const char *tmp; + + tmp = elm_entry_entry_get(obj); + p_retm_if(NULL == tmp || '\0' == tmp[0], "elm_entry_entry_get() return NULL"); + + evas_object_smart_callback_del(obj, "changed", input_email_changed_cb); + p_retm_if(NULL == cinput_d, "parameter(ct_input_data) is NULL"); + + typed_data = evas_object_data_get(obj, "typed_data"); + p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL"); + + ret = contacts_svc_value_set_bool(typed_data->value, CTS_EMAIL_VAL_DELETE_BOOL, false); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret); + + if (typed_data->ly_main == cinput_d->ly_email_last) { + btn_minus = elm_button_add(typed_data->ly_main); + p_retm_if(NULL == btn_minus, "elm_button_add() return NULL"); + + elm_object_style_set(btn_minus, "icon_minus"); + evas_object_data_set(btn_minus, "typed_data", typed_data); + elm_object_part_content_set(typed_data->ly_main, "elm.edit.icon", btn_minus); + evas_object_smart_callback_add(btn_minus, "clicked", input_email_del_clicked_cb, cinput_d); + + p_retm_if(NULL == input_add_new_email(cinput_d), "input_add_new_email() return NULL"); + } +} + +static void input_number_unfocused_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + char *input; + Evas_Object *entry = obj; + ct_input_data *cinput_d = data; + ct_input_typed_data *typed_data; + + typed_data = evas_object_data_get(entry, "typed_data"); + p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL"); + + input = ctui_entry_markup_to_utf8(elm_entry_entry_get(entry)); + p_retm_if(NULL == input, "ctui_entry_markup_to_utf8() return NULL"); + + if (*input) { + ret = contacts_svc_value_set_str(typed_data->value, CTS_NUM_VAL_NUMBER_STR, input); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret); + + if (NULL == cinput_d->ly_number_default) { + ret = contacts_svc_value_set_bool(typed_data->value, CTS_NUM_VAL_DELETE_BOOL, false); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() Failed(%d)", ret); + + cinput_d->ly_number_default = typed_data->ly_main; + edje_object_signal_emit(_EDJ(typed_data->ly_content), "elm,state,contact,default_number,enabled", "elm"); + + ret = contacts_svc_value_set_bool(typed_data->value, CTS_NUM_VAL_DEFAULT_BOOL, true); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() Failed(%d)", ret); + } + } + else if (!contacts_svc_value_get_bool(typed_data->value, CTS_NUM_VAL_DELETE_BOOL)) { + ret = contacts_svc_value_set_bool(typed_data->value, CTS_NUM_VAL_DELETE_BOOL, true); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() Failed(%d)", ret); + cinput_d->cnt_num--; + + if (typed_data->ly_main == cinput_d->ly_number_default) { + edje_object_signal_emit(_EDJ(typed_data->ly_content), "elm,state,contact,default_number,disabled", "elm"); + input_number_default_reset(cinput_d); + } + + if (cinput_d->ly_number_set_default) + input_number_set_default_button_reset(cinput_d); + } + + free(input); +} + +static void input_email_unfocused_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + char *input; + Evas_Object *entry = obj; + ct_input_data *cinput_d = data; + ct_input_typed_data *typed_data; + + typed_data = evas_object_data_get(entry, "typed_data"); + p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL"); + + input = ctui_entry_markup_to_utf8(elm_entry_entry_get(entry)); + p_retm_if(NULL == input, "ctui_entry_markup_to_utf8() return NULL"); + + if (*input) { + ret = contacts_svc_value_set_bool(typed_data->value, CTS_EMAIL_VAL_DELETE_BOOL, false); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret); + + ret = contacts_svc_value_set_str(typed_data->value, CTS_EMAIL_VAL_ADDR_STR, input); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret); + } + else if (!contacts_svc_value_get_bool(typed_data->value, CTS_EMAIL_VAL_DELETE_BOOL)) { + ret = contacts_svc_value_set_bool(typed_data->value, CTS_EMAIL_VAL_DELETE_BOOL, true); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret); + + if (typed_data->data) + evas_object_smart_callback_add(typed_data->data, "changed", input_email_changed_cb, cinput_d); + } + + free(input); +} + + +static Evas_Object *input_number_get_edit_rename(ct_input_data *cinput_d, + ct_input_typed_data *typed_data) +{ + const char *val_str; + Evas_Object *entry; + Evas_Object *editfield; + Evas_Object *ly_content = typed_data->ly_content; + + editfield = ct_input_add_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_NUMBER), + input_number_unfocused_cb, cinput_d); + p_retvm_if(NULL == editfield, NULL, "ct_input_add_editfield() return NULL"); + + entry = elm_object_part_content_get(editfield, "elm.swallow.content"); + typed_data->data = entry; + + evas_object_data_set(entry, "typed_data", typed_data); + elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_PHONENUMBER); + val_str = contacts_svc_value_get_str(typed_data->value, CTS_NUM_VAL_NUMBER_STR); + + if (val_str && *val_str) { + ctui_entry_entry_set(entry, val_str); + } + else + evas_object_smart_callback_add(entry, "changed", input_number_changed_cb, cinput_d); + + return editfield; + +} + + +static Evas_Object *input_email_get_edit_rename(ct_input_data *cinput_d, + ct_input_typed_data *typed_data) +{ + const char *val_str; + Evas_Object *entry; + Evas_Object *editfield; + Evas_Object *ly_content = typed_data->ly_content; + + editfield = ct_input_add_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_EMAIL), + input_email_unfocused_cb, cinput_d); + p_retvm_if(NULL == editfield, NULL, "ct_input_add_editfield() return NULL"); + + entry = elm_object_part_content_get(editfield, "elm.swallow.content"); + typed_data->data = entry; + + evas_object_data_set(entry, "typed_data", typed_data); + elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_EMAIL); + val_str = contacts_svc_value_get_str(typed_data->value, CTS_EMAIL_VAL_ADDR_STR); + + if (val_str && *val_str) { + ctui_entry_entry_set(entry, val_str); + } + else + evas_object_smart_callback_add(entry, "changed", input_email_changed_cb, cinput_d); + + return editfield; + +} + +static Evas_Object* input_fill_layout_number(ct_input_data *cinput_d, CTSvalue *value) +{ + const char *val_str; + int type_int; + char buf[PH_TEXT_SHORT_LEN]; + Evas_Object *ly_content, *ly_main, *ly_type; + Evas_Object *ef; + Evas_Object *btn_minus; + Evas_Object *ico_check; + Evas_Object *box = cinput_d->box; + ct_input_typed_data *typed_data; + + ly_content = ct_input_create_dg_layout(box, "1title.1text.1icon.2"); + p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL"); + elm_object_signal_emit(ly_content, "elm,state,flip,enabled", "elm"); + + ly_main = ct_input_create_dg_layout(box, "edit/contact"); + p_retvm_if(NULL == ly_main, NULL, "ct_input_create_dg_layout() return NULL"); + elm_object_signal_emit(ly_main, "elm,state,decorate,enabled", "elm"); + elm_object_part_content_set(ly_main, "elm.swallow.decorate.content", ly_content); + + if (contacts_svc_value_get_bool(value, CTS_NUM_VAL_DEFAULT_BOOL)) { + edje_object_signal_emit(_EDJ(ly_content), "elm,state,contact,default_number,enabled", "elm"); + cinput_d->ly_number_default = ly_main; + } + + type_int = contacts_svc_value_get_int(value, CTS_NUM_VAL_TYPE_INT); + ctui_get_number_type_str(type_int, buf, sizeof(buf)); + + ly_type = elm_layout_add(ly_content); + if (NULL == ly_type) { + ERR("elm_layout_add() return NULL"); + evas_object_del(ly_main); + return NULL; + } + elm_layout_file_set(ly_type, CONTACTS_EDJ, "gl_title"); + elm_object_part_text_set(ly_type, "title.text", buf); + + evas_object_data_set(ly_type, "cinput_d", cinput_d); + elm_object_part_content_set(ly_content, "elm.flip.content.title", ly_type); + + ico_check = elm_icon_add(ly_content); + if (NULL == ico_check) { + ERR("elm_icon_add() return NULL"); + evas_object_del(ly_main); + return NULL; + } + elm_icon_file_set(ico_check, CTUI_IMG_CHECK, NULL); + evas_object_size_hint_aspect_set(ico_check, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_object_part_content_set(ly_content, "elm.icon", ico_check); + + typed_data = calloc(1, sizeof(ct_input_typed_data)); + p_retvm_if(NULL == typed_data, NULL, "calloc() return NULL"); + typed_data->value = value; + typed_data->ly_main = ly_main; + typed_data->ly_content = ly_content; + evas_object_data_set(ly_main, "typed_data", typed_data); + + val_str = contacts_svc_value_get_str(value, CTS_NUM_VAL_NUMBER_STR); + if (val_str && *val_str) { + btn_minus = elm_button_add(ly_main); + if (NULL == btn_minus) { + ERR("elm_button_add() return NULL"); + evas_object_del(ly_main); + free(typed_data); + return NULL; + } + elm_object_style_set(btn_minus, "icon_minus"); + evas_object_data_set(btn_minus, "typed_data", typed_data); + elm_object_part_content_set(ly_main, "elm.edit.icon", btn_minus); + evas_object_smart_callback_add(btn_minus, "clicked", input_number_del_clicked_cb, cinput_d); + } + + ef = input_number_get_edit_rename(cinput_d, typed_data); + if (NULL == ef) { + ERR("input_number_get_edit_rename() return NULL"); + evas_object_del(ly_main); + free(typed_data); + return NULL; + } + elm_object_part_content_set(ly_content, "elm.flip.content", ef); + ct_input_name_field_add(ef, cinput_d); + + evas_object_event_callback_add(ly_type, EVAS_CALLBACK_MOUSE_UP, ct_input_data_type_mouse_up_cb, typed_data); + evas_object_event_callback_add(ly_main, EVAS_CALLBACK_DEL, ct_input_typed_layout_del_cb, typed_data); + + if (cinput_d->ly_number_last) + elm_box_pack_after(box, ly_main, cinput_d->ly_number_last); + else + elm_box_pack_end(box, ly_main); + + return ly_main; +} + + +void ct_input_fill_layout_numbers(ct_input_data *cinput_d) +{ + GSList *list, *cursor; + Evas_Object *ly; + CTSstruct *contact = cinput_d->contact; + + ly = NULL; + list = NULL; + contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &list); + + for (cursor=list;cursor;cursor=cursor->next) { + if (NULL == cursor->data) + continue; + if (contacts_svc_value_get_bool(cursor->data, CTS_NUM_VAL_DELETE_BOOL)) + continue; + ly = input_fill_layout_number(cinput_d, cursor->data); + p_retm_if(NULL == ly, "input_fill_layout_number() return NULL"); + + cinput_d->cnt_num++; + if (NULL == cinput_d->ly_number_first) + cinput_d->ly_number_first = ly; + } + if (NULL != ly) + cinput_d->ly_number_last = ly; + + p_retm_if(NULL == input_add_new_number(cinput_d), "input_add_new_number() return NULL"); +} + +static Evas_Object* input_fill_layout_email(ct_input_data *cinput_d, CTSvalue *value) +{ + const char *val_str; + int type_int; + Evas_Object *ly_content, *ly_main, *ly_type; + Evas_Object *ef; + Evas_Object *btn_minus; + Evas_Object *box = cinput_d->box; + ct_input_typed_data *typed_data; + + ly_content = ct_input_create_dg_layout(box, "1title.1text.1icon.2"); + p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL"); + elm_object_signal_emit(ly_content, "elm,state,flip,enabled", "elm"); + + ly_main = ct_input_create_dg_layout(box, "edit/contact"); + p_retvm_if(NULL == ly_main, NULL, "ct_input_create_dg_layout() return NULL"); + elm_object_signal_emit(ly_main, "elm,state,decorate,enabled", "elm"); + elm_object_part_content_set(ly_main, "elm.swallow.decorate.content", ly_content); + + type_int = contacts_svc_value_get_int(value, CTS_EMAIL_VAL_TYPE_INT); + ly_type = elm_layout_add(ly_content); + if (NULL == ly_type) { + ERR("elm_layout_add() return NULL"); + evas_object_del(ly_main); + return NULL; + } + elm_layout_file_set(ly_type, CONTACTS_EDJ, "gl_title"); + elm_object_part_text_set(ly_type, "title.text", T_(CT_GET_TEXT_EMAIL_TYPE, type_int)); + evas_object_data_set(ly_type, "cinput_d", cinput_d); + elm_object_part_content_set(ly_content, "elm.flip.content.title", ly_type); + + typed_data = calloc(1, sizeof(ct_input_typed_data)); + p_retvm_if(NULL == typed_data, NULL, "calloc() return NULL"); + typed_data->value = value; + typed_data->ly_main = ly_main; + typed_data->ly_content = ly_content; + evas_object_data_set(ly_main, "typed_data", typed_data); + + val_str = contacts_svc_value_get_str(value, CTS_EMAIL_VAL_ADDR_STR); + if (val_str && *val_str) { + btn_minus = elm_button_add(ly_main); + if (NULL == btn_minus) { + ERR("elm_button_add() return NULL"); + evas_object_del(ly_main); + free(typed_data); + return NULL; + } + elm_object_style_set(btn_minus, "icon_minus"); + evas_object_data_set(btn_minus, "typed_data", typed_data); + elm_object_part_content_set(ly_main, "elm.edit.icon", btn_minus); + evas_object_smart_callback_add(btn_minus, "clicked", input_email_del_clicked_cb, cinput_d); + } + + ef = input_email_get_edit_rename(cinput_d, typed_data); + if (NULL == ef) { + ERR("input_email_get_edit_rename() return NULL"); + evas_object_del(ly_main); + free(typed_data); + return NULL; + } + elm_object_part_content_set(ly_content, "elm.flip.content", ef); + + evas_object_event_callback_add(ly_main, EVAS_CALLBACK_DEL, ct_input_typed_layout_del_cb, typed_data); + evas_object_event_callback_add(ly_type, EVAS_CALLBACK_MOUSE_UP, ct_input_data_type_mouse_up_cb, typed_data); + + if (cinput_d->ly_email_last) + elm_box_pack_after(box, ly_main, cinput_d->ly_email_last); + else + elm_box_pack_end(box, ly_main); + + ct_input_name_field_add(ef, cinput_d); + + return ly_main; +} + +int ct_input_fill_layout_emails(ct_input_data *cinput_d) +{ + int cnt = 0; + GSList *list, *cursor; + Evas_Object *ly; + CTSstruct *contact = cinput_d->contact; + + ly = NULL; + list = NULL; + contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &list); + + for (cursor=list;cursor;cursor=cursor->next) { + if (NULL == cursor->data) + continue; + if (contacts_svc_value_get_bool(cursor->data, CTS_EMAIL_VAL_DELETE_BOOL)) + continue; + ly = input_fill_layout_email(cinput_d, cursor->data); + p_retvm_if(NULL == ly, cnt, "input_fill_layout_email() return NULL"); + + if (NULL == cinput_d->ly_email_first) + cinput_d->ly_email_first = ly; + + cnt++; + } + if (NULL != ly) + cinput_d->ly_email_last = ly; + + p_retvm_if(NULL == input_add_new_email(cinput_d), cnt, "input_add_new_email() return NULL"); + return cnt; +} + diff --git a/lib/details/ct-input-num-email.h b/lib/details/ct-input-num-email.h new file mode 100755 index 0000000..64e30a3 --- /dev/null +++ b/lib/details/ct-input-num-email.h @@ -0,0 +1,24 @@ +/* + * 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_INPUT_VIEW_EXT_H__ +#define __CONTACTS_INPUT_VIEW_EXT_H__ + +void ct_input_fill_layout_numbers(ct_input_data *i_data); +int ct_input_fill_layout_emails(ct_input_data *i_data); +void ct_input_data_type_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); + +#endif //__CONTACTS_INPUT_VIEW_EXT_H__ diff --git a/lib/details/ct-input-utils.c b/lib/details/ct-input-utils.c new file mode 100755 index 0000000..ca07c49 --- /dev/null +++ b/lib/details/ct-input-utils.c @@ -0,0 +1,997 @@ +/* + * 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 <regex.h> +#include <errno.h> +#include <aul.h> +#include <ui-gadget-module.h> +#include <vconf.h> +#include <vconf-keys.h> +#include <fcntl.h> +#include <app_service.h> + +#include "phone.h" +#include "ct-list.h" +#include "ct-detail.h" +#include "ct-detail-utils.h" +#include "ct-input-utils.h" +#include "ct-input-view.h" + +static void input_change_photo(ct_input_data *cinput_d, const char *normal, + const char *full) +{ + int ret; + CTSvalue* base_info = NULL; + + base_info = ct_detail_get_baseinfo_value(cinput_d->contact); + + ret = contacts_svc_value_set_str(base_info, CTS_BASE_VAL_IMG_PATH_STR, normal); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret); + + ret = contacts_svc_value_set_str(base_info, CTS_BASE_VAL_FULL_IMG_PATH_STR, full); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret); + + ct_input_update_image(cinput_d); +} + +static void input_img_crop_result(ui_gadget_h ug, service_h service, void *data) +{ + char *normal = NULL; + char *full = NULL; + ct_input_data *cinput_d = data; + + p_retm_if(NULL == ug || NULL == data, "ug or data is NULL"); + + if (service) { + 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); + input_change_photo(cinput_d, normal, full); + free(normal); + } + ug_destroy(ug); + cinput_d->crop_ug = NULL; + + if (cinput_d->src_ug) { + ug_destroy(cinput_d->src_ug); + cinput_d->src_ug = NULL; + } +} + +static void input_src_ug_destroy(ui_gadget_h ug, void *priv) +{ + ct_input_data *cinput_d = priv; + p_retm_if(NULL == ug, "ug is NULL"); + + if (NULL == cinput_d->crop_ug) { + ug_destroy(ug); + cinput_d->src_ug = NULL; + } +} + +static void input_crop_ug_destroy(ui_gadget_h ug, void *priv) +{ + ct_input_data *cinput_d = priv; + p_retm_if(NULL == ug, "ug is NULL"); + + if (cinput_d->crop_ug) { + ug_destroy(ug); + cinput_d->crop_ug = NULL; + } +} + +static void input_gallery_result(ui_gadget_h ug, service_h service, void *data) +{ + char *val = NULL; + ct_input_data *cinput_d = data; + + p_retm_if(NULL == ug || NULL == data, "ug or data is NULL"); + + if (service) { + struct ug_cbs cbs = {0}; + + service_get_extra_data(service, "path", &val); + p_retm_if(!val, "return value is NULL.\n"); + + cbs.result_cb = input_img_crop_result; + cbs.destroy_cb = input_crop_ug_destroy; + cbs.priv = cinput_d; + cinput_d->crop_ug = phone_image_crop_ug(cinput_d->cdetail_d->ug, val, &cbs); + free(val); + } +} + +void ct_input_gallery(void *data, Evas_Object *obj, void *event_info) +{ + struct ug_cbs cbs = {0}; + ct_input_data *cinput_d = data; + + service_h service; + + service_create(&service); + service_add_extra_data(service, "launch-type", "select-one"); + service_add_extra_data(service, "file-type", "image"); + + cbs.result_cb = input_gallery_result; + cbs.destroy_cb = input_src_ug_destroy; + cbs.layout_cb = ug_common_layout_cb; + cbs.priv = cinput_d; + + cinput_d->src_ug = ug_create(cinput_d->cdetail_d->ug, GALLERY_UG, UG_MODE_FULLVIEW, service, &cbs); + p_warn_if(NULL == cinput_d->src_ug, "ug_create() Failed"); + + service_destroy(service); + evas_object_del(cinput_d->cdetail_d->popup); + cinput_d->cdetail_d->popup = NULL; +} + +static void input_camera_result(service_h service, service_h reply, service_result_e result, void* user_data) +{ + char *normal = NULL; + char *full = NULL; + ct_input_data *cinput_d = user_data; + + service_get_extra_data(reply, "crop_image_path", &normal); + p_retm_if(!normal, "return value is NULL.\n"); + + service_get_extra_data(reply, "image_path", &full); + input_change_photo(cinput_d, normal, full); + + free(normal); + free(full); +} + +void ct_input_camera(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + ct_input_data *cinput_d = data; + service_h service; + + p_retm_if(NULL == cinput_d, "paramter(ct_input_data) is NULL"); + + if (cinput_d->cdetail_d && cinput_d->cdetail_d->popup) + ct_detail_popup_hide_cb(cinput_d->cdetail_d, NULL, NULL); + + service = NULL; + ret = service_create(&service); + p_retm_if(SERVICE_ERROR_NONE != ret, "service_create() Failed(%d)", ret); + + ret = service_set_operation(service, SERVICE_OPERATION_CREATE_CONTENT); + if (SERVICE_ERROR_NONE != ret) { + ERR("service_set_operation() Failed(%d)", ret); + ret = service_destroy(service); + p_warn_if(SERVICE_ERROR_NONE != ret, "service_destroy() Failed(%d)", ret); + return; + } + + ret = service_set_mime(service, "image/jpg"); + if (SERVICE_ERROR_NONE != ret) { + ERR("service_set_mime() Failed(%d)", ret); + ret = service_destroy(service); + p_warn_if(SERVICE_ERROR_NONE != ret, "service_destroy() Failed(%d)", ret); + return; + } + + ret = service_set_package(service, CAMERA_PKG); + if (SERVICE_ERROR_NONE != ret) { + ERR("service_set_package() Failed(%d)", ret); + ret = service_destroy(service); + p_warn_if(SERVICE_ERROR_NONE != ret, "service_destroy() Failed(%d)", ret); + return; + } + + ret = service_add_extra_data(service, "CALLER", "contacts"); + if (SERVICE_ERROR_NONE != ret) { + ERR("service_add_extra_data() Failed(%d)", ret); + ret = service_destroy(service); + p_warn_if(SERVICE_ERROR_NONE != ret, "service_destroy() Failed(%d)", ret); + return; + } + + ret = service_send_launch_request(service, input_camera_result, data); + if (SERVICE_ERROR_NONE != ret) { + ERR("service_send_launch_request() Failed(%d)", ret); + ret = service_destroy(service); + p_warn_if(SERVICE_ERROR_NONE != ret, "service_destroy() Failed(%d)", ret); + return; + } + + ret = service_destroy(service); + p_retm_if(SERVICE_ERROR_NONE != ret, "service_destroy() Failed(%d)", ret); +} + +static void input_myfile_ringtone_result(ui_gadget_h ug, service_h service, void *data) +{ + ct_input_data *cinput_d = data; + + p_retm_if(NULL == ug || NULL == data, "ug or data is NULL"); + + if (service) { + const char* display; + CTSvalue *base_info = NULL; + CTSstruct *contact = cinput_d->contact; + + char *val = NULL; + service_get_extra_data(service, "result", &val); + p_retm_if(!val, "return value is NULL.\n"); + + contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &base_info); + if (NULL == base_info) { + base_info = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO); + contacts_svc_struct_store_value(contact, CTS_CF_BASE_INFO_VALUE, base_info); + } + contacts_svc_value_set_str(base_info, CTS_BASE_VAL_RINGTONE_PATH_STR, val); + display = ct_detail_get_ringtone_display_name(val); + free(val); + + ct_input_update_ringtone(contact, cinput_d->ly_ringtone); + } + + ug_destroy(ug); + cinput_d->src_ug = NULL; +} + +static inline ui_gadget_h input_myfile_ug(struct ug_cbs cbs, + service_h service, ct_input_data *cinput_d) +{ + ui_gadget_h ug; + + cbs.layout_cb = ug_common_layout_cb; + cbs.priv = cinput_d; + + ug = ug_create(cinput_d->cdetail_d->ug, MYFILES_UG, UG_MODE_FULLVIEW, service, &cbs); + p_warn_if(NULL == ug, "ug_create() Failed"); + + return ug; +} + +void ct_input_myfile_ringtone(ct_input_data *cinput_d) +{ + struct ug_cbs cbs = {0}; + + service_h service; + + service_create(&service); + + service_add_extra_data(service, "path", "/opt/share/settings/Ringtones"); + service_add_extra_data(service, "select_type", "SINGLE_FILE"); + service_add_extra_data(service, "file_type", "SOUND"); + + cbs.result_cb = input_myfile_ringtone_result; + cbs.destroy_cb = input_src_ug_destroy; + cinput_d->src_ug = input_myfile_ug(cbs, service, cinput_d); + + service_destroy(service); +} + +#define ACCOUNT_RGEX "([a-z0-9!#$%&'*+/=?^_`{|}~-]+[.])*[a-z0-9!#$%&'*+/=?^_`{|}~-]+" +#define DOMAIN_RGEX "([a-z0-9!#$%&'*+/=?^_`{|}~-]+[.])+[a-z0-9!#$%&'*+/=?^_`{|}~-]+" +#define EMAIL_RGEX ACCOUNT_RGEX"@"DOMAIN_RGEX + +int ct_input_valid_email(CTSstruct *contact) +{ + int result = TRUE; + GSList *list = NULL; + GSList *cursor; + + contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &list); + + for (cursor=list;cursor;cursor=cursor->next) { + const char *email = NULL; + + if (contacts_svc_value_get_bool(cursor->data, CTS_EMAIL_VAL_DELETE_BOOL)) + continue; + + email = contacts_svc_value_get_str(cursor->data, CTS_EMAIL_VAL_ADDR_STR); + if (email && *email) { + int len = strlen(email) + 1; + regex_t compiled; + regmatch_t str[len]; + + if (regcomp(&compiled, EMAIL_RGEX, REG_ICASE | REG_EXTENDED)) + result = FALSE; + if (regexec(&compiled, email, len, str, 0) == REG_NOMATCH) + result = FALSE; + + regfree(&compiled); + } + if (!result) + break; + } + return result; +} + +static int input_is_name_empty(CTSstruct *contact) +{ + int ret; + CTSvalue *name_val; + const char *name = NULL; + + ret = contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &name_val); + + p_retv_if(CTS_ERR_NO_DATA == ret, TRUE); + p_retvm_if(CTS_SUCCESS != ret, TRUE, "contacts_svc_struct_get_value() Failed(%d)", ret); + + name = contacts_svc_value_get_str(name_val, CTS_NAME_VAL_FIRST_STR); + if (NULL == name || '\0' == *name) { + name = contacts_svc_value_get_str(name_val, CTS_NAME_VAL_LAST_STR); + if (NULL == name || '\0' == *name) + return TRUE; + } + + return FALSE; +} + +static int input_is_num_empty(CTSstruct *contact) +{ + GSList *list = NULL; + GSList *cursor; + + contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &list); + + for (cursor=list;cursor;cursor=cursor->next) { + const char *number = NULL; + + if (contacts_svc_value_get_bool(cursor->data, CTS_NUM_VAL_DELETE_BOOL)) + continue; + + number = contacts_svc_value_get_str(cursor->data, CTS_NUM_VAL_NUMBER_STR); + if (number && *number) + return FALSE; + } + return TRUE; +} + +static int input_is_email_empty(CTSstruct *contact) +{ + GSList *list = NULL; + GSList *cursor; + + contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &list); + + for (cursor=list;cursor;cursor=cursor->next) { + bool is_del; + const char *email = NULL; + + is_del = contacts_svc_value_get_bool(cursor->data, CTS_EMAIL_VAL_DELETE_BOOL); + if (is_del) continue; + + email = contacts_svc_value_get_str(cursor->data, CTS_EMAIL_VAL_ADDR_STR); + if (email && *email) + return FALSE; + } + return TRUE; +} + +static void input_btn_popup(ct_detail_data *cdetail_d, const char *desc) +{ + Evas_Object *popup; + Evas_Object *btn; + + popup = elm_popup_add(cdetail_d->navi); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(popup, desc); + + btn = elm_button_add(popup); + elm_object_text_set(btn, S_(PH_SYS_SK_OK)); + elm_object_part_content_set(popup, "button1", btn); + elm_object_style_set(btn, "popup_button/default"); + evas_object_smart_callback_add(btn, "clicked", ct_detail_popup_hide_cb, cdetail_d); + + cdetail_d->popup = popup; + evas_object_show(popup); +} + +void ct_input_save_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + ct_detail_data *cdetail_d; + ct_input_data *cinput_d = data; + + p_retm_if(NULL == cinput_d, "cinput_d is NULL"); + + cdetail_d = cinput_d->cdetail_d; + + if (TRUE != (ret = ct_input_valid_email(cinput_d->contact))) { + input_btn_popup(cdetail_d, T_(CT_GET_TEXT_ERR, CTTEXT_INVALID_EMAIL)); + return; + } + + if (input_is_name_empty(cinput_d->contact) + && input_is_num_empty(cinput_d->contact) + && input_is_email_empty(cinput_d->contact)) { + input_btn_popup(cdetail_d, T_(CT_GET_TEXT_ERR, CTTEXT_SAVE_FAIL)); + return; + } + + if (cinput_d->contact_id) { + ret = contacts_svc_update_contact(cinput_d->contact); + if (ret < CTS_SUCCESS) { + switch (ret) { + case CTS_ERR_DB_LOCK: + ERR("contacts_svc_update_contact() Failed(%d)", ret); + phone_show_popup(cdetail_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_ERR_DB_LOCKED), 1.5); + break; + case CTS_ERR_NO_SPACE: + ERR("contacts_svc_update_contact() Failed(%d)", ret); + phone_show_popup(cdetail_d->navi, S_(CT_SYS_POP_NOT_ENOUGH_MEMORY), 1.5); + break; + default: + ERR("contacts_svc_update_contact() Failed(%d)", ret); + phone_show_popup(cdetail_d->navi, S_(PH_SYS_POP_FAILED), 1.5); + break; + } + return; + } + else { + cinput_d->saved = true; + } + } + else { + ret = contacts_svc_insert_contact(cinput_d->base_ab, cinput_d->contact); + if (ret < CTS_SUCCESS) { + switch (ret) { + case CTS_ERR_DB_LOCK: + ERR("contacts_svc_insert_contact() Failed(%d)", ret); + phone_show_popup(cdetail_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_ERR_DB_LOCKED), 1.5); + break; + case CTS_ERR_NO_SPACE: + ERR("contacts_svc_update_contact() Failed(%d)", ret); + phone_show_popup(cdetail_d->navi, S_(CT_SYS_POP_NOT_ENOUGH_MEMORY), 1.5); + break; + default: + ERR("contacts_svc_insert_contact() Failed(%d)", ret); + phone_show_popup(cdetail_d->navi, S_(PH_SYS_POP_FAILED), 1.5); + break; + } + return; + } + else { + cdetail_d->contact_id = ret; + } + if (NULL == cdetail_d->prev_view_data && cdetail_d->ug) + phone_ug_return_id(cdetail_d->ug, ret, 0, 0); + } + + /* evas_object_smart_callback_del() func will be deleted */ + evas_object_smart_callback_del(obj, "clicked", ct_input_save_cb); + + if (cdetail_d->prev_view_data && ((CT_UG_REQUEST_UPDATE_CONTACT <= cdetail_d->ug_request && + cdetail_d->ug_request <= CT_UG_REQUEST_SAVE_RINGTONE) || + (PH_UG_REQUEST_SET_WITH_NUM <= cdetail_d->ug_request && + cdetail_d->ug_request <= PH_UG_REQUEST_SET_WITH_RINGTONE))){ + ug_destroy_me(cdetail_d->ug); + } + else if (cdetail_d->ug && !cdetail_d->has_detail && NULL == cdetail_d->prev_view_data) { + ug_destroy_me(cdetail_d->ug); + } + else if (cdetail_d->vcard) + elm_exit(); + else + elm_naviframe_item_pop(cdetail_d->navi); +} + +CTSvalue* ct_input_get_event(CTSstruct *contact, int event_type) +{ + GSList *list=NULL, *cursor; + + contacts_svc_struct_get_list(contact, CTS_CF_EVENT_LIST, &list); + + for (cursor=list;cursor;cursor=cursor->next) { + int type = contacts_svc_value_get_int(cursor->data, CTS_EVENT_VAL_TYPE_INT); + if (event_type == type) + return cursor->data; + } + return NULL; +} + +CTSvalue* ct_input_get_nickname(CTSstruct *contact) +{ + GSList *list=NULL; + contacts_svc_struct_get_list(contact, CTS_CF_NICKNAME_LIST, &list); + + if (NULL == list) return NULL; + return list->data; +} + +CTSvalue* ct_input_get_website_value(CTSstruct* contact) +{ + GSList *list = NULL; + contacts_svc_struct_get_list(contact, CTS_CF_WEB_ADDR_LIST, &list); + + if (0 < g_slist_length(list)) + return list->data; + return NULL; +} + +int ct_input_get_number_type(int ct_num_type) +{ + int ret_type; + + switch (ct_num_type) { + case CTTEXT_TYPE_MOBILE: + ret_type = CTS_NUM_TYPE_CELL; + break; + case CTTEXT_TYPE_HOME: + ret_type = CTS_NUM_TYPE_VOICE | CTS_NUM_TYPE_HOME; + break; + case CTTEXT_TYPE_HOME2: + ret_type = CTS_NUM_TYPE_CELL | CTS_NUM_TYPE_HOME; + break; + case CTTEXT_TYPE_WORK: + ret_type = CTS_NUM_TYPE_VOICE | CTS_NUM_TYPE_WORK; + break; + case CTTEXT_TYPE_WORK2: + ret_type = CTS_NUM_TYPE_CELL | CTS_NUM_TYPE_WORK; + break; + case CTTEXT_TYPE_FAX_HOME: + ret_type = CTS_NUM_TYPE_FAX | CTS_NUM_TYPE_HOME; + break; + case CTTEXT_TYPE_FAX_WORK: + ret_type = CTS_NUM_TYPE_FAX | CTS_NUM_TYPE_WORK; + break; + case CTTEXT_TYPE_ASSISTANT: + ret_type = CTS_NUM_TYPE_ASSISTANT; + break; + case CTTEXT_TYPE_PAGER: + ret_type = CTS_NUM_TYPE_PAGER; + break; + case CTTEXT_TYPE_CAR: + ret_type = CTS_NUM_TYPE_CAR; + break; + case CTTEXT_TYPE_OTHER: + default: + ret_type = CTS_NUM_TYPE_NONE; + break; + } + + return ret_type; +} + +static void input_img_del_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + CTSvalue *value; + ct_input_data *cinput_d = data; + + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + + value = ct_detail_get_baseinfo_value(cinput_d->contact); + + ret = contacts_svc_value_set_str(value, CTS_BASE_VAL_IMG_PATH_STR, NULL); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret); + + ret = contacts_svc_value_set_str(value, CTS_BASE_VAL_FULL_IMG_PATH_STR, NULL); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret); + + ct_input_update_image(cinput_d); + + evas_object_del(cinput_d->cdetail_d->popup); + cinput_d->cdetail_d->popup = NULL; +} + +void ct_input_contact_image_change_popup(ct_input_data *cinput_d, bool has_photo) +{ + int rotate; + Evas_Object *popup; + int battery_status = -1; + + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + + popup = elm_ctxpopup_add(cinput_d->cdetail_d->navi); + p_retm_if(NULL == popup, "elm_ctxpopup_add() return NULL"); + + rotate = (int)evas_object_data_get(cinput_d->cdetail_d->navi, "phone_rotate"); + if (0 == rotate || 180 == rotate) + elm_ctxpopup_direction_priority_set(popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT); + + evas_object_smart_callback_add(popup, "dismissed", ct_detail_popup_hide_cb, cinput_d->cdetail_d); + evas_object_data_set(popup, "cinput_d", cinput_d); + + if (has_photo) { + elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_BASE_OP, CTTEXT_DELETE_PHOTO), NULL, + input_img_del_cb, cinput_d); + } + + elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_BASE_OP, CTTEXT_IMAGE), NULL, + ct_input_gallery, cinput_d); + + vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &battery_status); + if (VCONFKEY_SYSMAN_BAT_POWER_OFF != battery_status) + elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_BASE_OP, CTTEXT_TAKE_A_PHOTO), NULL, + ct_input_camera, cinput_d); + + cinput_d->cdetail_d->popup = popup; + + phone_move_ctxpopup(popup, elm_object_part_content_get(cinput_d->ly_baseinfo, "elm.icon.image")); + evas_object_show(popup); +} + +void ct_input_entry_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + if (elm_object_focus_get(obj)) return; + evas_object_smart_callback_call(obj, "unfocused", NULL); +} + +Evas_Object* ct_input_add_editfield(Evas_Object *parent, const char* guide_txt, + Evas_Smart_Cb unfocused_cb, void *unfocused_cb_data) +{ + Evas_Object *editfield; + Evas_Object *entry; + + editfield = ctui_create_editfield(parent, NULL, guide_txt, false); + p_retvm_if(NULL == editfield, NULL, "ctui_create_editfield() return NULL"); + + entry = elm_object_part_content_get(editfield, "elm.swallow.content"); + evas_object_smart_callback_add(entry, "changed", ct_input_entry_changed_cb, editfield); + + if (unfocused_cb) + evas_object_smart_callback_add(entry, "unfocused", unfocused_cb, unfocused_cb_data); + + return editfield; +} + +static int input_get_ct_number_type(int cts_num_type) +{ + if (cts_num_type & CTS_NUM_TYPE_CUSTOM) + return CTTEXT_TYPE_OTHER; + else if (cts_num_type & CTS_NUM_TYPE_CELL) + return CTTEXT_TYPE_MOBILE; + else if (cts_num_type & CTS_NUM_TYPE_VOICE) { + if (cts_num_type & CTS_NUM_TYPE_HOME) + return CTTEXT_TYPE_HOME2; + else if (cts_num_type & CTS_NUM_TYPE_WORK) + return CTTEXT_TYPE_WORK2; + else + return CTTEXT_TYPE_TELEPHONE; + } + else if (cts_num_type & CTS_NUM_TYPE_FAX) { + if (cts_num_type & CTS_NUM_TYPE_HOME) + return CTTEXT_TYPE_FAX_HOME; + else if (cts_num_type & CTS_NUM_TYPE_WORK) + return CTTEXT_TYPE_FAX_WORK; + else + return CTTEXT_TYPE_FAX; + } + else if (cts_num_type & CTS_NUM_TYPE_PAGER) + return CTTEXT_TYPE_PAGER; + else if (cts_num_type & CTS_NUM_TYPE_CAR) + return CTTEXT_TYPE_CAR; + else if (cts_num_type & CTS_NUM_TYPE_ASSISTANT) + return CTTEXT_TYPE_ASSISTANT; + else + return CTTEXT_TYPE_OTHER; + +} + +int ct_input_next_number_type(CTSstruct *contact) +{ + int i; + int used = 0; + int cts_type; + GSList *list = NULL, *cursor; + contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &list); + + for (cursor=list;cursor;cursor=cursor->next) { + if (contacts_svc_value_get_bool(cursor->data, CTS_NUM_VAL_DELETE_BOOL)) + continue; + + cts_type = contacts_svc_value_get_int(cursor->data, CTS_NUM_VAL_TYPE_INT); + used |= 1<<input_get_ct_number_type(cts_type); + } + + for (i=CTTEXT_TYPE_MOBILE;i<CTTEXT_TYPE_OTHER;i++) { + if (!(used & 1<<i)) + return i; + } + return CTTEXT_TYPE_OTHER; +} + +int ct_input_next_email_type(CTSstruct *contact) +{ + int i; + int used = 0; + GSList *list = NULL, *cursor; + contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &list); + + for (cursor=list;cursor;cursor=cursor->next) { + if (contacts_svc_value_get_bool(cursor->data, CTS_EMAIL_VAL_DELETE_BOOL)) + continue; + + used |= 1<<contacts_svc_value_get_int(cursor->data, CTS_EMAIL_VAL_TYPE_INT); + } + + for (i=CTS_EMAIL_TYPE_HOME;i<=CTS_EMAIL_TYPE_WORK;i++) { + if (!(used & 1<<i)) + return i; + } + + return CTS_EMAIL_TYPE_NONE; +} + +int ct_input_next_addr_type(CTSstruct *contact) +{ + int i; + int type = CTS_ADDR_TYPE_NONE; + GSList *list = NULL, *cursor; + contacts_svc_struct_get_list(contact, CTS_CF_POSTAL_ADDR_LIST, &list); + + for (cursor=list;cursor;cursor=cursor->next) { + if (contacts_svc_value_get_bool(cursor->data, CTS_POSTAL_VAL_DELETE_BOOL)) + continue; + + type |= contacts_svc_value_get_int(cursor->data, CTS_POSTAL_VAL_TYPE_INT); + } + + for (i=CTS_ADDR_TYPE_HOME;i<=CTS_ADDR_TYPE_WORK;i++) { + if (!(type & i)) + return i; + } + + return CTS_ADDR_TYPE_NONE; +} + +int ct_input_next_web_type(CTSstruct *contact) +{ + int i; + int used = 0; + GSList *list = NULL, *cursor; + contacts_svc_struct_get_list(contact, CTS_CF_WEB_ADDR_LIST, &list); + + for (cursor=list;cursor;cursor=cursor->next) { + if (contacts_svc_value_get_bool(cursor->data, CTS_WEB_VAL_DELETE_BOOL)) + continue; + + used |= 1<<contacts_svc_value_get_int(cursor->data, CTS_WEB_VAL_TYPE_INT); + } + + for (i=CTS_WEB_TYPE_HOME;i<=CTS_WEB_TYPE_WORK;i++) { + if (!(used & 1<<i)) + return i; + } + + return CTS_WEB_TYPE_NONE; +} + +int ct_input_next_messenger_type(CTSstruct *contact) +{ + int i; + int used = 0; + GSList *list = NULL, *cursor; + contacts_svc_struct_get_list(contact, CTS_CF_MESSENGER_LIST, &list); + + for (cursor=list;cursor;cursor=cursor->next) { + if (contacts_svc_value_get_bool(cursor->data, CTS_MESSENGER_VAL_DELETE_BOOL)) + continue; + + used |= 1<<contacts_svc_value_get_int(cursor->data, CTS_MESSENGER_VAL_TYPE_INT); + } + + for (i=CTS_IM_TYPE_GOOGLE;i<=CTS_IM_TYPE_IRC;i++) { + if (!(used & 1<<i)) + return i; + } + + return CTS_IM_TYPE_NONE; +} + + +Evas_Object* ct_input_create_dg_layout(Evas_Object *parent, const char *theme) +{ + Evas_Object *layout = elm_layout_add(parent); + p_retvm_if(NULL == layout, NULL, "elm_layout_add() return NULL"); + + elm_layout_theme_set(layout, "layout", "dialogue", theme); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, 0.0); + + evas_object_show(layout); + return layout; +} + +void ct_input_typed_layout_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + ct_input_typed_data *typed_data = data; + free(typed_data); +} + +void ct_input_update_ringtone(CTSstruct *contact, Evas_Object *layout) +{ + int ret; + CTSvalue *value; + const char *display; + const char *temp; + Evas_Object *btn; + + ret = contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &value); + p_retm_if(CTS_SUCCESS != ret && CTS_ERR_NO_DATA != ret, "contacts_svc_struct_get_value() Failed(%d)", ret); + + temp = contacts_svc_value_get_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR); + display = ct_detail_get_ringtone_display_name(temp); + elm_object_part_text_set(layout, "elm.text.2", display); + + btn = elm_object_part_content_get(layout, "elm.icon"); + p_retm_if(NULL == btn, "elm_object_part_content_get() return NULL"); + + if (NULL == temp || '\0' == *temp) { + elm_object_focus_set(btn, EINA_FALSE); + elm_object_disabled_set(btn, EINA_TRUE); + } + else + elm_object_disabled_set(btn, EINA_FALSE); +} + +unsigned int ct_input_box_idx_get(Evas_Object *box, Evas_Object *obj) +{ + int count = 0; + Eina_List *list, *cursor; + Evas_Object *data; + list = elm_box_children_get(box); + + EINA_LIST_FOREACH(list, cursor, data) { + if (data == obj) + break; + count++; + } + eina_list_free(list); + return count; +} + +void ct_input_save_button_update(ct_input_data *cinput_d) +{ + Evas_Object *save_btn; + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + + save_btn = elm_object_item_part_content_get(cinput_d->navi_item, "title_left_btn"); + if (save_btn) + elm_object_disabled_set(save_btn, cinput_d->save_disable); + + if (cinput_d->save_btn) + elm_object_item_disabled_set(cinput_d->save_btn, cinput_d->save_disable); +} + +static inline Eina_Bool input_is_editfield_empty(Evas_Object *editfield) +{ + const char *val; + Evas_Object *entry; + + entry = elm_object_part_content_get(editfield, "elm.swallow.content"); + p_retvm_if(NULL == entry, EINA_FALSE, "elm_object_part_content_get() return NULL"); + + val = elm_entry_entry_get(entry); + if (val && *val) + return EINA_FALSE; + + return EINA_TRUE; +} + +static void input_name_field_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + int idx; + Evas_Object *ly; + Evas_Object *ly_content; + Evas_Object *ef; + Eina_List *list; + ct_input_data *cinput_d = data; + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + + ef = elm_object_part_content_get(cinput_d->ly_baseinfo, "elm.icon.name1"); + if (EINA_FALSE == input_is_editfield_empty(ef)) { + if (EINA_FALSE == cinput_d->save_disable) + return; + cinput_d->save_disable = EINA_FALSE; + ct_input_save_button_update(cinput_d); + return; + } + + ef = elm_object_part_content_get(cinput_d->ly_baseinfo, "elm.icon.name2"); + if (EINA_FALSE == input_is_editfield_empty(ef)) { + if (EINA_FALSE == cinput_d->save_disable) + return; + cinput_d->save_disable = EINA_FALSE; + ct_input_save_button_update(cinput_d); + return; + } + + list = elm_box_children_get(cinput_d->box); + + ly = cinput_d->ly_number_first; + idx = ct_input_box_idx_get(cinput_d->box, ly); + while (ly) { + ly_content = elm_object_part_content_get(ly, "elm.swallow.decorate.content"); + ef = elm_object_part_content_get(ly_content, "elm.flip.content"); + if (EINA_FALSE == input_is_editfield_empty(ef)) { + if (EINA_FALSE == cinput_d->save_disable) { + eina_list_free(list); + return; + } + cinput_d->save_disable = EINA_FALSE; + ct_input_save_button_update(cinput_d); + eina_list_free(list); + return; + } + if (ly == cinput_d->ly_number_last) + break; + ly = eina_list_nth(list, ++idx); + } + + ly = cinput_d->ly_email_first; + idx = ct_input_box_idx_get(cinput_d->box, ly); + while (ly) { + ly_content = elm_object_part_content_get(ly, "elm.swallow.decorate.content"); + ef = elm_object_part_content_get(ly_content, "elm.flip.content"); + if (EINA_FALSE == input_is_editfield_empty(ef)) { + if (EINA_FALSE == cinput_d->save_disable) { + eina_list_free(list); + return; + } + cinput_d->save_disable = EINA_FALSE; + ct_input_save_button_update(cinput_d); + eina_list_free(list); + return; + } + if (ly == cinput_d->ly_email_last) + break; + ly = eina_list_nth(list, ++idx); + } + + eina_list_free(list); + + if (EINA_TRUE == cinput_d->save_disable) + return; + cinput_d->save_disable = EINA_TRUE; + ct_input_save_button_update(cinput_d); +} + +void ct_input_name_field_add(Evas_Object *editfield, ct_input_data *cinput_d) +{ + Evas_Object *entry; + + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + p_retm_if(NULL == editfield, "parameter(editfield) is NULL"); + + entry = elm_object_part_content_get(editfield, "elm.swallow.content"); + p_retm_if(NULL == cinput_d, "elm_object_part_content_get() return NULL"); + + evas_object_smart_callback_add(entry, "changed", input_name_field_changed_cb, cinput_d); + evas_object_smart_callback_add(entry, "preedit,changed", input_name_field_changed_cb, cinput_d); +} + +int ct_input_get_full_address(CTSvalue *postal, char *buf, int buf_len) +{ + const char *code; + const char *region; + const char *locality; + const char *street; + const char *extended; + const char *country; + const char *pobox; + + code = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_POSTALCODE_STR); + extended = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_EXTENDED_STR); + pobox = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_POBOX_STR); + street = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_STREET_STR); + locality = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_LOCALITY_STR); + region = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_REGION_STR); + country = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_COUNTRY_STR); + + snprintf(buf, buf_len, "%s%s%s%s%s%s%s%s%s%s%s%s%s", SAFE_STR(code), STR_BLANK(code, extended), STR_BLANK(extended, pobox), + STR_BLANK(pobox, street), STR_BLANK(street, locality), STR_BLANK(locality, region), STR_BLANK(region, country)); + + return 0; +} + diff --git a/lib/details/ct-input-utils.h b/lib/details/ct-input-utils.h new file mode 100755 index 0000000..cece9a2 --- /dev/null +++ b/lib/details/ct-input-utils.h @@ -0,0 +1,53 @@ +/* + * 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_INPUT_UTILS_H__ +#define __CONTACTS_INPUT_UTILS_H__ + +CTSvalue* ct_input_get_event(CTSstruct *contact, int event_type); +int ct_input_get_base_ab(void); +void ct_input_camera(void *data, Evas_Object *obj, void *event_info); +void ct_input_gallery(void *data, Evas_Object *obj, void *event_info); +void ct_input_myfile_ringtone(ct_input_data *cinput_d); +void ct_input_save_cb(void *data, Evas_Object *obj, void *event_info); +void ct_input_set_default_num(ct_input_data *cinput_d, CTSvalue *val); +CTSvalue* ct_input_get_nickname(CTSstruct *contact); +CTSvalue* ct_input_get_website_value(CTSstruct* contact); +int ct_input_get_number_type(int ct_num_type); +void ct_input_contact_image_change_popup(ct_input_data *cinput_d, bool has_photo); +void ct_input_entry_changed_cb(void *data, Evas_Object *obj, void *event_info); +Evas_Object* ct_input_add_editfield(Evas_Object *parent, const char* guide_txt, + Evas_Smart_Cb unfocused_cb, void *unfocused_cb_data); +int ct_input_next_number_type(CTSstruct *contact); +int ct_input_next_email_type(CTSstruct *contact); +int ct_input_next_addr_type(CTSstruct *contact); +int ct_input_next_web_type(CTSstruct *contact); +int ct_input_next_messenger_type(CTSstruct *contact); + +enum { + INPUT_LAYOUT_NONE, + INPUT_LAYOUT_RENAME, + INPUT_LAYOUT_EDIT, +}; +Evas_Object* ct_input_create_dg_layout(Evas_Object *parent, const char *theme); +void ct_input_typed_layout_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +void ct_input_update_ringtone(CTSstruct *contact, Evas_Object *layout); +unsigned int ct_input_box_idx_get(Evas_Object *box, Evas_Object *obj); +void ct_input_save_button_update(ct_input_data *cinput_d); +void ct_input_name_field_add(Evas_Object *editfield, ct_input_data *cinput_d); +int ct_input_get_full_address(CTSvalue *postal, char *buf, int buf_len); + +#endif //__CONTACTS_INPUT_UTILS_H__ diff --git a/lib/details/ct-input-view.c b/lib/details/ct-input-view.c new file mode 100755 index 0000000..9d0eccd --- /dev/null +++ b/lib/details/ct-input-view.c @@ -0,0 +1,2634 @@ +/* + * 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 <Ecore_X.h> +#include "phone.h" +#include "ct-detail.h" +#include "ct-detail-utils.h" +#include "ct-detail-view.h" +#include "ct-input-utils.h" +#include "ct-input-view.h" +#include "ct-input-num-email.h" + +static Eina_Bool input_fill_layout(void *data); +static void input_update_address(ct_input_data *cinput_d); +static Evas_Object* input_add_new_address(ct_input_data *cinput_d); +static Evas_Object* input_add_new_website(ct_input_data *cinput_d); +static Evas_Object* input_add_new_messenger(ct_input_data *cinput_d); +static void input_update_event(Evas_Object *layout, CTSvalue *value); +static void input_baseinfo_expand_clicked_cb(void *data, Evas_Object *obj, void *event_info); + +enum input_items { + INPUT_BASEINFO = 0, + INPUT_NUMBER, + INPUT_EMAIL, + INPUT_ADDRESS, + INPUT_MESSENGER, + INPUT_URL, + INPUT_RELATIONSHIP, + INPUT_BIRTHDAY, + INPUT_ANNIVERSARY, + INPUT_NOTE, + INPUT_RINGTONE, + INPUT_MORE_INFO, + INPUT_ITEMS_MAX, +}; + +enum input_more_fiels { + INPUT_MORE_JOB_TITLE, + INPUT_MORE_DEPARTMENT, + INPUT_MORE_MESSENGER, + INPUT_MORE_URL, + INPUT_MORE_RELATIONSHIP, + INPUT_MORE_BIRTHDAY, + INPUT_MORE_ANNIVERSARY, + INPUT_MORE_NOTE, +}; + +#define CT_INPUT_ADDRESS_MAX_CHAR 1000 + +static void input_layout_mouse_up_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + Evas_Object *layout = (Evas_Object *) data; + elm_object_signal_emit(layout, "elm,state,unselected", "elm"); +} + +static void input_layout_mouse_move_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Move *ev = (Evas_Event_Mouse_Move *)event_info; + Evas_Object *layout = (Evas_Object *) data; + if (ev && ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) + elm_object_signal_emit(layout, "elm,state,unselected", "elm"); +} + +static void input_layout_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + Evas_Object *layout = (Evas_Object *) data; + elm_object_signal_emit(layout, "elm,state,selected", "elm"); +} + +static void input_layout_selectable_set(Evas_Object *layout) +{ + p_retm_if(NULL == layout, "parameter(layout) is NULL"); + evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_UP, input_layout_mouse_up_cb, layout); + evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_DOWN, input_layout_mouse_down_cb, layout); + evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_MOVE, input_layout_mouse_move_cb, layout); +} + +static inline CTSvalue* input_new_address(CTSstruct *contact) +{ + int ret; + int type; + GSList *list; + CTSvalue *value; + + value = contacts_svc_value_new(CTS_VALUE_POSTAL); + p_retvm_if(NULL == value, NULL, "contacts_svc_value_new() return NULL"); + + type = ct_input_next_addr_type(contact); + contacts_svc_value_set_int(value, CTS_POSTAL_VAL_TYPE_INT, type); + + list = NULL; + list = g_slist_append(list, value); + + ret = contacts_svc_struct_store_list(contact, CTS_CF_POSTAL_ADDR_LIST, list); + g_slist_free(list); + p_retvm_if(ret < CTS_SUCCESS, NULL, "contacts_svc_struct_store_list() failed(%d)", ret); + + return value; +} + +static inline CTSvalue* input_new_event(CTSstruct *contact, int event_type) +{ + int ret; + GSList *list; + CTSvalue *value; + + value = contacts_svc_value_new(CTS_VALUE_EVENT); + + ret = contacts_svc_value_set_int(value, CTS_EVENT_VAL_TYPE_INT, event_type); + p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_value_set_int() failed(%d)", ret); + + list = NULL; + list = g_slist_append(list, value); + ret = contacts_svc_struct_store_list(contact, CTS_CF_EVENT_LIST, list); + g_slist_free(list); + p_retvm_if(ret < CTS_SUCCESS, NULL, "contacts_svc_struct_store_list() failed(%d)", ret); + + ret = contacts_svc_value_set_bool(value, CTS_EVENT_VAL_DELETE_BOOL, true); + p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_value_set_bool() failed(%d)", ret); + + return value; +} + +static inline CTSvalue* input_new_name(CTSstruct *contact) +{ + int ret; + CTSvalue *name; + + name = contacts_svc_value_new(CTS_VALUE_NAME); + ret = contacts_svc_struct_store_value(contact, CTS_CF_NAME_VALUE, name); + p_retvm_if(ret < CTS_SUCCESS, NULL, "contacts_svc_struct_store_value() failed(%d)", ret); + + return name; +} + + +static inline CTSvalue* input_new_nickname(CTSstruct *contact) +{ + int ret; + GSList *list; + CTSvalue *value; + + value = contacts_svc_value_new(CTS_VALUE_NICKNAME); + + list = NULL; + list = g_slist_append(list, value); + ret = contacts_svc_struct_store_list(contact, CTS_CF_NICKNAME_LIST, list); + g_slist_free(list); + p_retvm_if(ret < CTS_SUCCESS, NULL, "contacts_svc_struct_store_list() failed(%d)", ret); + + return value; +} + +static inline CTSvalue* input_new_web(CTSstruct *contact) +{ + int ret; + int type; + GSList *list; + CTSvalue *value; + + value = contacts_svc_value_new(CTS_VALUE_WEB); + p_retvm_if(NULL == value, NULL, "contacts_svc_value_new() return NULL"); + + type = ct_input_next_web_type(contact); + contacts_svc_value_set_int(value, CTS_WEB_VAL_TYPE_INT, type); + + list = NULL; + list = g_slist_append(list, value); + ret = contacts_svc_struct_store_list(contact, CTS_CF_WEB_ADDR_LIST, list); + g_slist_free(list); + p_retvm_if(ret < CTS_SUCCESS, NULL, "contacts_svc_struct_store_list() failed(%d)", ret); + + return value; +} + +static inline CTSvalue* input_new_messenger(CTSstruct *contact) +{ + int ret; + int type; + GSList *list; + CTSvalue *value; + + value = contacts_svc_value_new(CTS_VALUE_MESSENGER); + p_retvm_if(NULL == value, NULL, "contacts_svc_value_new() return NULL"); + + type = ct_input_next_messenger_type(contact); + contacts_svc_value_set_int(value, CTS_MESSENGER_VAL_TYPE_INT, type); + + list = NULL; + list = g_slist_append(list, value); + ret = contacts_svc_struct_store_list(contact, CTS_CF_MESSENGER_LIST, list); + g_slist_free(list); + p_retvm_if(ret < CTS_SUCCESS, NULL, "contacts_svc_struct_store_list() failed(%d)", ret); + + ret = contacts_svc_value_set_bool(value, CTS_MESSENGER_VAL_DELETE_BOOL, true); + p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_value_set_bool() failed(%d)", ret); + + return value; +} + +static inline CTSvalue* input_new_company(CTSstruct *contact) +{ + int ret; + CTSvalue *value; + + value = contacts_svc_value_new(CTS_VALUE_COMPANY); + p_retvm_if(NULL == value, NULL, "contacts_svc_value_new() return NULL"); + + ret = contacts_svc_struct_store_value(contact, CTS_CF_COMPANY_VALUE, value); + p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_struct_store_value() failed(%d)", ret); + + return value; +} + +static void input_contacts_changed(void *user_data) +{ + int id_ab, type, ret; + bool changed = false; + CTSiter *iter; + CTSvalue *value; + ct_input_data *cinput_d = user_data; + ct_detail_data *cdetail_d = cinput_d->cdetail_d; + + p_retm_if(NULL == cdetail_d, "ct_detail_data is NULL"); + p_retm_if(NULL == cinput_d->contact, "Contact is NULL"); + + if (cinput_d->saved) + return; + + contacts_svc_struct_get_value(cinput_d->contact, CTS_CF_BASE_INFO_VALUE, &value); + id_ab = contacts_svc_value_get_int(value, CTS_BASE_VAL_ADDRESSBOOK_ID_INT); + + ret = contacts_svc_get_updated_contacts(id_ab, cinput_d->view_create_ver, &iter); + p_retm_if(CTS_SUCCESS != ret, "contacts_svc_get_updated_contacts() Failed(%d)", ret); + + while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { + value = contacts_svc_iter_get_info(iter); + if (contacts_svc_value_get_int(value, CTS_LIST_CHANGE_ID_INT) == cinput_d->contact_id) { + changed = true; + type = contacts_svc_value_get_int(value, CTS_LIST_CHANGE_TYPE_INT); + contacts_svc_value_free(value); + break; + } + contacts_svc_value_free(value); + } + contacts_svc_iter_remove(iter); + p_ret_if(!changed); + if (CTS_OPERATION_UPDATED == type || (CTS_OPERATION_DELETED == type && !cdetail_d->has_detail)) + elm_naviframe_item_pop(cdetail_d->navi); +} + + +static void input_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + int ret; + ct_input_data *cinput_d = data; + ct_detail_data *cdetail_d = cinput_d->cdetail_d; + + if (cinput_d->contact_id) { + ret = contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_CONTACT_CHANGE, + input_contacts_changed, cinput_d); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_unsubscribe_change_with_data() Failed(%d)", ret); + } + if (cinput_d->win_prop_change) + ecore_event_handler_del(cinput_d->win_prop_change); + contacts_svc_struct_free(cinput_d->contact); + + if (cdetail_d->has_detail) { + cdetail_d->has_input = false; + } + else { + if (cdetail_d && cdetail_d->child_ug) + ug_destroy(cdetail_d->child_ug); + + if (cdetail_d && cdetail_d->popup) + evas_object_del(cdetail_d->popup); + + free(cdetail_d->base_ab_name); + contacts_svc_struct_free(cdetail_d->contact); + free(cdetail_d); + } + + if (cinput_d->crop_ug) + ug_destroy(cinput_d->crop_ug); + + if (cinput_d->src_ug) + ug_destroy(cinput_d->src_ug); + + free(cinput_d->base_ab_name); + free(cinput_d); +} + + +static void input_nick_unfocused_cb(void *data, Evas_Object *obj, void *event_info) +{ + char *input; + CTSvalue *value; + ct_input_data *cinput_d = data; + + value = ct_input_get_nickname(cinput_d->contact); + if (NULL == value) + value = input_new_nickname(cinput_d->contact); + + input = ctui_entry_markup_to_utf8(elm_entry_entry_get(obj)); + p_retm_if(NULL == input, "ctui_entry_markup_to_utf8() return NULL"); + + contacts_svc_value_set_str(value, CTS_NICKNAME_VAL_NAME_STR, input); + free(input); +} + +static void input_website_unfocused_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + char *input; + Evas_Object *entry = obj; + CTSvalue *value = data; + + p_retm_if(NULL == value, "parameter(value) is NULL"); + + input = ctui_entry_markup_to_utf8(elm_entry_entry_get(entry)); + p_retm_if(NULL == input, "ctui_entry_markup_to_utf8() return NULL"); + + if (*input) { + ret = contacts_svc_value_set_str(value, CTS_WEB_VAL_ADDR_STR, input); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret); + + ret = contacts_svc_value_set_bool(value, CTS_WEB_VAL_DELETE_BOOL, false); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret); + } + else { + ret = contacts_svc_value_set_bool(value, CTS_WEB_VAL_DELETE_BOOL, true); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret); + } + + free(input); +} + +static void input_note_unfocused_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + char *input; + Evas_Object *entry = obj; + CTSvalue *value = data; + + input = ctui_entry_markup_to_utf8(elm_entry_entry_get(entry)); + p_retm_if(NULL == input, "ctui_entry_markup_to_utf8() return NULL"); + + ret = contacts_svc_value_set_str(value, CTS_BASE_VAL_NOTE_STR, input); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret); + free(input); +} + +static inline const char* input_get_contact_image_path(CTSstruct *contact) +{ + CTSvalue *base_info; + const char *img_path; + + contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &base_info); + img_path = contacts_svc_value_get_str(base_info, CTS_BASE_VAL_IMG_PATH_STR); + + return img_path; +} + +static void input_img_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + const char *value_data; + + ct_input_data *cinput_d = data; + p_retm_if(NULL == cinput_d, "parameter(ct_input_data) is NULL"); + + if(cinput_d->cdetail_d->ug) + return; + + + value_data = input_get_contact_image_path(cinput_d->contact); + + if (NULL == value_data) + ct_input_contact_image_change_popup(cinput_d, false); + else + ct_input_contact_image_change_popup(cinput_d, true); +} + +static void input_set_name_value(Evas_Object *entry, int field, ct_input_data *cinput_d) +{ + int ret; + char *name; + CTSvalue *value; + + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + + ret = contacts_svc_struct_get_value(cinput_d->contact, CTS_CF_NAME_VALUE, &value); + if (CTS_ERR_NO_DATA == ret) { + value = input_new_name(cinput_d->contact); + } + else if (CTS_SUCCESS != ret) { + ERR("contacts_svc_struct_get_value() failed(%d)", ret); + return; + } + + name = ctui_entry_markup_to_utf8(elm_entry_entry_get(entry)); + p_retm_if(NULL == name, "ctui_entry_markup_to_utf8() return NULL"); + + ret = contacts_svc_value_set_str(value, CTS_NAME_VAL_DISPLAY_STR, NULL); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret); + + ret = contacts_svc_value_set_str(value, field, name); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret); + + free(name); + +} + +static void input_firstname_unfocused_cb(void *data, Evas_Object *obj, void *event_info) +{ + input_set_name_value(obj, CTS_NAME_VAL_FIRST_STR, data); +} + +static void input_lastname_unfocused_cb(void *data, Evas_Object *obj, void *event_info) +{ + input_set_name_value(obj, CTS_NAME_VAL_LAST_STR, data); +} + +static void input_middle_unfocused_cb(void *data, Evas_Object *obj, void *event_info) +{ + input_set_name_value(obj, CTS_NAME_VAL_ADDITION_STR, data); +} + +static void input_suffix_unfocused_cb(void *data, Evas_Object *obj, void *event_info) +{ + input_set_name_value(obj, CTS_NAME_VAL_SUFFIX_STR, data); +} + +static void input_set_company_value(Evas_Object *entry, int field, ct_input_data *cinput_d) +{ + int ret; + char *str; + CTSvalue *value; + + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + + ret = contacts_svc_struct_get_value(cinput_d->contact, CTS_CF_COMPANY_VALUE, &value); + if (CTS_ERR_NO_DATA == ret) + value = input_new_company(cinput_d->contact); + else if (CTS_SUCCESS != ret) { + ERR("contacts_svc_struct_get_value() failed(%d)", ret); + return; + } + + str = ctui_entry_markup_to_utf8(elm_entry_entry_get(entry)); + p_retm_if(NULL == str, "ctui_entry_markup_to_utf8() return NULL"); + + ret = contacts_svc_value_set_str(value, field, str); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret); + + free(str); +} + +static void input_job_title_unfocused_cb(void *data, Evas_Object *obj, void *event_info) +{ + input_set_company_value(obj, CTS_COMPANY_VAL_JOB_TITLE_STR, data); +} + +static void input_department_unfocused_cb(void *data, Evas_Object *obj, void *event_info) +{ + input_set_company_value(obj, CTS_COMPANY_VAL_DEPARTMENT_STR, data); +} + +static void input_company_unfocused_cb(void *data, Evas_Object *obj, void *event_info) +{ + input_set_company_value(obj, CTS_COMPANY_VAL_NAME_STR, data); +} + + +static inline Evas_Object* input_editfield_entry_set(Evas_Object *ef, const char *text) +{ + Evas_Object *en = elm_object_part_content_get(ef, "elm.swallow.content"); + p_retvm_if(NULL == en, NULL, "elm_object_part_content_get() return NULL"); + + if (text && *text) { + elm_entry_entry_set(en, text); + } + return en; +} + +static Evas_Object* input_fill_layout_baseinfo_expand(ct_input_data *cinput_d, const char* guide_text, + Evas_Smart_Cb unfocused_cb, int type_struct, int type_value) +{ + int ret; + const char *display; + CTSvalue *value; + Evas_Object *ly_content; + Evas_Object *ef; + Evas_Object *box = cinput_d->box; + Evas_Object *bt_expand; + + ly_content = elm_layout_add(box); + p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL"); + elm_layout_file_set(ly_content, CONTACTS_EDJ, "dialogue/baseinfo.expand.2icon"); + evas_object_size_hint_align_set(ly_content, EVAS_HINT_FILL, 0.0); + evas_object_show(ly_content); + + if (CTS_NAME_VAL_LAST_STR == type_value && CTS_CF_NAME_VALUE == type_struct) { + bt_expand = elm_button_add(ly_content); + p_retvm_if(NULL == bt_expand, NULL, "elm_button_add() return NULL"); + elm_object_part_content_set(ly_content, "elm.icon.expand", bt_expand); + + elm_object_style_set(bt_expand, "icon_expand_closed"); + evas_object_smart_callback_add(bt_expand, "clicked", input_baseinfo_expand_clicked_cb, cinput_d); + } + + ef = ct_input_add_editfield(ly_content, guide_text, unfocused_cb, cinput_d); + p_retvm_if(NULL == ef, NULL, "ct_input_add_editfield() return NULL"); + elm_object_part_content_set(ly_content, "elm.icon.name", ef); + + if (-1 == type_struct) { + value = ct_input_get_nickname(cinput_d->contact); + p_warn_if(NULL == value, "ct_input_get_nickname() return NULL"); + } + else { + ret = contacts_svc_struct_get_value(cinput_d->contact, type_struct, &value); + p_warn_if(CTS_SUCCESS != ret && CTS_ERR_NO_DATA != ret, "contacts_svc_struct_get_value() Failed(%d)", ret); + } + + display = contacts_svc_value_get_str(value, type_value); + input_editfield_entry_set(ef, display); + + return ly_content; +} + +static void input_expand_baseinfo(ct_input_data *cinput_d) +{ + Evas_Object *layout; + + elm_box_unpack(cinput_d->box, cinput_d->ly_baseinfo_expand); + evas_object_del(cinput_d->ly_baseinfo_expand); + cinput_d->ly_baseinfo_expand = NULL; + + layout = input_fill_layout_baseinfo_expand(cinput_d, T_(CT_GET_TEXT_BASIC, CTTEXT_LASTNAME), + input_lastname_unfocused_cb, CTS_CF_NAME_VALUE, CTS_NAME_VAL_LAST_STR); + p_retm_if(NULL == layout, "input_fill_layout_baseinfo_expand() return NULL"); + elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo); + cinput_d->ly_baseinfo_last = layout; + + layout = input_fill_layout_baseinfo_expand(cinput_d, T_(CT_GET_TEXT_BASIC, CTTEXT_SUFFIX), + input_suffix_unfocused_cb, CTS_CF_NAME_VALUE, CTS_NAME_VAL_SUFFIX_STR); + p_retm_if(NULL == layout, "input_fill_layout_baseinfo_expand() return NULL"); + elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_last); + cinput_d->ly_baseinfo_suffix = layout; + + layout = input_fill_layout_baseinfo_expand(cinput_d, T_(CT_GET_TEXT_BASIC, CTTEXT_NICKNAME), + input_nick_unfocused_cb, -1, CTS_NICKNAME_VAL_NAME_STR); + p_retm_if(NULL == layout, "input_fill_layout_baseinfo_expand() return NULL"); + elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_suffix); + cinput_d->ly_baseinfo_nick = layout; + + if (cinput_d->add_job_title) { + layout = input_fill_layout_baseinfo_expand(cinput_d, T_(CT_GET_TEXT_BASIC, CTTEXT_JOB_TITLE), + input_job_title_unfocused_cb, CTS_CF_COMPANY_VALUE, CTS_COMPANY_VAL_JOB_TITLE_STR); + p_retm_if(NULL == layout, "input_fill_layout_baseinfo_expand() return NULL"); + elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_nick); + cinput_d->ly_baseinfo_job_title = layout; + } + + if (cinput_d->add_department) { + layout = input_fill_layout_baseinfo_expand(cinput_d, T_(CT_GET_TEXT_BASIC, CTTEXT_DEPARTMENT), + input_department_unfocused_cb, CTS_CF_COMPANY_VALUE, CTS_COMPANY_VAL_DEPARTMENT_STR); + p_retm_if(NULL == layout, "input_fill_layout_baseinfo_expand() return NULL"); + if (cinput_d->ly_baseinfo_job_title) + elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_job_title); + else + elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_nick); + cinput_d->ly_baseinfo_department = layout; + } + layout = input_fill_layout_baseinfo_expand(cinput_d, T_(CT_GET_TEXT_BASIC, CTTEXT_COMPANY), + input_company_unfocused_cb, CTS_CF_COMPANY_VALUE, CTS_COMPANY_VAL_NAME_STR); + p_retm_if(NULL == layout, "input_fill_layout_baseinfo_expand() return NULL"); + + if (cinput_d->ly_baseinfo_job_title) + elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_job_title); + else if (cinput_d->ly_baseinfo_department) + elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_department); + else + elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_nick); + cinput_d->ly_baseinfo_company = layout; + + if (!cinput_d->ly_seperator_baseinfo) { + cinput_d->ly_seperator_baseinfo = ct_input_fill_layout_separator(cinput_d, "separator/hd16"); + p_retm_if(NULL == layout, "ct_input_fill_layout_separator() return NULL"); + elm_box_pack_after(cinput_d->box, cinput_d->ly_seperator_baseinfo, cinput_d->ly_baseinfo_company); + } +} + +static Evas_Object* input_fill_layout_baseinfo_expand_button(ct_input_data *cinput_d) +{ + Evas_Object *ly_content; + Evas_Object *box = cinput_d->box; + Evas_Object *bt_expand; + + ly_content = elm_layout_add(box); + p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL"); + elm_layout_file_set(ly_content, CONTACTS_EDJ, "dialogue/baseinfo.1text.1icon"); + evas_object_size_hint_align_set(ly_content, EVAS_HINT_FILL, 0.0); + evas_object_show(ly_content); + + bt_expand = elm_button_add(ly_content); + p_retvm_if(NULL == bt_expand, NULL, "elm_button_add() return NULL"); + elm_object_part_content_set(ly_content, "elm.icon", bt_expand); + + elm_object_style_set(bt_expand, "icon_expand_opened"); + evas_object_smart_callback_add(bt_expand, "clicked", input_baseinfo_expand_clicked_cb, cinput_d); + + cinput_d->ly_baseinfo_expand = ly_content; + + return ly_content; +} + +static inline void input_close_baseinfo(ct_input_data *cinput_d) +{ + Evas_Object *layout; + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + + layout = input_fill_layout_baseinfo_expand_button(cinput_d); + p_retm_if(NULL == layout, "input_fill_layout_baseinfo_expand_button() return NULL"); + elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo); + + elm_box_unpack(cinput_d->box, cinput_d->ly_baseinfo_last); + elm_box_unpack(cinput_d->box, cinput_d->ly_baseinfo_suffix); + elm_box_unpack(cinput_d->box, cinput_d->ly_baseinfo_nick); + elm_box_unpack(cinput_d->box, cinput_d->ly_baseinfo_company); + + evas_object_del(cinput_d->ly_baseinfo_last); + evas_object_del(cinput_d->ly_baseinfo_suffix); + evas_object_del(cinput_d->ly_baseinfo_nick); + evas_object_del(cinput_d->ly_baseinfo_company); + + cinput_d->ly_baseinfo_last = NULL; + cinput_d->ly_baseinfo_suffix = NULL; + cinput_d->ly_baseinfo_nick = NULL; + cinput_d->ly_baseinfo_company = NULL; + + if (cinput_d->ly_baseinfo_job_title) { + elm_box_unpack(cinput_d->box, cinput_d->ly_baseinfo_job_title); + evas_object_del(cinput_d->ly_baseinfo_job_title); + cinput_d->ly_baseinfo_job_title = NULL; + } + + if (cinput_d->ly_baseinfo_department) { + elm_box_unpack(cinput_d->box, cinput_d->ly_baseinfo_department); + evas_object_del(cinput_d->ly_baseinfo_department); + cinput_d->ly_baseinfo_department = NULL; + } +} + +static void input_update_baseinfo_field(ct_input_data *cinput_d) +{ + int ret; + const char *name; + CTSvalue *value; + Evas_Object *ef; + Evas_Object *ly_content; + + ly_content = cinput_d->ly_baseinfo; + + // closed + if (!cinput_d->ly_baseinfo_last) { + /* middle name */ + ef = ct_input_add_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_LASTNAME), + input_lastname_unfocused_cb, cinput_d); + p_retm_if(NULL == ef, "ct_input_add_editfield() return NULL"); + elm_object_part_content_set(ly_content, "elm.icon.name2", ef); + + ret = contacts_svc_struct_get_value(cinput_d->contact, CTS_CF_NAME_VALUE, &value); + if (CTS_SUCCESS == ret) { + name = contacts_svc_value_get_str(value, CTS_NAME_VAL_LAST_STR); + input_editfield_entry_set(ef, name); + } + } + else { + /* last name */ + ef = ct_input_add_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_MIDDLE), + input_middle_unfocused_cb, cinput_d); + p_retm_if(NULL == ef, "ct_input_add_editfield() return NULL"); + elm_object_part_content_set(ly_content, "elm.icon.name2", ef); + + ret = contacts_svc_struct_get_value(cinput_d->contact, CTS_CF_NAME_VALUE, &value); + if (CTS_SUCCESS == ret) { + name = contacts_svc_value_get_str(value, CTS_NAME_VAL_ADDITION_STR); + input_editfield_entry_set(ef, name); + } + } +} + +static void input_baseinfo_expand_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_input_data *cinput_d = data; + if (cinput_d->ly_baseinfo_last) + input_close_baseinfo(cinput_d); + else + input_expand_baseinfo(cinput_d); + input_update_baseinfo_field(cinput_d); +} + +static void input_event_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + int year; + int month; + int day; + int ret; + CTSvalue *value = data; + ct_input_data *cinput_d; + struct tm currtime; + + p_retm_if(NULL == value, "parameter(value) is NULL"); + + cinput_d = evas_object_data_get(obj, "cinput_d"); + p_retm_if(NULL == cinput_d, "evas_object_data_get() return NULL"); + + elm_datetime_value_get(obj, &currtime); + + year = currtime.tm_year + 1900; + month = currtime.tm_mon + 1; + day = currtime.tm_mday; + + ret = contacts_svc_value_set_int(value, CTS_EVENT_VAL_DATE_INT, + year * 10000 + month * 100 + day); + p_retm_if(CTS_SUCCESS != ret, "contacts_svc_value_set_int() Failed(%d)", ret); + + if (contacts_svc_value_get_bool(value, CTS_EVENT_VAL_DELETE_BOOL)) { + int event_type; + Evas_Object *layout; + + ret = contacts_svc_value_set_bool(value, CTS_EVENT_VAL_DELETE_BOOL, false); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() Failed(%d)", ret); + + event_type = contacts_svc_value_get_int(value, CTS_EVENT_VAL_TYPE_INT); + if (CTS_EVENT_TYPE_BIRTH == event_type) + layout = cinput_d->ly_birthday; + else + layout = cinput_d->ly_anniversary; + input_update_event(layout, value); + } +} + +static void input_update_event(Evas_Object *layout, CTSvalue *value) +{ + time_t timer; + struct tm *stime; + Evas_Object *btn; + Evas_Object *datetime; + bool deleted = false; + + datetime = elm_object_part_content_get(layout, "elm.icon.1"); + p_retm_if(NULL == datetime, "elm_object_part_content_get() return NULL"); + + deleted = contacts_svc_value_get_bool(value, CTS_EVENT_VAL_DELETE_BOOL); + + if (deleted) { + timer = time(NULL); + stime = localtime(&timer); + p_retm_if(NULL == stime, "localtime() Failed(%d)", errno); + + evas_object_smart_callback_del(datetime, "changed", input_event_changed_cb); + elm_datetime_value_set(datetime, stime); + evas_object_smart_callback_add(datetime, "changed", input_event_changed_cb, value); + } + + btn = elm_object_part_content_get(layout, "elm.icon.2"); + p_retm_if(NULL == btn, "elm_object_part_content_get() return NULL"); + + if (deleted) { + elm_object_focus_set(btn, EINA_FALSE); + elm_object_disabled_set(btn, EINA_TRUE); + } + else + elm_object_disabled_set(btn, EINA_FALSE); +} + + +static void input_event_cancel_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + int event_type; + ct_input_data *cinput_d; + CTSvalue *value = data; + Evas_Object *layout; + + cinput_d = evas_object_data_get(obj, "cinput_d"); + p_retm_if(NULL == cinput_d, "evas_object_data_get() return NULL"); + + contacts_svc_value_set_bool(value, CTS_EVENT_VAL_DELETE_BOOL, true); + + event_type = contacts_svc_value_get_int(value, CTS_EVENT_VAL_TYPE_INT); + if (CTS_EVENT_TYPE_BIRTH == event_type) + layout = cinput_d->ly_birthday; + else + layout = cinput_d->ly_anniversary; + input_update_event(layout, value); +} + +static void input_ringtone_cancel_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + CTSvalue *value; + ct_input_data *cinput_d = data; + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + + ret = contacts_svc_struct_get_value(cinput_d->contact, CTS_CF_BASE_INFO_VALUE, &value); + p_retm_if(CTS_SUCCESS != ret && CTS_ERR_NO_DATA != ret, "contacts_svc_struct_get_value() Failed(%d)", ret); + + ret = contacts_svc_value_set_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR, NULL); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() Failed(%d)", ret); + + ct_input_update_ringtone(cinput_d->contact, cinput_d->ly_ringtone); +} + +static void input_addr_editfield_unfocused_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + char *display; + Evas_Object *entry = obj; + CTSvalue *value = data; + + display = ctui_entry_markup_to_utf8(elm_entry_entry_get(entry)); + p_retm_if(NULL == display, "ctui_entry_markup_to_utf8() return NULL"); + + ret = contacts_svc_value_set_str(value, CTS_POSTAL_VAL_STREET_STR, display); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() Failed(%d)", ret); + + if (*display) { + ret = contacts_svc_value_set_bool(value, CTS_POSTAL_VAL_DELETE_BOOL, false); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() Failed(%d)", ret); + } + + free(display); +} + +static void input_addr_type_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + int type = (int)data; + Evas_Object *ly_type; + ct_input_typed_data *typed_data; + + typed_data = evas_object_data_get(obj, "typed_data"); + p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL"); + + contacts_svc_value_set_int(typed_data->value, CTS_POSTAL_VAL_TYPE_INT, type); + + ly_type = elm_object_part_content_get(typed_data->ly_content, "elm.flip.content.title"); + p_retm_if(NULL == ly_type, "elm_object_part_content_get() return NULL"); + + elm_object_part_text_set(ly_type, "title.text", T_(CT_GET_TEXT_POSTAL_TYPE, type)); + evas_object_del(obj); +} + +static void input_addr_type_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + int i; + int type; + int rotate; + int x, y, w, h; + Evas_Object *popup; + ct_input_data *cinput_d; + ct_input_typed_data *typed_data = data; + Evas_Event_Mouse_Up *ev = (Evas_Event_Mouse_Up *)event_info; + + if (ev && ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) + return; + + evas_object_geometry_get(obj, &x, &y, &w, &h); + if (ev->output.y < y || y + h < ev->output.y) + return; + + p_retm_if(NULL == typed_data, "parameter(typed_data) is NULL"); + + cinput_d = evas_object_data_get(obj, "cinput_d"); + p_retm_if(NULL == cinput_d, "evas_object_data_get() return NULL"); + + popup = elm_ctxpopup_add(cinput_d->cdetail_d->win); + p_retm_if(NULL == popup, "elm_ctxpopup_add() return NULL"); + cinput_d->cdetail_d->popup = popup; + + rotate = (int)evas_object_data_get(cinput_d->cdetail_d->navi, "phone_rotate"); + if (0 == rotate || 180 == rotate) + elm_ctxpopup_direction_priority_set(popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT); + + evas_object_smart_callback_add(popup, "dismissed", ct_detail_popup_hide_cb, cinput_d->cdetail_d); + type = contacts_svc_value_get_int(typed_data->value, CTS_POSTAL_VAL_TYPE_INT); + evas_object_data_set(popup, "typed_data", typed_data); + + for (i=CTS_ADDR_TYPE_HOME;i<=CTS_ADDR_TYPE_WORK;i++) + { + if (type == i) continue; + elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_POSTAL_TYPE, i), NULL, + input_addr_type_changed_cb, (void *)i); + } + if (type != CTS_ADDR_TYPE_NONE) { + elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_POSTAL_TYPE, CTS_ADDR_TYPE_NONE), NULL, + input_addr_type_changed_cb, (void *)CTS_ADDR_TYPE_NONE); + } + phone_move_ctxpopup(popup, obj); + evas_object_show(popup); +} + + +static void input_addr_del_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + int idx; + Evas_Object *layout; + ct_input_data *cinput_d; + ct_input_typed_data *typed_data = data; + p_retm_if(NULL == typed_data, "parameter(typed_data) is NULL"); + + cinput_d = evas_object_data_get(obj, "cinput_d"); + p_retm_if(NULL == cinput_d, "evas_object_data_get() return NULL"); + + if (typed_data->ly_main == cinput_d->ly_addr_first) { + Eina_List *list; + idx = ct_input_box_idx_get(cinput_d->box, cinput_d->ly_addr_first); + list = elm_box_children_get(cinput_d->box); + layout = eina_list_nth(list, idx + 1); + eina_list_free(list); + cinput_d->ly_addr_first = layout; + } + + contacts_svc_value_set_bool(typed_data->value, CTS_POSTAL_VAL_DELETE_BOOL, true); + elm_box_unpack(cinput_d->box, typed_data->ly_main); + evas_object_del(typed_data->ly_main); + input_update_address(cinput_d); +} + +static void input_addr_add_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *layout; + ct_input_data *cinput_d = data; + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + + layout = input_add_new_address(data); + p_retm_if(NULL == layout, "input_add_new_address() return"); + if (NULL == cinput_d->ly_addr_first) + cinput_d->ly_addr_first = layout; + cinput_d->ly_addr_last = layout; + input_update_address(data); +} + +static void input_update_address(ct_input_data *cinput_d) +{ + int idx; + Eina_List *list, *cursor; + Evas_Object *btn; + Evas_Object *layout; + ct_input_typed_data *typed_data; + + idx = ct_input_box_idx_get(cinput_d->box, cinput_d->ly_addr_first); + list = elm_box_children_get(cinput_d->box); + EINA_LIST_FOREACH(eina_list_nth_list(list, idx), cursor, layout) { + if (NULL == layout) continue; + + btn = elm_object_part_content_get(layout, "elm.edit.icon"); + if (NULL == btn) { + ERR("elm_object_part_content_get() return NULL"); + break; + } + + evas_object_smart_callback_del(btn, "clicked", input_addr_add_clicked_cb); + evas_object_smart_callback_del(btn, "clicked", input_addr_del_clicked_cb); + + if (layout == cinput_d->ly_addr_last) { + elm_object_style_set(btn, "icon_plus"); + evas_object_smart_callback_add(btn, "clicked", input_addr_add_clicked_cb, cinput_d); + break; + } + else { + typed_data = evas_object_data_get(layout, "typed_data"); + if (NULL == typed_data) { + ERR("evas_object_data_get() return NULL"); + break; + } + elm_object_style_set(btn, "icon_minus"); + if (EINA_TRUE == elm_object_disabled_get(btn)) + elm_object_disabled_set(btn, EINA_FALSE); + evas_object_smart_callback_add(btn, "clicked", input_addr_del_clicked_cb, typed_data); + } + } + eina_list_free(list); +} + +void ct_input_update_image(ct_input_data *cinput_d) +{ + Evas_Object *layout = cinput_d->ly_baseinfo; + Evas_Object *ico; + Evas_Object *btn; + const char *img_path; + static int idx_ico; + + btn = elm_object_part_content_get(layout, "elm.icon.image"); + if (NULL == btn) { + btn = elm_button_add(layout); + p_retm_if(NULL == btn, "elm_button_add() return NULL"); + elm_object_part_content_set(layout, "elm.icon.image", btn); + evas_object_smart_callback_add(btn, "clicked", input_img_clicked_cb, cinput_d); + evas_object_size_hint_aspect_set(btn, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + } + + ico = elm_object_part_content_get(btn, "icon"); + if (!ico) { + ico = elm_icon_add(btn); + elm_icon_prescale_set(ico, CT_DETAIL_IMAGE_SIZE); + elm_object_part_content_set(btn, "icon", ico); + } + + img_path = input_get_contact_image_path(cinput_d->contact); + if (NULL == img_path) + img_path = ctui_get_default_contact_img(CT_VIEW_INPUT); + + if (idx_ico++%2) + elm_icon_file_set(ico, img_path, NULL); + else + elm_icon_file_set(ico, img_path, "/"); +} + +static Evas_Object* input_fill_layout_baseinfo(ct_input_data *cinput_d) +{ + int ret; + const char *name; + CTSvalue *value; + Evas_Object *ly_content; + Evas_Object *ef_first, *ef_last; + Evas_Object *box = cinput_d->box; + + ly_content = elm_layout_add(box); + p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL"); + elm_layout_file_set(ly_content, CONTACTS_EDJ, "dialogue/baseinfo.3icon"); + evas_object_size_hint_align_set(ly_content, EVAS_HINT_FILL, 0.0); + cinput_d->ly_baseinfo = ly_content; + evas_object_show(ly_content); + + ef_first = ct_input_add_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_FIRSTNAME), + input_firstname_unfocused_cb, cinput_d); + p_retvm_if(NULL == ef_first, NULL, "ct_input_add_editfield() return NULL"); + elm_object_part_content_set(ly_content, "elm.icon.name1", ef_first); + ct_input_name_field_add(ef_first, cinput_d); + + ef_last = ct_input_add_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_LASTNAME), + input_lastname_unfocused_cb, cinput_d); + p_retvm_if(NULL == ef_last, NULL, "ct_input_add_editfield() return NULL"); + elm_object_part_content_set(ly_content, "elm.icon.name2", ef_last); + ret = contacts_svc_struct_get_value(cinput_d->contact, CTS_CF_NAME_VALUE, &value); + ct_input_name_field_add(ef_last, cinput_d); + + if (CTS_SUCCESS == ret) { + name = contacts_svc_value_get_str(value, CTS_NAME_VAL_FIRST_STR); + input_editfield_entry_set(ef_first, name); + + name = contacts_svc_value_get_str(value, CTS_NAME_VAL_LAST_STR); + input_editfield_entry_set(ef_last, name); + } + + ct_input_update_image(cinput_d); + + return ly_content; +} + +Evas_Object* ct_input_fill_layout_separator(ct_input_data *cinput_d, const char *theme) +{ + Evas_Object *box = cinput_d->box; + Evas_Object *layout; + + /*Create a separator layout*/ + layout = elm_layout_add(box); + p_retvm_if(NULL == layout, NULL, "elm_layout_add() return NULL"); + + elm_layout_theme_set(layout, "layout", "dialogue", theme); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, 0.0); + evas_object_show(layout); + + return layout; +} + +static void input_messenger_del(ct_input_data *cinput_d, ct_input_typed_data *typed_data) +{ + int ret; + int idx; + Eina_List *list = NULL; + + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + p_retm_if(NULL == typed_data, "parameter(typed_data) is NULL"); + + ret = contacts_svc_value_set_bool(typed_data->value, CTS_MESSENGER_VAL_DELETE_BOOL, true); + p_retm_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret); + + if (typed_data->ly_main == cinput_d->ly_messenger_first) { + idx = ct_input_box_idx_get(cinput_d->box, typed_data->ly_main); + list = elm_box_children_get(cinput_d->box); + cinput_d->ly_messenger_first = eina_list_nth(list, idx + 1); + eina_list_free(list); + } + + elm_box_unpack(cinput_d->box, typed_data->ly_main); + evas_object_del(typed_data->ly_main); +} + +static void input_messenger_del_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_input_data *cinput_d = data; + ct_input_typed_data *typed_data; + + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + + typed_data = evas_object_data_get(obj, "typed_data"); + p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL"); + + input_messenger_del(data, typed_data); +} + +static void input_messenger_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + ct_input_data *cinput_d = data; + Evas_Object *btn_minus; + ct_input_typed_data *typed_data; + const char *tmp; + + tmp = elm_entry_entry_get(obj); + p_retm_if(NULL == tmp || '\0' == tmp[0], "elm_entry_entry_get() return NULL"); + + evas_object_smart_callback_del(obj, "changed", input_messenger_changed_cb); + evas_object_smart_callback_del(obj, "preedit,changed", input_messenger_changed_cb); + p_retm_if(NULL == cinput_d, "parameter(ct_input_data) is NULL"); + + typed_data = evas_object_data_get(obj, "typed_data"); + p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL"); + + ret = contacts_svc_value_set_bool(typed_data->value, CTS_MESSENGER_VAL_DELETE_BOOL, false); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret); + + if (typed_data->ly_main == cinput_d->ly_messenger_last) { + btn_minus = elm_button_add(typed_data->ly_main); + p_retm_if(NULL == btn_minus, "elm_button_add() return NULL"); + + elm_object_style_set(btn_minus, "icon_minus"); + evas_object_data_set(btn_minus, "typed_data", typed_data); + elm_object_part_content_set(typed_data->ly_main, "elm.edit.icon", btn_minus); + evas_object_smart_callback_add(btn_minus, "clicked", input_messenger_del_clicked_cb, cinput_d); + + p_retm_if(NULL == input_add_new_messenger(cinput_d), "input_add_new_messenger() return NULL"); + } +} + +static void input_messenger_unfocused_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + char *input; + Evas_Object *entry = obj; + ct_input_data *cinput_d = data; + ct_input_typed_data *typed_data; + + typed_data = evas_object_data_get(entry, "typed_data"); + p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL"); + + input = ctui_entry_markup_to_utf8(elm_entry_entry_get(entry)); + p_retm_if(NULL == input, "ctui_entry_markup_to_utf8() return NULL"); + + if (*input) { + ret = contacts_svc_value_set_bool(typed_data->value, CTS_MESSENGER_VAL_DELETE_BOOL, false); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret); + + ret = contacts_svc_value_set_str(typed_data->value, CTS_MESSENGER_VAL_IM_ID_STR, input); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret); + } + else if (!contacts_svc_value_get_bool(typed_data->value, CTS_MESSENGER_VAL_DELETE_BOOL)) { + ret = contacts_svc_value_set_bool(typed_data->value, CTS_MESSENGER_VAL_DELETE_BOOL, true); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret); + + if (typed_data->data) { + evas_object_smart_callback_add(typed_data->data, "changed", input_messenger_changed_cb, cinput_d); + evas_object_smart_callback_add(typed_data->data, "preedit,changed", input_messenger_changed_cb, cinput_d); + } + } + + free(input); +} + + +static Evas_Object *input_messenger_get_edit_rename(ct_input_data *cinput_d, ct_input_typed_data *typed_data) +{ + const char *val_str; + Evas_Object *entry; + Evas_Object *editfield; + Evas_Object *ly_content = typed_data->ly_content; + + editfield = ct_input_add_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_INSTANT_MESSENGER), + input_messenger_unfocused_cb, cinput_d); + p_retvm_if(NULL == editfield, NULL, "ct_input_add_editfield() return NULL"); + + entry = elm_object_part_content_get(editfield, "elm.swallow.content"); + typed_data->data = entry; + + evas_object_data_set(entry, "typed_data", typed_data); + elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NORMAL); + val_str = contacts_svc_value_get_str(typed_data->value, CTS_MESSENGER_VAL_IM_ID_STR); + + if (val_str && *val_str) + ctui_entry_entry_set(entry, val_str); + else { + evas_object_smart_callback_add(entry, "changed", input_messenger_changed_cb, cinput_d); + evas_object_smart_callback_add(entry, "preedit,changed", input_messenger_changed_cb, cinput_d); + } + return editfield; + +} + +static Evas_Object* input_fill_layout_messenger(ct_input_data *cinput_d, CTSvalue *value) +{ + const char *val_str; + int type_int; + Evas_Object *ly_content, *ly_main, *ly_type; + Evas_Object *ef; + Evas_Object *btn_minus; + Evas_Object *box = cinput_d->box; + ct_input_typed_data *typed_data; + + if (!cinput_d->ly_seperator_more) { + cinput_d->ly_seperator_more = ct_input_fill_layout_separator(cinput_d, "separator/hd33/with_line"); + p_retvm_if(NULL == cinput_d->ly_seperator_more, EINA_FALSE, "ct_input_fill_layout_separator() return NULL"); + elm_box_pack_after(cinput_d->box, cinput_d->ly_seperator_more, cinput_d->ly_addr_last); + } + + ly_content = ct_input_create_dg_layout(box, "1title.1text.1icon.2"); + p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL"); + elm_object_signal_emit(ly_content, "elm,state,flip,enabled", "elm"); + + ly_main = ct_input_create_dg_layout(box, "edit/contact"); + p_retvm_if(NULL == ly_main, NULL, "ct_input_create_dg_layout() return NULL"); + elm_object_signal_emit(ly_main, "elm,state,decorate,enabled", "elm"); + elm_object_part_content_set(ly_main, "elm.swallow.decorate.content", ly_content); + + type_int = contacts_svc_value_get_int(value, CTS_MESSENGER_VAL_TYPE_INT); + ly_type = elm_layout_add(ly_content); + if (NULL == ly_type) { + ERR("elm_layout_add() return NULL"); + evas_object_del(ly_main); + return NULL; + } + + elm_layout_file_set(ly_type, CONTACTS_EDJ, "gl_title"); + + elm_object_part_text_set(ly_type, "title.text", T_(CT_GET_TEXT_IM_TYPE, type_int)); + evas_object_data_set(ly_type, "cinput_d", cinput_d); + elm_object_part_content_set(ly_content, "elm.flip.content.title", ly_type); + + typed_data = calloc(1, sizeof(ct_input_typed_data)); + p_retvm_if(NULL == typed_data, NULL, "calloc() return NULL"); + typed_data->value = value; + typed_data->ly_main = ly_main; + typed_data->ly_content = ly_content; + evas_object_data_set(ly_main, "typed_data", typed_data); + + val_str = contacts_svc_value_get_str(value, CTS_MESSENGER_VAL_IM_ID_STR); + if (val_str && *val_str) { + btn_minus = elm_button_add(ly_main); + if (NULL == btn_minus) { + ERR("elm_button_add() return NULL"); + evas_object_del(ly_main); + free(typed_data); + return NULL; + } + elm_object_style_set(btn_minus, "icon_minus"); + evas_object_data_set(btn_minus, "typed_data", typed_data); + elm_object_part_content_set(ly_main, "elm.edit.icon", btn_minus); + evas_object_smart_callback_add(btn_minus, "clicked", input_messenger_del_clicked_cb, cinput_d); + } + + ef = input_messenger_get_edit_rename(cinput_d, typed_data); + if (NULL == ef) { + ERR("input_messenger_get_edit_rename() return NULL"); + evas_object_del(ly_main); + free(typed_data); + return NULL; + } + elm_object_part_content_set(ly_content, "elm.flip.content", ef); + + evas_object_event_callback_add(ly_main, EVAS_CALLBACK_DEL, ct_input_typed_layout_del_cb, typed_data); + if (CTS_ADDRESSBOOK_TYPE_EXCHANGE != cinput_d->base_ab_type) + evas_object_event_callback_add(ly_type, EVAS_CALLBACK_MOUSE_UP, ct_input_data_type_mouse_up_cb, typed_data); + + if (cinput_d->ly_messenger_last) + elm_box_pack_after(box, ly_main, cinput_d->ly_messenger_last); + else + elm_box_pack_after(box, ly_main, cinput_d->ly_seperator_more); + + return ly_main; +} + +static int input_fill_layout_messengers(ct_input_data *cinput_d) +{ + int ret; + int cnt = 0; + GSList *list, *cursor; + Evas_Object *layout; + CTSstruct *contact = cinput_d->contact; + + list = NULL; + layout = NULL; + ret = contacts_svc_struct_get_list(contact, CTS_CF_MESSENGER_LIST, &list); + if (CTS_SUCCESS == ret) { + for (cursor=list;cursor;cursor=cursor->next) { + if (NULL == cursor->data) continue; + + layout = input_fill_layout_messenger(cinput_d, cursor->data); + p_retvm_if(NULL == layout, cnt, "input_fill_layout_messenger() return NULL"); + + if (NULL == cinput_d->ly_messenger_first) + cinput_d->ly_messenger_first = layout; + cinput_d->ly_messenger_last = layout; + + cnt++; + } + } + + return cnt; +} + +static Evas_Object* input_add_new_messenger(ct_input_data *cinput_d) +{ + CTSvalue *value; + Evas_Object *layout; + + value = input_new_messenger(cinput_d->contact); + p_retvm_if(NULL == value, NULL, "input_new_messenger() return NULL"); + + layout = input_fill_layout_messenger(cinput_d, value); + p_retvm_if(NULL == layout, NULL, "input_fill_layout_messenger() return NULL"); + + if (NULL == cinput_d->ly_messenger_first) + cinput_d->ly_messenger_first = layout; + cinput_d->ly_messenger_last = layout; + + return layout; +} + +static Evas_Object* input_fill_layout_address(ct_input_data *cinput_d, CTSvalue *value) +{ + int type_int; + Evas_Object *ly_main, *ly_content, *ly_type; + Evas_Object *ef, *en; + Evas_Object *btn; + Evas_Object *box = cinput_d->box; + ct_input_typed_data *typed_data; + Elm_Entry_Filter_Limit_Size filter; + + ly_content = ct_input_create_dg_layout(box, "1title.1text.1icon.2"); + p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL"); + elm_object_signal_emit(ly_content, "elm,state,flip,enabled", "elm"); + + ly_main = ct_input_create_dg_layout(box, "edit/contact"); + p_retvm_if(NULL == ly_main, NULL, "ct_input_create_dg_layout() return NULL"); + elm_object_signal_emit(ly_main, "elm,state,decorate,enabled", "elm"); + elm_object_part_content_set(ly_main, "elm.swallow.decorate.content", ly_content); + + + char display[PH_TEXT_MAX_LEN]; + + ef = ctui_create_editfield(ly_content, NULL, S_(CT_SYS_POP_ADDRESS), false); + p_retvm_if(NULL == ef, NULL, "ctui_create_editfield() return NULL"); + + en = elm_object_part_content_get(ef, "elm.swallow.content"); + filter.max_char_count = CT_INPUT_ADDRESS_MAX_CHAR; + elm_entry_markup_filter_append(en, elm_entry_filter_limit_size, &filter); + evas_object_smart_callback_add(en, "changed", ct_input_entry_changed_cb, ef); + evas_object_smart_callback_add(en, "unfocused", input_addr_editfield_unfocused_cb, value); + elm_object_part_content_set(ly_content, "elm.flip.content", ef); + + display[0] = '\0'; + ct_input_get_full_address(value, display, sizeof(display)); + en = input_editfield_entry_set(ef, display); + + /* type */ + type_int = contacts_svc_value_get_int(value, CTS_POSTAL_VAL_TYPE_INT); + + ly_type = elm_layout_add(ly_content); + if (NULL == ly_type) { + ERR("elm_layout_add() return NULL"); + evas_object_del(ly_main); + return NULL; + } + elm_layout_file_set(ly_type, CONTACTS_EDJ, "gl_title"); + elm_object_part_text_set(ly_type, "title.text", T_(CT_GET_TEXT_POSTAL_TYPE, type_int)); + + evas_object_data_set(ly_type, "cinput_d", cinput_d); + elm_object_part_content_set(ly_content, "elm.flip.content.title", ly_type); + + /* edit button */ + btn = elm_button_add(ly_main); + if (NULL == btn) { + ERR("elm_button_add() return NULL"); + evas_object_del(ly_main); + return NULL; + } + elm_object_part_content_set(ly_main, "elm.edit.icon", btn); + evas_object_data_set(btn, "cinput_d", cinput_d); + + typed_data = calloc(1, sizeof(ct_input_typed_data)); + p_retvm_if(NULL == typed_data, NULL, "calloc() return NULL"); + typed_data->ly_main = ly_main; + typed_data->ly_content = ly_content; + typed_data->value = value; + evas_object_data_set(ly_main, "typed_data", typed_data); + + evas_object_event_callback_add(ly_type, EVAS_CALLBACK_MOUSE_UP, input_addr_type_mouse_up_cb, typed_data); + evas_object_event_callback_add(ly_main, EVAS_CALLBACK_DEL, ct_input_typed_layout_del_cb, typed_data); + return ly_main; +} + +static Evas_Object* input_add_new_address(ct_input_data *cinput_d) +{ + CTSvalue *value; + Evas_Object *layout; + + value = input_new_address(cinput_d->contact); + p_retvm_if(NULL == value, NULL, "input_new_address() return NULL"); + + layout = input_fill_layout_address(cinput_d, value); + p_retvm_if(NULL == layout, NULL, "input_fill_layout_address() return NULL"); + + if (cinput_d->ly_addr_last) + elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_addr_last); + else + elm_box_pack_end(cinput_d->box, layout); + + return layout; +} + +static void input_ringtone_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + int x, y, w, h; + Evas_Event_Mouse_Up *ev = (Evas_Event_Mouse_Up *)event_info; + ct_input_data *cinput_d = data; + + if (ev && ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) + return; + + evas_object_geometry_get(obj, &x, &y, &w, &h); + if (ev->output.y < y || y + h < ev->output.y) + return; + elm_object_focus_set(cinput_d->cdetail_d->navi, EINA_FALSE); + + if(cinput_d->cdetail_d->ug) + return; + + ct_input_myfile_ringtone(data); +} + +static Evas_Object* input_fill_layout_ringtone(ct_input_data *cinput_d) +{ + int ret; + const char *temp; + const char *display; + CTSvalue *value; + Evas_Object *box = cinput_d->box; + Evas_Object *ly_content; + Evas_Object *btn; + Evas_Object *icon; + double scale; + + ly_content = ct_input_create_dg_layout(box, "2text.1icon.6"); + p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL"); + + cinput_d->ly_ringtone = ly_content; + input_layout_selectable_set(ly_content); + evas_object_event_callback_add(ly_content, EVAS_CALLBACK_MOUSE_UP, input_ringtone_mouse_up_cb, cinput_d); + + /* title */ + elm_object_part_text_set(ly_content, "elm.text.1", T_(CT_GET_TEXT_BASIC, CTTEXT_RINGTONE)); + + /* file name */ + ret = contacts_svc_struct_get_value(cinput_d->contact, CTS_CF_BASE_INFO_VALUE, &value); + p_retvm_if(CTS_SUCCESS != ret && CTS_ERR_NO_DATA != ret, NULL, "contacts_svc_struct_get_value() Failed(%d)", ret); + + temp = contacts_svc_value_get_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR); + display = ct_detail_get_ringtone_display_name(temp); + elm_object_part_text_set(ly_content, "elm.text.2", display); + + /* remove button */ + btn = elm_button_add(ly_content); + p_retvm_if(NULL == btn, NULL, "elm_button_add() return NULL"); + elm_object_part_content_set(ly_content, "elm.icon", btn); + evas_object_propagate_events_set(btn, EINA_FALSE); + + scale = elm_scale_get(); + evas_object_size_hint_min_set(btn, CT_DETAIL_RESET_BUTTON_SIZE * scale, CT_DETAIL_RESET_BUTTON_SIZE * scale); + evas_object_size_hint_max_set(btn, CT_DETAIL_RESET_BUTTON_SIZE * scale, CT_DETAIL_RESET_BUTTON_SIZE * scale); + + icon = elm_icon_add(btn); + p_retvm_if(NULL == icon, NULL, "elm_icon_add() return NULL"); + elm_icon_resizable_set(icon, EINA_FALSE, EINA_FALSE); + elm_icon_file_set(icon, CTUI_IMG_ICON_RESET, NULL); + elm_object_part_content_set(btn, "icon", icon); + + evas_object_smart_callback_add(btn, "clicked", input_ringtone_cancel_cb, cinput_d); + + if (NULL == temp || '\0' == *temp) { + elm_object_focus_set(btn, EINA_FALSE); + elm_object_disabled_set(btn, EINA_TRUE); + } + else + elm_object_disabled_set(btn, EINA_FALSE); + + return ly_content; + +} + +static inline void input_refresh_layout(ct_input_data *cinput_d) +{ + cinput_d->idx_append = 0; + elm_box_clear(cinput_d->box); + + cinput_d->ly_baseinfo = NULL; + cinput_d->ly_baseinfo_last = NULL; + cinput_d->ly_baseinfo_suffix = NULL; + cinput_d->ly_baseinfo_nick = NULL; + cinput_d->ly_baseinfo_job_title = NULL; + cinput_d->ly_baseinfo_department = NULL; + cinput_d->ly_baseinfo_company = NULL; + cinput_d->ly_baseinfo_expand = NULL; + cinput_d->ly_number_first = NULL; + cinput_d->ly_number_last = NULL; + cinput_d->ly_number_default = NULL; + cinput_d->ly_number_set_default_separator_before = NULL; + cinput_d->ly_number_set_default = NULL; + cinput_d->ly_number_set_default_separator_after = NULL; + cinput_d->ly_email_first = NULL; + cinput_d->ly_email_last = NULL; + cinput_d->ly_addr_first = NULL; + cinput_d->ly_addr_last = NULL; + cinput_d->ly_seperator_more = NULL; + cinput_d->ly_messenger_first = NULL; + cinput_d->ly_messenger_last = NULL; + cinput_d->ly_url_first = NULL; + cinput_d->ly_url_last = NULL; + cinput_d->ly_relationship = NULL; + cinput_d->ly_birthday = NULL; + cinput_d->ly_anniversary = NULL; + cinput_d->ly_note = NULL; + cinput_d->ly_ringtone = NULL; + cinput_d->ly_moreinfo = NULL; + + input_fill_layout(cinput_d); +} + +static void input_relationship_unfocused_cb(void *data, Evas_Object *obj, void *event_info) +{ + CTSvalue *value = data; + char *input; + + input = ctui_entry_markup_to_utf8(elm_entry_entry_get(obj)); + p_retm_if(NULL == input, "ctui_entry_markup_to_utf8() return NULL"); + + contacts_svc_value_set_str(value, CTS_EXTEND_VAL_DATA2_STR, input); + free(input); +} + +static Evas_Object* input_relationship_get_edit_rename(ct_input_data *cinput_d, ct_input_typed_data *typed_data) +{ + const char *val_str; + Evas_Object *entry; + Evas_Object *editfield; + Evas_Object *ly_content = typed_data->ly_content; + + editfield = ct_input_add_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_RELATIONSHIP), input_relationship_unfocused_cb, typed_data->value); + p_retvm_if(NULL == editfield, NULL, "ct_input_add_editfield() return NULL"); + + entry = elm_object_part_content_get(editfield, "elm.swallow.content"); + typed_data->data = entry; + + evas_object_data_set(entry, "typed_data", typed_data); + elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NORMAL); + + val_str = contacts_svc_value_get_str(typed_data->value, CTS_EXTEND_VAL_DATA2_STR); + + if (val_str && *val_str) + ctui_entry_entry_set(entry, val_str); + + return editfield; +} + +static void input_relationship_select_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_input_data *cinput_d = data; + ct_contact_list *contact; + Elm_Object_Item *item = event_info; + Evas_Object *ly_relationship; + Evas_Object *editfield; + Evas_Object *entry; + + elm_genlist_item_selected_set(item, EINA_FALSE); + + p_retm_if(!cinput_d, "parameter(cinput_d) is NULL"); + p_retm_if(!cinput_d->ly_relationship, "parameter(ly_relationship) is NULL"); + + contact = elm_object_item_data_get(item); + p_retm_if(NULL == contact, "elm_object_item_data_get() returns NULL"); + + ly_relationship = elm_object_part_content_get(cinput_d->ly_relationship, "elm.swallow.decorate.content"); + editfield = elm_object_part_content_get(ly_relationship, "elm.flip.content"); + entry = elm_object_part_content_get(editfield, "elm.swallow.content"); + + if (entry && contact->display && *contact->display) + ctui_entry_entry_set(entry, contact->display); + + elm_naviframe_item_pop(cinput_d->cdetail_d->navi); +} + +static void input_relationship_select_contact(void *data, Evas_Object *obj, void *event_info) +{ + ct_input_data *cinput_d = data; + ct_detail_create_list_view(cinput_d->cdetail_d, input_relationship_select_cb, cinput_d, 0); +} + +static Evas_Object* input_fill_layout_relationship(ct_input_data *cinput_d) +{ + int type; + int type_int = 0; + char *type_str = NULL; + Evas_Object *ly_content, *ly_type; + Evas_Object *ly_main; + Evas_Object *box = cinput_d->box; + Evas_Object *ef; + Evas_Object *btn; + ct_input_typed_data *typed_data; + CTSvalue *value; + + if (!cinput_d->ly_seperator_more) { + cinput_d->ly_seperator_more = ct_input_fill_layout_separator(cinput_d, "separator/hd33/with_line"); + p_retvm_if(NULL == cinput_d->ly_seperator_more, EINA_FALSE, "ct_input_fill_layout_separator() return NULL"); + elm_box_pack_after(cinput_d->box, cinput_d->ly_seperator_more, cinput_d->ly_addr_last); + } + ly_main = ct_input_create_dg_layout(box, "edit/contact.5"); + p_retvm_if(NULL == ly_main, NULL, "ct_input_create_dg_layout() return NULL"); + elm_object_signal_emit(ly_main, "elm,state,decorate,enabled", "elm"); + + ly_content = ct_input_create_dg_layout(ly_main, "1title.1text.1icon.2"); + p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL"); + elm_object_signal_emit(ly_content, "elm,state,flip,enabled", "elm"); + elm_object_part_content_set(ly_main, "elm.swallow.decorate.content", ly_content); + + type = contacts_svc_find_custom_type(CTS_TYPE_CLASS_EXTEND_DATA, "Relationship"); + if (type <= 0) { + type = contacts_svc_insert_custom_type(CTS_TYPE_CLASS_EXTEND_DATA, "Relationship"); + p_retvm_if(type <= 0, NULL, "contacts_svc_insert_custom_type() Failed(%d)", type); + } + + value = ct_detail_get_relationship(cinput_d->contact); + if (value) + type_int = contacts_svc_value_get_int(value, CTS_EXTEND_VAL_DATA1_INT); + else { + value = contacts_svc_value_new(CTS_VALUE_EXTEND); + p_retvm_if(NULL == value, NULL, "contacts_svc_struct_get_value() return NULL"); + contacts_svc_struct_store_value(cinput_d->contact, type, value); + } + + ly_type = elm_layout_add(ly_content); + if (NULL == ly_type) { + ERR("elm_layout_add() return NULL"); + evas_object_del(ly_main); + return NULL; + } + + elm_layout_file_set(ly_type, CONTACTS_EDJ, "gl_title"); + + if (RELATIONSHIP_TYPE_CUSTOM == type_int) + type_str = (char *)contacts_svc_value_get_str(value, CTS_EXTEND_VAL_DATA3_STR); + if (NULL == type_str || '\0' == type_str) + type_str = (char *)T_(CT_GET_TEXT_RELATIONSHIP_TYPE, type_int); + + elm_object_part_text_set(ly_type, "title.text", type_str); + evas_object_data_set(ly_type, "cinput_d", cinput_d); + elm_object_part_content_set(ly_content, "elm.flip.content.title", ly_type); + + typed_data = calloc(1, sizeof(ct_input_typed_data)); + p_retvm_if(NULL == typed_data, NULL, "calloc() return NULL"); + typed_data->value = value; + typed_data->ly_content = ly_content; + evas_object_data_set(ly_content, "typed_data", typed_data); + + ef = input_relationship_get_edit_rename(cinput_d, typed_data); + if (NULL == ef) { + ERR("input_website_get_edit_rename() return NULL"); + evas_object_del(ly_main); + free(typed_data); + return NULL; + } + + elm_object_part_content_set(ly_content, "elm.flip.content", ef); + evas_object_event_callback_add(ly_content, EVAS_CALLBACK_DEL, ct_input_typed_layout_del_cb, typed_data); + evas_object_event_callback_add(ly_type, EVAS_CALLBACK_MOUSE_UP, ct_input_data_type_mouse_up_cb, typed_data); + + btn = elm_button_add(ly_main); + if (NULL == btn) { + ERR("elm_button_add() return NULL"); + evas_object_del(ly_main); + return NULL; + } + elm_object_part_content_set(ly_main, "elm.edit.icon", btn); + evas_object_data_set(btn, "cinput_d", cinput_d); + + // TODO: Fixme - button style + elm_object_style_set(btn, "icon_plus"); + evas_object_smart_callback_add(btn, "clicked", input_relationship_select_contact, cinput_d); + + if (cinput_d->ly_url_last) + elm_box_pack_after(box, ly_main, cinput_d->ly_url_last); + else if (cinput_d->ly_messenger_last) + elm_box_pack_after(box, ly_main, cinput_d->ly_messenger_last); + else + elm_box_pack_after(box, ly_main, cinput_d->ly_seperator_more); + + cinput_d->ly_relationship = ly_main; + + return ly_main; +} + +static Evas_Object* input_fill_layout_event(ct_input_data *cinput_d, int event_type) +{ + int event_date; + CTSvalue *value; + Evas_Object *ly_content; + Evas_Object *icon; + Evas_Object *btn; + Evas_Object *datetime; + double scale; + + if (!cinput_d->ly_seperator_more) { + cinput_d->ly_seperator_more = ct_input_fill_layout_separator(cinput_d, "separator/hd33/with_line"); + p_retvm_if(NULL == cinput_d->ly_seperator_more, EINA_FALSE, "ct_input_fill_layout_separator() return NULL"); + elm_box_pack_after(cinput_d->box, cinput_d->ly_seperator_more, cinput_d->ly_addr_last); + } + + ly_content = elm_layout_add(cinput_d->box); + p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL"); + elm_layout_file_set(ly_content, CONTACTS_EDJ, "dialogue/1text.2icon"); + evas_object_size_hint_align_set(ly_content, EVAS_HINT_FILL, 0.0); + + elm_object_part_text_set(ly_content, "elm.text", T_(CT_GET_TEXT_EVENT_TYPE, event_type)); + + /* datetime */ + datetime = elm_datetime_add(ly_content); + p_retvm_if(NULL == datetime, NULL, "elm_datetime_add() return NULL"); + + elm_datetime_field_visible_set(datetime, ELM_DATETIME_HOUR, EINA_FALSE); + elm_datetime_field_visible_set(datetime, ELM_DATETIME_MINUTE, EINA_FALSE); + elm_datetime_field_visible_set(datetime, ELM_DATETIME_AMPM, EINA_FALSE); + + elm_object_part_content_set(ly_content, "elm.icon.1", datetime); + evas_object_data_set(datetime, "cinput_d", cinput_d); + + value = ct_input_get_event(cinput_d->contact, event_type); + if (NULL == value) + value = input_new_event(cinput_d->contact, event_type); + + if (contacts_svc_value_get_bool(value, CTS_EVENT_VAL_DELETE_BOOL)) { + time_t timer; + struct tm *stime = NULL; + timer = time(NULL); + stime = localtime(&timer); + p_retvm_if(NULL == stime, NULL, "localtime() Failed(%d)", errno); + elm_datetime_value_set(datetime, stime); + } + else { + struct tm stime; + event_date = contacts_svc_value_get_int(value, CTS_EVENT_VAL_DATE_INT); + stime.tm_year = event_date/10000 - 1900; + stime.tm_mon = (event_date%10000)/100 - 1; + stime.tm_mday = event_date%100; + elm_datetime_value_set(datetime, &stime); + } + evas_object_smart_callback_add(datetime, "changed", input_event_changed_cb, value); + + /* reset button */ + btn = elm_button_add(ly_content); + p_retvm_if(NULL == btn, NULL, "elm_button_add() return NULL"); + elm_object_part_content_set(ly_content, "elm.icon.2", btn); + evas_object_propagate_events_set(btn, EINA_FALSE); + evas_object_data_set(btn, "cinput_d", cinput_d); + + scale = elm_scale_get(); + evas_object_size_hint_min_set(btn, CT_DETAIL_RESET_BUTTON_SIZE * scale, CT_DETAIL_RESET_BUTTON_SIZE * scale); + evas_object_size_hint_max_set(btn, CT_DETAIL_RESET_BUTTON_SIZE * scale, CT_DETAIL_RESET_BUTTON_SIZE * scale); + + icon = elm_icon_add(btn); + p_retvm_if(NULL == icon, NULL, "elm_icon_add() return NULL"); + elm_icon_file_set(icon, CTUI_IMG_ICON_RESET, NULL); + elm_icon_resizable_set(icon, EINA_FALSE, EINA_FALSE); + elm_object_part_content_set(btn, "icon", icon); + evas_object_smart_callback_add(btn, "clicked", input_event_cancel_clicked_cb, value); + + if (contacts_svc_value_get_bool(value, CTS_EVENT_VAL_DELETE_BOOL)) + elm_object_disabled_set(btn, EINA_TRUE); + else + elm_object_disabled_set(btn, EINA_FALSE); + + evas_object_show(ly_content); + + if (cinput_d->ly_birthday) + elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_birthday); + else if (cinput_d->ly_relationship) + elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_relationship); + else if (cinput_d->ly_url_last) + elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_url_last); + else if (cinput_d->ly_messenger_last) + elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_messenger_last); + else + elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_seperator_more); + + if (CTS_EVENT_TYPE_BIRTH == event_type) + cinput_d->ly_birthday = ly_content; + else + cinput_d->ly_anniversary = ly_content; + + return ly_content; +} + + +static void input_website_del(ct_input_data *cinput_d, ct_input_typed_data *typed_data) +{ + int ret; + int idx; + Eina_List *list = NULL; + + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + p_retm_if(NULL == typed_data, "parameter(typed_data) is NULL"); + + ret = contacts_svc_value_set_bool(typed_data->value, CTS_WEB_VAL_DELETE_BOOL, true); + p_retm_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret); + + if (typed_data->ly_main == cinput_d->ly_url_first) { + idx = ct_input_box_idx_get(cinput_d->box, typed_data->ly_main); + list = elm_box_children_get(cinput_d->box); + cinput_d->ly_url_first = eina_list_nth(list, idx + 1); + eina_list_free(list); + } + + elm_box_unpack(cinput_d->box, typed_data->ly_main); + evas_object_del(typed_data->ly_main); +} + + +static void input_website_del_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_input_data *cinput_d = data; + ct_input_typed_data *typed_data; + + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + + typed_data = evas_object_data_get(obj, "typed_data"); + p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL"); + + input_website_del(cinput_d, typed_data); + +} + +static void input_website_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + ct_input_data *cinput_d = data; + Evas_Object *btn_minus; + ct_input_typed_data *typed_data; + const char *tmp; + + tmp = elm_entry_entry_get(obj); + p_retm_if(NULL == tmp || '\0' == tmp[0], "elm_entry_entry_get() return NULL"); + + evas_object_smart_callback_del(obj, "changed", input_website_changed_cb); + p_retm_if(NULL == cinput_d, "parameter(ct_input_data) is NULL"); + + typed_data = evas_object_data_get(obj, "typed_data"); + p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL"); + + ret = contacts_svc_value_set_bool(typed_data->value, CTS_WEB_VAL_DELETE_BOOL, false); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret); + + if (typed_data->ly_main == cinput_d->ly_url_last) { + btn_minus = elm_button_add(typed_data->ly_main); + p_retm_if(NULL == btn_minus, "elm_button_add() return NULL"); + + elm_object_style_set(btn_minus, "icon_minus"); + evas_object_data_set(btn_minus, "typed_data", typed_data); + elm_object_part_content_set(typed_data->ly_main, "elm.edit.icon", btn_minus); + evas_object_smart_callback_add(btn_minus, "clicked", input_website_del_clicked_cb, cinput_d); + + p_retm_if(NULL == input_add_new_website(cinput_d), "input_add_new_website() return NULL"); + } + +} + +static Evas_Object *input_website_get_edit_rename(ct_input_data *cinput_d, ct_input_typed_data *typed_data) +{ + const char *val_str; + Evas_Object *entry; + Evas_Object *editfield; + Evas_Object *ly_content = typed_data->ly_content; + + editfield = ct_input_add_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_URL), input_website_unfocused_cb, typed_data->value); + p_retvm_if(NULL == editfield, NULL, "ct_input_add_editfield() return NULL"); + + entry = elm_object_part_content_get(editfield, "elm.swallow.content"); + typed_data->data = entry; + + evas_object_data_set(entry, "typed_data", typed_data); + elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_URL); + val_str = contacts_svc_value_get_str(typed_data->value, CTS_WEB_VAL_ADDR_STR); + + if (val_str && *val_str) + ctui_entry_entry_set(entry, val_str); + else + evas_object_smart_callback_add(entry, "changed", input_website_changed_cb, cinput_d); + return editfield; + +} + +static Evas_Object *input_fill_layout_url(ct_input_data *cinput_d, CTSvalue *value) +{ + const char *val_str; + int type_int; + Evas_Object *ly_content, *ly_main, *ly_type; + Evas_Object *box = cinput_d->box; + Evas_Object *ef; + Evas_Object *btn_minus; + ct_input_typed_data *typed_data; + + if (!cinput_d->ly_seperator_more) { + cinput_d->ly_seperator_more = ct_input_fill_layout_separator(cinput_d, "separator/hd33/with_line"); + p_retvm_if(NULL == cinput_d->ly_seperator_more, EINA_FALSE, "ct_input_fill_layout_separator() return NULL"); + elm_box_pack_after(cinput_d->box, cinput_d->ly_seperator_more, cinput_d->ly_addr_last); + } + + ly_content = ct_input_create_dg_layout(box, "1title.1text.1icon.2"); + p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL"); + elm_object_signal_emit(ly_content, "elm,state,flip,enabled", "elm"); + + ly_main = ct_input_create_dg_layout(box, "edit/contact"); + p_retvm_if(NULL == ly_main, NULL, "ct_input_create_dg_layout() return NULL"); + elm_object_signal_emit(ly_main, "elm,state,decorate,enabled", "elm"); + elm_object_part_content_set(ly_main, "elm.swallow.decorate.content", ly_content); + + type_int = contacts_svc_value_get_int(value, CTS_WEB_VAL_TYPE_INT); + ly_type = elm_layout_add(ly_content); + if (NULL == ly_type) { + ERR("elm_layout_add() return NULL"); + evas_object_del(ly_main); + return NULL; + } + + elm_layout_file_set(ly_type, CONTACTS_EDJ, "gl_title"); + + elm_object_part_text_set(ly_type, "title.text", T_(CT_GET_TEXT_WEBSITE_TYPE, type_int)); + + evas_object_data_set(ly_type, "cinput_d", cinput_d); + elm_object_part_content_set(ly_content, "elm.flip.content.title", ly_type); + + typed_data = calloc(1, sizeof(ct_input_typed_data)); + p_retvm_if(NULL == typed_data, NULL, "calloc() return NULL"); + typed_data->value = value; + typed_data->ly_main = ly_main; + typed_data->ly_content = ly_content; + evas_object_data_set(ly_main, "typed_data", typed_data); + + val_str = contacts_svc_value_get_str(value, CTS_WEB_VAL_ADDR_STR); + if (val_str && *val_str) { + btn_minus = elm_button_add(ly_main); + if (NULL == btn_minus) { + ERR("elm_button_add() return NULL"); + evas_object_del(ly_main); + free(typed_data); + return NULL; + } + elm_object_style_set(btn_minus, "icon_minus"); + evas_object_data_set(btn_minus, "typed_data", typed_data); + elm_object_part_content_set(ly_main, "elm.edit.icon", btn_minus); + evas_object_smart_callback_add(btn_minus, "clicked", input_website_del_clicked_cb, cinput_d); + } + + ef = input_website_get_edit_rename(cinput_d, typed_data); + if (NULL == ef) { + ERR("input_website_get_edit_rename() return NULL"); + evas_object_del(ly_main); + free(typed_data); + return NULL; + } + + elm_object_part_content_set(ly_content, "elm.flip.content", ef); + evas_object_event_callback_add(ly_main, EVAS_CALLBACK_DEL, ct_input_typed_layout_del_cb, typed_data); + evas_object_event_callback_add(ly_type, EVAS_CALLBACK_MOUSE_UP, ct_input_data_type_mouse_up_cb, typed_data); + + if (cinput_d->ly_url_last) + elm_box_pack_after(box, ly_main, cinput_d->ly_url_last); + else { + if (cinput_d->ly_messenger_last) + elm_box_pack_after(box, ly_main, cinput_d->ly_messenger_last); + else + elm_box_pack_after(box, ly_main, cinput_d->ly_seperator_more); + } + + return ly_main; + +} + +static Evas_Object* input_add_new_website(ct_input_data *cinput_d) +{ + CTSvalue *value; + Evas_Object *layout; + + value = input_new_web(cinput_d->contact); + p_retvm_if(NULL == value, NULL, "input_new_web() return NULL"); + + layout = input_fill_layout_url(cinput_d, value); + p_retvm_if(NULL == layout, NULL, "input_fill_layout_url() return NULL"); + + if (NULL == cinput_d->ly_url_first) + cinput_d->ly_url_first = layout; + cinput_d->ly_url_last = layout; + + return layout; +} + + +static int input_fill_layout_websites(ct_input_data *cinput_d) +{ + int cnt = 0; + GSList *list, *cursor; + Evas_Object *ly; + CTSstruct *contact = cinput_d->contact; + + ly = NULL; + list = NULL; + contacts_svc_struct_get_list(contact, CTS_CF_WEB_ADDR_LIST, &list); + + for (cursor=list;cursor;cursor=cursor->next) { + if (NULL == cursor->data) continue; + ly = input_fill_layout_url(cinput_d, cursor->data); + p_retvm_if(NULL == ly, cnt, "input_fill_layout_url() return NULL"); + + if (NULL == cinput_d->ly_url_first) + cinput_d->ly_url_first = ly; + cinput_d->ly_url_last = ly; + cnt++; + } + return cnt; +} + + +static Evas_Object* input_fill_layout_note(ct_input_data *cinput_d) +{ + CTSvalue *value; + char *val_str; + Evas_Object *box = cinput_d->box; + Evas_Object *ly_content; + Evas_Object *ef, *en; + + if (!cinput_d->ly_seperator_more) { + cinput_d->ly_seperator_more = ct_input_fill_layout_separator(cinput_d, "separator/hd33/with_line"); + p_retvm_if(NULL == cinput_d->ly_seperator_more, EINA_FALSE, "ct_input_fill_layout_separator() return NULL"); + elm_box_pack_after(cinput_d->box, cinput_d->ly_seperator_more, cinput_d->ly_addr_last); + } + + ly_content = ct_input_create_dg_layout(box, "1icon"); + p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL"); + + value = ct_detail_get_baseinfo_value(cinput_d->contact); + + ef = ctui_create_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_NOTE), NULL, true); + p_retvm_if(NULL == ef, NULL, "ctui_create_editfield() return NULL"); + + en = elm_object_part_content_get(ef, "elm.swallow.content"); + evas_object_smart_callback_add(en, "unfocused", input_note_unfocused_cb, value); + evas_object_smart_callback_add(en, "changed", ct_input_entry_changed_cb, ef); + elm_object_part_content_set(ly_content, "elm.icon", ef); + + val_str = elm_entry_utf8_to_markup(contacts_svc_value_get_str(value, CTS_BASE_VAL_NOTE_STR)); + input_editfield_entry_set(ef, val_str); + free(val_str); + + if (cinput_d->ly_anniversary) + elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_anniversary); + else if (cinput_d->ly_birthday) + elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_birthday); + else if (cinput_d->ly_relationship) + elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_relationship); + else if (cinput_d->ly_url_last) + elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_url_last); + else if (cinput_d->ly_messenger_last) + elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_messenger_last); + else + elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_seperator_more); + + cinput_d->ly_note = ly_content; + + return ly_content; +} + + +static Evas_Object* input_fill_layout_addresses(ct_input_data *cinput_d) +{ + GSList *list, *cursor; + CTSstruct *contact = cinput_d->contact; + Evas_Object *layout; + + list = NULL; + layout = NULL; + + contacts_svc_struct_get_list(contact, CTS_CF_POSTAL_ADDR_LIST, &list); + + for (cursor=list;cursor;cursor=cursor->next) { + if (NULL == cursor->data) continue; + layout = input_fill_layout_address(cinput_d, cursor->data); + p_retvm_if(NULL == layout, NULL, "input_fill_layout_address() return NULL"); + elm_box_pack_end(cinput_d->box, layout); + if (NULL == cinput_d->ly_addr_first) + cinput_d->ly_addr_first = layout; + cinput_d->ly_addr_last = layout; + } + + if (NULL == cinput_d->ly_addr_last) { + layout = input_add_new_address(cinput_d); + p_retvm_if(NULL == layout, NULL, "input_add_new_address() return"); + if (NULL == cinput_d->ly_addr_first) + cinput_d->ly_addr_first = layout; + cinput_d->ly_addr_last = layout; + } + + input_update_address(cinput_d); + + return layout; +} + + +static void input_render_flush_post_cb(void *data, Evas *e, void *even_info) +{ + ecore_idler_add(input_fill_layout, data); + evas_event_callback_del(e, EVAS_CALLBACK_RENDER_FLUSH_POST, input_render_flush_post_cb); +} + +static void input_genlist_render_flush_post_cb(void *data, Evas *e, void *event_info) +{ + int field; + Evas_Coord w,h; + ct_input_data *cinput_d = data; + + evas_event_callback_del(e, EVAS_CALLBACK_RENDER_FLUSH_POST, input_genlist_render_flush_post_cb); + field = (int)evas_object_data_get(cinput_d->scroller, "field"); + evas_object_data_del(cinput_d->scroller, "field"); + + switch (field) { + case INPUT_MORE_JOB_TITLE: + case INPUT_MORE_DEPARTMENT: + elm_scroller_region_bring_in(cinput_d->scroller, 0, 0, 0, 0); + break; + default: + elm_scroller_child_size_get(cinput_d->scroller, &w, &h); + elm_scroller_region_bring_in(cinput_d->scroller, 0, h, 0, h); + break; + } + +} + + +static void input_update_moreinfo(ct_input_data *cinput_d) +{ + PH_FN_CALL; + Evas_Object *button; + p_ret_if(!cinput_d->ly_moreinfo); + + if (cinput_d->ly_anniversary && cinput_d->ly_birthday && cinput_d->add_department && + cinput_d->add_job_title && cinput_d->ly_messenger_last && cinput_d->ly_note && + cinput_d->ly_url_last) { + + button = elm_object_part_content_get(cinput_d->ly_moreinfo, "elm.icon"); + p_retm_if(NULL == button, "elm_object_part_content_get() return NULL"); + + elm_object_disabled_set(button, EINA_TRUE); + } +} + +static void input_moreinfo_cb(void *data, Evas_Object *obj, void *event_info) +{ + int field = (int)data; + ct_input_data *cinput_d; + Evas_Object *layout; + Evas_Object *btn_expand; + + cinput_d = evas_object_data_get(obj, "cinput_d"); + p_retm_if(NULL == cinput_d, "evas_object_data_get() return NULL"); + + ct_detail_popup_hide_cb(cinput_d->cdetail_d, NULL, NULL); + + switch(field) { + case INPUT_MORE_JOB_TITLE: + cinput_d->add_job_title = true; + if (cinput_d->ly_baseinfo_last) { + layout = input_fill_layout_baseinfo_expand(cinput_d, T_(CT_GET_TEXT_BASIC, CTTEXT_JOB_TITLE), + input_job_title_unfocused_cb, CTS_CF_COMPANY_VALUE, CTS_COMPANY_VAL_JOB_TITLE_STR); + p_retm_if(NULL == layout, "input_fill_layout_baseinfo_expand() return NULL"); + elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_nick); + cinput_d->ly_baseinfo_job_title = layout; + } + else { + btn_expand = elm_object_part_content_get(cinput_d->ly_baseinfo, "elm.edit.icon"); + input_baseinfo_expand_clicked_cb(cinput_d, btn_expand, NULL); + } + break; + case INPUT_MORE_DEPARTMENT: + cinput_d->add_department = true; + if (cinput_d->ly_baseinfo_last) { + layout = input_fill_layout_baseinfo_expand(cinput_d, T_(CT_GET_TEXT_BASIC, CTTEXT_DEPARTMENT), + input_department_unfocused_cb, CTS_CF_COMPANY_VALUE, CTS_COMPANY_VAL_DEPARTMENT_STR); + p_retm_if(NULL == layout, "input_fill_layout_baseinfo_expand() return NULL"); + if (cinput_d->ly_baseinfo_job_title) + elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_job_title); + else + elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_nick); + cinput_d->ly_baseinfo_department = layout; + } + else { + btn_expand = elm_object_part_content_get(cinput_d->ly_baseinfo, "elm.edit.icon"); + input_baseinfo_expand_clicked_cb(cinput_d, btn_expand, NULL); + } + break; + case INPUT_MORE_MESSENGER: + input_add_new_messenger(cinput_d); + break; + case INPUT_MORE_URL: + input_add_new_website(cinput_d); + break; + case INPUT_MORE_RELATIONSHIP: + input_fill_layout_relationship(cinput_d); + break; + case INPUT_MORE_BIRTHDAY: + input_fill_layout_event(cinput_d, CTS_EVENT_TYPE_BIRTH); + break; + case INPUT_MORE_ANNIVERSARY: + input_fill_layout_event(cinput_d, CTS_EVENT_TYPE_ANNIVERSARY); + break; + case INPUT_MORE_NOTE: + input_fill_layout_note(cinput_d); + break; + } + + evas_object_data_set(cinput_d->scroller, "field", (void *)field); + evas_event_callback_add(evas_object_evas_get(cinput_d->scroller), + EVAS_CALLBACK_RENDER_FLUSH_POST, input_genlist_render_flush_post_cb, cinput_d); + + input_update_moreinfo(cinput_d); +} + +static void input_moreinfo_button_cb(void *data, Evas_Object *obj, void *even_info) +{ + int rotate; + ct_input_data *cinput_d = data; + ct_detail_data *cdetail_d = cinput_d->cdetail_d; + + if (cdetail_d->popup) + ct_detail_popup_hide_cb(cdetail_d, NULL, NULL); + + cdetail_d->popup = elm_ctxpopup_add(cdetail_d->navi); + p_retm_if(NULL == cdetail_d->popup, "elm_ctxpopup_add() return NULL"); + + rotate = (int)evas_object_data_get(cinput_d->cdetail_d->navi, "phone_rotate"); + if (0 == rotate || 180 == rotate) + elm_ctxpopup_direction_priority_set(cdetail_d->popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT); + + evas_object_smart_callback_add(cdetail_d->popup, "dismissed", ct_detail_popup_hide_cb, cdetail_d); + evas_object_data_set(cdetail_d->popup, "cinput_d", cinput_d); + + if (!cinput_d->add_job_title) + elm_ctxpopup_item_append(cdetail_d->popup, T_(CT_GET_TEXT_BASIC, CTTEXT_JOB_TITLE), NULL, + input_moreinfo_cb, (void *)INPUT_MORE_JOB_TITLE); + if (!cinput_d->add_department) + elm_ctxpopup_item_append(cdetail_d->popup, T_(CT_GET_TEXT_BASIC, CTTEXT_DEPARTMENT), NULL, + input_moreinfo_cb, (void *)INPUT_MORE_DEPARTMENT); + if (!cinput_d->ly_messenger_last) + elm_ctxpopup_item_append(cdetail_d->popup, T_(CT_GET_TEXT_BASIC, CTTEXT_INSTANT_MESSENGER), NULL, + input_moreinfo_cb, (void *)INPUT_MORE_MESSENGER); + if (!cinput_d->ly_url_last) + elm_ctxpopup_item_append(cdetail_d->popup, T_(CT_GET_TEXT_BASIC, CTTEXT_URL), NULL, + input_moreinfo_cb, (void *)INPUT_MORE_URL); + if (!cinput_d->ly_relationship) + elm_ctxpopup_item_append(cdetail_d->popup, T_(CT_GET_TEXT_BASIC, CTTEXT_RELATIONSHIP), NULL, + input_moreinfo_cb, (void *)INPUT_MORE_RELATIONSHIP); + if (!cinput_d->ly_birthday) + elm_ctxpopup_item_append(cdetail_d->popup, T_(CT_GET_TEXT_EVENT_TYPE, CTS_EVENT_TYPE_BIRTH), NULL, + input_moreinfo_cb, (void *)INPUT_MORE_BIRTHDAY); + if (!cinput_d->ly_anniversary) + elm_ctxpopup_item_append(cdetail_d->popup, T_(CT_GET_TEXT_EVENT_TYPE, CTS_EVENT_TYPE_ANNIVERSARY), NULL, + input_moreinfo_cb, (void *)INPUT_MORE_ANNIVERSARY); + if (!cinput_d->ly_note) + elm_ctxpopup_item_append(cdetail_d->popup, T_(CT_GET_TEXT_BASIC, CTTEXT_NOTE), NULL, + input_moreinfo_cb, (void *)INPUT_MORE_NOTE); + + phone_move_ctxpopup(cdetail_d->popup, obj); + evas_object_show(cdetail_d->popup); +} + +static Evas_Object* input_fill_layout_moreinfo(ct_input_data *cinput_d) +{ + Evas_Object *button; + Evas_Object *box = cinput_d->box; + Evas_Object *ly_content; + + ly_content = ct_input_create_dg_layout(box, "bg/1icon"); + p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL"); + + button = elm_button_add(ly_content); + p_retvm_if(NULL == button, NULL, "elm_button_add() return NULL"); + elm_object_text_set(button, T_(CT_GET_TEXT_BASIC, CTTEXT_MORE_INFORMATION)); + elm_object_part_content_set(ly_content, "elm.icon", button); + evas_object_smart_callback_add(button, "clicked", input_moreinfo_button_cb, cinput_d); + + cinput_d->ly_moreinfo = ly_content; + return ly_content; +} +static Eina_Bool input_fill_layout(void *data) +{ + const char *str; + const int ITEMS_MAX_CNT = 9; + int i, ret; + int cnt, cnt_append = 0; + Evas_Object *layout; + CTSvalue *value; + ct_input_data *cinput_d = data; + + for (i = cinput_d->idx_append; i < INPUT_ITEMS_MAX; i++) { + switch(i) { + case INPUT_BASEINFO: + ret = contacts_svc_struct_get_value(cinput_d->contact, CTS_CF_COMPANY_VALUE, &value); + str = NULL; + if (CTS_SUCCESS == ret && !cinput_d->add_department) { + str = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_DEPARTMENT_STR); + if (str && *str) + cinput_d->add_department = true; + } + str = NULL; + if (CTS_SUCCESS == ret && !cinput_d->add_job_title) { + str = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_JOB_TITLE_STR); + if (str && *str) + cinput_d->add_job_title = true; + } + + /* base info */ + layout = input_fill_layout_baseinfo(cinput_d); + p_retvm_if(NULL == layout, EINA_FALSE, "input_fill_layout_baseinfo() return NULL"); + elm_box_pack_end(cinput_d->box, layout); + + layout = input_fill_layout_baseinfo_expand_button(cinput_d); + p_retvm_if(NULL == layout, EINA_FALSE, "input_fill_layout_baseinfo_expand_button() return NULL"); + elm_box_pack_end(cinput_d->box, layout); + + /* separator */ + layout = ct_input_fill_layout_separator(cinput_d, "separator/hd1"); + p_retvm_if(NULL == layout, EINA_FALSE, "ct_input_fill_layout_separator() return NULL"); + elm_box_pack_end(cinput_d->box, layout); + + cnt_append += 2; + break; + + case INPUT_NUMBER: + /* number */ + ct_input_fill_layout_numbers(cinput_d); + cnt_append += cinput_d->cnt_num + 1; + break; + + case INPUT_EMAIL: + /* email */ + cnt = 0; + cnt = ct_input_fill_layout_emails(cinput_d); + cnt_append += cnt + 1; + break; + + case INPUT_ADDRESS: + /* address */ + input_fill_layout_addresses(cinput_d); + cnt_append += cinput_d->cnt_addr * 5; + break; + + case INPUT_MESSENGER: + /* messenger */ + cnt = input_fill_layout_messengers(cinput_d); + if (cnt) { + input_add_new_messenger(cinput_d); + cnt++; + } + cnt_append += cnt; + break; + + case INPUT_URL: + cnt = input_fill_layout_websites(cinput_d); + if (cnt) { + input_add_new_website(cinput_d); + cnt++; + } + cnt_append += cnt; + break; + case INPUT_RELATIONSHIP: + value = ct_detail_get_relationship(cinput_d->contact); + if (value) + input_fill_layout_relationship(cinput_d); + break; + case INPUT_BIRTHDAY: + value = ct_input_get_event(cinput_d->contact, CTS_EVENT_TYPE_BIRTH); + if (value && !contacts_svc_value_get_bool(value, CTS_EVENT_VAL_DELETE_BOOL)) { + input_fill_layout_event(cinput_d, CTS_EVENT_TYPE_BIRTH); + cnt_append++; + } + break; + + case INPUT_ANNIVERSARY: + value = ct_input_get_event(cinput_d->contact, CTS_EVENT_TYPE_ANNIVERSARY); + if (value && !contacts_svc_value_get_bool(value, CTS_EVENT_VAL_DELETE_BOOL)) { + input_fill_layout_event(cinput_d, CTS_EVENT_TYPE_ANNIVERSARY); + cnt_append++; + } + break; + + case INPUT_NOTE: + value = ct_detail_get_baseinfo_value(cinput_d->contact); + str = contacts_svc_value_get_str(value, CTS_BASE_VAL_NOTE_STR); + if (str && *str) { + input_fill_layout_note(cinput_d); + cnt_append += 1; + } + break; + + case INPUT_RINGTONE: + /* ringtone */ + layout = input_fill_layout_ringtone(cinput_d); + p_retvm_if(NULL == layout, EINA_FALSE, "input_fill_layout_ringtone() return NULL"); + elm_box_pack_end(cinput_d->box, layout); + + cnt_append += 1; + break; + + case INPUT_MORE_INFO: + layout = ct_input_fill_layout_separator(cinput_d, "separator/hd16"); + p_retvm_if(NULL == layout, EINA_FALSE, "ct_input_fill_layout_separator() return NULL"); + elm_box_pack_end(cinput_d->box, layout); + + layout = input_fill_layout_moreinfo(cinput_d); + p_retvm_if(NULL == layout, EINA_FALSE, "input_fill_layout_moreinfo() return NULL"); + elm_box_pack_end(cinput_d->box, layout); + + layout = ct_input_fill_layout_separator(cinput_d, "separator/hd16"); + p_retvm_if(NULL == layout, EINA_FALSE, "ct_input_fill_layout_separator() return NULL"); + elm_box_pack_end(cinput_d->box, layout); + + input_update_moreinfo(cinput_d); + + cnt_append += 1; + break; + + default: + ERR("Unknown item(%d)", i); + return EINA_FALSE; + } + + if (0 == cinput_d->idx_append && ITEMS_MAX_CNT <= cnt_append) { + cinput_d->idx_append = i + 1; + evas_event_callback_add(evas_object_evas_get(cinput_d->box), + EVAS_CALLBACK_RENDER_FLUSH_POST, input_render_flush_post_cb, cinput_d); + break; + } + } + return EINA_FALSE; +} + +static void input_cancel_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_input_data *cinput_d = data; + ct_detail_data *cdetail_d = cinput_d->cdetail_d; + + /* evas_object_smart_callback_del() func will be deleted */ + evas_object_smart_callback_del(obj, "clicked", input_cancel_cb); + + elm_naviframe_item_pop(cdetail_d->navi); +} + +static Eina_Bool input_win_prop_change(void *data, int type, void *event) +{ + ct_input_data *cinput_d; + Evas_Object *l_btn, *r_btn; + Evas_Object *obj = data; + Ecore_X_Event_Window_Property *ev = event; + Ecore_X_Virtual_Keyboard_State state = ecore_x_e_virtual_keyboard_state_get(ev->win); + + cinput_d = evas_object_data_get(obj, "cinput_d"); + p_retvm_if(NULL == cinput_d, ECORE_CALLBACK_PASS_ON, "evas_object_data_get() return NULL"); + + if (ECORE_X_VIRTUAL_KEYBOARD_STATE_ON == state && + NULL == elm_object_item_part_content_get(cinput_d->navi_item, "title_left_btn")) { + r_btn = phone_create_navi_btn(cinput_d->cdetail_d->navi, S_(PH_SYS_SK_CANCEL)); + if (cinput_d->cdetail_d->ug && NULL == cinput_d->pre_item) + evas_object_smart_callback_add(r_btn, "clicked", phone_ug_destroy_me_cb, cinput_d->cdetail_d->ug); + else + evas_object_smart_callback_add(r_btn, "clicked", input_cancel_cb, cinput_d); + elm_object_item_part_content_set(cinput_d->navi_item, "title_right_btn",r_btn); + + l_btn = phone_create_navi_btn(cinput_d->cdetail_d->navi, S_(CT_SYS_SK_SAVE)); + evas_object_smart_callback_add(l_btn, "clicked", ct_input_save_cb, cinput_d); + elm_object_item_part_content_set(cinput_d->navi_item, "title_left_btn", l_btn); + + ct_input_save_button_update(cinput_d); + } + else if (ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF == state && + NULL != elm_object_item_part_content_get(cinput_d->navi_item, "title_left_btn")) { + cinput_d = evas_object_data_get(obj, "cinput_d"); + p_retvm_if(NULL == cinput_d, ECORE_CALLBACK_PASS_ON, "evas_object_data_get() return NULL"); + + elm_object_item_part_content_set(cinput_d->navi_item, "title_left_btn", NULL); + elm_object_item_part_content_set(cinput_d->navi_item, "title_right_btn", NULL); + } + return ECORE_CALLBACK_PASS_ON; +} + + +static Evas_Object* input_create_layout(ct_input_data *cinput_d) +{ + Evas_Object *box; + Evas_Object *scroller; + Evas_Object *conform; + ct_detail_data *cdetail_d = cinput_d->cdetail_d; + + elm_win_conformant_set(cdetail_d->win, EINA_TRUE); + conform = elm_conformant_add(cdetail_d->navi); + p_retvm_if(NULL == conform, NULL, "elm_conformant_add() return NULL"); + + cinput_d->win_prop_change = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, input_win_prop_change, conform); + evas_object_data_set(conform, "cinput_d", cinput_d); + + evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(conform); + + scroller = elm_scroller_add(cdetail_d->navi); + p_retvm_if(NULL == scroller, NULL, "elm_scroller_add() return NULL"); + elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_TRUE); + elm_scroller_policy_set(scroller,ELM_SCROLLER_POLICY_OFF,ELM_SCROLLER_POLICY_AUTO); + evas_object_show(scroller); + elm_object_content_set(conform, scroller); + cinput_d->scroller = scroller; + + box = elm_box_add(scroller); + p_retvm_if(NULL == box, NULL, "elm_box_add() return NULL"); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0.0); + elm_object_content_set(scroller, box); + evas_object_show(box); + cinput_d->box = box; + + cdetail_d->has_input = true; + if (!cinput_d->contact) + cinput_d->contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT); + input_fill_layout(cinput_d); + evas_object_event_callback_add(conform, EVAS_CALLBACK_DEL, input_view_delete_cb, cinput_d); + return conform; +} + +void ct_input_push_navi_content(ct_detail_data *cdetail_d, CTSstruct *contact, int contact_id) +{ + int ret; + Evas_Object *toolbar; + Evas_Object *content; + Elm_Object_Item *navi_item; + const char *navi_title; + ct_input_data *cinput_d; + + cinput_d = calloc(1, sizeof(ct_input_data)); + p_retm_if(NULL == cinput_d, "calloc() return NULL"); + cinput_d->cdetail_d = cdetail_d; + cinput_d->contact = contact; + cinput_d->contact_id = contact_id; + cinput_d->base_ab = cdetail_d->base_ab; + cinput_d->base_ab_mode = cdetail_d->base_ab_mode; + cinput_d->base_ab_name = SAFE_STRDUP(cdetail_d->base_ab_name); + + cinput_d->pre_item = elm_naviframe_top_item_get(cdetail_d->navi); + cinput_d->save_disable = EINA_TRUE; + + if (cdetail_d->has_detail) { + ct_detail_delete_namecards(cdetail_d); + } + + content = input_create_layout(cinput_d); + p_retm_if(NULL == content, "input_create_layout() Failed"); + + if (cinput_d->contact_id) { + navi_title = S_(PH_SYS_SK_EDIT); + + contacts_svc_begin_trans(); + cinput_d->view_create_ver = contacts_svc_end_trans(true); + ret = contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE, + input_contacts_changed, cinput_d); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_subscribe_change() Failed(%d)", ret); + } + else + navi_title = S_(CT_SYS_BODY_CREATE); + + navi_item = elm_naviframe_item_push(cdetail_d->navi, + navi_title, NULL, NULL, content, NULL); + cinput_d->navi_item = navi_item; + + toolbar = elm_toolbar_add(cdetail_d->navi); + p_retm_if(NULL == toolbar, "elm_toolbar_add() return NULL"); + elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND); + elm_object_item_part_content_set(cinput_d->navi_item, "controlbar", toolbar); + + cinput_d->save_btn = elm_toolbar_item_append(toolbar, PH_IMG_ICON_DONE, NULL, ct_input_save_cb, cinput_d); + ct_input_save_button_update(cinput_d); + phone_toolbar_disabled_item_append(toolbar, 3); + + if (cinput_d->cdetail_d->ug && NULL == cinput_d->pre_item) + elm_toolbar_item_append(toolbar, CTUI_IMG_ICON_CLOSE, NULL, phone_ug_destroy_me_cb, cinput_d->cdetail_d->ug); + else + elm_toolbar_item_append(toolbar, CTUI_IMG_ICON_CLOSE, NULL, input_cancel_cb, cinput_d); +} diff --git a/lib/details/ct-input-view.h b/lib/details/ct-input-view.h new file mode 100755 index 0000000..32c04e2 --- /dev/null +++ b/lib/details/ct-input-view.h @@ -0,0 +1,24 @@ +/* + * 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_INPUT_VIEW_H__ +#define __CONTACTS_INPUT_VIEW_H__ + +void ct_input_push_navi_content(ct_detail_data *cdetail_d, CTSstruct *contact, int contact_id); +void ct_input_update_image(ct_input_data *i_data); +Evas_Object* ct_input_fill_layout_separator(ct_input_data *i_data, const char *theme); + +#endif //__CONTACTS_INPUT_VIEW_H__ |