diff options
Diffstat (limited to 'lib')
173 files changed, 28524 insertions, 3168 deletions
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 388f134..6d1ec4a 100755 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -1,15 +1,21 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) -SET(COMMON_LIB phone-common) -SET(PHONELOG ug-phonelog-efl) -SET(PH_VIEW_DIALER ug-dialer-efl) -SET(MAIN ug-phoneui-efl) -SET(UGLIBDIR "/opt/ug/lib") +SET(COMMON_LIB common) +SET(FAVOR_LIB favorite) +SET(SPEEDDIAL ug-speeddial-efl) +SET(PH_LOG ug-phonelog-efl) +SET(CT_DETAILS ug-contacts-details-efl) +SET(CT_LIST ug-contacts-list-efl) +SET(CT_SETTING ug-contacts-settings-efl) +SET(PH_DIALER ug-dialer-efl) +SET(PH_FRONT ug-phone-tabui-efl) +SET(CT_FRONT ug-contacts-tabui-efl) +SET(UGLIBDIR "/usr/ug/lib") FILE(GLOB COMMON_SRCS common/*.c) INCLUDE(FindPkgConfig) -pkg_check_modules(ug_pkgs REQUIRED contacts-service) +pkg_check_modules(ug_pkgs REQUIRED contacts-service msg-service) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fPIC") @@ -32,18 +38,80 @@ ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_BINARY_DIR}/dialer.edj DEPENDS ${EDC_SRC_DIR}/dialer.edc ) +ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_BINARY_DIR}/dialer_theme.edj + COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/lib/images + ${EDC_SRC_DIR}/dialer_theme.edc ${CMAKE_BINARY_DIR}/dialer_theme.edj + DEPENDS ${EDC_SRC_DIR}/dialer_theme.edc + ) + +ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_BINARY_DIR}/speeddial_theme.edj + COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/lib/images + ${EDC_SRC_DIR}/speeddial_theme.edc ${CMAKE_BINARY_DIR}/speeddial_theme.edj + DEPENDS ${EDC_SRC_DIR}/speeddial_theme.edc + ) + +ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_BINARY_DIR}/contacts.edj + COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/images + ${EDC_SRC_DIR}/contacts.edc ${CMAKE_BINARY_DIR}/contacts.edj + DEPENDS ${EDC_SRC_DIR}/contacts.edc ${EDC_SRC_DIR}/list.edc ${EDC_SRC_DIR}/progress.edc ${EDC_SRC_DIR}/gl_title.edc + ) + +ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_BINARY_DIR}/favorites.edj + COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/lib/images + ${EDC_SRC_DIR}/favorites.edc ${CMAKE_BINARY_DIR}/favorites.edj + DEPENDS ${EDC_SRC_DIR}/favorites.edc + ) + +ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_BINARY_DIR}/favorites_theme.edj + COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/lib/images + ${EDC_SRC_DIR}/favorites_theme.edc ${CMAKE_BINARY_DIR}/favorites_theme.edj + DEPENDS ${EDC_SRC_DIR}/favorites_theme.edc + ) + +ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_BINARY_DIR}/list_theme.edj + COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/images + ${EDC_SRC_DIR}/list_theme.edc ${CMAKE_BINARY_DIR}/list_theme.edj + DEPENDS ${EDC_SRC_DIR}/list_theme.edc + ) + +ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_BINARY_DIR}/detail_theme.edj + COMMAND edje_cc + ${EDC_SRC_DIR}/detail_theme.edc ${CMAKE_BINARY_DIR}/detail_theme.edj + DEPENDS ${EDC_SRC_DIR}/detail_theme.edc + ) + ADD_CUSTOM_TARGET(progress_edj_build DEPENDS ${CMAKE_BINARY_DIR}/progress.edj) +ADD_CUSTOM_TARGET(dialer_theme_build DEPENDS ${CMAKE_BINARY_DIR}/dialer_theme.edj) ADD_CUSTOM_TARGET(dialer_edj_build DEPENDS ${CMAKE_BINARY_DIR}/dialer.edj) +ADD_CUSTOM_TARGET(speeddial_theme_build DEPENDS ${CMAKE_BINARY_DIR}/speeddial_theme.edj) +ADD_CUSTOM_TARGET(contacts_edj_build DEPENDS ${CMAKE_BINARY_DIR}/contacts.edj) +ADD_CUSTOM_TARGET(favorites_edj_build DEPENDS ${CMAKE_BINARY_DIR}/favorites.edj) +ADD_CUSTOM_TARGET(favorites_theme_build DEPENDS ${CMAKE_BINARY_DIR}/favorites_theme.edj) +ADD_CUSTOM_TARGET(list_theme_edj_build DEPENDS ${CMAKE_BINARY_DIR}/list_theme.edj) +ADD_CUSTOM_TARGET(detail_theme_edj_build DEPENDS ${CMAKE_BINARY_DIR}/detail_theme.edj) ADD_LIBRARY(${COMMON_LIB} STATIC ${COMMON_SRCS}) SET_TARGET_PROPERTIES(${COMMON_LIB} PROPERTIES COMPILE_FLAGS ${EXTRA_CFLAGS}) TARGET_LINK_LIBRARIES(${COMMON_LIB} ${ug_pkgs_LDFLAGS}) -#INSTALL(TARGETS ${COMMON_LIB} DESTINATION /usr/lib) INSTALL(FILES ${CMAKE_SOURCE_DIR}/include/phone-ug.h DESTINATION /usr/include) +INSTALL(FILES ${CMAKE_SOURCE_DIR}/include/contacts-ug.h DESTINATION /usr/include) +INSTALL(FILES ${CMAKE_BINARY_DIR}/contacts.edj DESTINATION ${EDJDIR}) INSTALL(FILES ${CMAKE_BINARY_DIR}/progress.edj DESTINATION ${EDJDIR}) INSTALL(FILES ${CMAKE_BINARY_DIR}/dialer.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_BINARY_DIR}/dialer_theme.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_BINARY_DIR}/speeddial_theme.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_BINARY_DIR}/favorites.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_BINARY_DIR}/favorites_theme.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_BINARY_DIR}/list_theme.edj DESTINATION ${EDJDIR}) +INSTALL(FILES ${CMAKE_BINARY_DIR}/detail_theme.edj DESTINATION ${EDJDIR}) +ADD_SUBDIRECTORY(speed) ADD_SUBDIRECTORY(log) ADD_SUBDIRECTORY(dialer) -ADD_SUBDIRECTORY(phoneui) +ADD_SUBDIRECTORY(details) +ADD_SUBDIRECTORY(list) +ADD_SUBDIRECTORY(settings) +ADD_SUBDIRECTORY(favor) +ADD_SUBDIRECTORY(ph-front) +ADD_SUBDIRECTORY(ct-front) diff --git a/lib/common/ct-list-detail.c b/lib/common/ct-list-detail.c new file mode 100755 index 0000000..966334c --- /dev/null +++ b/lib/common/ct-list-detail.c @@ -0,0 +1,284 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <aul.h> +#include <ui-gadget-module.h> + +#include "phone.h" +#include "phone-common.h" +#include "ct-list.h" + +inline void ctui_ld_to_dd(ct_list_data *clist_d, ct_detail_data *cdetail_d) +{ + cdetail_d->win = clist_d->win; + cdetail_d->navi = clist_d->navi; + cdetail_d->base_grp = clist_d->base_grp; + cdetail_d->base_ab = clist_d->base_ab; + cdetail_d->ug = clist_d->ug; + cdetail_d->prev_navi_item = clist_d->navi_item; + cdetail_d->prev_view_data = clist_d; +} + +int ctui_get_display_name(CTSvalue *name, char *dest, int dest_len) +{ + int len = 0; + const char *first, *last, *display; + + display = contacts_svc_value_get_str(name, CTS_NAME_VAL_DISPLAY_STR); + + if (display) + len = snprintf(dest, dest_len, "%s", display); + else { + first = contacts_svc_value_get_str(name, CTS_NAME_VAL_FIRST_STR); + last = contacts_svc_value_get_str(name, CTS_NAME_VAL_LAST_STR); + + if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) + len = snprintf(dest, dest_len, "%s%s%s", SAFE_STR(first), STR_BLANK(first, last)); + else + len = snprintf(dest, dest_len, "%s%s%s", SAFE_STR(last), STR_BLANK(last, first)); + } + return len; +} + +void ctui_get_number_type_str(int cts_num_type, char *dest, int dest_len) +{ + const char* type_str; + if (cts_num_type & CTS_NUM_TYPE_CUSTOM) { + char *custom; + custom = contacts_svc_get_custom_type(CTS_TYPE_CLASS_NUM, cts_num_type); + if (NULL == custom) + type_str = T_(CT_GET_TEXT_NUM_TYPE, CTTEXT_TYPE_OTHER); + else { + snprintf(dest, dest_len, "%s", custom); + free(custom); + return; + } + } + else if (cts_num_type & CTS_NUM_TYPE_CELL) { + if (cts_num_type & CTS_NUM_TYPE_HOME) + type_str = T_(CT_GET_TEXT_NUM_TYPE, CTTEXT_TYPE_HOME2); + else if (cts_num_type & CTS_NUM_TYPE_WORK) + type_str = T_(CT_GET_TEXT_NUM_TYPE, CTTEXT_TYPE_WORK2); + else + type_str = T_(CT_GET_TEXT_NUM_TYPE, CTTEXT_TYPE_MOBILE); + } + else if (cts_num_type & CTS_NUM_TYPE_VOICE) { + if (cts_num_type & CTS_NUM_TYPE_HOME) + type_str = T_(CT_GET_TEXT_NUM_TYPE, CTTEXT_TYPE_HOME); + else if (cts_num_type & CTS_NUM_TYPE_WORK) + type_str = T_(CT_GET_TEXT_NUM_TYPE, CTTEXT_TYPE_WORK); + else + type_str = T_(CT_GET_TEXT_NUM_TYPE, CTTEXT_TYPE_TELEPHONE); + } + else if (cts_num_type & CTS_NUM_TYPE_FAX) { + if (cts_num_type & CTS_NUM_TYPE_HOME) + type_str = T_(CT_GET_TEXT_NUM_TYPE, CTTEXT_TYPE_FAX_HOME); + else if (cts_num_type & CTS_NUM_TYPE_WORK) + type_str = T_(CT_GET_TEXT_NUM_TYPE, CTTEXT_TYPE_FAX_WORK); + else + type_str = T_(CT_GET_TEXT_NUM_TYPE, CTTEXT_TYPE_FAX); + } + else if (cts_num_type & CTS_NUM_TYPE_PAGER) + type_str = T_(CT_GET_TEXT_NUM_TYPE, CTTEXT_TYPE_PAGER); + else if (cts_num_type & CTS_NUM_TYPE_CAR) + type_str = T_(CT_GET_TEXT_NUM_TYPE, CTTEXT_TYPE_CAR); + else if (cts_num_type & CTS_NUM_TYPE_ASSISTANT) + type_str = T_(CT_GET_TEXT_NUM_TYPE, CTTEXT_TYPE_ASSISTANT); + else { + if (cts_num_type == CTS_NUM_TYPE_HOME) + type_str = T_(CT_GET_TEXT_NUM_TYPE, CTTEXT_TYPE_HOME); + else if (cts_num_type == CTS_NUM_TYPE_WORK) + type_str = T_(CT_GET_TEXT_NUM_TYPE, CTTEXT_TYPE_WORK); + else + type_str = T_(CT_GET_TEXT_NUM_TYPE, CTTEXT_TYPE_OTHER); + } + + snprintf(dest, dest_len, "%s", type_str); +} + +const char* ctui_get_default_contact_img(int view_type) +{ + switch (view_type) { + case CT_VIEW_DETAIL: + return CTUI_IMG_DEFAULT_PHOTO_BIG; + + case CT_VIEW_INPUT: + return CTUI_IMG_PHOTO_EDIT; + + case CT_VIEW_ETC: + default: + return CTUI_IMG_DEFAULT_PHOTO_SMALL; + } +} + +Evas_Object* ctui_create_btn(Evas_Object *parent, const char *label) +{ + Evas_Object *btn; + + btn = elm_button_add(parent); + p_retvm_if(NULL == btn, NULL, "elm_button_add() return NULL"); + + elm_object_style_set(btn, "style2"); + elm_object_text_set(btn, label); + evas_object_show(btn); + + return btn; +} + +void ctui_destroy_child_ug(void *data) +{ + void **child = data; + *child = NULL; +} + +void* ctui_msg_ug(ui_gadget_h parent, const char *number, const int idx, + const char *attach, void(*destroy_cb)(void*), void *cb_param) +{ + struct ug_cbs cbs = {0}; + ui_gadget_h ug; + struct ug_priv_data *priv_data; + service_h service; + + priv_data = calloc(1, sizeof(struct ug_priv_data)); + p_retvm_if(NULL == priv_data, NULL, "calloc is failed"); + priv_data->destroy_cb = destroy_cb; + priv_data->cb_param = cb_param; + + service_create(&service); + + if (number && idx) { + char temp[PH_TEXT_SHORT_LEN]; + snprintf(temp, sizeof(temp), "%s/%d", number, idx); + service_add_extra_data(service, "number/index", temp); + } + else if (number) { + service_add_extra_data(service, "TO", number); + } + + if (attach) { + service_add_extra_data(service, "ATTACHFILE", attach); + service_add_extra_data(service, "SUBJECT", "Contacts name card"); + } + + cbs.layout_cb = ug_common_layout_cb; + cbs.result_cb = NULL; + cbs.destroy_cb = ug_common_destroy_cb; + cbs.priv = priv_data; + + ug = ug_create(parent, MSG_COMPOSER_UG, UG_MODE_FULLVIEW, service, &cbs); + p_warn_if(NULL == ug, "ug_create() Failed"); + + service_destroy(service); + return ug; +} + +void ctui_entry_limit_size_set(Evas_Object *entry) +{ + static Elm_Entry_Filter_Limit_Size filter; + p_retm_if(NULL == entry, "parameter(entry) is NULL"); + + filter.max_byte_count = CT_EDITFIELD_MAX_BYTE; + elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &filter); +} + +void ctui_genlist_append_separator_10px(Evas_Object *genlist) +{ + static Elm_Genlist_Item_Class itc = { .item_style="dialogue/separator/10" }; + + 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); +} + +void ctui_genlist_append_separator_20px(Evas_Object *genlist) +{ + static Elm_Genlist_Item_Class itc = { .item_style="dialogue/separator/20" }; + + 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); +} + +void ctui_cbar_btn_disabled_set(Evas_Object *cbar, Eina_Bool disabled) +{ + Elm_Object_Item *done_item, *delete_item, *share_item; + + p_retm_if(NULL == cbar, "parameter(cbar) is NULL"); + + done_item = evas_object_data_get(cbar, "done_item"); + delete_item = evas_object_data_get(cbar, "delete_item"); + share_item = evas_object_data_get(cbar, "share_item"); + + if(done_item) + elm_object_item_disabled_set(done_item, disabled); + if(delete_item) + elm_object_item_disabled_set(delete_item, disabled); + if(share_item) + elm_object_item_disabled_set(share_item, disabled); +} + +char* ctui_entry_markup_to_utf8(const char *s) +{ + int i; + char *ret; + + ret = elm_entry_markup_to_utf8(s); + p_retvm_if(NULL == ret, NULL, "elm_entry_markup_to_utf8() return NULL"); + + for (i = 0; i < strlen(ret); i++) + if (' ' != ret[i]) return ret; + + ret[0] = '\0'; + return ret; +} + +void ctui_entry_entry_set(Evas_Object *entry, const char *s) +{ + char *s_markup; + s_markup = elm_entry_utf8_to_markup(s); + elm_entry_entry_set(entry, s_markup); + free(s_markup); +} + +int ctui_get_person_id(int ct_id) +{ + int ret; + int person_id; + CTSstruct *contact; + CTSvalue *value; + + ret = contacts_svc_get_contact(ct_id, &contact); + p_retvm_if(CTS_SUCCESS != ret, -1, "contacts_svc_get_contact() Failed(%d)", ret); + + ret = contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &value); + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_struct_get_value() failed(%d)", ret); + contacts_svc_struct_free(contact); + return -1; + } + + person_id = contacts_svc_value_get_int(value, CTS_BASE_VAL_PERSON_ID_INT); + contacts_svc_struct_free(contact); + + return person_id; +} + +void ctui_list_ug_hide_cb(void *data, Evas_Object *obj, void *event_info) +{ + ug_destroy_me(data); +} diff --git a/lib/common/ct-list-view-common.c b/lib/common/ct-list-view-common.c new file mode 100755 index 0000000..8531e3e --- /dev/null +++ b/lib/common/ct-list-view-common.c @@ -0,0 +1,1459 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <aul.h> +#include <ui-gadget-module.h> + +#include "phone.h" +#include "phone-common.h" +#include "ct-list.h" + +#include <unicode/ulocdata.h> +#include <unicode/uset.h> +#include <unicode/ustring.h> +#include <vconf.h> +#include <vconf-keys.h> + +static char pre_search_str[CT_LIST_MAX_SEARCH_STR]; + +// for removing build warning /////////////////////////////////////// +int contacts_svc_normalized_strstr(const char *str, const char *search_str, int *len); +int contacts_svc_normalize_str(const char *src, char *dest, const int dest_len); +/////////////////////////////////////////////////////////////////// + +void ctui_list_free_contacts(Eina_List* list) +{ + ct_contact_list *data; + Eina_List* l; + + EINA_LIST_FOREACH(list, l, data) { + if (data) { + free(data->img_path); + free(data->display); + free(data->normalize); + free(data->number); + free(data); + } + } + eina_list_free(list); +} + +void ctui_list_free_index(Eina_List* list) +{ + ct_list_index_data *data; + Eina_List* l; + + EINA_LIST_FOREACH(list, l, data) { + if (data) { + free(data); + } + } + eina_list_free(list); +} + + +char* ct_list_get_display_name(CTSvalue *list_info) +{ + const char *first, *last; + const char *display; + char name[PH_TEXT_MAX_LEN]; + + display = contacts_svc_value_get_str(list_info, CTS_LIST_CONTACT_DISPLAY_STR); + if (display) return strdup(display); + + first = contacts_svc_value_get_str(list_info, CTS_LIST_CONTACT_FIRST_STR); + last = contacts_svc_value_get_str(list_info, CTS_LIST_CONTACT_LAST_STR); + + if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) + snprintf(name, sizeof(name), "%s%s%s", SAFE_STR(first), STR_BLANK(first, last)); + else + snprintf(name, sizeof(name), "%s%s%s", SAFE_STR(last), STR_BLANK(last, first)); + + return strdup(name); +} + +static inline int list_get_grp_contact_id(Eina_List *list) +{ + ct_contact_list *info; + if (NULL == list) return 0; + info = list->data; + return info->id; +} + +int ct_list_get_contacts(ct_list_data *clist_d, Eina_List **list) +{ + PH_FN_CALL; + int ct_id; + int ret = CTS_SUCCESS; + CTSiter *iter; + CTSfilter *filter = NULL; + Eina_List *result = NULL; + + switch (clist_d->list_op) { + case CT_GET_LIST_ALL_CONTACTS: + ret = contacts_svc_get_list(CTS_LIST_ALL_CONTACT, &iter); + break; + case CT_GET_LIST_ALL_CONTACT_HAD_NUMBER: + ret = contacts_svc_get_list(CTS_LIST_ALL_CONTACT_HAD_NUMBER, &iter); + break; + case CT_GET_LIST_ALL_CONTACT_HAD_EMAIL: + ret = contacts_svc_get_list(CTS_LIST_ALL_CONTACT_HAD_EMAIL, &iter); + break; + default: + ERR("Invalid op"); + return -1; + } + p_retvm_if(CTS_SUCCESS != ret, ret, "contacts_svc_get_list...() Failed(%d)", ret); + PH_DBG("end cotnacts_svc_get_list, start iter"); + + if (filter) { + contacts_svc_get_list_with_filter(filter, &iter); + contacts_svc_list_filter_free(filter); + } + + clist_d->cnt_list = 0; + + while (CTS_SUCCESS == (ret = contacts_svc_iter_next(iter))) { + ct_contact_list *info; + CTSvalue *value; + + value = contacts_svc_iter_get_info(iter); + ct_id = contacts_svc_value_get_int(value, CTS_LIST_CONTACT_ID_INT); + + if (ct_id == clist_d->ct_id_caller) { + contacts_svc_value_free(value); + continue; + } + + info = calloc(1, sizeof(ct_contact_list)); + if (NULL == info) { + ERR("calloc() return NULL"); + contacts_svc_value_free(value); + break; + } + info->id = ct_id; + info->display = ct_list_get_display_name(value); + info->normalize = contacts_svc_value_steal_str(value, CTS_LIST_CONTACT_NORMALIZED_STR); + info->id_ab = contacts_svc_value_get_int(value, CTS_LIST_CONTACT_ADDRESSBOOK_ID_INT); + info->id_person = contacts_svc_value_get_int(value, CTS_LIST_CONTACT_PERSON_ID_INT); + result = eina_list_append(result, info); + clist_d->cnt_list++; + contacts_svc_value_free(value); + } + contacts_svc_iter_remove(iter); + *list = result; + + if (CTS_ERR_FINISH_ITER != ret) { + ERR("contacts_svc_iter_next() Failed(%d)", ret); + return ret; + } + return 0; +} + +static inline int list_check_utf8(char c) +{ + if (c < 128) + return 1; + else if ((c & 0xe0) == 0xc0) + return 2; + else if ((c & 0xf0) == 0xe0) + return 3; + else if ((c & 0xf8) == 0xf0) + return 4; + else if ((c & 0xfc) == 0xf8) + return 5; + else if ((c & 0xfe) == 0xfc) + return 6; + else + return CTS_ERR_FAIL; +} + +static inline void list_clean_ecore_task(ct_list_data *clist_d) +{ + if (clist_d->list_idler) { + ecore_idler_del(clist_d->list_idler); + clist_d->list_idler = NULL; + } +} + +static void list_searchbar_entry_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_list_data *clist_d = data; + p_retm_if(NULL == clist_d, "parameter(clist_d) is NULL"); + + if (clist_d->last_sweep_item) { + elm_genlist_item_decorate_mode_set(clist_d->last_sweep_item, "slide", EINA_FALSE); + elm_genlist_item_select_mode_set(clist_d->last_sweep_item, ELM_OBJECT_SELECT_MODE_DEFAULT); + clist_d->last_sweep_item = NULL; + } +} + + +static void list_searchbar_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + ct_list_data *clist_d; + elm_object_focus_set(data, EINA_TRUE); + + clist_d = evas_object_data_get(data, "clist_d"); + p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL"); + + list_searchbar_entry_clicked_cb(clist_d, NULL, NULL); +} + +static char *list_group_label_get(void *data, Evas_Object *obj, const char *part) +{ + char *group_index = data; + if (0 == strcmp(part, "elm.text") && group_index && *group_index) + return strdup(group_index); + else + return NULL; +} + +static Elm_Genlist_Item_Class group_index = +{ + .item_style = "grouptitle", + .func.text_get = list_group_label_get, +}; + +static void __list_get_group_letter(char* src, char* dest, int dest_size) +{ + + char normalized_str[PH_TEXT_MAX_LEN] = {0}; + char firtst_str[10] = {0}; + int length = 0; + + dest[0] = '\0'; + firtst_str[0] = '\0'; + length = list_check_utf8(src[0]); + p_retm_if(length < 0, "__list_get_group_letter() - (%s) is not UTF-8 type", src); + + snprintf(firtst_str, length+1, "%s", &(src[0])); + + contacts_svc_normalize_str(firtst_str, normalized_str, PH_TEXT_MAX_LEN); + length = list_check_utf8(normalized_str[0]); + + if ('a' <= normalized_str[0] && normalized_str[0] <= 'z' ) + snprintf(dest, length+1, "%c", toupper((int)normalized_str[0])); + else + snprintf(dest, length+1, "%s", &(normalized_str[0])); + + //PH_DBG("src(%s), dest(%s), length(%d)", src, dest, length); +} + +static void __list_set_index_letter(ct_list_data *clist_d) +{ + ULocaleData* uld; + USet *indexChars; + UErrorCode error = U_ZERO_ERROR; + int32_t itemCount; + int32_t j; + const char *language; + bool is_alphabet = true; + + ctui_list_free_index(clist_d->list_index); + + language = vconf_get_str(VCONFKEY_LANGSET); + PH_DBG("__list_set_index_letter - language is %s", language); + uld = ulocdata_open(language, &error); + indexChars = uset_openEmpty(); + + ulocdata_getExemplarSet(uld, indexChars, 0, ULOCDATA_ES_INDEX, &error); + ulocdata_close(uld); + + if (U_FAILURE(error)) + return; + + if (error == U_USING_DEFAULT_WARNING) + uset_clear(indexChars); + + itemCount = uset_size(indexChars); + + //temporarily set number charactors + clist_d->list_index = NULL; + ct_list_index_data *index_0 = calloc(1, sizeof(ct_list_index_data)); + snprintf(index_0->index, sizeof(index_0->index), "0"); + index_0->item = elm_index_item_append(clist_d->fast_index, index_0->index, NULL, NULL); + clist_d->list_index = eina_list_append(clist_d->list_index, index_0); + //PH_DBG("list count %d, letter 0", eina_list_count(clist_d->list_index)); + + //set primary language charactors + for (j = 0; j < itemCount; j++) + { + UChar ch[2] = {0}; + int size; + ct_list_index_data *index_list = calloc(1, sizeof(ct_list_index_data)); + ch[0] = uset_charAt(indexChars, j); + u_strToUTF8(index_list->index, sizeof(index_list->index)-1, &size, ch, -1, &error); + + Elm_Object_Item *item = elm_index_item_append(clist_d->fast_index, index_list->index, NULL, NULL); + + index_list->item = item; + clist_d->list_index = eina_list_append(clist_d->list_index, index_list); + + //PH_DBG("%d th letter is %s", j, index_list->index); + + if(j == 0) + { + if(strcmp(index_list->index, "A") != 0) + is_alphabet = false; + } + + } + + //set spcial charactor + ct_list_index_data *index_S = calloc(1, sizeof(ct_list_index_data)); + snprintf(index_S->index, sizeof(index_S->index), "#"); + index_S->item = elm_index_item_append(clist_d->fast_index, index_S->index, NULL, NULL); + clist_d->list_index = eina_list_append(clist_d->list_index, index_S); + //PH_DBG("list count %d, letter #", eina_list_count(clist_d->list_index)); + + return; +} + +static bool __is_in_primary_letter(char* letter, ct_list_data *clist_d) +{ + unsigned int count = eina_list_count(clist_d->list_index); + ct_list_index_data *first_data; + ct_list_index_data *last_data; + first_data = (ct_list_index_data*)eina_list_nth(clist_d->list_index, 1);// first letter + last_data = (ct_list_index_data*)eina_list_nth(clist_d->list_index, count-2);// last letter + //PH_DBG("list count %d, first %d, letter %d, last %d", count, *first_data->index, *letter, *last_data->index); + if(*letter >= *first_data->index && *letter <= *last_data->index) + { + return true; + } + + return false; +} + +static inline void list_append_item(ct_list_data *clist_d, ct_contact_list *item_data) +{ + Elm_Object_Item *item; + // append group title if condition is accepted + if(CT_GET_LIST_VCARD != clist_d->list_op) + { + //ct_list_index_data *skipped_index = clist_d->list_skipped_index; + char cur_index[10] = {0,}; + __list_get_group_letter(item_data->display, cur_index, sizeof(cur_index)); + + if(isdigit(cur_index[0])) + { + cur_index[0] = '0'; + cur_index[1] = '\0'; + } + else if(__is_in_primary_letter(cur_index, clist_d) == false) + { + cur_index[0] = '#'; + cur_index[1] = '\0'; + } + + if (strcmp(clist_d->group_index, cur_index)) + { + item = elm_genlist_item_append(clist_d->genlist, &group_index, strdup(cur_index), NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL); + elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + snprintf(clist_d->group_index, sizeof(clist_d->group_index), "%s", cur_index); + clist_d->group_item = item; + + //PH_DBG("list_append_item - group letter is %s", cur_index); + //link to fastscroll + Eina_List* l; + ct_list_index_data *data; + bool matched = false; + EINA_LIST_FOREACH(clist_d->list_index, l, data) + { + if(strcmp(cur_index, data->index) == 0) + { + //PH_DBG("list_append_item - matched letter is %s", cur_index); + matched = true; + } + + if(matched == true) + { + //PH_DBG("list_append_item - %s mapping to %s", data->index, cur_index); + elm_object_item_data_set(data->item, item); + } + } + } + } + + if (clist_d->search_str && *clist_d->search_str) + item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[2], item_data, clist_d->group_item, + ELM_GENLIST_ITEM_NONE, clist_d->gl_sel, clist_d->gl_sel_data); + else + item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[0], item_data, clist_d->group_item, + ELM_GENLIST_ITEM_NONE, clist_d->gl_sel, clist_d->gl_sel_data); + + item_data->item = item; + + clist_d->cnt_total++; + if (item_data->checked) clist_d->cnt_checked++; + +} + +#define N_S 10 + +static Eina_Bool list_searched_list_append_part(void *user_data) +{ + int ret, i=0; + int readed = 0; + Eina_List *cursor; + ct_contact_list *item_data; + ct_list_data *clist_d = user_data; + int len; + + cursor = eina_list_nth_list(clist_d->list, clist_d->readed_n); + EINA_LIST_FOREACH(cursor, cursor, item_data) { + if (NULL == item_data) continue; + ret = contacts_svc_normalized_strstr(item_data->normalize, clist_d->search_normalize, &len); + if (0 <= ret) { + if (i++ == N_S) break; + list_append_item(clist_d, item_data); + } + readed++; + } + if (N_S < i) { + clist_d->readed_n += readed; + return ECORE_CALLBACK_RENEW; + } + else { + clist_d->list_idler = NULL; + if (EINA_FALSE == elm_genlist_decorate_mode_get(clist_d->genlist)) { + clist_d->count_item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[4], + (void *)clist_d->cnt_total, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_object_item_disabled_set(clist_d->count_item, EINA_TRUE); + } + return ECORE_CALLBACK_CANCEL; + } +} + +void ctui_list_handle_search(ct_list_data *clist_d) +{ + int ret, i=0; + int readed = 0; + int len; + Eina_List *cursor; + ct_contact_list *item_data; + char normalized_str[PH_TEXT_MAX_LEN] = {0}; + + ret = contacts_svc_normalize_str(clist_d->search_str, normalized_str, PH_TEXT_MAX_LEN); + p_retm_if(ret < CTS_SUCCESS, "contacts_svc_normalize_str() Failed(%d)", ret); + free(clist_d->search_normalize); + clist_d->search_normalize = strdup(normalized_str); + + elm_genlist_clear(clist_d->genlist); + elm_index_item_clear(clist_d->fast_index); + clist_d->group_index[0] = '\0'; + clist_d->group_item = NULL; + clist_d->cnt_total = 0; + clist_d->cnt_checked = 0; + + if (clist_d->list_idler) { + ecore_idler_del(clist_d->list_idler); + clist_d->list_idler = NULL; + } + + EINA_LIST_FOREACH(clist_d->list, cursor, item_data) { + if (NULL == item_data) continue; + ret = contacts_svc_normalized_strstr(item_data->normalize, normalized_str, &len); + if (0 <= ret) { + if (i++ == N_S) break; + list_append_item(clist_d, item_data); + } + readed++; + } + if (N_S < i) { + clist_d->readed_n = readed; + clist_d->list_idler = ecore_idler_add(list_searched_list_append_part, clist_d); + } + else { + if (EINA_FALSE == elm_genlist_decorate_mode_get(clist_d->genlist)) { + clist_d->count_item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[4], + (void *)clist_d->cnt_total, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_object_item_disabled_set(clist_d->count_item, EINA_TRUE); + } + } +} +#undef N_S + +#define N 20 +static Eina_Bool list_append_part(void *user_data) +{ + + int i = 0; + Eina_List *cursor; + ct_contact_list *item_data; + ct_list_data *clist_d = user_data; + + cursor = eina_list_nth_list(clist_d->list, clist_d->readed_n); + EINA_LIST_FOREACH(cursor, cursor, item_data) { + if (i++ == N) break; + list_append_item(clist_d, item_data); + } + if (N < i) { + clist_d->readed_n += N; + return ECORE_CALLBACK_RENEW; + } + else { + clist_d->list_idler = NULL; + if (EINA_FALSE == elm_genlist_decorate_mode_get(clist_d->genlist)) { + clist_d->count_item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[4], + (void *)clist_d->cnt_total, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_object_item_disabled_set(clist_d->count_item, EINA_TRUE); + } + return ECORE_CALLBACK_CANCEL; + } +} + +static void list_append_all(ct_list_data *clist_d) +{ + int i = 0; + Eina_List *cursor; + ct_contact_list *item_data; + + if (clist_d->list_idler) { + ecore_idler_del(clist_d->list_idler); + clist_d->list_idler = NULL; + } + + __list_set_index_letter(clist_d); + + EINA_LIST_FOREACH(clist_d->list, cursor, item_data) { + if (i++ == N) break; + list_append_item(clist_d, item_data); + } + if (N < i) { + clist_d->readed_n = N; + clist_d->list_idler = ecore_idler_add(list_append_part, clist_d); + } + else { + if (EINA_FALSE == elm_genlist_decorate_mode_get(clist_d->genlist)) { + clist_d->count_item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[4], + (void *)clist_d->cnt_total, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_object_item_disabled_set(clist_d->count_item, EINA_TRUE); + } + } +} +#undef N + +void ctui_list_refresh_genlist(ct_list_data *clist_d) +{ + PH_FN_CALL; + elm_genlist_clear(clist_d->genlist); + elm_index_item_clear(clist_d->fast_index); + clist_d->group_index[0] = '\0'; + clist_d->group_item = NULL; + clist_d->cnt_total = 0; + clist_d->cnt_checked = 0; + list_append_all(clist_d); +} + +static void list_searchbar_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; + Evas_Object *en; + Evas_Object *sb = data; + ct_list_data *clist_d; + char *search_str; + + clist_d = evas_object_data_get(sb, "clist_d"); + p_retm_if(NULL == sb, "evas_object_data_get() return NULL"); + + en = elm_object_part_content_get(sb, "elm.swallow.content"); + p_retm_if(NULL == en, "elm_object_part_content_get() return NULL"); + + if (!elm_entry_is_empty(en)) + elm_object_signal_emit(sb, "elm,state,guidetext,hide", "elm"); + + if (elm_object_focus_get(sb)) { + if (elm_entry_is_empty(en)) + elm_object_signal_emit(sb, "elm,state,eraser,hide", "elm"); + else + elm_object_signal_emit(sb, "elm,state,eraser,show", "elm"); + } + + search_str = ctui_entry_markup_to_utf8(elm_entry_entry_get(en)); + p_retm_if(NULL == search_str, "ctui_entry_markup_to_utf8() return NULL"); + p_ret_if('\0' == search_str[0] && NULL == clist_d->search_str); + + if (search_str && clist_d->search_str) + p_ret_if(0 == strcmp(search_str, clist_d->search_str)); + + PH_DBG("search string is %s", search_str); + if(NULL != search_str){ + if(strlen(search_str)>0) { + if(NULL !=clist_d->select_all_layout){ + elm_box_unpack(clist_d->box, clist_d->select_all_layout); + evas_object_del(clist_d->select_all_layout); + clist_d->select_all_layout = NULL; + } + } + else { + ctui_list_set_selectall(clist_d); + } + } + + free(clist_d->search_str); + clist_d->search_str = search_str; + + if (search_str && strcmp(pre_search_str, search_str)) { + if (*search_str) { + elm_genlist_mode_set(clist_d->genlist, ELM_LIST_COMPRESS); + ctui_list_handle_search(clist_d); + } + else { + elm_genlist_homogeneous_set(clist_d->genlist, EINA_TRUE); + elm_genlist_mode_set(clist_d->genlist, ELM_LIST_SCROLL); + ctui_list_refresh_genlist(clist_d); + } + } + snprintf(pre_search_str, sizeof(pre_search_str), "%s", search_str); + + if (elm_genlist_decorate_mode_get(clist_d->genlist) && clist_d->edit_sel_update) + clist_d->edit_sel_update(clist_d); +} + +static void list_searchbar_focused_cb(void *data, Evas_Object *obj, void *event_info) +{ + elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm"); + elm_object_signal_emit(data, "cancel,in", ""); + + if (!elm_entry_is_empty(obj)) + elm_object_signal_emit(data, "elm,state,eraser,show", "elm"); +} + +static void list_searchbar_unfocused_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *cancel_btn; + + elm_object_signal_emit(data, "elm,state,eraser,hide", "elm"); + + if (elm_entry_is_empty(obj)) { + elm_object_signal_emit(data, "elm,state,guidetext,show", "elm"); + + cancel_btn = elm_object_part_content_get(data, "button_cancel"); + evas_object_hide(cancel_btn); + elm_object_signal_emit(data, "cancel,out", ""); + } +} + +static void list_searchbar_cancel_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *sb = data; + Evas_Object *en; + ct_list_data *clist_d; + const char *text; + + p_retm_if(NULL == sb, "parameter(sb) is NULL"); + + clist_d = evas_object_data_get(sb, "clist_d"); + p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL"); + + en = elm_object_part_content_get(sb, "elm.swallow.content"); + p_retm_if(NULL == en, "elm_object_part_content_get() return NULL"); + + free(clist_d->search_str); + clist_d->search_str = NULL; + + free(clist_d->search_normalize); + clist_d->search_normalize = NULL; + + text = elm_entry_entry_get(en); + if (text && *text) + elm_entry_entry_set(en, NULL); + elm_object_focus_set(en, EINA_FALSE); + + ctui_list_refresh_genlist(clist_d); + + // problem of set focus automatically on searchbar when resumed app + elm_object_focus_set(clist_d->genlist, EINA_TRUE); +} + +static void list_searchbar_eraser_cb(void *data, Evas_Object *obj, const char *emission, + const char *source) +{ + elm_entry_entry_set(data, ""); +} + +static Evas_Object* list_create_searchbar(Evas_Object* parent, ct_list_data *clist_d) +{ + Evas_Object *sb; + Evas_Object *en; + Evas_Object *cancel_btn; + + sb = elm_layout_add(parent); + p_retvm_if(NULL == sb, NULL, "elm_layout_add() return NULL"); + evas_object_data_set(sb, "clist_d", clist_d); + + elm_layout_theme_set(sb, "layout", "searchbar", "cancel_button"); + + en = elm_entry_add(sb); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_single_line_set(en, EINA_TRUE); + elm_object_part_content_set(sb, "elm.swallow.content", en); + elm_object_part_text_set(sb, "elm.guidetext", S_(CT_SYS_BODY_SEARCH)); + + ctui_entry_limit_size_set(en); + elm_entry_input_panel_layout_set(en, ELM_INPUT_PANEL_LAYOUT_NORMAL); + + cancel_btn = elm_button_add(sb); + elm_object_part_content_set(sb, "button_cancel", cancel_btn); + elm_object_style_set(cancel_btn, "searchbar/default"); + elm_object_text_set(cancel_btn, "Cancel"); + + evas_object_smart_callback_add(en, "focused", list_searchbar_focused_cb, sb); + evas_object_smart_callback_add(en, "unfocused", list_searchbar_unfocused_cb, sb); + evas_object_smart_callback_add(en, "changed", list_searchbar_changed_cb, sb); + evas_object_smart_callback_add(en, "preedit,changed", list_searchbar_changed_cb, sb); + evas_object_smart_callback_add(en, "clicked", list_searchbar_entry_clicked_cb, clist_d); + elm_object_signal_callback_add(sb, "elm,bg,clicked", "elm", list_searchbar_clicked_cb, en); + elm_object_signal_callback_add(sb, "elm,eraser,clicked", "elm", list_searchbar_eraser_cb, en); + evas_object_smart_callback_add(cancel_btn, "clicked", list_searchbar_cancel_cb, sb); + + return sb; +} + +static Evas_Object* list_create_navi_content_genlist(Evas_Object* parent) +{ + Evas_Object *genlist = elm_genlist_add(parent); + + elm_genlist_scroller_policy_set(genlist, ELM_SCROLLER_POLICY_OFF, + ELM_SCROLLER_POLICY_OFF); + elm_genlist_block_count_set(genlist, 20); + elm_genlist_homogeneous_set(genlist, EINA_TRUE); + + evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL); + + return genlist; +} + +static void list_fast_delayed_changed(void *data, Evas_Object *obj, + void *event_info) +{ + // called on a change but delayed in case multiple changes happen in a + // short timespan + elm_genlist_item_bring_in(elm_object_item_data_get(event_info), + ELM_GENLIST_ITEM_SCROLLTO_TOP); +} + +static void list_fast_selected(void *data, Evas_Object *obj, void *event_info) +{ + // called on final select + elm_genlist_item_bring_in(elm_object_item_data_get(event_info), + ELM_GENLIST_ITEM_SCROLLTO_TOP); +} + +static void list_start_sweep_effect(void *data) +{ + elm_genlist_item_decorate_mode_set(data, "slide", EINA_TRUE); + elm_genlist_item_select_mode_set(data, ELM_OBJECT_SELECT_MODE_NONE); +} + +char* ct_list_get_number(int id) +{ + int ret; + char *number; + CTSvalue *value; + + ret = contacts_svc_get_contact_value(CTS_GET_DEFAULT_NUMBER_VALUE, id, &value); + p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_get_contact_value() Failed(%d)", ret); + + number = contacts_svc_value_steal_str(value, CTS_NUM_VAL_NUMBER_STR); + contacts_svc_value_free(value); + + return number; +} + +static void list_gl_sweep(void *data, Evas_Object *obj, void *event_info) +{ + ct_contact_list *item_info; + ct_list_data *clist_d = data; + Elm_Object_Item *item = event_info; + Elm_Genlist_Item_Class *itc; + Elm_Genlist_Item_Type type; + + p_ret_if(!item); + p_ret_if(CT_GET_LIST_VCARD == clist_d->list_op); + p_ret_if(CT_LIST_MODE_EDIT == clist_d->list_mode); + + type = elm_genlist_item_type_get(item); + p_ret_if(ELM_GENLIST_ITEM_GROUP == type); + p_ret_if(&clist_d->itcs[4] == elm_genlist_item_item_class_get(item)); + + item_info = elm_object_item_data_get(item); + p_retm_if(NULL == item_info, "ct_contact_list is null"); + if (!item_info->number_loaded) { + item_info->number = ct_list_get_number(item_info->id_person); + item_info->number_loaded = true; + } + + itc = (Elm_Genlist_Item_Class *)elm_genlist_item_item_class_get(item); + p_retm_if(NULL == itc, "item class is null"); + if ((NULL == item_info->number || '\0' == *item_info->number) + && strcmp(itc->decorate_item_style, clist_d->itcs[1].decorate_item_style)){ + if (clist_d->search_str && *clist_d->search_str) + elm_genlist_item_item_class_update(item, &clist_d->itcs[3]); + else + elm_genlist_item_item_class_update(item, &clist_d->itcs[1]); + ecore_job_add(list_start_sweep_effect, item); + clist_d->last_sweep_item = item; + return; + } + else if ((item_info->number && *item_info->number) + && strcmp(itc->decorate_item_style, clist_d->itcs[0].decorate_item_style)) { + if (clist_d->search_str && *clist_d->search_str) + elm_genlist_item_item_class_update(item, &clist_d->itcs[2]); + else + elm_genlist_item_item_class_update(item, &clist_d->itcs[0]); + ecore_job_add(list_start_sweep_effect, item); + clist_d->last_sweep_item = item; + return; + } + + clist_d->last_sweep_item = item; + elm_genlist_item_decorate_mode_set(event_info, "slide", EINA_TRUE); + elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_NONE); +} + +static void list_gl_unsweep(void *data, Evas_Object *obj, void *event_info) +{ + ct_list_data *clist_d = data; + if (NULL == clist_d->last_sweep_item) return; + + elm_genlist_item_decorate_mode_set(clist_d->last_sweep_item, "slide", EINA_FALSE); + elm_genlist_item_select_mode_set(clist_d->last_sweep_item, ELM_OBJECT_SELECT_MODE_DEFAULT); + clist_d->last_sweep_item = NULL; +} + +static void list_gl_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + elm_object_focus_set(obj, EINA_TRUE); +} + +static Evas_Object* list_create_contact_list(Evas_Object *parent, ct_list_data *clist_d) +{ + Evas_Object *layout, *fast_index, *searchbar, *genlist, *conform; + + elm_win_conformant_set(clist_d->win, EINA_TRUE); + + conform = elm_conformant_add(parent); + p_retvm_if(NULL == conform, NULL, "elm_conformant_add() return NULL"); + + elm_object_style_set(conform, "internal_layout"); + evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(conform); + + layout = elm_layout_add(conform); + elm_layout_file_set(layout, CONTACTS_EDJ, "genlist"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + clist_d->layout = layout; + + searchbar = list_create_searchbar(layout, clist_d); + elm_object_part_content_set(layout, "searchbar", searchbar); + evas_object_show(searchbar); + clist_d->searchbar = searchbar; + + clist_d->box = elm_box_add(layout); + evas_object_size_hint_weight_set(clist_d->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(clist_d->box); + elm_object_part_content_set(layout, "content", clist_d->box); + + // Create genlist + genlist = list_create_navi_content_genlist(clist_d->box); + evas_object_show(genlist); + elm_object_theme_set(genlist, clist_d->th); + + evas_object_smart_callback_add(genlist, "drag,start,right", list_gl_sweep, clist_d); + evas_object_smart_callback_add(genlist, "drag,start,left", list_gl_unsweep, clist_d); + evas_object_smart_callback_add(genlist, "drag,start,up", list_gl_unsweep, clist_d); + evas_object_smart_callback_add(genlist, "drag,start,down", list_gl_unsweep, clist_d); + evas_object_event_callback_add(genlist, EVAS_CALLBACK_MOUSE_DOWN, list_gl_mouse_down_cb, clist_d); + + clist_d->genlist = genlist; + + elm_box_pack_end(clist_d->box, genlist); + evas_object_data_set(genlist, "clist_d", clist_d); + + if (CT_GET_LIST_VCARD != clist_d->list_op) { + // Create fast scroll + fast_index = elm_index_add(layout); + elm_object_part_content_set(layout, "fastscroll", fast_index); + evas_object_show(fast_index); + clist_d->fast_index = fast_index; + evas_object_smart_callback_add(fast_index, "delay,changed", list_fast_delayed_changed, + fast_index); + evas_object_smart_callback_add(fast_index, "selected", list_fast_selected, NULL); + elm_index_level_go(fast_index, 0); + } + + // Genlist item append + pre_search_str[0] = '\0'; + + evas_object_show(layout); + + elm_object_content_set(conform, layout); + + return conform; +} + +static void list_fill_contact_view(Evas_Object *parent, ct_list_data *clist_d) +{ + Evas_Object *content = NULL; + + if (clist_d->list) { + if (NULL == clist_d->genlist) { + content = list_create_contact_list(parent, clist_d); + list_append_all(clist_d); + + if (CT_LIST_MODE_EDIT == clist_d->list_mode) + ctui_list_edit_mode_start(clist_d); + elm_object_part_content_set(parent, "elm.swallow.content", content); + } + else { + if (clist_d->search_str && *clist_d->search_str) + ctui_list_handle_search(clist_d); + else + ctui_list_refresh_genlist(clist_d); + } + } + else { + list_clean_ecore_task(clist_d); + + content = phone_create_nocontents(parent, T_(CT_GET_TEXT_ERR, CTTEXT_NO_CONTACTS)); + p_retm_if(NULL == content, "phone_create_nocontents() return NULL"); + + elm_object_part_content_set(parent, "elm.swallow.content", content); + + clist_d->genlist = NULL; + clist_d->group_index[0] = '\0'; + clist_d->group_item = NULL; + + free(clist_d->search_str); + clist_d->search_str = NULL; + clist_d->searchbar = NULL; + clist_d->cnt_total = 0; + } +} + +API Eina_Bool ctui_list_genlist_update(void *data) +{ + PH_FN_CALL; + char buf[PH_TEXT_SHORT_LEN]; + Evas_Object *content; + ct_list_data *clist_d = data; + + if (clist_d->update_timer) { + ecore_timer_del(clist_d->update_timer); + clist_d->update_timer = NULL; + } + + p_retvm_if(NULL == clist_d->navi_item, ECORE_CALLBACK_CANCEL, "navi_item is NULL"); + + ctui_list_free_contacts(clist_d->list); + ct_list_get_contacts(clist_d, &clist_d->list); + clist_d->cnt_total = 0; + + if(CT_LIST_IN_MULTI_TAB != clist_d->tab_mode && CT_UG_REQUEST_SELECT_CONTACT <= clist_d->ug_request) { + snprintf(buf, sizeof(buf), "%s (%d)", clist_d->title, clist_d->cnt_list); + elm_object_item_text_set(clist_d->navi_item, buf); + } + + content = clist_d->content; + list_fill_contact_view(content, clist_d); + if (clist_d->list_cbar_update_fn) + clist_d->list_cbar_update_fn(clist_d); + + return ECORE_CALLBACK_CANCEL; +} + +void ct_list_clear_pdata(ct_list_data *clist_d) +{ + int ret; + p_ret_if(NULL == clist_d); + p_ret_if(NULL == clist_d->p_info); + + clist_d->p_info->alive = false; + pthread_join(clist_d->p_info->thread, NULL); + + ret = contacts_svc_end_trans(false); + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); + ecore_timer_del(clist_d->p_info->timer); + + if (clist_d->popup) { + evas_object_del(clist_d->popup); + clist_d->popup = NULL; + } + + free(clist_d->p_info); + clist_d->p_info = NULL; +} + +static void list_set_group_index_item(Eina_List *list_index, const char *cur_index, Elm_Object_Item *cur_item) +{ + Eina_List* l; + ct_list_index_data *data; + + EINA_LIST_FOREACH(list_index, l, data) { + if (0 == strcmp(cur_index, data->index)) { + //PH_DBG("list_append_item - %s mapping to %s", data->index, cur_index); + elm_object_item_data_set(data->item, cur_item); + break; + } + } +} + +static Elm_Object_Item* list_genlist_update_group_item_get(Evas_Object *genlist, Eina_List *list_index, + Elm_Object_Item *gal_item, Elm_Object_Item *item, const char *cur_index) +{ + int cmp; + char *item_index; + Elm_Object_Item *next_item; + Elm_Object_Item *item_ret; + + if (NULL == item) { + item_ret = elm_genlist_item_append(genlist, &group_index, strdup(cur_index), NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL); + list_set_group_index_item(list_index, cur_index, item_ret); + return item_ret; + } + else if (gal_item == item) { + item_ret = elm_genlist_item_insert_before(genlist, &group_index, strdup(cur_index), NULL, item, ELM_GENLIST_ITEM_GROUP, NULL, NULL); + list_set_group_index_item(list_index, cur_index, item_ret); + return item_ret; + } + if (ELM_GENLIST_ITEM_GROUP != elm_genlist_item_type_get(item)) { + next_item = elm_genlist_item_next_get(item); + item_ret = list_genlist_update_group_item_get(genlist, list_index, gal_item, next_item, cur_index); + elm_object_item_del(item); + return item_ret; + } + + item_index = elm_object_item_data_get(item); + cmp = strcmp(item_index, cur_index); + + if (0 == cmp) { + return item; + } + else if (0 < cmp) { + item_ret = elm_genlist_item_insert_before(genlist, &group_index, strdup(cur_index), NULL, item, ELM_GENLIST_ITEM_GROUP, NULL, NULL); + list_set_group_index_item(list_index, cur_index, item_ret); + return item_ret; + } + else { + next_item = elm_genlist_item_next_get(item); + item_ret = list_genlist_update_group_item_get(genlist, list_index, gal_item, next_item, cur_index); + elm_object_item_del(item); + return item_ret; + } +} + +static Eina_Bool list_genlist_update(void *data) +{ + int len; + int ret; + char buf[PH_TEXT_MAX_LEN]; + char cur_index[10]; + char group_index[10]; + Eina_List *list_new; + Eina_List *l; + Elm_Object_Item *gal_item = NULL; + Elm_Object_Item *item = NULL; + Elm_Object_Item *item_cur; + Elm_Object_Item *next_item; + Elm_Object_Item *group_item = NULL; + + ct_contact_list *item_data; + ct_list_data *clist_d = data; + ct_list_index_data *skipped_index = clist_d->list_skipped_index; + + if (clist_d->list_idler) { + ecore_idler_del(clist_d->list_idler); + clist_d->list_idler = NULL; + } + + if (clist_d->update_timer) { + ecore_timer_del(clist_d->update_timer); + clist_d->update_timer = NULL; + } + + p_retvm_if(NULL == clist_d->navi_item, ECORE_CALLBACK_CANCEL, "navi_item is NULL"); + + list_new = NULL; + ret = ct_list_get_contacts(clist_d, &list_new); + if (0 != ret) { + ERR("ct_list_get_contacts() Failed(%d)", ret); + ctui_list_free_contacts(list_new); + clist_d->need_update = true; + return ECORE_CALLBACK_CANCEL; + } + + clist_d->cnt_total = 0; + + if (!list_new) { + Evas_Object *content; + list_clean_ecore_task(clist_d); + + content = phone_create_nocontents(clist_d->content, T_(CT_GET_TEXT_ERR, CTTEXT_NO_CONTACTS)); + p_retvm_if(NULL == content, ECORE_CALLBACK_CANCEL, "phone_create_nocontents() return NULL"); + + elm_object_part_content_set(clist_d->content, "elm.swallow.content", content); + + clist_d->genlist = NULL; + clist_d->group_index[0] = '\0'; + clist_d->group_item = NULL; + + free(clist_d->search_str); + clist_d->search_str = NULL; + clist_d->searchbar = NULL; + clist_d->cnt_total = 0; + } + else { + if (NULL == clist_d->genlist) { + Evas_Object *content = NULL; + content = list_create_contact_list(clist_d->content, clist_d); + + if (CT_LIST_MODE_EDIT == clist_d->list_mode) + ctui_list_edit_mode_start(clist_d); + + elm_object_part_content_set(clist_d->content, "elm.swallow.content", content); + __list_set_index_letter(clist_d); + } + else { + if (clist_d->last_sweep_item) { + elm_genlist_item_decorate_mode_set(clist_d->last_sweep_item, "slide", EINA_FALSE); + elm_genlist_item_select_mode_set(clist_d->last_sweep_item, ELM_OBJECT_SELECT_MODE_DEFAULT); + clist_d->last_sweep_item = NULL; + } + + if (clist_d->count_item) + elm_object_item_del(clist_d->count_item); + } + + clist_d->group_index[0] = '\0'; + clist_d->group_item = NULL; + clist_d->cnt_total = 0; + if (NULL == skipped_index) { + skipped_index = calloc(1, sizeof(ct_list_index_data)); + clist_d->list_skipped_index = skipped_index; + } + else + memset(skipped_index, 0x0, sizeof(ct_list_index_data)); + + item_cur = elm_genlist_first_item_get(clist_d->genlist); + group_index[0] = '\0'; + + EINA_LIST_FOREACH(list_new, l, item_data) { + if (NULL == item_data) + continue; + + if (clist_d->search_str && *clist_d->search_str) { + ret = contacts_svc_normalized_strstr(item_data->normalize, clist_d->search_normalize, &len); + if (ret < 0) + continue; + } + + cur_index[0] = '\0'; + __list_get_group_letter(item_data->display, cur_index, sizeof(cur_index)); + if(isdigit(cur_index[0])) + snprintf(cur_index, sizeof(cur_index), "0"); + else if(__is_in_primary_letter(cur_index, clist_d) == false) + snprintf(cur_index, sizeof(cur_index), "#"); + + if ('\0' == group_index[0] || 0 != strcmp(cur_index, group_index)) { + group_item = list_genlist_update_group_item_get(clist_d->genlist, clist_d->list_index, gal_item, item_cur, cur_index); + if (NULL == group_item) { + ERR("list_genlist_update_group_item_get() return NULL"); + break; + } + snprintf(group_index, sizeof(group_index), "%s", cur_index); + item_cur = elm_genlist_item_next_get(group_item); + } + + if (NULL == item_cur) { + if (clist_d->search_str && *clist_d->search_str) + item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[2], item_data, group_item, + ELM_GENLIST_ITEM_NONE, clist_d->gl_sel, clist_d->gl_sel_data); + else + item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[0], item_data, group_item, + ELM_GENLIST_ITEM_NONE, clist_d->gl_sel, clist_d->gl_sel_data); + } + else if (ELM_GENLIST_ITEM_NONE == elm_genlist_item_type_get(item_cur)) { + elm_object_item_data_set(item_cur, item_data); + item = item_cur; + item_cur = elm_genlist_item_next_get(item_cur); + } + else { + if (clist_d->search_str && *clist_d->search_str) + item = elm_genlist_item_insert_before(clist_d->genlist, &clist_d->itcs[2], item_data, group_item, item_cur, + ELM_GENLIST_ITEM_NONE, clist_d->gl_sel, clist_d->gl_sel_data); + else + item = elm_genlist_item_insert_before(clist_d->genlist, &clist_d->itcs[0], item_data, group_item, item_cur, + ELM_GENLIST_ITEM_NONE, clist_d->gl_sel, clist_d->gl_sel_data); + } + + clist_d->cnt_total++; + } + + if (item_cur) { + while (gal_item != (next_item = elm_genlist_item_next_get(item_cur))) { + elm_object_item_del(next_item); + } + elm_object_item_del(item_cur); + } + + if(CT_LIST_IN_MULTI_TAB != clist_d->tab_mode && CT_UG_REQUEST_SELECT_CONTACT <= clist_d->ug_request) { + snprintf(buf, sizeof(buf), "%s (%d)", clist_d->title, clist_d->cnt_list); + elm_object_item_text_set(clist_d->navi_item, buf); + } + } + + ctui_list_free_contacts(clist_d->list); + clist_d->list = list_new; + + if (clist_d->genlist) { + elm_genlist_realized_items_update(clist_d->genlist); + if (EINA_FALSE == elm_genlist_decorate_mode_get(clist_d->genlist)) { + if (gal_item) + clist_d->count_item = elm_genlist_item_insert_before(clist_d->genlist, &clist_d->itcs[4], + (void *)clist_d->cnt_total, NULL, gal_item, ELM_GENLIST_ITEM_NONE, NULL, NULL); + else + clist_d->count_item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[4], + (void *)clist_d->cnt_total, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_object_item_disabled_set(clist_d->count_item, EINA_TRUE); + } + } + + if (clist_d->list_cbar_update_fn) + clist_d->list_cbar_update_fn(clist_d); + + PH_FN_END; + return ECORE_CALLBACK_CANCEL; +} + +static Eina_Bool list_genlist_update_queue_timer_cb(void *data) +{ + ct_list_data *clist_d = data; + p_retvm_if(NULL == clist_d, ECORE_CALLBACK_CANCEL, "parameter(clist_d) is NULL"); + + if (clist_d->need_update) { + clist_d->need_update = false; + list_genlist_update(clist_d); + return ECORE_CALLBACK_RENEW; + } + clist_d->update_queue_timer = NULL; + return ECORE_CALLBACK_CANCEL; +} + +static void list_lazy_update(void *data) +{ + int ui_updated; + ct_list_data *clist_d = data; + + if (clist_d->update_timer) { + ecore_timer_del(clist_d->update_timer); + clist_d->update_timer = NULL; + } + + PH_DBG("is_background = %d", clist_d->is_background); + + if (clist_d->is_background) { + clist_d->need_update = false; + clist_d->update_timer = ecore_timer_add(3.0, list_genlist_update, clist_d); + return; + } + + ui_updated = (int)evas_object_data_del(clist_d->navi, "ct_list_update_ui"); + if (0 == ui_updated && clist_d->update_queue_timer) { + clist_d->need_update = true; + } + else { + list_genlist_update(clist_d); + clist_d->update_queue_timer = ecore_timer_add(1.0, list_genlist_update_queue_timer_cb, clist_d); + p_warn_if(NULL == clist_d->update_queue_timer, "ecore_timer_add() return NULL"); + } +} + +static void list_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + int ret; + ct_list_data *clist_d = data; + + ct_list_clear_pdata(clist_d); + list_clean_ecore_task(clist_d); + + if (CT_GET_LIST_VCARD != clist_d->list_op) { + ret = contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_CONTACT_CHANGE, + list_lazy_update, clist_d); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_unsubscribe_change_with_data() Failed(%d)", ret); + + ret = contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_LINK_CHANGE, + list_lazy_update, clist_d); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_unsubscribe_change_with_data() Failed(%d)", ret); + } + + ctui_list_free_contacts(clist_d->list); + + ctui_list_free_index(clist_d->list_index); + + if (clist_d->update_timer) + ecore_timer_del(clist_d->update_timer); + + if (clist_d->update_queue_timer) + ecore_timer_del(clist_d->update_queue_timer); + + if (clist_d->popup) { + evas_object_del(clist_d->popup); + clist_d->popup = NULL; + } + + if (clist_d->th) { + elm_theme_extension_del(clist_d->th, CONTACTS_EDJ); + elm_theme_free(clist_d->th); + } + + if (clist_d->child_ug) + ug_destroy(clist_d->child_ug); + + evas_object_data_del(clist_d->navi, "gadd_list_d"); + evas_object_data_del(clist_d->navi, "favor_list_d"); + eina_list_free(clist_d->list_ab); + free(clist_d->search_str); + free(clist_d->search_normalize); + free(clist_d->sub_title); + free(clist_d->title); + free(clist_d); +} + +static char* list_get_highlight_text(ct_list_data *clist_d, const char *src, const char *normalize) +{ + int len; + int ret; + char display[PH_TEXT_MAX_LEN]; + + if (NULL == clist_d->search_str || '\0' == clist_d->search_str[0]) + return strdup(src); + + ret = contacts_svc_normalized_strstr(normalize, clist_d->search_normalize, &len); + if (0 <= ret) { + char middle[PH_TEXT_MAX_LEN] = {0}; + char first[PH_TEXT_MAX_LEN] = {0}; + snprintf(first, sizeof(first), "%s", src); + snprintf(middle, len+1, "%s", src + ret); + first[ret] = '\0'; + //PH_DBG("%s -> %s, %s, %s", src, first, middle, src + ret + len); + + snprintf(display, sizeof(display), "%s<match>%s</>%s", first, middle, src + ret + len); + return strdup(display); + } + return strdup(src); +} + +static int list_handle_noname(int op, int sub_op, ct_contact_list *item) +{ + int ret; + CTSvalue *value = NULL; + char normalized_str[PH_TEXT_MAX_LEN]; + + ret = contacts_svc_get_contact_value(op, item->id, &value); + if (CTS_SUCCESS == ret) { + free(item->display); + free(item->normalize); + item->display = SAFE_STRDUP(contacts_svc_value_get_str(value, sub_op)); + + ret = contacts_svc_normalize_str(item->display, normalized_str, + sizeof(normalized_str)); + if (CTS_SUCCESS <= ret) + item->normalize = strdup(normalized_str); + else + item->normalize = NULL; + + contacts_svc_value_free(value); + return TRUE; + } + else { + PH_DBG("op(%d) is NO DATA", op); + return FALSE; + } +} + +char* ct_list_gl_label_get(void *data, Evas_Object *obj, const char *part) +{ + ct_contact_list *item = data; + p_retvm_if(NULL == item, NULL, "The parameter(data) is NULL"); + + p_retvm_if(0 != strcmp(part, "elm.text") && 0 != strcmp(part, "elm.slide.text.1"), + NULL, "unknown part(%s)", part); + + if (NULL == item->display || '\0' == item->display[0]) { + int ret; + ret = list_handle_noname(CTS_GET_COMPANY_VALUE, CTS_COMPANY_VAL_NAME_STR, item); + if (TRUE != ret) { + ret = list_handle_noname(CTS_GET_DEFAULT_NUMBER_VALUE, CTS_NUM_VAL_NUMBER_STR, item); + if (TRUE != ret) + list_handle_noname(CTS_GET_DEFAULT_EMAIL_VALUE, CTS_EMAIL_VAL_ADDR_STR, item); + } + } + + if (item->display && *item->display) { + ct_list_data *clist_d = evas_object_data_get(obj, "clist_d"); + p_retvm_if(NULL == clist_d, strdup(item->display), + "evas_object_data_get() return NULL"); + + if (0 == strcmp(part, "elm.slide.text.1")) + return strdup(item->display); + else + return list_get_highlight_text(clist_d, item->display, item->normalize); + } + else + return strdup(T_(CT_GET_TEXT_ERR, CTTEXT_NONAME)); +} + +char* ct_list_count_gl_label_get(void *data, Evas_Object *obj, const char *part) +{ + char buf[PH_TEXT_SHORT_LEN]; + int count = (int)data; + snprintf(buf, sizeof(buf), T_(CT_GET_TEXT_BASIC, CTTEXT_COUNT_CONTACTS), count); + return strdup(buf); +} + +Evas_Object* ct_list_create_contact_layout(ct_list_data *clist_d) +{ + PH_FN_CALL; + int ret; + Elm_Theme *th; + Evas_Object *layout; + + th = elm_theme_new(); + elm_theme_ref_set(th, NULL); + elm_theme_extension_add(th, LIST_THEME_EDJ); + clist_d->th = th; + + layout = phone_create_base_layout(clist_d->navi, false); + list_fill_contact_view(layout, clist_d); + + if (CT_GET_LIST_VCARD != clist_d->list_op) { + ret = contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE, + list_lazy_update, clist_d); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_subscribe_change() Failed(%d)", ret); + + ret = contacts_svc_subscribe_change(CTS_SUBSCRIBE_LINK_CHANGE, + list_lazy_update, clist_d); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_subscribe_change() Failed(%d)", ret); + } + + evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, list_view_delete_cb, clist_d); + return layout; +} + diff --git a/lib/common/ph-common.c b/lib/common/ph-common.c index 6ef6ed2..1a232e3 100755 --- a/lib/common/ph-common.c +++ b/lib/common/ph-common.c @@ -14,16 +14,14 @@ * limitations under the License. */ -#include <contacts-ug.h> +#include <app.h> #include <ui-gadget-module.h> -#include <aul.h> -#include <appsvc.h> +#include <account-types.h> +#include <syspopup_caller.h> #include "phone.h" #include "phone-common.h" -#define MSG_COMPOSER_UG "msg-composer-efl" - #ifdef PH_TIMECHECK double ph_set_start_time(void) { @@ -51,10 +49,10 @@ int ph_init_time(void) } #endif -void phone_progress_popup_del(void *data, Evas_Object *obj, void *event_info) +static void progress_popup_cancel_cb(void *data, Evas_Object *obj, void *event_info) { - ph_progress_info *p_info = data; - p_info->alive = false; + bool *is_alive = data; + *is_alive = false; } void phone_free_contacts(Eina_List *list) @@ -80,11 +78,11 @@ void phone_view_back_btn_cb(void *data, Evas_Object *obj, void *event_info) { /* TODO : remove evas_object_smart_callback_del, it will be controlled by WINSET */ evas_object_smart_callback_del(obj, "clicked", phone_view_back_btn_cb); - + phone_hide_notify(data); elm_naviframe_item_pop(data); } -static void ug_common_layout_cb(struct ui_gadget *ug, enum ug_mode mode, void *priv) +void ug_common_layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv) { Evas_Object *base; @@ -103,7 +101,7 @@ static void ug_common_layout_cb(struct ui_gadget *ug, enum ug_mode mode, void *p evas_object_show(base); } -static void ug_common_destroy_cb(struct ui_gadget *ug, void *priv) +void ug_common_destroy_cb(ui_gadget_h ug, void *priv) { struct ug_priv_data *priv_data; @@ -122,35 +120,60 @@ static void ug_common_destroy_cb(struct ui_gadget *ug, void *priv) PH_FN_END; } -void* phone_launch_msg_composer_ug(void *parent_ug, char *data, +void * phone_image_crop_ug(ui_gadget_h parent, const char *photo, + struct ug_cbs *cbs) +{ + ui_gadget_h ug; + + service_h service; + + service_create(&service); + service_add_extra_data(service, "Path", photo); + service_add_extra_data(service, "View Mode", "SETAS"); + service_add_extra_data(service, "Setas type", "CallerID"); + service_add_extra_data(service, "Area Size", "100"); + + cbs->layout_cb = ug_common_layout_cb; + + ug = ug_create(parent, IMG_VIEWER_UG, UG_MODE_FULLVIEW, service, cbs); + p_warn_if(NULL == ug, "ug_create() Failed"); + + service_destroy(service); + + return ug; +} + +void* phone_launch_msg_composer_ug(void *parent_ug, char *number, int msg_id, void(*destroy_cb)(void*), void *cb_param) { PH_FN_CALL; - struct ui_gadget *ug; + ui_gadget_h ug; struct ug_cbs cbs = {0}; struct ug_priv_data *priv_data; - bundle *kb; + service_h service; + char ret[PH_TEXT_MAX_LEN] = {0}; priv_data = calloc(1, sizeof(struct ug_priv_data)); p_retvm_if(NULL == priv_data, NULL, "calloc is failed"); priv_data->destroy_cb = destroy_cb; priv_data->cb_param = cb_param; - kb = bundle_create(); - if (NULL == kb) { - ERR("bundle_create() Failed"); - free(priv_data); - return NULL; + service_create(&service); + if (number && *number) + service_add_extra_data(service, "TO", (char*)number); + else if (msg_id) { + service_add_extra_data(service, "type", "msg_id"); + snprintf(ret, sizeof(ret), "%d", msg_id); + service_add_extra_data(service, "msgId", ret); } - bundle_add(kb, "TO", (char*)data); cbs.priv = priv_data; cbs.layout_cb = ug_common_layout_cb; cbs.result_cb = NULL; cbs.destroy_cb = ug_common_destroy_cb; - ug = ug_create(parent_ug, MSG_COMPOSER_UG, UG_MODE_FULLVIEW, kb, &cbs); - bundle_free(kb); + ug = ug_create(parent_ug, MSG_COMPOSER_UG, UG_MODE_FULLVIEW, service, &cbs); + service_destroy(service); if (ug == NULL) { free(priv_data); @@ -165,8 +188,8 @@ void* phone_launch_contact_detail_ug(void *parent_ug, int contact_index, PH_FN_CALL; char buf[PH_TEXT_MAX_LEN] = {0}; struct ug_cbs cbs = {0}; - bundle *bd; - struct ui_gadget *ug; + service_h service; + ui_gadget_h ug; struct ug_priv_data *priv_data; priv_data = calloc(1, sizeof(struct ug_priv_data)); @@ -174,24 +197,20 @@ void* phone_launch_contact_detail_ug(void *parent_ug, int contact_index, priv_data->destroy_cb = destroy_cb; priv_data->cb_param = cb_param; - bd = bundle_create(); - if (NULL == bd) { - ERR("bundle_create() Failed"); - free(priv_data); - return NULL; - } + service_create(&service); + snprintf(buf, sizeof(buf), "%d", contact_index); - bundle_add(bd, CT_UG_BUNDLE_ID, buf); + service_add_extra_data(service, CT_UG_BUNDLE_ID, buf); snprintf(buf, sizeof(buf), "%d", CT_UG_REQUEST_DETAIL); - bundle_add(bd, CT_UG_BUNDLE_TYPE, buf); + service_add_extra_data(service, CT_UG_BUNDLE_TYPE, buf); cbs.priv = priv_data; cbs.layout_cb = ug_common_layout_cb; cbs.result_cb = NULL; cbs.destroy_cb = ug_common_destroy_cb; - ug = ug_create(parent_ug, UG_CONTACTS_DETAILS, UG_MODE_FULLVIEW, bd, &cbs); - bundle_free(bd); + ug = ug_create(parent_ug, UG_CONTACTS_DETAILS, UG_MODE_FULLVIEW, service, &cbs); + service_destroy(service); if (NULL == ug) { free(priv_data); @@ -207,24 +226,20 @@ void* phone_launch_contact_add_list_edit_ug(void *parent_ug, char *data, char buf[PH_TEXT_MAX_LEN] = {0}; struct ug_cbs cbs = {0}; struct ug_priv_data *priv_data; - struct ui_gadget *ug; - bundle *kb; + ui_gadget_h ug; + service_h service; priv_data = calloc(1, sizeof(struct ug_priv_data)); p_retvm_if(NULL == priv_data, NULL, "calloc is failed"); priv_data->destroy_cb = destroy_cb; priv_data->cb_param = cb_param; - kb = bundle_create(); - if (NULL == kb) { - ERR("bundle_create() Failed"); - free(priv_data); - return NULL; - } + service_create(&service); + snprintf(buf, sizeof(buf), "%d", CT_UG_REQUEST_UPDATE_WITH_NUM); - bundle_add(kb, CT_UG_BUNDLE_TYPE, buf); + service_add_extra_data(service, CT_UG_BUNDLE_TYPE, buf); snprintf(buf, sizeof(buf), "%s", data); - bundle_add(kb, CT_UG_BUNDLE_NUM, buf); + service_add_extra_data(service, CT_UG_BUNDLE_NUM, buf); PH_DBG("number %s", buf); cbs.priv = priv_data; @@ -232,8 +247,8 @@ void* phone_launch_contact_add_list_edit_ug(void *parent_ug, char *data, cbs.result_cb = NULL; cbs.destroy_cb = ug_common_destroy_cb; - ug = ug_create(parent_ug, UG_CONTACTS_LIST, UG_MODE_FULLVIEW, kb, &cbs); - bundle_free(kb); + ug = ug_create(parent_ug, UG_CONTACTS_LIST, UG_MODE_FULLVIEW, service, &cbs); + service_destroy(service); if (NULL == ug) { free(priv_data); ERR("%s ug_create fail", UG_CONTACTS_LIST); @@ -241,16 +256,17 @@ void* phone_launch_contact_add_list_edit_ug(void *parent_ug, char *data, return ug; } -static void ug_contact_list_result_cb(struct ui_gadget *ug, bundle *result, void *priv) +static void ug_contact_list_result_cb(ui_gadget_h ug, service_h service, void *priv) { PH_FN_CALL; - const char *temp_p = NULL; + char *temp_p = NULL; struct ug_priv_data *priv_data = priv; int id; p_retm_if(NULL == priv, "private data is NULL"); - temp_p = bundle_get_val(result, "id"); + service_get_extra_data(service, "id", &temp_p); id = atoi(temp_p); + free(temp_p); if (priv_data->result_cb) priv_data->result_cb(priv_data->cb_param, (void*)&id); PH_FN_END; @@ -262,9 +278,9 @@ void* phone_launch_contact_list_ug(void *parent_ug, int request, PH_FN_CALL; char ug_request[PH_TEXT_MAX_LEN] = {0}; struct ug_priv_data *priv_data; - struct ui_gadget *ug; + ui_gadget_h ug; struct ug_cbs cbs = {0}; - bundle *kb; + service_h service; priv_data = calloc(1, sizeof(struct ug_priv_data)); p_retvm_if(NULL == priv_data, NULL, "calloc is failed"); @@ -272,22 +288,18 @@ void* phone_launch_contact_list_ug(void *parent_ug, int request, priv_data->result_cb = result_cb; priv_data->cb_param = cb_param; - kb = bundle_create(); - if (NULL == kb) { - ERR("bundle_create() Failed"); - free(priv_data); - return NULL; - } + service_create(&service); + snprintf(ug_request, sizeof(ug_request), "%d", request); - bundle_add(kb, CT_UG_BUNDLE_TYPE, ug_request); + service_add_extra_data(service, CT_UG_BUNDLE_TYPE, ug_request); cbs.priv = priv_data; cbs.layout_cb = ug_common_layout_cb; cbs.destroy_cb = ug_common_destroy_cb; cbs.result_cb = ug_contact_list_result_cb; - ug = ug_create(parent_ug, UG_CONTACTS_LIST, UG_MODE_FULLVIEW, kb, &cbs); - bundle_free(kb); + ug = ug_create(parent_ug, UG_CONTACTS_LIST, UG_MODE_FULLVIEW, service, &cbs); + service_destroy(service); if (NULL == ug) { free(priv_data); ERR("%s ug_create fail", UG_CONTACTS_LIST); @@ -295,6 +307,43 @@ void* phone_launch_contact_list_ug(void *parent_ug, int request, return ug; } +Evas_Object* phone_create_list_sweep_btn(Evas_Object *parent, char *fullpath) +{ + Evas_Object *btn; + Evas_Object *icon; + + btn = elm_button_add(parent); + 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_file_set(icon, fullpath, NULL); + elm_icon_resizable_set(icon, EINA_FALSE, EINA_FALSE); + elm_object_part_content_set(btn, "icon", icon); + + return btn; +} + +void phone_resize_notify(Evas_Object *parent, int rotate) +{ + Evas_Object *notify; + Evas_Object *layout; + const char *msg; + p_retm_if(NULL == parent, "parent is NULL"); + notify = phone_get_notify(parent); + layout = elm_object_content_get(notify); + msg = edje_object_part_text_get(_EDJ(layout), "elm.text"); + + if (0 == rotate || 180 == rotate) + elm_layout_theme_set(layout, "standard", "selectioninfo", "vertical/bottom_64"); + else + elm_layout_theme_set(layout, "standard", "selectioninfo", "horizontal/bottom_64"); + + if (msg && *msg) + edje_object_part_text_set(_EDJ(layout), "elm.text", msg); +} + Evas_Object * phone_get_notify(Evas_Object *parent) { Evas_Object *notify; @@ -308,13 +357,24 @@ Evas_Object * phone_get_notify(Evas_Object *parent) info_layout = elm_layout_add(parent); elm_layout_theme_set(info_layout, "standard", "selectioninfo", "vertical/bottom_64"); elm_object_content_set(notify, info_layout); - evas_object_layer_set(notify, EVAS_LAYER_MAX); evas_object_data_set(parent, "notify", notify); } return notify; } -void phone_show_notify(Evas_Object *parent, const char *msg, double timeout) +void phone_show_tickernoti(const char *msg) +{ + bundle *b; + b = bundle_create(); + bundle_add(b, "0", "info"); + bundle_add(b, "1", msg); + bundle_add(b, "2", "0"); + bundle_add(b, "3", "2"); + syspopup_launch("tickernoti-syspopup", b); + bundle_free(b); +} + +void phone_show_notify(Evas_Object *parent, const char *msg) { Evas_Object *layout; Evas_Object *notify; @@ -323,7 +383,7 @@ void phone_show_notify(Evas_Object *parent, const char *msg, double timeout) layout = elm_object_content_get(notify); edje_object_part_text_set(_EDJ(layout), "elm.text", msg); - elm_notify_timeout_set(notify, timeout); + elm_notify_timeout_set(notify, 0.0); if (evas_object_visible_get(notify)) evas_object_hide(notify); @@ -340,56 +400,82 @@ void phone_hide_notify(Evas_Object *parent) evas_object_hide(notify); } +static void popup_cancel_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object **popup = data; + evas_object_del(*popup); + *popup = NULL; +} + static void popup_block_clicked_cb(void *data, Evas_Object *obj, void *event_info) { evas_object_del(obj); } -Evas_Object *phone_create_popup(Evas_Object *parent, const char *desc, double timeout) +Evas_Object *phone_show_popup(Evas_Object *parent, const char *desc, double timeout) { Evas_Object *popup; - popup = elm_popup_add(parent); - evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_smart_callback_add(popup, "block,clicked", popup_block_clicked_cb, NULL); - elm_popup_timeout_set(popup, timeout); + + popup = evas_object_data_get(parent, "popup"); + if (NULL == popup) { + popup = elm_popup_add(parent); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_smart_callback_add(popup, "block,clicked", popup_block_clicked_cb, NULL); + evas_object_show(popup); + } elm_object_text_set(popup, desc); - evas_object_show(popup); + elm_popup_timeout_set(popup, timeout); return popup; } -Evas_Object* phone_create_confirm_popup(Evas_Object *win, const char* description) +Evas_Object* phone_create_confirm_popup(Evas_Object **popup, Evas_Object *win, const char* description, + void (*btn_clicked_cb)(void *, Evas_Object *, void *), void *cb_data) { - Evas_Object* popup = elm_popup_add(win); - evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_object_text_set(popup, description); - evas_object_show(popup); + Evas_Object *btn1, *btn2; + *popup = elm_popup_add(win); + evas_object_size_hint_weight_set(*popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(*popup, description); - return popup; + 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", btn_clicked_cb, cb_data); + + 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", popup_cancel_btn_cb, &(*popup)); + + evas_object_show(*popup); + + return btn1; } -void phone_launch_voice_call(char *number, int ct_id) +void phone_launch_voice_call(const int id, const char* number) { - PH_FN_CALL; - bundle * kb; char buf[PH_TEXT_MAX_LEN] = {0}; - p_retm_if(NULL == number, "data is null"); + service_h service; + int ret; - kb = bundle_create(); - p_retm_if(NULL == kb, "bundle_create() Failed"); + ret = service_create(&service); + p_retm_if(SERVICE_ERROR_NONE != ret, "service_create() Failed(%d)", ret); - appsvc_set_operation(kb, APPSVC_OPERATION_CALL); + service_set_operation(service, SERVICE_OPERATION_CALL); snprintf(buf, sizeof(buf), "tel:%s", number); - appsvc_set_uri(kb, buf); - if (0 < ct_id) { - snprintf(buf, sizeof(buf), "%d", ct_id); - appsvc_add_data(kb, "ctindex", buf); - } - appsvc_run_service(kb, 0, NULL, NULL); + service_set_uri(service, buf); + + if (0 < id) { + snprintf(buf, sizeof(buf), "%d", id); + service_add_extra_data(service, "ctindex", buf); - bundle_free(kb); + } + service_send_launch_request(service, NULL, NULL); + service_destroy(service); } -Evas_Object* phone_create_layout(Evas_Object *parent, bool is_fullview) +Evas_Object* phone_create_base_layout(Evas_Object *parent, bool is_fullview) { Evas_Object *base; @@ -419,10 +505,10 @@ void phone_back_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info) elm_win_lower(win); } -char *phone_get_display_name_from_value(CTSvalue *value, int display_field, int first_field, int last_field) +char* phone_get_display_name_from_value(CTSvalue *value, int display_field, int first_field, int last_field) { const char *first, *last; - char *display, name[PATH_MAX]; + char *display, name[PH_TEXT_MAX_LEN]; display = contacts_svc_value_steal_str(value, display_field); if (display) return display; @@ -431,9 +517,9 @@ char *phone_get_display_name_from_value(CTSvalue *value, int display_field, int last = contacts_svc_value_get_str(value, last_field); if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) - snprintf(name, sizeof(name), "%s%s%s", SAFE_STR(first), STR_BLANK(last)); + snprintf(name, sizeof(name), "%s%s%s", SAFE_STR(first), STR_BLANK(first, last)); else - snprintf(name, sizeof(name), "%s%s%s", SAFE_STR(last), STR_BLANK(first)); + snprintf(name, sizeof(name), "%s%s%s", SAFE_STR(last), STR_BLANK(last, first)); return strdup(name); } @@ -458,6 +544,7 @@ Evas_Object* phone_progressbar_popup(Evas_Object *parent, ph_progress_info *p_in Evas_Object *layout; Evas_Object *label; Evas_Object *progressbar; + Evas_Object *btn; popup = elm_popup_add(parent); p_retvm_if(NULL == popup, NULL, "elm_popup_add() return NULL"); @@ -470,19 +557,27 @@ Evas_Object* phone_progressbar_popup(Evas_Object *parent, ph_progress_info *p_in label = elm_label_add(layout); p_retvm_if(NULL == label, NULL, "elm_label_add() return NULL"); - snprintf(buf, sizeof(buf), "<align=middle>%s</>", title); + snprintf(buf, sizeof(buf), "<color=#000000><align=middle>%s</align></color>", title); elm_object_text_set(label, buf); elm_object_style_set(label, "popup_description/default"); elm_label_line_wrap_set(label, EINA_TRUE); - evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(label); progressbar = elm_progressbar_add(layout); p_retvm_if(NULL == progressbar, NULL, "elm_progressbar_add() return NULL"); p_info->progressbar= progressbar; - elm_object_style_set(progressbar, "list_progress"); - elm_progressbar_value_set(progressbar, 0.0); + + if (0 < p_info->cnt_checked_total) { + elm_object_style_set(progressbar, "list_progress"); + elm_progressbar_value_set(progressbar, 0.0); + } + else { + elm_object_style_set(progressbar, "pending_list"); + elm_progressbar_pulse(progressbar, EINA_TRUE); + } + evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(progressbar); @@ -490,6 +585,14 @@ Evas_Object* phone_progressbar_popup(Evas_Object *parent, ph_progress_info *p_in elm_object_part_content_set(layout, "elm.swallow.end", progressbar); elm_object_content_set(popup, layout); + if(false == p_info->without_cancel_btn) + { + 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", progress_popup_cancel_cb, &p_info->alive); + } evas_object_show(popup); return popup; } @@ -497,7 +600,7 @@ Evas_Object* phone_progressbar_popup(Evas_Object *parent, ph_progress_info *p_in void phone_cbar_item_clear(Evas_Object *cbar) { Elm_Object_Item *c_item, *n_item; - p_retm_if(NULL == cbar, "parameter(toolbar) is NULL"); + p_retm_if(NULL == cbar, "parameter(controlbar) is NULL"); c_item = elm_toolbar_first_item_get(cbar); while(c_item) { n_item = elm_toolbar_item_next_get(c_item); @@ -516,7 +619,17 @@ Evas_Object *phone_create_icon_with_img(Evas_Object *parent, char *full_path) return ic; } -Evas_Object* phone_naviframe_btn(Evas_Object *parent, const char *label) +char* ctui_get_addrbook_icon_path(int type) +{ + switch (type) { + case CTS_ADDRESSBOOK_TYPE_INTERNAL: + return CTUI_IMG_ACC_PHONE; + default: + return CTUI_IMG_ACC_DEFAULT; + } +} + +Evas_Object* phone_create_navi_btn(Evas_Object *parent, const char *label) { Evas_Object *btn; @@ -528,6 +641,154 @@ Evas_Object* phone_naviframe_btn(Evas_Object *parent, const char *label) return btn; } +void phone_set_view_info(ph_view_info *view_info, Evas_Object *win, Evas_Object *navi, + void *ug, int ug_request, int cnt_max, char *ug_data) +{ + view_info->win = win; + view_info->navi = navi; + view_info->ug = ug; + view_info->ug_request = ug_request; + view_info->ug_cnt_max = cnt_max; + view_info->ug_data = ug_data; +} + +void phone_list_ug_return_ids(ui_gadget_h ug, int *result_list, int cnt, const char *bd_key) +{ + gchar *encoded_str; + service_h service; + + service_create(&service); + + if (result_list) { + encoded_str = g_base64_encode((guchar *)result_list, cnt*sizeof(int)); + service_add_extra_data(service, bd_key, encoded_str); + g_free(encoded_str); + } + + ug_send_result(ug, service); + + service_destroy(service); +} + +#define CT_UG_BUNDLE_RESULT_ID "id" +#define CT_UG_BUNDLE_RESULT_VCARD "vcard" + +void phone_ug_return_id(ui_gadget_h ug, int ct_id, int num_id, int email_id) +{ + service_h service; + char buf[16]; + + service_create(&service); + + if (ct_id) { + snprintf(buf, sizeof(buf), "%d", ct_id); + service_add_extra_data(service, CT_UG_BUNDLE_RESULT_ID, buf); + service_add_extra_data(service, CT_UG_BUNDLE_RESULT_CONTACT_ID, buf); + } + + if (num_id) { + snprintf(buf, sizeof(buf), "%d", num_id); + service_remove_extra_data(service, CT_UG_BUNDLE_RESULT_ID); + service_add_extra_data(service, CT_UG_BUNDLE_RESULT_ID, buf); + service_add_extra_data(service, CT_UG_BUNDLE_RESULT_NUMBER_ID, buf); + } + + if (email_id) { + snprintf(buf, sizeof(buf), "%d", email_id); + service_remove_extra_data(service, CT_UG_BUNDLE_RESULT_ID); + service_add_extra_data(service, CT_UG_BUNDLE_RESULT_ID, buf); + service_add_extra_data(service, CT_UG_BUNDLE_RESULT_EMAIL_ID, buf); + } + + ug_send_result(ug, service); + + service_destroy(service); +} + +void phone_ug_return_vcard(ui_gadget_h ug, int ct_id, char *vcard) +{ + service_h service; + char buf[16]; + + service_create(&service); + + if (ct_id) { + snprintf(buf, sizeof(buf), "%d", ct_id); + service_add_extra_data(service, CT_UG_BUNDLE_RESULT_ID, buf); + } + + if (vcard) { + service_add_extra_data(service, CT_UG_BUNDLE_RESULT_VCARD, vcard); + } + + ug_send_result(ug, service); + + service_destroy(service); +} + + +static void editfield_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + if (!elm_entry_is_empty(obj)) + elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm"); + + if (elm_object_focus_get(data)) { + if (elm_entry_is_empty(obj)) + elm_object_signal_emit(data, "elm,state,eraser,hide", "elm"); + else + elm_object_signal_emit(data, "elm,state,eraser,show", "elm"); + } +} +static void editfield_focused_cb(void *data, Evas_Object *obj, void *event_info) +{ + if (!elm_entry_is_empty(obj)) + elm_object_signal_emit(data, "elm,state,eraser,show", "elm"); + elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm"); +} + +static void editfield_unfocused_cb(void *data, Evas_Object *obj, void *event_info) +{ + if (elm_entry_is_empty(obj)) + elm_object_signal_emit(data, "elm,state,guidetext,show", "elm"); + elm_object_signal_emit(data, "elm,state,eraser,hide", "elm"); +} + +static void editfield_eraser_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + elm_entry_entry_set(data, ""); +} + +Evas_Object* ctui_create_editfield(Evas_Object *parent, const char *title, const char *guide, bool multiline) +{ + Evas_Object *layout, *entry; + + layout = elm_layout_add(parent); + if (title && *title) { + elm_layout_theme_set(layout, "layout", "editfield", "title"); + elm_object_part_text_set(layout, "elm.text", title); + } + else + elm_layout_theme_set(layout, "layout", "editfield", "default"); + + if (guide && *guide) + elm_object_part_text_set(layout, "elm.guidetext", guide); + + entry = elm_entry_add(parent); + if (!multiline) { + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_entry_single_line_set(entry, EINA_TRUE); + ctui_entry_limit_size_set(entry); + } + elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_NO_IMAGE); + elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NORMAL); + evas_object_smart_callback_add(entry, "changed", editfield_changed_cb, layout); + evas_object_smart_callback_add(entry, "focused", editfield_focused_cb, layout); + evas_object_smart_callback_add(entry, "unfocused", editfield_unfocused_cb, layout); + elm_object_part_content_set(layout, "elm.swallow.content", entry); + elm_object_signal_callback_add(layout, "elm,eraser,clicked", "elm", editfield_eraser_clicked_cb, entry); + return layout; +} + Evas_Object* phone_create_nocontents(Evas_Object *parent, const char* label) { Evas_Object *layout; @@ -541,26 +802,119 @@ Evas_Object* phone_create_nocontents(Evas_Object *parent, const char* label) return layout; } -Evas_Object* phone_create_popup_button(Evas_Object *popup, int index, const char* label, Evas_Smart_Cb cb, void *cb_data) +void ctui_genlist_append_separator_20px_with_line(Evas_Object *genlist) { - Evas_Object *btn; - char part[PH_TEXT_SHORT_LEN]; - - btn = elm_button_add(popup); - elm_object_text_set(btn, label); - snprintf(part, sizeof(part), "button%d", index); + static Elm_Genlist_Item_Class itc = { .item_style="dialogue/separator/21/with_line"}; - elm_object_part_content_set(popup, part, btn); - evas_object_smart_callback_add(btn, "clicked", cb, cb_data); - return btn; + 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); } -void phone_toolbar_disalbed_item_append(Evas_Object *toolbar, int cnt) +void phone_toolbar_disabled_item_append(Evas_Object *toolbar, int cnt) { int i; Elm_Object_Item *item; - for(i=0;i<cnt;i++) { + for (i=0;i<cnt;i++) { item = elm_toolbar_item_append(toolbar, NULL, NULL, NULL, NULL); elm_object_item_disabled_set(item, EINA_TRUE); } } + +void ctui_navi_left_btn_disabled_set(Elm_Object_Item *item, Eina_Bool disabled) +{ + Evas_Object *btn; + btn = elm_object_item_part_content_get(item, "title_left_btn"); + p_retm_if(NULL == btn, "elm_object_item_part_content_get() return NULL"); + elm_object_focus_set(btn, EINA_FALSE); + elm_object_disabled_set(btn, disabled); +} + +static void genlist_selectall_mouseup_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + int x, y, w, h; + Eina_Bool is_checked; + Evas_Object *check; + Evas_Event_Mouse_Up *ev = event_info; + void *cb_data; + selectall_changed_cb changed_cb = data; + + if (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 == changed_cb, "changed_cb is NULL"); + + check = elm_object_part_content_get(obj, "elm.icon"); + p_retm_if(NULL == check, "elm_object_part_content_get() return NULL"); + + cb_data = evas_object_data_get(check, "cb_data"); + p_retm_if(NULL == cb_data, "cb_data is NULL"); + + is_checked = !elm_check_state_get(check); + elm_check_state_set(check, is_checked); + + changed_cb(cb_data, is_checked); +} + +static void genlist_selectall_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + Eina_Bool is_checked; + void *cb_data; + selectall_changed_cb changed_cb = data; + p_retm_if(NULL == changed_cb, "changed_cb is NULL"); + + cb_data = evas_object_data_get(obj, "cb_data"); + p_retm_if(NULL == cb_data, "cb_data is NULL"); + + is_checked = elm_check_state_get(obj); + changed_cb(cb_data, is_checked); +} + +Evas_Object* phone_create_select_all(Evas_Object *parent, const char *selectall_text, + selectall_changed_cb changed_cb, void *cb_data) +{ + Evas_Object *layout; + Evas_Object *check; + + p_retvm_if(NULL == parent, NULL, "parameter(parent) is NULL"); + + layout = elm_layout_add(parent); + p_retvm_if(NULL == layout, NULL, "elm_layout_add() return NULL"); + elm_layout_theme_set(layout, "genlist", "item", "select_all/default"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_UP, genlist_selectall_mouseup_cb, changed_cb); + + check = elm_check_add(layout); + p_retvm_if(NULL == check, NULL, "elm_check_add() return NULL"); + evas_object_propagate_events_set(check, EINA_FALSE); + elm_object_part_content_set(layout, "elm.icon", check); + evas_object_smart_callback_add(check, "changed", genlist_selectall_changed_cb, changed_cb); + evas_object_data_set(check, "cb_data", cb_data); + + elm_object_part_text_set(layout, "elm.text", selectall_text); + evas_object_show(layout); + + return layout; +} + +void phone_move_ctxpopup(Evas_Object *popup, Evas_Object *item) +{ + int x,y,w,h; + int pos_x; + int pos_y; + p_retm_if(NULL == popup, "parameter(popup) is NULL"); + p_retm_if(NULL == item, "parameter(item) is NULL"); + + evas_object_geometry_get(item, &x, &y, &w, &h); + + pos_x = x + (Evas_Coord)w/2; + pos_y = y + (Evas_Coord)h/2; + + evas_object_move(popup, pos_x, pos_y); +} diff --git a/lib/common/ph-detail-log.c b/lib/common/ph-detail-log.c new file mode 100755 index 0000000..084b6cc --- /dev/null +++ b/lib/common/ph-detail-log.c @@ -0,0 +1,404 @@ +/* + * 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 <unicode/udat.h> +#include <unicode/udatpg.h> +#include <unicode/ucal.h> +#include <unicode/ustring.h> +#include <vconf.h> +#include <vconf-keys.h> +#include <runtime_info.h> + +#include "phone-common.h" + +enum{ + LOG_FORMAT_TIME_12 = 0, + LOG_FORMAT_TIME_24, + LOG_FORMAT_DATE, + LOG_FORMAT_MAX, +}; + +static const char *date_time_format[] = { + "hm", + "Hm", + "yMMMdd", + "yMMMddhm", + "yMMMddHm", +}; + +static char *m_img_logtype_tbl[LOG_TYPE_MAX] = { + IMGDIR"/C01-4_list_icon_call.png", + IMGDIR"/C01-4_list_icon_vt-call.png", + IMGDIR"/C01-4_list_icon_sms.png", + IMGDIR"/C01-4_list_icon_mms.png" +}; + +static char *m_img_logaction_tbl[LOG_ACTION_MAX] = { + IMGDIR"/C01-4_icon_dialed.png", + IMGDIR"/C01-4_icon_missed-call.png", + IMGDIR"/C01-4_icon_received.png", + IMGDIR"/C01-4_icon_rejected.png", + IMGDIR"/C01-4_icon_Blocked(Auto-rejected).png" +}; + +static bool is_24hour_enabled = false; + +int phone_detail_log_is_call_ing_type(int type) +{ + switch (type) { + case CTS_PLOG_TYPE_VOICE_INCOMMING: + case CTS_PLOG_TYPE_VOICE_OUTGOING: + case CTS_PLOG_TYPE_VIDEO_INCOMMING: + case CTS_PLOG_TYPE_VIDEO_OUTGOING: + return TRUE; + default: + return FALSE; + } +} + +static int detail_log_is_voice_call_type(int type) +{ + switch (type) { + case CTS_PLOG_TYPE_VOICE_INCOMMING: + case CTS_PLOG_TYPE_VOICE_OUTGOING: + case CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN: + case CTS_PLOG_TYPE_VOICE_INCOMMING_SEEN: + case CTS_PLOG_TYPE_VOICE_REJECT: + case CTS_PLOG_TYPE_VOICE_BLOCKED: + return TRUE; + default: + return FALSE; + } +} + +int phone_detail_log_is_mms_type(int type) +{ + if (type == CTS_PLOG_TYPE_MMS_INCOMMING + || type == CTS_PLOG_TYPE_MMS_OUTGOING + || type == CTS_PLOG_TYPE_MMS_BLOCKED) + return TRUE; + else + return FALSE; +} + +int phone_detail_log_is_sms_type(int type) +{ + if (type == CTS_PLOG_TYPE_SMS_INCOMMING + || type == CTS_PLOG_TYPE_SMS_OUTGOING + || type == CTS_PLOG_TYPE_SMS_BLOCKED) + return TRUE; + else + return FALSE; +} + +int phone_detail_log_is_email_type(int type) +{ + if (type == CTS_PLOG_TYPE_EMAIL_RECEIVED + || type == CTS_PLOG_TYPE_EMAIL_SENT) + return TRUE; + else + return FALSE; +} + + +static int detail_log_is_video_call_type(int type) +{ + switch (type) { + case CTS_PLOG_TYPE_VIDEO_INCOMMING: + case CTS_PLOG_TYPE_VIDEO_OUTGOING: + case CTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN: + case CTS_PLOG_TYPE_VIDEO_INCOMMING_SEEN: + case CTS_PLOG_TYPE_VIDEO_REJECT: + case CTS_PLOG_TYPE_VIDEO_BLOCKED: + return TRUE; + default: + return FALSE; + } +} + +static int phone_detail_log_is_call_dial_type(int type) +{ + if (type == CTS_PLOG_TYPE_VOICE_OUTGOING + || type == CTS_PLOG_TYPE_VIDEO_OUTGOING) + return TRUE; + else + return FALSE; +} + +static int detail_log_is_msg_out_type(int type) +{ + if (type == CTS_PLOG_TYPE_MMS_OUTGOING + || type == CTS_PLOG_TYPE_SMS_OUTGOING + || type == CTS_PLOG_TYPE_EMAIL_SENT) + return TRUE; + else + return FALSE; + +} + +static int detail_log_is_call_receive_type(int type) +{ + if (type == CTS_PLOG_TYPE_VOICE_INCOMMING + || type == CTS_PLOG_TYPE_VIDEO_INCOMMING) + return TRUE; + else + return FALSE; +} + +static int detail_log_is_msg_income_type(int type) +{ + if (type == CTS_PLOG_TYPE_MMS_INCOMMING + || type == CTS_PLOG_TYPE_SMS_INCOMMING + || type == CTS_PLOG_TYPE_EMAIL_RECEIVED) + return TRUE; + else + return FALSE; +} + +static int detail_log_is_call_miss_type(int type) +{ + switch (type) { + case CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN: + case CTS_PLOG_TYPE_VOICE_INCOMMING_SEEN: + case CTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN: + case CTS_PLOG_TYPE_VIDEO_INCOMMING_SEEN: + return TRUE; + default: + return FALSE; + } +} + +static int detail_log_is_call_rejected_type(int type) +{ + if (type == CTS_PLOG_TYPE_VOICE_REJECT + || type == CTS_PLOG_TYPE_VIDEO_REJECT) + return TRUE; + else + return FALSE; +} + +static int detail_log_is_blocked_type(int type) +{ + switch (type) { + case CTS_PLOG_TYPE_VOICE_BLOCKED: + case CTS_PLOG_TYPE_VIDEO_BLOCKED: + case CTS_PLOG_TYPE_SMS_BLOCKED: + case CTS_PLOG_TYPE_MMS_BLOCKED: + return TRUE; + default: + return FALSE; + } +} + +char* phone_detail_log_get_icon_type(int log_type) +{ + Log_Type type = -1; + char buf[PATH_MAX]={0}; + + if (TRUE == detail_log_is_voice_call_type(log_type)) + type = LOG_TYPE_CALL; + else if (TRUE == detail_log_is_video_call_type(log_type)) + type = LOG_TYPE_VIDEO_CALL; + else if (TRUE == phone_detail_log_is_sms_type(log_type)) + type = LOG_TYPE_SMS_MESSAGE; + else if (TRUE == phone_detail_log_is_mms_type(log_type)) + type = LOG_TYPE_MMS_MESSAGE; + else if (TRUE == phone_detail_log_is_email_type(log_type)) + type = LOG_TYPE_MMS_MESSAGE; + else { + PH_DBG("error invalid type"); + return NULL; + } + snprintf(buf, sizeof(buf), "%s", m_img_logtype_tbl[type]); + return strdup(buf); +} + +char* phone_detail_log_get_duration_from_number(int number) +{ + int sec, min, hour, day; + struct tm tmp={0}; + char buf[PATH_MAX]={0}; + char buf_t[PATH_MAX]={0}; + + sec = number; + day = sec/(60*60*24); + sec %= (60*60*24); + hour = sec/(60*60); + sec %= (60*60); + min = sec/(60); + sec %= (60); + tmp.tm_mday = day; + tmp.tm_hour = hour; + tmp.tm_min = min; + tmp.tm_sec = sec; + strftime(buf_t, sizeof(buf_t), "%H:%M:%S", &tmp); + snprintf(buf, sizeof(buf), "%s", buf_t); + + return strdup(buf_t); +} + +void phone_detail_log_init_time_format(void) +{ + static int already_init = FALSE; + + if (!already_init) { + UErrorCode status = U_ZERO_ERROR; + uloc_setDefault(getenv("LC_TIME"), &status); + already_init = TRUE; + } +} + +void phone_detail_log_delete_date_format(UDateFormat **formatter) +{ + int i; + for (i=LOG_FORMAT_TIME_12;i<LOG_FORMAT_MAX;i++) { + if (formatter[i]) { + udat_close(formatter[i]); + formatter[i] = NULL; + } + } +} + +void phone_detail_log_generate_date_format(UDateFormat **formatter) +{ + PH_FN_CALL; + UDateTimePatternGenerator *generator; + UErrorCode error = U_ZERO_ERROR; + UChar utimezone_id [256] = {0}; + char *timezone_id = NULL; + const char *locale; + int i; + int ret; + + timezone_id = vconf_get_str(VCONFKEY_SETAPPL_TIMEZONE_ID); + if (timezone_id) { + u_uastrncpy(utimezone_id, timezone_id, strlen(timezone_id)); + ucal_setDefaultTimeZone(utimezone_id , &error); + free(timezone_id); + } + + ret = runtime_info_get_value_bool(RUNTIME_INFO_KEY_24HOUR_CLOCK_FORMAT_ENABLED, &is_24hour_enabled); + if (RUNTIME_INFO_ERROR_NONE != ret || false == is_24hour_enabled) + is_24hour_enabled = false; + + locale = uloc_getDefault(); + phone_detail_log_delete_date_format(formatter); + + generator = udatpg_open(locale, &error); + p_retm_if(NULL == generator, "udatpg_open is failed(%d)", error); + + for (i=LOG_FORMAT_TIME_12;i<LOG_FORMAT_MAX;i++) { + UChar skeleton[64]={'\0'}; + UChar best_pattern[64] = {0}; + + u_uastrncpy(skeleton, date_time_format[i], strlen(date_time_format[i])); + udatpg_getBestPattern(generator, skeleton, u_strlen(skeleton), best_pattern, + (int32_t)(sizeof(best_pattern)/sizeof(UChar)), &error); + formatter[i] = udat_open(UDAT_IGNORE, UDAT_IGNORE, locale, NULL, -1, best_pattern, -1, &error); + } + udatpg_close(generator); +} + +char* phone_detail_log_get_icon_path_with_action(int log_type) +{ + char buf[PATH_MAX]={0}; + Log_Action action = -1; + + if (TRUE == phone_detail_log_is_call_dial_type(log_type) || TRUE == detail_log_is_msg_out_type(log_type)) + action = LOG_ACTION_DIALLED; + else if (TRUE == detail_log_is_call_miss_type(log_type)) + action = LOG_ACTION_MISSED; + else if (TRUE == detail_log_is_call_receive_type(log_type) || TRUE == detail_log_is_msg_income_type(log_type)) + action = LOG_ACTION_RECEIVED; + else if (TRUE == detail_log_is_call_rejected_type(log_type)) + action = LOG_ACTION_REJECTED; + else if (TRUE == detail_log_is_blocked_type(log_type)) + action = LOG_ACTION_BLOCKED; + else { + PH_DBG("error invalid type %d", log_type); + return NULL; + } + snprintf(buf, sizeof(buf), "%s", m_img_logaction_tbl[action]); + return strdup(buf); +} + +char *ph_log_util_get_formatted_date(UDateFormat **formatter, int log_time, + date_style style) +{ + time_t stime; + UErrorCode status = U_ZERO_ERROR; + UDate date; + UChar formatted[64] = {0}; + int32_t formatted_size; + int32_t formatted_len; + char formatted_str[PH_TEXT_SHORT_LEN] = {0}; + int type = LOG_FORMAT_DATE; + + stime = log_time; + date = (UDate)stime * 1000; + + formatted_size = (int32_t)(sizeof(formatted)/sizeof(UChar)); + if (PH_LOG_TIME_ONLY == style) { + if (true == is_24hour_enabled) + type = LOG_FORMAT_TIME_24; + else + type = LOG_FORMAT_TIME_12; + } + else if (PH_LOG_DATE_ONLY == style) + type = LOG_FORMAT_DATE; + formatted_len = udat_format(formatter[type], date, formatted, formatted_size, NULL, &status); + u_austrncpy(formatted_str, formatted, PH_TEXT_SHORT_LEN); + return strdup(formatted_str); +} + +char *phone_detail_log_get_date(UDateFormat ** formatter, int log_time) +{ + return ph_log_util_get_formatted_date(formatter, log_time, PH_LOG_DATE_ONLY); +} + +char *phone_detail_log_get_time(UDateFormat ** formatter, int log_time) +{ + return ph_log_util_get_formatted_date(formatter, log_time, PH_LOG_TIME_ONLY);; +} + + +// 0: today, 1: yesterday, 2: previous +int phone_detail_log_get_date_type(int log_time, int log_duration) +{ + time_t stime; + struct timeval timeval; + struct tm *tmp; + int yday, cur_yday; + + gettimeofday(&timeval, 0); + tmp = localtime(&timeval.tv_sec); + p_retvm_if(NULL == tmp, 2, "localtime is null"); + cur_yday = tmp->tm_yday; + + stime = log_time - log_duration; + tmp = localtime(&stime); + p_retvm_if(NULL == tmp, 2, "localtime is null"); + + yday = tmp->tm_yday; + + if (yday == cur_yday) + return 0; + else if (yday == cur_yday-1) + return 1; + else + return 2; +} diff --git a/lib/common/ph-dialer-speed.c b/lib/common/ph-dialer-speed.c new file mode 100755 index 0000000..a527e15 --- /dev/null +++ b/lib/common/ph-dialer-speed.c @@ -0,0 +1,122 @@ +/* + * 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 <contacts-svc.h> +#include "msg.h" +#include "phone.h" +#include "phone-common.h" + +static char *get_voice_mail_number() +{ + int ret; + msg_handle_t handle; + msg_struct_t voice_mail; + char strValue[MAX_PHONE_NUMBER_LEN+1] = {0,}; + + ret = msg_open_msg_handle(&handle); + p_retvm_if (MSG_SUCCESS != ret, NULL, "msg_open_msg_handle is Failed(%d)", ret); + + voice_mail = msg_create_struct(MSG_STRUCT_SETTING_VOICE_MSG_OPT); + ret = msg_get_voice_msg_opt(handle, voice_mail); + + if (ret != MSG_SUCCESS) { + ERR("msg_get_confi is faild(%d)", ret); + ret = msg_close_msg_handle(&handle); + p_warn_if (MSG_SUCCESS != ret, "msg_close_msg_handles is Failed(%d)", ret); + return NULL; + } + + msg_get_str_value(voice_mail, MSG_VOICEMSG_ADDRESS_STR, strValue, MAX_PHONE_NUMBER_LEN); + + ret = msg_close_msg_handle(&handle); + p_warn_if (MSG_SUCCESS != ret, "msg_close_msg_handles is Failed(%d)", ret); + + return strdup(strValue); +} + +Eina_List *phone_load_speeddial_data(int *ref_count) +{ + Eina_List *list = NULL; + int count = 0; + int ret = 0; + CTSiter *iter; + ph_speeddial_info *voice_mail; + + ret = contacts_svc_get_list(CTS_LIST_ALL_SPEEDDIAL, &iter); + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_get_list is failed(%d)", ret); + *ref_count = count; + return NULL; + } + + while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { + CTSvalue *pfav= NULL; + ph_speeddial_info *speed_info; + pfav = contacts_svc_iter_get_info(iter); + + speed_info = calloc(1, sizeof(ph_speeddial_info)); + speed_info->ph_number = SAFE_STRDUP((char*)contacts_svc_value_get_str(pfav, CTS_LIST_SHORTCUT_NUMBER_STR)); + speed_info->contact_id = contacts_svc_value_get_int(pfav, CTS_LIST_SHORTCUT_CONTACT_ID_INT); + speed_info->dial_number = contacts_svc_value_get_int(pfav, CTS_LIST_SHORTCUT_SPEEDDIAL_INT); + + speed_info->display = phone_get_display_name_from_value(pfav, CTS_LIST_SHORTCUT_DISPLAY_NAME_STR, + CTS_LIST_SHORTCUT_FIRST_NAME_STR, CTS_LIST_SHORTCUT_LAST_NAME_STR); + speed_info->img_path = contacts_svc_value_steal_str(pfav, CTS_LIST_SHORTCUT_IMG_PATH_STR); + + list = eina_list_append(list, (void*)speed_info); + count++; + contacts_svc_value_free(pfav); + } + contacts_svc_iter_remove(iter); + + voice_mail = calloc(1, sizeof(ph_speeddial_info)); + if (NULL == voice_mail) { + ERR("calloc Failed"); + *ref_count = count; + phone_free_speeddial_data(list); + return NULL; + } + voice_mail->ph_number = get_voice_mail_number(); + voice_mail->contact_id = 0; + voice_mail->dial_number = 1; + voice_mail->display = strdup(T_(PH_GET_TEXT_BASIC, PHTEXT_VOICE_MAIL)); + voice_mail->img_path = strdup(IMG_VOICEMAIL_ICON); + list = eina_list_prepend(list, (void*)voice_mail); + + *ref_count = count; + return list; +} + +void phone_free_speeddial_data(Eina_List *list) +{ + PH_FN_CALL; + Eina_List *l; + ph_speeddial_info *s_info; + + p_retm_if(NULL == list, "List is null"); + + EINA_LIST_FOREACH(list, l, s_info) { + if (NULL == s_info) + continue; + free(s_info->display); + free(s_info->img_path); + free(s_info->ph_number); + free(s_info); + } + eina_list_free(list); + PH_FN_END; +} + diff --git a/lib/common/ph-text.c b/lib/common/ph-text.c index c9137be..5415ce9 100755 --- a/lib/common/ph-text.c +++ b/lib/common/ph-text.c @@ -14,30 +14,237 @@ * limitations under the License. */ -#include <appcore-efl.h> - #include "phone.h" #include "phone-text.h" static const char *basic_str[] = { - N_("IDS_PB_ITAB4_DIALLER"), + N_("IDS_KPD_TAB4_KEYPAD"), N_("IDS_PB_ITAB4_FAVOURITES"), + N_("IDS_PB_HEADER_SPEEDDIAL"), N_("IDS_CST_BODY_VOICE_MAIL"), N_("IDS_CLOG_ITAB4_LOGS"), + N_("IDS_COM_POP_NO_SPEED_DIAL_NUMBER_ASSIGN_ONE_NOW_Q"), N_("IDS_PB_POP_REQUEST_FAILED"), N_("IDS_PB_POP_REQUEST_SUCCESS"), N_("IDS_CALL_POP_EMERGENCY_CALL"), N_("IDS_CLOG_BODY_NO_LOGS"), N_("IDS_PB_BODY_NO_FAVOURITES"), + N_("IDS_CLOG_POP_MESSAGE_DELETED"), N_("IDS_PB_POP_MAXIMUM_PHONE_NUMBER_LENGTH_EXCEEDED"), N_("IDS_CLOG_POP_DELETING_LOGS_ING"), N_("IDS_PB_POP_DELETING_FAVOURITES_ING"), N_("IDS_PB_POP_INITIALISING_TRY_LATER_ING"), + N_("IDS_COM_POP_SOUND_OFF"), + N_("IDS_COM_POP_SOUND_ON"), }; static const char *base_op_str[] = { N_("IDS_CLOG_HEADER_SELECT_LOGS"), + N_("IDS_CST_HEADER_SELECT_SPEED_DIAL_CONTACTS"), + N_("IDS_CLOG_BUTTON2_UNBLOCK"), N_("IDS_CST_OPT_CHANGE_CONTACT_ABB"), + N_("IDS_KPD_OPT_ADD_PD_SEC_PAUSE"), + N_("IDS_KPD_OPT_ADD_WAIT"), + N_("IDS_CLOG_HEADER_MISSED"), + N_("IDS_COM_OPT_EXIT"), +}; + +static const char *number_type_str[] = { + N_("IDS_PB_BODY_MOBILE"),/*Mobile*/ + N_("IDS_PB_BODY_HOME"),/*Home*/ + N_("IDS_PB_BODY_WORK"),/*Work*/ + N_("IDS_PB_BODY_FAX_HHOME"),/*Fax(home)*/ + N_("IDS_PB_BODY_FAX_HWORK"),/*Fax(work)*/ + N_("IDS_PB_BODY_ASSISTANT_S_NUMBER"),/*Assistant*/ + N_("IDS_PB_BODY_PAGER"),/*Pager*/ + N_("IDS_PB_BODY_OTHER"),/*Other*/ + N_("IDS_PB_BODY_TELEPHONE"),/*Telephone*/ + N_("IDS_PB_BODY_FAX"),/*Fax*/ + N_("IDS_PB_BODY_CAR_TELEPHONE"),/*Car*/ + N_("IDS_PB_BODY_HOME_2"),/*Home2*/ + N_("IDS_PB_BODY_WORK"),/*Work2*/ // TODO: Fixme + N_("IDS_PB_BODY_COMPANY_MAIN"),/*Company main*/ + N_("IDS_PB_BODY_RADIO"),/*Radio*/ +}; + +static const char *postal_type_str[] = { + N_("IDS_PB_BODY_HOME"),/*Home*/ + N_("IDS_PB_BODY_WORK"),/*Work*/ + N_("IDS_PB_BODY_OTHER")/*Other*/ +}; + +static const char *cbasic_str[] = { + N_("IDS_PB_BODY_ALL_CONTACTS"),/*All Contacts*/ + N_("IDS_PB_BODY_NOT_ASSIGNED"),/*Not Assigned*/ + N_("IDS_PB_BODY_SERVICE_NUMBER"),/*Service Number*/ + N_("IDS_PB_BODY_PHONE"),/*Phone*/ + N_("IDS_PB_BODY_GROUPS"),/*Groups*/ + N_("IDS_PB_BODY_DEFAULT"),/*Default*/ + N_("IDS_PB_BODY_RINGTONE"),/*Ringtone*/ + N_("IDS_PB_BODY_URL"),/*URL*/ + N_("IDS_PB_BODY_IM"),/*Instant Messenger*/ + N_("IDS_PB_BODY_EMAIL"),/*Email*/ + N_("IDS_PB_BODY_NUMBER"),/*Number*/ + N_("IDS_PB_BODY_NOTE"),/*Note*/ + N_("IDS_PB_BODY_POSTAL_ADDRESS"),/*Postal Address*/ + N_("IDS_PB_HEADER_DETAILS"),/*Details*/ + N_("IDS_PB_BODY_COMPANY"),/*Company*/ + N_("IDS_PB_BODY_ORDER_OF_DISPLAY_NAME"),/* Order display name */ + N_("IDS_PB_BODY_OWN_NUMBER"),/* Own number */ + N_("IDS_PB_BODY_FIRST_NAME"), + N_("IDS_PB_BODY_LAST_NAME"), + N_("IDS_PB_BODY_MIDDLE_NAME"), + N_("IDS_PB_BODY_SUFFIX"), + N_("IDS_PB_BODY_NICKNAME"), + N_("IDS_PB_BODY_EXPORT_CONTACTS"), + N_("IDS_PB_HEADER_SELECT_CONTACTS"), + N_("IDS_PB_BODY_POSTAL_CODE"), + N_("IDS_PB_BODY_COUNTRY"), + N_("IDS_PB_BODY_PROVINCE"), + N_("IDS_PB_BODY_CITY"), + N_("IDS_PB_BODY_STREET"), + N_("IDS_EMAIL_BODY_SAVED_IN_PS"), + N_("IDS_PB_BODY_FREQUENTLY_CONTACTED_ABB"), + N_("IDS_PB_POP_COPIED"), + N_("IDS_COM_BODY_EXPORTED"), + N_("IDS_PB_POP_DELETING_CONTACTS_ING"), + N_("IDS_PB_BODY_MOVING_ING"), + N_("IDS_PB_BODY_COPYING_ING"), + N_("IDS_PB_POP_IMPORTING_SIM_CONTACTS_ING"), + N_("IDS_PB_POP_IMPORTING_CONTACTS_FROM_VCARD_ING"), + N_("IDS_PB_POP_EXPORTING_CONTACTS_TO_PS_ING"), + N_("IDS_PB_BODY_VCARD"), + N_("IDS_PB_BODY_READING_VCARD_ING"), + N_("IDS_COM_BODY_IMPORTED_ABB"), + N_("IDS_COM_BODY_NA"), + N_("IDS_PB_OPT_ALL_LINKED_CONTACTS_ABB"), + N_("IDS_PB_BODY_LINKED_CONTACTS"), + N_("IDS_KA_BODY_MORE_INFORMATION"), + N_("IDS_PB_BODY_JOB_TITLE"), + N_("IDS_PB_BODY_DEPARTMENT"), + N_("IDS_PB_OPT_GROUP_NAME"), + N_("IDS_PB_BODY_ADD_ACCOUNT"), + N_("IDS_PB_POP_ADDING_MEMBERS_TO_GROUP_ING"), + N_("IDS_PB_OPT_VIEW"), + N_("IDS_PB_BODY_PD_CONTACTS"), + N_("IDS_PB_OPT_RENAME"), + N_("IDS_PB_OPT_RELATIONSHIP"), + N_("IDS_PB_BODY_NO_HISTORIES"), + N_("IDS_PB_BODY_NO_ACTIVITIES"), + N_("IDS_PB_POP_ADDING_ING"), + N_("IDS_PB_BODY_CUSTOM_T_PHONEBOOK"), + N_("IDS_PB_BODY_EDITADDITIONALINFO"), + N_("IDS_PB_BODY_PO_BOX"), + N_("IDS_PB_BODY_STATE"), +}; + +static const char *err_str[] = { + N_("IDS_PB_BODY_NO_NAME"), + N_("IDS_PB_POP_INVALID_EMAIL_ADDRESS"), + N_("IDS_PB_POP_COMPLETE_AT_LEAST_ONE_FIELD_AS_WELL_AS_NAME"), + N_("IDS_IM_BODY_FAILED_TO_ACCESS_DATABASE"), + N_("IDS_PB_POP_ALREADY_ADDED"), + N_("IDS_PB_POP_GROUP_ALREADY_IN_USE"), + N_("IDS_PB_BODY_NO_GROUP"), + N_("IDS_PB_POP_NO_NUMBER"), + N_("IDS_PB_POP_NO_EMAIL_ADDRESSES"), + N_("IDS_PB_BODY_NO_CONTACTS"), + N_("IDS_PB_POP_SIM_MEMORY_EMPTY"), + N_("IDS_PB_POP_MAXIMUM_NUMBER_OF_ENTRIES_EXCEEDED"), + N_("IDS_SEARCH_BODY_DATA_DOES_NOT_EXIST"), + N_("IDS_PB_BODY_INVALID_NUMBER"), +}; + +static const char *cbase_op_str[] = { + N_("IDS_PB_BODY_MARK_AS_DEFAULT_NUMBER"),/*Set Default Number*/ + N_("IDS_PB_BODY_IMAGE"),/*Image*/ + N_("IDS_PB_BODY_TAKE_A_PHOTO"),/*Take a photo*/ + N_("IDS_PB_OPT_REMOVE_PHOTO_ABB"),/*Delete photo*/ + N_("IDS_PB_BODY_SAVE_CONTACT_TO"),/*Save contact to*/ + N_("IDS_PB_OPT_SAVE_TO"),/*Save to*/ + N_("IDS_PB_BODY_IMPORT_SIM_CONTACTS"), /* Import SIM contacts */ + N_("IDS_PB_BODY_FIRST_NAME_FIRST"),/* order display - First name first */ + N_("IDS_PB_BODY_LAST_NAME_FIRST_ABB"),/* order display - Last name first */ + N_("IDS_PB_HEADER_SEND_NAMECARD"), + N_("IDS_PB_POP_THIS_CONTACT_WILL_BE_DELETED"), + N_("IDS_PB_HEADER_CREATE_GROUP"), + N_("IDS_PB_HEADER_SELECT_GROUP"), + N_("IDS_PB_BODY_EXPORT_CONTACTS"), + N_("IDS_PB_SK_IMPORT_CONTACTS"), + N_("IDS_PB_BODY_LINK_CONTACT"), + N_("IDS_PB_OPT_UNLINK"), + N_("IDS_PB_POP_ALL_LINKED_CONTACTS_WILL_BE_DELETED"), +}; + +static const char *event_type_str[] = { + N_("IDS_PB_BODY_BIRTHDAY"),/*CTS_EVENT_TYPE_BIRTH*/ + N_("IDS_PB_BODY_ANNIVERSARY")/*CTS_EVENT_TYPE_ANNIVERSARY*/ +}; + +static const char *im_type_str[] = { + N_("IDS_PB_BODY_OTHER"),/*CTS_IM_TYPE_NONE*/ + N_("IDS_PB_OPT_GOOGLE_TALK"),/*CTS_IM_TYPE_GOOGLE*/ + N_("IDS_PB_OPT_WINDOWS_LIVE_MESSENGER"),/*CTS_IM_TYPE_WLM*/ + N_("IDS_PB_BODY_YAHOO"),/*CTS_IM_TYPE_YAHOO*/ + N_("IDS_PB_BODY_FACEBOOK"),/*CTS_IM_TYPE_FACEBOOK*/ + N_("IDS_PB_BODY_IMPSCOMMUNITY_ICQ"),/*CTS_IM_TYPE_ICQ*/ + N_("IDS_PB_BODY_IMPSCOMMUNITY_AIM"),/*CTS_IM_TYPE_AIM*/ + N_("IDS_PB_OPT_QQ"),/*CTS_IM_TYPE_QQ*/ + N_("IDS_PB_OPT_JABBER"),/*CTS_IM_TYPE_JABBER*/ + N_("IDS_PB_OPT_SKYPE"),/*CTS_IM_TYPE_SKYPE*/ +}; + +static const char* acc_type_str[] = { + N_("IDS_PB_BODY_PHONE"),/*CTS_ADDRESSBOOK_TYPE_INTERNAL*/ + N_("IDS_PB_BODY_EXCHANGE"),/*CTS_ADDRESSBOOK_TYPE_EXCHANGE*/ + N_("IDS_PB_BODY_GOOGLE"),/*CTS_ADDRESSBOOK_TYPE_GOOGLE*/ + N_("IDS_PB_BODY_YAHOO"),/*CTS_ADDRESSBOOK_TYPE_YAHOO*/ + N_("IDS_PB_BODY_FACEBOOK"),/*CTS_ADDRESSBOOK_TYPE_GOOGLE*/ + N_("IDS_PB_HEADER_UNKNOWN"),/*CTS_ADDRESSBOOK_TYPE_OTHER*/ +}; + +static const char *day_str[] = { + N_("IDS_COM_BODY_SUNDAY"), + N_("IDS_COM_BODY_MONDAY"), + N_("IDS_COM_BODY_TUESDAY"), + N_("IDS_COM_BODY_WEDNESDAY"), + N_("IDS_COM_BODY_THURSDAY"), + N_("IDS_COM_BODY_FRIDAY"), + N_("IDS_COM_BODY_SATURDAY"), +}; + +static const char* relation_type_str[] = { + N_("IDS_PB_BUTTON_ASSISTANT"),/*Assistant*/ + N_("IDS_COM_OPT_BROTHER_ABB"),/*Brother*/ + N_("IDS_PB_BUTTON_CHILD"),/*Child*/ + N_("IDS_PB_OPT_DOMESTIC_PARTNER_ABB"),/*Domestic partner*/ + N_("IDS_COM_OPT_FATHER_ABB"),/*Father*/ + N_("IDS_PB_BODY_CALLERIDFRIEND"),/*Friend*/ + N_("IDS_JAVA_BODY_MANAGER"),/*Manager*/ + N_("IDS_COM_OPT_MOTHER_ABB"),/*Mother*/ + N_("IDS_COM_OPT_PARENT_ABB"),/*Parent*/ + N_("IDS_PB_BODY_CALLERIDPARTNER"),/*Partner*/ + N_("IDS_PB_OPT_REFERRED_BY"),/*Referred by*/ + N_("IDS_COM_BODY_RELATIVE_ABB"),/*Relative*/ + N_("IDS_COM_OPT_SISTER_ABB"),/*Sister*/ + N_("IDS_PB_BODY_SPOUSE"),/*Spouse*/ + N_("IDS_PB_BODY_CUSTOM_T_PHONEBOOK"),/*Custom*/ +}; + +static const char *month_str[] = { + "IDS_COM_BODY_NONE", + "IDS_COM_BODY_JAN", + "IDS_COM_BODY_FEB", + "IDS_COM_BODY_MAR", + "IDS_COM_BODY_APR", + "IDS_COM_BODY_MAY", + "IDS_COM_BODY_JUN", + "IDS_COM_BODY_JUL", + "IDS_COM_BODY_AUG", + "IDS_COM_BODY_SEP", + "IDS_COM_BODY_OCT", + "IDS_COM_BODY_NOV", + "IDS_COM_BODY_DEC" }; const char* phone_get_text(int op, int type) @@ -47,27 +254,90 @@ const char* phone_get_text(int op, int type) switch (op) { case PH_GET_TEXT_BASIC: table = basic_str; - return dgettext(PACKAGE, table[type]); + break; case PH_GET_TEXT_BASE_OP: table = base_op_str; - return dgettext(PACKAGE, table[type]); + break; + case CT_GET_TEXT_BASIC: + table = cbasic_str; + break; + case CT_GET_TEXT_ERR: + table = err_str; + break; + case CT_GET_TEXT_BASE_OP: + table = cbase_op_str; + break; + case CT_GET_TEXT_NUM_TYPE: + table = number_type_str; + break; + case CT_GET_TEXT_POSTAL_TYPE: + case CT_GET_TEXT_EMAIL_TYPE: + case CT_GET_TEXT_WEBSITE_TYPE: + table = postal_type_str; + type--; + if (-1 == type) type = 2; + break; + case CT_GET_TEXT_EVENT_TYPE: + table = event_type_str; + break; + case CT_GET_TEXT_IM_TYPE: + table = im_type_str; + break; + case CT_GET_TEXT_MONTH: + if (sizeof(month_str) / sizeof(month_str[0]) <= type) + return NULL; + else + return dgettext("sys_string", month_str[type]); + case CT_GET_TEXT_ACC_TYPE: + table = acc_type_str; + break; + case CT_GET_TEXT_RELATIONSHIP_TYPE: + table = relation_type_str; + break; + case PH_GET_TEXT_DAY: + if (sizeof(day_str) / sizeof(day_str[0]) <= type) + return NULL; + else + table = day_str; + break; default: return NULL; } + return dgettext(PACKAGE, table[type]); } static const char *sys_str[] = { "IDS_COM_SK_OK", + "IDS_COM_SK_SAVE", + "IDS_COM_SK_DONE", "IDS_COM_SK_EDIT", "IDS_COM_SK_DELETE", "IDS_COM_SK_CANCEL", + "IDS_COM_SK3_BLOCK", + "IDS_COM_SK_NO", + "IDS_COM_SK_YES", "IDS_COM_BODY_CALL", "IDS_COM_BODY_MESSAGE", + "IDS_COM_BODY_VIDEO_CALL", "IDS_COM_BODY_UNKNOWN", "IDS_COM_BODY_SELECT_ALL", "IDS_COM_BODY_CONTACTS", "IDS_COM_BODY_DETAILS", "IDS_COM_BODY_REMOVE", + "IDS_COM_BODY_TODAY", + "IDS_COM_BODY_YESTERDAY", + "IDS_COM_BODY_PREVIOUS", + "IDS_COM_BODY_NO_NAME", + "IDS_COM_BODY_CREATE", + "IDS_COM_BODY_MOVE", + "IDS_COM_BODY_COPY", + "IDS_COM_BODY_PHONE", + "IDS_COM_BODY_SEARCH", + "IDS_COM_BODY_BLUETOOTH", + "IDS_COM_BODY_EMAIL", + "IDS_COM_BODY_ADDTOPHONEBOOK_SIM", + "IDS_COM_BODY_MEMORY_CARD", + "IDS_COM_BODY_ALL", "IDS_COM_POP_FAIL", "IDS_COM_POP_FAILED", "IDS_COM_POP_CLOSE", @@ -76,11 +346,16 @@ static const char *sys_str[] = { "IDS_COM_POP_INCORRECT_PASSWORD", "IDS_COM_POP_ALREDY_EXISTS", "IDS_COM_POP_SELECTED", + "IDS_COM_POP_SUCCESS", + "IDS_COM_POP_ERROR", + "IDS_COM_POP_MOVED", + "IDS_COM_POP_ADDED", + "IDS_COM_POP_NOT_ENOUGH_MEMORY", + "IDS_COM_POP_NOTHING_SELECTED", + "IDS_COM_POP_FILE_NOT_FOUND", + "IDS_COM_POP_ADDRESS", "IDS_COM_OPT_ADD_TO_CONTACTS", - "IDS_COM_BODY_TODAY", - "IDS_COM_BODY_YESTERDAY", - "IDS_COM_BODY_PREVIOUS", - "IDS_COM_BODY_NO_NAME", + "IDS_COM_BODY_SELECTED_DATA_NOT_FOUND", }; const char* phone_get_system_string(int type) diff --git a/lib/ct-front/CMakeLists.txt b/lib/ct-front/CMakeLists.txt new file mode 100755 index 0000000..e4b3f66 --- /dev/null +++ b/lib/ct-front/CMakeLists.txt @@ -0,0 +1,14 @@ +LINK_DIRECTORIES(${CMAKE_BINARY_DIR}) + +SET(TARGET ${CT_FRONT}) + +FILE(GLOB SRCS *.c) + +ADD_LIBRARY(${TARGET} SHARED ${SRCS}) +SET_TARGET_PROPERTIES(${TARGET} PROPERTIES VERSION ${VERSION}) +SET_TARGET_PROPERTIES(${TARGET} PROPERTIES COMPILE_FLAGS ${EXTRA_CFLAGS}) +TARGET_LINK_LIBRARIES(${TARGET} ${COMMON_LIB} ${FAVOR_LIB} ${ug_pkgs_LDFLAGS} ${PH_LOG} ${CT_DETAILS} ${CT_LIST}) + +INSTALL(TARGETS ${TARGET} DESTINATION ${UGLIBDIR}) + +INSTALL(FILES ${CMAKE_BINARY_DIR}/lib/ct-front/contacts-tabui-efl.xml DESTINATION "/usr/share/packages") diff --git a/lib/ct-front/contacts-tabui-efl.xml b/lib/ct-front/contacts-tabui-efl.xml new file mode 100644 index 0000000..948d1c3 --- /dev/null +++ b/lib/ct-front/contacts-tabui-efl.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns="http://tizen.org/ns/packages" package="contacts-tabui-efl" version="0.1.0-0" install-location="internal-only"> + <label>contacts-tabui-efl</label> + <author email="ensung.park@samsung.com" href="www.samsung.com">ensung park</author> + <description>contacts-tabui-efl Application</description> + <ui-application appid="contacts-tabui-efl" exec="/opt/ug/bin/contacts-tabui-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/ct-front/ct-front-main.c b/lib/ct-front/ct-front-main.c new file mode 100755 index 0000000..1a427d3 --- /dev/null +++ b/lib/ct-front/ct-front-main.c @@ -0,0 +1,221 @@ +/* + * 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 "contacts-ug.h" +#include "ct-front.h" +#include "ct-front-view.h" + +static int cfront_parse_bundle(ct_front_data *cfront_d, service_h service) +{ + PH_FN_CALL; + char* val = NULL; + + cfront_d->view_visible[CT_VIEW_CONTACT] = true; + cfront_d->view_visible[CT_VIEW_FAVORITE] = true; + + if (service) { + service_get_extra_data(service, PH_UG_BUNDLE_TYPE, &val); + if (val) cfront_d->ug_request = atoi(val); + PH_DBG("type = %d", cfront_d->ug_request); + free(val); + } + + switch (cfront_d->ug_request) { + case PH_UG_REQUEST_SELECT: + case PH_UG_REQUEST_SELECT_NUMBER: + case PH_UG_REQUEST_SELECT_EMAIL: + cfront_d->view_visible[CT_VIEW_LOG] = true; + break; + case PH_UG_REQUEST_SET_WITH_NUM: + service_get_extra_data(service, CT_UG_BUNDLE_NUM, &cfront_d->ug_data); + break; + case PH_UG_REQUEST_SET_WITH_EMAIL: + service_get_extra_data(service, CT_UG_BUNDLE_EMAIL, &cfront_d->ug_data); + break; + case PH_UG_REQUEST_SET_WITH_WEB: + service_get_extra_data(service, CT_UG_BUNDLE_WEB, &cfront_d->ug_data); + break; + case PH_UG_REQUEST_SET_WITH_IMG: + case PH_UG_REQUEST_SET_WITH_RINGTONE: + service_get_extra_data(service, CT_UG_BUNDLE_PATH, &cfront_d->ug_data); + break; + case PH_UG_REQUEST_CHECK: + case PH_UG_REQUEST_CHECK_FOR_NUMBER: + case PH_UG_REQUEST_CHECK_FOR_EMAIL: + cfront_d->view_visible[CT_VIEW_LOG] = true; + val = NULL; + service_get_extra_data(service, CT_UG_BUNDLE_MAX, &val); + if (val) cfront_d->cnt_max = atoi(val); + free(val); + default: + break; + } + return 0; +} + +void *ct_tabui_on_create(ui_gadget_h ug, enum ug_mode mode, service_h service, void *priv) +{ + PH_FN_CALL; + int ret; + Evas_Object *bg; + Evas_Object *parent; + Evas_Object *layout; + ct_front_data *cfront_d; + + if (!ug || !priv) + return NULL; + + bindtextdomain(PACKAGE, LOCALEDIR); + + cfront_d = priv; + ret = cfront_parse_bundle(cfront_d, service); + p_retvm_if(-1 == ret, NULL, "ph_front_view_parse_bundle() Failed"); + + ret = contacts_svc_connect(); + p_retvm_if(ret < CTS_SUCCESS, NULL, "contacts_svc_connect() Failed(%d)", ret); + + parent = ug_get_parent_layout(ug); + if (!parent) + return NULL; + + cfront_d = priv; + cfront_d->win = ug_get_window(); + cfront_d->select_tab = CT_VIEW_NONE; + cfront_d->ug = ug; + + layout = ct_front_view_create_toolbar(cfront_d); + + bg = phone_create_bg(layout); + if (NULL == bg) { + PH_DBG("phone_create_bg() return NULL"); + ret = contacts_svc_disconnect(); + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_disconnect() Failed(%d)", ret); + return NULL; + } + + return layout; +} + +void ct_tabui_on_start(ui_gadget_h ug, service_h service, void *priv) +{ + PH_FN_CALL; + int i; + ct_front_data *cfront_d = priv; + + for (i=CT_VIEW_CONTACT;i<CT_VIEW_MAX;i++) { + if (cfront_d->item[i]) { + elm_toolbar_item_selected_set(cfront_d->item[i], EINA_TRUE); + break; + } + } + + cfront_d->timer = ecore_timer_add(3.0, ctui_front_view_load_timer, cfront_d); + PH_FN_END; +} + +void ct_tabui_on_pause(ui_gadget_h ug, service_h service, void *priv) +{ +} + +void ct_tabui_on_resume(ui_gadget_h ug, service_h service, void *priv) +{ +} + +void ct_tabui_on_destroy(ui_gadget_h ug, service_h service, void *priv) +{ + ct_front_data *cfront_d = priv; + PH_FN_CALL; + if (!ug) + return; + + free(cfront_d->ug_data); + + evas_object_del(ug_get_layout(ug)); + contacts_svc_disconnect(); + PH_FN_END; +} + +void ct_tabui_on_message(ui_gadget_h ug, service_h msg, service_h service, void *priv) +{ +} + +void ct_tabui_on_event(ui_gadget_h ug, enum ug_event event, service_h service, void *priv) +{ + ct_front_data *cfront_d = priv; + Evas_Object *notify; + switch (event) { + case UG_EVENT_REGION_CHANGE: + ctui_front_view_region_changed(cfront_d); + break; + case UG_EVENT_ROTATE_PORTRAIT: + case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN: + phone_resize_notify(cfront_d->navi, 0); + evas_object_data_set(cfront_d->navi, "phone_rotate", (void *)0); + notify = phone_get_notify(cfront_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(cfront_d->navi, 90); + evas_object_data_set(cfront_d->navi, "phone_rotate", (void *)90); + notify = phone_get_notify(cfront_d->navi); + elm_layout_theme_set(elm_object_content_get(notify), "standard", "selectioninfo", "horizontal/bottom_64"); + break; + default: + break; + } +} + +void ct_tabui_on_key_event(ui_gadget_h ug, enum ug_key_event event, service_h service, void *priv) +{ +} + +API int UG_MODULE_INIT(struct ug_module_ops *ops) +{ + ct_front_data *cfront_d; + + if (!ops) + return -1; + + cfront_d = calloc(1, sizeof(ct_front_data)); + if (!cfront_d) + return -1; + + ops->create = ct_tabui_on_create; + ops->start = ct_tabui_on_start; + ops->pause = ct_tabui_on_pause; + ops->resume = ct_tabui_on_resume; + ops->destroy = ct_tabui_on_destroy; + ops->message = ct_tabui_on_message; + ops->event = ct_tabui_on_event; + ops->key_event = ct_tabui_on_key_event; + ops->priv = cfront_d; + ops->opt = UG_OPT_INDICATOR_ENABLE; + + return 0; +} + +API void UG_MODULE_EXIT(struct ug_module_ops *ops) +{ + PH_FN_CALL; + if (!ops) + return; + ops->priv = NULL; +} + diff --git a/lib/ct-front/ct-front-view.c b/lib/ct-front/ct-front-view.c new file mode 100755 index 0000000..85b559d --- /dev/null +++ b/lib/ct-front/ct-front-view.c @@ -0,0 +1,434 @@ +/* + * 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 <bundle.h> +#include <app.h> +#include "phone.h" +#include "ct-front.h" +#include "phone-log.h" +#include "ct-front-view.h" +#include "ct-list.h" +#include "ct-favor.h" + +static void cfront_view_reset_current_sub_view(ct_front_data *cfront_d) +{ + PH_FN_CALL; + p_ret_if(cfront_d->select_tab <= CT_VIEW_NONE || CT_VIEW_MAX <= cfront_d->select_tab); + if (cfront_d->sub_view[cfront_d->select_tab]) { + switch (cfront_d->select_tab) { + case CT_VIEW_CONTACT : + ctui_list_view_reset(evas_object_data_get(cfront_d->navi, "clist_d")); + break; + case CT_VIEW_LOG : + phone_log_view_reset(cfront_d->navi); + phone_log_set_background(cfront_d->navi, true); + break; + case CT_VIEW_FAVORITE : + phone_favor_view_reset(cfront_d->sub_view[CT_VIEW_FAVORITE]); + phone_favor_set_background(cfront_d->sub_view[CT_VIEW_FAVORITE], true); + break; + } + } +} + +static void cfront_view_load_sub_view(ct_front_data *cfront_d, int tab_index) +{ + PH_FN_CALL; + ph_view_info *view_info; + view_info = calloc(1, sizeof(ph_view_info)); + phone_set_view_info(view_info, cfront_d->win, cfront_d->navi, cfront_d->ug, cfront_d->ug_request, + cfront_d->cnt_max, cfront_d->ug_data); + switch (tab_index) { + case CT_VIEW_CONTACT: + cfront_d->sub_view[tab_index] = ctui_create_phone_list_view(view_info); + return; + case CT_VIEW_LOG: + cfront_d->sub_view[tab_index] = phone_create_log_view(view_info); + break; + case CT_VIEW_FAVORITE: + cfront_d->sub_view[tab_index] = phone_favor_create_view(view_info); + break; + default: + return; + }; + free(view_info); +} + +static void cfront_view_show_sub_view(ct_front_data *cfront_d, int tab_index) +{ + PH_FN_CALL; + Evas_Object *view; + ph_view_info *view_info; + p_retm_if(tab_index <= CT_VIEW_NONE || CT_VIEW_MAX <= tab_index, "tab index is invalid"); + p_retm_if(cfront_d->select_tab == tab_index, "The tab is already shown"); + + cfront_view_reset_current_sub_view(cfront_d); + phone_hide_notify(cfront_d->navi); + + view_info = calloc(1, sizeof(ph_view_info)); + phone_set_view_info(view_info, cfront_d->win, cfront_d->navi, cfront_d->ug, cfront_d->ug_request, + cfront_d->cnt_max, cfront_d->ug_data); + + switch (tab_index) { + case CT_VIEW_CONTACT: + if (NULL == cfront_d->sub_view[tab_index]) + cfront_d->sub_view[tab_index] = ctui_create_phone_list_view(view_info); + + if (PH_UG_REQUEST_CHECK == cfront_d->ug_request || + PH_UG_REQUEST_CHECK_FOR_NUMBER == cfront_d->ug_request || + PH_UG_REQUEST_CHECK_FOR_EMAIL == cfront_d->ug_request) { + ctui_list_edit_mode_start(evas_object_data_get(cfront_d->navi, "clist_d")); + } + else + ctui_list_navi_set(CT_LIST_MODE_DEFAULT, evas_object_data_get(cfront_d->navi, "clist_d")); + break; + case CT_VIEW_LOG: + if (NULL == cfront_d->sub_view[tab_index]) + cfront_d->sub_view[tab_index] = phone_create_log_view(view_info); + phone_log_set_background(cfront_d->navi, false); + if (PH_UG_REQUEST_CHECK == cfront_d->ug_request || + PH_UG_REQUEST_CHECK_FOR_NUMBER == cfront_d->ug_request) + phone_log_check_mode_start(evas_object_data_get(cfront_d->navi, "log_data")); + else + phone_log_set_navi(cfront_d->navi); + break; + case CT_VIEW_FAVORITE: + if (NULL == cfront_d->sub_view[tab_index]) + cfront_d->sub_view[tab_index] = phone_favor_create_view(view_info); + phone_favor_set_background(cfront_d->sub_view[CT_VIEW_FAVORITE], false); + if (cfront_d->ug && + (PH_UG_REQUEST_CHECK == cfront_d->ug_request || + PH_UG_REQUEST_CHECK_FOR_NUMBER == cfront_d->ug_request || + PH_UG_REQUEST_CHECK_FOR_EMAIL == cfront_d->ug_request)) { + phone_favor_edit_mode_start(evas_object_data_get(cfront_d->sub_view[tab_index], "favor_d")); + } + else + phone_favor_set_navi(cfront_d->sub_view[tab_index], PH_FAVOR_MODE_DEFAULT); + break; + default: + free(view_info); + return; + } + cfront_d->select_tab = tab_index; + + view = elm_object_part_content_get(cfront_d->layout, "elm.swallow.content"); + if (view) { + elm_object_part_content_unset(cfront_d->layout, "elm.swallow.content"); + evas_object_hide(view); + } + elm_object_part_content_set(cfront_d->layout, "elm.swallow.content", cfront_d->sub_view[tab_index]); + evas_object_show(cfront_d->sub_view[tab_index]); + + free(view_info); +} + +static Eina_Bool cfront_view_load_all_sub_view(void *data) +{ + PH_FN_CALL; + ct_front_data *cfront_d = data; + int i; + + for (i=CT_VIEW_CONTACT;i<CT_VIEW_MAX;i++) { + if (cfront_d->view_visible[i] && NULL == cfront_d->sub_view[i]) { + cfront_view_load_sub_view(cfront_d, i); + return ECORE_CALLBACK_RENEW; + } + } + cfront_d->idler = NULL; + return ECORE_CALLBACK_CANCEL; +} + +API Eina_Bool ctui_front_view_load_timer(void *data) +{ + ct_front_data *cfront_d = data; + cfront_d->idler = ecore_idler_add(cfront_view_load_all_sub_view, cfront_d); + cfront_d->timer = NULL; + return ECORE_CALLBACK_CANCEL; +} + +static void cfront_view_change_cb(void *data, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; + int i; + Elm_Object_Item *selected_it; + ct_front_data *cfront_d = data; + + selected_it = elm_toolbar_selected_item_get(obj); + + for (i=CT_VIEW_CONTACT;i<CT_VIEW_MAX;i++) { + if (cfront_d->item[i]) + if (selected_it == cfront_d->item[i]) break; + } + PH_DBG("cur sel : %d, sel index : %d", cfront_d->select_tab, i); + cfront_view_show_sub_view(cfront_d, i); +} + +static void cfront_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; + ct_front_data *cfront_d = data; + int i; + + p_retm_if(NULL == cfront_d, "cfront_d is null"); + + for (i=0;i<CT_VIEW_MAX;i++) { + if (cfront_d->sub_view[i]) + evas_object_del(cfront_d->sub_view[i]); + } + + if (cfront_d->idler) + ecore_idler_del(cfront_d->idler); + + if (cfront_d->timer) + ecore_timer_del(cfront_d->timer); + + free(cfront_d); + PH_FN_END; +} + +Evas_Object* ct_front_view_create_toolbar(ct_front_data *cfront_d) +{ + Evas_Object *base; + Evas_Object *layout; + Evas_Object *naviframe; + Evas_Object *toolbar; + Elm_Object_Item *navi_it; + + base = elm_layout_add(cfront_d->win); + p_retvm_if(NULL == base, NULL, "elm_layout_add() Failed"); + evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_layout_theme_set(base, "layout", "application", "default"); + elm_win_resize_object_add(cfront_d->win, base); + evas_object_show(base); + + naviframe = elm_naviframe_add(base); + elm_naviframe_prev_btn_auto_pushed_set(naviframe, EINA_FALSE); + elm_object_part_content_set(base, "elm.swallow.content", naviframe); + cfront_d->navi = naviframe; + + layout = elm_layout_add(naviframe); + p_retvm_if(NULL == layout, NULL, "elm_layout_add() Failed"); + elm_layout_theme_set(layout, "layout", "tabbar", "default"); + cfront_d->layout = layout; + + toolbar = elm_toolbar_add(naviframe); + p_retvm_if(NULL == toolbar, NULL, "elm_toolbar_add() Failed"); + elm_object_style_set(toolbar, "tabbar"); + elm_object_part_content_set(layout, "elm.swallow.tabbar", toolbar); + cfront_d->tabbar = toolbar; + + elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND); + + if (cfront_d->view_visible[CT_VIEW_CONTACT]) + cfront_d->item[CT_VIEW_CONTACT] = elm_toolbar_item_append(toolbar, + PH_IMG_ICON_CONTACTS, S_(PH_SYS_BODY_CONTACTS), cfront_view_change_cb, cfront_d); + if (cfront_d->view_visible[CT_VIEW_FAVORITE]) + cfront_d->item[CT_VIEW_FAVORITE] = elm_toolbar_item_append(toolbar, + PH_IMG_ICON_FAVORITE, T_(PH_GET_TEXT_BASIC, PHTEXT_FAVORITES), cfront_view_change_cb, cfront_d); + if (cfront_d->view_visible[CT_VIEW_LOG]) + cfront_d->item[CT_VIEW_LOG] = elm_toolbar_item_append(toolbar, + PH_IMG_ICON_LOGS, T_(PH_GET_TEXT_BASIC, PHTEXT_LOGS), cfront_view_change_cb, cfront_d); + + navi_it = elm_naviframe_item_push(naviframe, NULL, NULL, NULL, layout, NULL); + elm_naviframe_item_title_visible_set(navi_it, EINA_FALSE); + evas_object_event_callback_add(base, EVAS_CALLBACK_DEL, cfront_view_delete_cb, cfront_d); + + return base; +} + +API ct_front_data* ctui_front_view_create(Evas_Object *win) +{ + PH_FN_CALL; + Evas_Object *bg; + Evas_Object *layout; + ct_front_data *cfront_d = calloc(1, sizeof(ct_front_data)); + cfront_d->win = win; + cfront_d->select_tab = CT_VIEW_NONE; + + cfront_d->view_visible[CT_VIEW_CONTACT] = true; + cfront_d->view_visible[CT_VIEW_FAVORITE] = true; + + layout = ct_front_view_create_toolbar(cfront_d); + if (NULL == layout) { + PH_DBG("layout_main is null"); + free(cfront_d); + return NULL; + } + + bg = phone_create_bg(layout); + if (NULL == bg) { + PH_DBG("phone_create_bg() return NULL"); + free(cfront_d); + return NULL; + } + + return cfront_d; +} + +API void ctui_front_view_region_changed(ct_front_data *cfront_d) +{ + if (cfront_d && cfront_d->sub_view[CT_VIEW_LOG]) + phone_log_views_update(cfront_d->navi); + // TODO: update contact detail history view +} + +API void ctui_front_view_pause(ct_front_data *cfront_d) +{ + if (cfront_d && cfront_d->sub_view[CT_VIEW_LOG]) + phone_log_set_background(cfront_d->navi, true); + if (cfront_d && cfront_d->sub_view[CT_VIEW_CONTACT]) + ctui_list_view_pause(cfront_d->navi); + if (cfront_d && cfront_d->sub_view[CT_VIEW_FAVORITE]) + phone_favor_set_background(cfront_d->sub_view[CT_VIEW_FAVORITE], true); +} + +API void ctui_front_view_resume(ct_front_data *cfront_d) +{ + if (cfront_d && cfront_d->sub_view[CT_VIEW_LOG]) { + if (CT_VIEW_LOG == cfront_d->select_tab) { + phone_log_set_background(cfront_d->navi, false); + phone_log_view_resume(cfront_d->navi); + } + } + if (cfront_d && cfront_d->sub_view[CT_VIEW_CONTACT]) + ctui_list_view_resume(cfront_d->navi); + + if (cfront_d && cfront_d->sub_view[CT_VIEW_FAVORITE] && CT_VIEW_FAVORITE == cfront_d->select_tab) + phone_favor_set_background(cfront_d->sub_view[CT_VIEW_FAVORITE], false); +} + +static void cfront_view_win_activate(void *data, Evas *e, void *even_info) +{ + elm_win_activate(data); + evas_event_callback_del(e, EVAS_CALLBACK_RENDER_FLUSH_POST, cfront_view_win_activate); +} + +API int ctui_front_view_rotate(ct_front_data *cfront_d, app_device_orientation_e orientation) +{ + int rotate; + int ret = 0; + + switch (orientation) { + case APP_DEVICE_ORIENTATION_0: + rotate = 0; + ret = ug_send_event(UG_EVENT_ROTATE_PORTRAIT); + phone_resize_notify(cfront_d->navi, rotate); + break; + case APP_DEVICE_ORIENTATION_180: + rotate = 180; + ret = ug_send_event(UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN); + phone_resize_notify(cfront_d->navi, rotate); + break; + case APP_DEVICE_ORIENTATION_270: + rotate = 270; + ret = ug_send_event(UG_EVENT_ROTATE_LANDSCAPE); + phone_resize_notify(cfront_d->navi, rotate); + break; + case APP_DEVICE_ORIENTATION_90: + rotate = 90; + ret = ug_send_event(UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN); + phone_resize_notify(cfront_d->navi, rotate); + break; + default: + rotate = -1; + break; + } + evas_object_data_set(cfront_d->navi, "phone_rotate", (void *)rotate); + if (0 <= rotate) + elm_win_rotation_with_resize_set(cfront_d->win, rotate); + return ret; +} + +API void ctui_front_view_reset(ct_front_data *cfront_d, int select_index, int op, service_h service) +{ + PH_FN_CALL; + int call_launched = FALSE; + ph_view_info *view_info; + Evas_Object *view; + char *buf = NULL; + int ret; + + elm_toolbar_select_mode_set(cfront_d->tabbar, ELM_OBJECT_SELECT_MODE_NONE); + + cfront_view_reset_current_sub_view(cfront_d); + if (cfront_d->sub_view[CT_VIEW_CONTACT]) + ctui_list_view_resume(cfront_d->navi); + + view = elm_object_part_content_get(cfront_d->layout, "elm.swallow.content"); + if (view) { + elm_object_part_content_unset(cfront_d->layout, "elm.swallow.content"); + evas_object_hide(view); + } + + elm_toolbar_select_mode_set(cfront_d->tabbar, ELM_OBJECT_SELECT_MODE_ALWAYS); + + view_info = calloc(1, sizeof(ph_view_info)); + phone_set_view_info(view_info, cfront_d->win, cfront_d->navi, cfront_d->ug, cfront_d->ug_request, + cfront_d->cnt_max, cfront_d->ug_data); + + switch (select_index) { + case CT_VIEW_CONTACT: + if (NULL == cfront_d->sub_view[select_index]) { + cfront_d->sub_view[CT_VIEW_CONTACT] = ctui_create_phone_list_view(view_info); + } + ctui_list_navi_set(CT_LIST_MODE_DEFAULT, evas_object_data_get(cfront_d->navi, "clist_d")); + if (CT_FRONT_CONTACT_NEW == op) + ctui_list_new_btn_clicked_cb(evas_object_data_get(cfront_d->navi, "clist_d"), NULL, NULL); + else if (CT_FRONT_CONTACT_SEARCH == op) { + ret = service_get_extra_data(service, "search_name", &buf); + p_warn_if(SERVICE_ERROR_NONE != ret, "service_get_extra_data is failed(%d)", ret); + ctui_list_set_search_text(evas_object_data_get(cfront_d->navi, "clist_d"), buf); + free(buf); + } + break; + case CT_VIEW_LOG: + if (NULL == cfront_d->sub_view[select_index]) + cfront_d->sub_view[select_index] = phone_create_log_view(view_info); + if (!cfront_d->ug) + phone_log_missed_info_update(cfront_d->navi); + phone_log_set_navi(cfront_d->navi); + break; + case CT_VIEW_FAVORITE: + if (NULL == cfront_d->sub_view[select_index]) + cfront_d->sub_view[select_index] = phone_favor_create_view(view_info); + phone_favor_set_navi(cfront_d->sub_view[select_index], PH_FAVOR_MODE_DEFAULT); + break; + default: + break; + } + + cfront_d->select_tab = select_index; + + if (CT_VIEW_NONE < select_index && select_index < CT_VIEW_MAX) { + elm_object_part_content_set(cfront_d->layout, "elm.swallow.content", cfront_d->sub_view[select_index]); + evas_object_show(cfront_d->sub_view[select_index]); + elm_toolbar_item_selected_set(cfront_d->item[select_index], EINA_TRUE); + } + + if (cfront_d->win && FALSE == call_launched && CT_VIEW_NONE != select_index){ + if (EINA_FALSE == evas_object_visible_get(cfront_d->win)) + evas_object_show(cfront_d->win); + evas_event_callback_add(evas_object_evas_get(cfront_d->navi), + EVAS_CALLBACK_RENDER_FLUSH_POST, cfront_view_win_activate, cfront_d->win); + } + else + elm_win_lower(cfront_d->win); + cfront_d->timer = ecore_timer_add(3.0, ctui_front_view_load_timer, cfront_d); + + free(view_info); + PH_FN_END; +} + diff --git a/lib/ct-front/ct-front-view.h b/lib/ct-front/ct-front-view.h new file mode 100755 index 0000000..dcc7387 --- /dev/null +++ b/lib/ct-front/ct-front-view.h @@ -0,0 +1,23 @@ +/* + * 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_FRONT_VIEW_H__ +#define __CT_FRONT_VIEW_H__ + +Evas_Object* ct_front_view_create_toolbar(ct_front_data *cfront_d); + +#endif /* __CT_FRONT_VIEW_H__ */ + 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__ diff --git a/lib/dialer/CMakeLists.txt b/lib/dialer/CMakeLists.txt index 9dba0a5..7977a74 100755 --- a/lib/dialer/CMakeLists.txt +++ b/lib/dialer/CMakeLists.txt @@ -1,11 +1,11 @@ LINK_DIRECTORIES(${CMAKE_BINARY_DIR}) -SET(TARGET ${PH_VIEW_DIALER}) +SET(TARGET ${PH_DIALER}) FILE(GLOB SRCS *.c) INCLUDE(FindPkgConfig) -pkg_check_modules(dialer_pkgs REQUIRED tapi) +pkg_check_modules(dialer_pkgs REQUIRED tapi capi-uix-feedback) FOREACH(flag ${dialer_pkgs_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") @@ -19,3 +19,5 @@ TARGET_LINK_LIBRARIES(${TARGET} ${COMMON_LIB} ${ug_pkgs_LDFLAGS} ${SPEEDDIAL} ${ ADD_DEPENDENCIES(${TARGET} dialer_edj_build dialer_theme_build) INSTALL(TARGETS ${TARGET} DESTINATION ${UGLIBDIR}) + +INSTALL(FILES ${CMAKE_BINARY_DIR}/lib/dialer/dialer-efl.xml DESTINATION "/usr/share/packages") diff --git a/lib/dialer/dialer-efl.desktop.in b/lib/dialer/dialer-efl.desktop.in new file mode 100644 index 0000000..ea965ed --- /dev/null +++ b/lib/dialer/dialer-efl.desktop.in @@ -0,0 +1,10 @@ +Name=dialer-efl
+Exec=/opt/ug/bin/dialer-efl
+Icon=
+Type=Application
+Version=0.1.0-0
+NoDisplay=true
+X-TIZEN-Multiple=true
+X-TIZEN-TaskManage=false
+X-TIZEN-Removable=true
+X-TIZEN-SVC=http://tizen.org/appsvc/operation/test|NULL|NULL
diff --git a/lib/dialer/dialer-efl.xml b/lib/dialer/dialer-efl.xml new file mode 100644 index 0000000..d388945 --- /dev/null +++ b/lib/dialer/dialer-efl.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns="http://tizen.org/ns/packages" package="dialer-efl" version="0.1.0-0" install-location="internal-only"> + <label>dialer-efl</label> + <author email="ensung.park@samsung.com" href="www.samsung.com">ensung park</author> + <description>dialer-efl Application</description> + <ui-application appid="dialer-efl" exec="/opt/ug/bin/dialer-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/dialer/ph-dialer-cclist.h b/lib/dialer/ph-dialer-cclist.h new file mode 100755 index 0000000..bf9a5d6 --- /dev/null +++ b/lib/dialer/ph-dialer-cclist.h @@ -0,0 +1,20 @@ +/* + * 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 __PH_DIALER_CCLIST_H__ +#define __PH_DIALER_CCLIST_H__ +#endif /* __PH_DIALER_CCLIST_H__ */ diff --git a/lib/dialer/ph-dialer-keystring.c b/lib/dialer/ph-dialer-keystring.c new file mode 100755 index 0000000..336a943 --- /dev/null +++ b/lib/dialer/ph-dialer-keystring.c @@ -0,0 +1,18 @@ +/* + * ug-phone-efl + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngjae Shin <yj99.shin@samsung.com> + * Donghee Ye <donghee.ye@samsung.com> + * Sunggoo Kim <sung.goo.kim@samsung.com> + * Somang Park <somang.park@samsung.com> + * + * Not Open License + * + */ +#include <vconf.h> +#include <vconf-keys.h> + +#include "phone.h" +#include "ph-dialer-keystring.h" diff --git a/lib/dialer/ph-dialer-keystring.h b/lib/dialer/ph-dialer-keystring.h new file mode 100755 index 0000000..e20e2f2 --- /dev/null +++ b/lib/dialer/ph-dialer-keystring.h @@ -0,0 +1,17 @@ +/* + * ug-phone-efl + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngjae Shin <yj99.shin@samsung.com> + * Donghee Ye <donghee.ye@samsung.com> + * Sunggoo Kim <sung.goo.kim@samsung.com> + * Somang Park <somang.park@samsung.com> + * + * Not Open License + * + */ + +#ifndef __PH_DIALER_KEYSTRING_H__ +#define __PH_DIALER_KEYSTRING_H__ +#endif /* __PH_DIALER_KEYSTRING_H__ */ diff --git a/lib/dialer/ph-dialer-main.c b/lib/dialer/ph-dialer-main.c index b319f52..4771a7a 100755 --- a/lib/dialer/ph-dialer-main.c +++ b/lib/dialer/ph-dialer-main.c @@ -23,11 +23,14 @@ #include "ph-dialer-view.h" #include "ph-dialer-utils.h" +// for removing build warning //////////////////////////////////// +int service_export_as_bundle(service_h service, bundle **data); +//////////////////////////////////////////////////////// + static bool dialer_create_ug_view(ph_dialer_data *dial_d, Evas_Object *base) { int ret; const char *title; - Evas_Object *back_btn; p_retvm_if(NULL == dial_d, false, "Parameter is null"); if (NULL == dial_d->navi) { @@ -42,26 +45,24 @@ static bool dialer_create_ug_view(ph_dialer_data *dial_d, Evas_Object *base) if (dial_d->is_emergency) title = T_(PH_GET_TEXT_BASIC, PHTEXT_EMERGENCY_CALL); else - title = T_(PH_GET_TEXT_BASIC, PHTEXT_DIALER); + title = T_(PH_GET_TEXT_BASIC, PHTEXT_KEYPAD); - back_btn = elm_button_add(dial_d->navi); - if (back_btn) { - evas_object_smart_callback_add(back_btn, "clicked", phone_ug_destroy_me_cb, dial_d->ug); - elm_object_style_set(back_btn, "naviframe/back_btn/default"); - } - elm_naviframe_item_push(dial_d->navi, title, back_btn, NULL, dial_d->layout, NULL); + elm_naviframe_item_push(dial_d->navi, title, NULL, NULL, dial_d->layout, NULL); return true; } -void* dialer_on_create(struct ui_gadget *ug, enum ug_mode mode, bundle *data, void *priv) +void* dialer_on_create(ui_gadget_h ug, enum ug_mode mode, service_h service, void *priv) { int ret; - char *val; + char *val = NULL; Evas_Object *bg; Evas_Object *parent; Evas_Object *base; ph_dialer_data *dial_d = priv; + bundle *data; + + service_export_as_bundle(service, &data); p_retvm_if(NULL == ug || NULL == priv, NULL, "The parameter is invalid(ug=%p, priv=%p)", ug, priv); @@ -83,9 +84,9 @@ void* dialer_on_create(struct ui_gadget *ug, enum ug_mode mode, bundle *data, vo dial_d->is_emergency = false; if (UG_MODE_FULLVIEW == mode) - base = phone_create_layout(parent, true); + base = phone_create_base_layout(parent, true); else - base = phone_create_layout(parent, false); + base = phone_create_base_layout(parent, false); bg = phone_create_bg(base); if (NULL == bg) { @@ -105,19 +106,49 @@ void* dialer_on_create(struct ui_gadget *ug, enum ug_mode mode, bundle *data, vo return base; } -static void dialer_on_event(struct ui_gadget *ug, enum ug_event event, bundle *data, void *priv) +static void dialer_on_event(ui_gadget_h ug, enum ug_event event, service_h service, void *priv) { + ph_dialer_data *dial_d = priv; + Evas_Object *notify; + + switch (event) { + case UG_EVENT_ROTATE_PORTRAIT: + case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN: + phone_resize_notify(dial_d->navi, 0); + evas_object_data_set(dial_d->navi, "phone_rotate", (void *)0); + notify = phone_get_notify(dial_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(dial_d->navi, 90); + notify = phone_get_notify(dial_d->navi); + evas_object_data_set(dial_d->navi, "phone_rotate", (void *)90); + elm_layout_theme_set(elm_object_content_get(notify), "standard", "selectioninfo", "horizontal/bottom_64"); + break; + default: + break; + } } -static void dialer_on_pause(struct ui_gadget *ug, bundle *data, void *priv) +static void dialer_on_pause(ui_gadget_h ug, service_h service, void *priv) { + ph_dialer_data *dial_d = priv; + dial_d->is_background = true; } -static void dialer_on_resume(struct ui_gadget *ug, bundle *data, void *priv) +static void dialer_on_resume(ui_gadget_h ug, service_h service, void *priv) { + ph_dialer_data *dial_d = priv; + dial_d->is_background = false; + if (dial_d->update_timer) { + ecore_timer_del(dial_d->update_timer); + dial_d->update_timer = NULL; + ph_dialer_reload_data(dial_d); + } } -static void dialer_on_destroy(struct ui_gadget *ug, bundle *data, void *priv) +static void dialer_on_destroy(ui_gadget_h ug, service_h service, void *priv) { PH_FN_CALL; if (!ug) @@ -127,7 +158,7 @@ static void dialer_on_destroy(struct ui_gadget *ug, bundle *data, void *priv) contacts_svc_disconnect(); } -static void dialer_on_message(struct ui_gadget *ug, bundle *msg, bundle *data, void *priv) +static void dialer_on_message(ui_gadget_h ug, service_h msg, service_h service, void *priv) { } @@ -159,18 +190,18 @@ API void UG_MODULE_EXIT(struct ug_module_ops *ops) ops->priv = NULL; } -API Evas_Object* phone_create_dialer_view(void *ug, Evas_Object *win, Evas_Object *navi) +API Evas_Object* phone_create_dialer_view(ph_view_info *view_info) { ph_dialer_data *dial_d; - p_retvm_if(NULL == navi, NULL, "The parameter(navi) is NULL"); + p_retvm_if(NULL == view_info, NULL, "The parameter(view_info) is NULL"); dial_d = calloc(1, sizeof(ph_dialer_data)); p_retvm_if(NULL == dial_d, NULL, "dial_d is NULL, Not enough memory"); - dial_d->ug = ug; - dial_d->win = win; - - dial_d->navi = navi; + dial_d->ug = view_info->ug; + dial_d->win = view_info->win; + dial_d->navi = view_info->navi; dial_d->is_emergency = false; + dial_d->is_background = true; if (!ph_dialer_create_content(dial_d)) { free(dial_d); diff --git a/lib/dialer/ph-dialer-search.c b/lib/dialer/ph-dialer-search.c new file mode 100755 index 0000000..a07e4b6 --- /dev/null +++ b/lib/dialer/ph-dialer-search.c @@ -0,0 +1,34 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define _GNU_SOURCE // for strcasestr +#include <feedback.h> +#include <pthread.h> + +#include "phone.h" +#include "phone-dialer.h" +#include "ph-dialer-utils.h" +#include "ph-dialer-view.h" +#include "ph-dialer-cclist.h" +#include "ph-dialer-search.h" +#include "ph-dialer-tapi.h" + +void ph_dialer_search_request(void *data, int force_search) +{ + PH_FN_CALL; + + return; +} diff --git a/lib/dialer/ph-dialer-search.h b/lib/dialer/ph-dialer-search.h new file mode 100755 index 0000000..15615d5 --- /dev/null +++ b/lib/dialer/ph-dialer-search.h @@ -0,0 +1,30 @@ +/* + * 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 __PH_DIALER_SEARCH_H__ +#define __PH_DIALER_SEARCH_H__ + +void ph_dialer_search_request(void *data, int force_search); +void ph_dialer_search_result_clicked(void *data, Evas_Object *obj, const char *emission, const char *source); +void ph_dialer_search_free_search_data(ph_dialer_data *dial_d); +void ph_dialer_search_free_log_data(ph_dialer_data *dial_d); +void ph_dialer_search_free_cc_data(ph_dialer_data *dial_d); +void ph_dialer_search_find_cur_sim_cc(ph_dialer_data *dial_d); +void ph_dialer_search_fill_genlist_by_list(ph_dialer_data *dial_d); +void ph_dialer_search_fill_genlist_by_cc_list(ph_dialer_data *dial_d); +void ph_dialer_search_set_genlist_item_style(); + +#endif /* __PH_DIALER_SEARCH_H__ */ diff --git a/lib/dialer/ph-dialer-tapi.c b/lib/dialer/ph-dialer-tapi.c index b112cdf..97833f0 100755 --- a/lib/dialer/ph-dialer-tapi.c +++ b/lib/dialer/ph-dialer-tapi.c @@ -14,163 +14,88 @@ * limitations under the License. */ -#include <TapiCommon.h> +#include <tapi_common.h> #include <ITapiSim.h> -#include <ITapiCall.h> -#include <TapiEvent.h> +#include <ITapiPhonebook.h> +#include <TapiUtility.h> #include "phone.h" #include "phone-dialer.h" -#include "ph-dialer-view.h" #include "ph-dialer-utils.h" -#define PHONE_PKG "org.tizen.phone" +#ifdef Status + #undef Status +#endif -static int request_id; -static int iNumOfSIMEvt = 0; -static unsigned int* SIM_subscription_id; +static TapiHandle *handle = NULL; -static void sim_async_event_callback(TelTapiEvent_t* sim_event, void *data) +int GCF_tapi_init() { - PH_FN_CALL; - p_retm_if(NULL == sim_event || NULL == sim_event->pData, "No Event Data!!"); - - if (sim_event->EventClass == TAPI_EVENT_CLASS_SIM) { - switch (sim_event->EventType) { - case TAPI_EVENT_SIM_PB_ACCESS_READ_CNF: - { - TelSimPbRecordData_t *sim_acces_info = (TelSimPbRecordData_t*)sim_event->pData; - if (sim_event->Status != TAPI_SIM_PB_SUCCESS) { - ERR("SIM phone book access error [%d]", sim_event->Status); - break; - } + int status; + int ret; + TelSimPbList_t pb_list; + + handle = tel_init(NULL); + if (NULL == handle) + return FALSE; + + ret = tel_get_sim_pb_init_info(handle, &status, &pb_list); + if (TAPI_API_SUCCESS != ret) { + ERR("tel_get_sim_pb_init_info() is failed(%d)", ret); + tel_deinit(handle); + handle = NULL; + return FALSE; + } - if ( sim_acces_info->StorageFileType == TAPI_SIM_PB_ADN){ //KKC - ADN number value! - char number[PH_TEXT_MAX_LEN] = {0}; - ph_dialer_util_append_node_from_numstr_with_strip(data, (char *)sim_acces_info->ContactInfo.Pb2GData.Number); - ph_dialer_util_add_dashes(data, DASH_REAL); - ph_dialer_util_get_numstr_from_node(data, number); - ph_dialer_entry_set_number(data, number, CURSOR_END, TRUE); - } - else if (sim_acces_info->StorageFileType == TAPI_SIM_PB_3GSIM) { - int i, k; - int num_of_pb_rec; - char *temp; - TelSimPbRecordData_t *sim_3g_access_info; - - temp = (char*)calloc(1, sim_event->pDataLen); - memcpy(temp , (char*)sim_event->pData, sim_event->pDataLen); - - num_of_pb_rec = (sim_event->pDataLen/sizeof(TelSimPbRecordData_t)); - for (k = 0;k< num_of_pb_rec ;k++) { - sim_3g_access_info = (TelSimPbRecordData_t*)(temp+ k*sizeof(TelSimPbRecordData_t)); - - for (i = 0;i<sim_3g_access_info->ContactInfo.Pb3GData.FileTypeCount;i++) { - if (sim_3g_access_info->ContactInfo.Pb3GData.PbFileDataInfo[i].FileType == TAPI_PB_3G_NUMBER){//KKC - USIM ADN number value! - char number[PH_TEXT_MAX_LEN] = {0}; - ph_dialer_util_append_node_from_numstr_with_strip(data, (char*)(sim_3g_access_info->ContactInfo.Pb3GData.PbFileDataInfo[i].FileData)); - ph_dialer_util_add_dashes(data, DASH_REAL); - ph_dialer_util_get_numstr_from_node(data, number); - ph_dialer_entry_set_number(data, number, CURSOR_END, TRUE); - } - } - } - free(temp); - } - } - break; - case TAPI_EVENT_SIM_VERIFY_PUK_CNF: - { - TelSimSecResult_t *pPinInfo = (TelSimSecResult_t*)sim_event->pData; - if (sim_event->Status == TAPI_SIM_PIN_OPERATION_SUCCESS) { - if (pPinInfo->type == TAPI_SIM_PTYPE_PUK1) { - ph_dialer_data *dial_d = data; - if (dial_d->popup) - evas_object_del(dial_d->popup); - dial_d->popup = phone_create_popup(dial_d->win, T_(PH_GET_TEXT_BASIC, PHTEXT_REQUEST_SUCCESS), 2.0); - evas_object_smart_callback_add(dial_d->popup, "timeout", ph_dialer_util_popup_response_cb, dial_d); - } - else if (pPinInfo->type == TAPI_SIM_PTYPE_PIN2) - PH_DBG("Unblock PIN2 Success!"); - } - else { - if (pPinInfo->type == TAPI_SIM_PTYPE_PUK1) { - ph_dialer_data *dial_d = data; - if (dial_d->popup) - evas_object_del(dial_d->popup); - dial_d->popup = phone_create_popup(dial_d->win, T_(PH_GET_TEXT_BASIC, PHTEXT_REQUEST_FAIL), 2.0); - evas_object_smart_callback_add(dial_d->popup, "timeout", ph_dialer_util_popup_response_cb, dial_d); - } - else if (pPinInfo->type == TAPI_SIM_PTYPE_PIN1 - || pPinInfo->type == TAPI_SIM_PTYPE_PIN2 - || pPinInfo->type == TAPI_SIM_PTYPE_PUK2) { - ERR("%d Verification Failed! - PIN Required", pPinInfo->type); - PH_DBG("Remainint attempts [%d]", pPinInfo->retry_count); - } - } - } - break; - default: - break; - } + if (!status) { + ERR("SIM is not available"); + tel_deinit(handle); + handle = NULL; + return FALSE; } - else - PH_DBG("Undhandled EventClass [0x%x]", sim_event->EventClass); - return; + return TRUE; } -int GCF_subscribe_tapi_events(void *data) +int GCF_tapi_deinit() { - int i = 0; - int ret_val = TRUE; - TapiResult_t api_err; - static int SIMEvtList[] = { - TAPI_EVENT_SIM_PB_ACCESS_READ_CNF, - TAPI_EVENT_SIM_VERIFY_PUK_CNF, - }; - - tel_init(); - iNumOfSIMEvt = sizeof(SIMEvtList)/sizeof(int); - - SIM_subscription_id = (unsigned int *) calloc(iNumOfSIMEvt , sizeof (unsigned int)); - if (SIM_subscription_id == NULL) - ERR("calloc error -NULL, errno is [%d]", errno); - - for ( i=0 ; i< iNumOfSIMEvt; i++ ) { - api_err = tel_register_event(SIMEvtList[i], &SIM_subscription_id[i], (TelAppCallback)&sim_async_event_callback, data); - if (api_err != TAPI_API_SUCCESS) { - ERR("isn't subscribed. sub id is [%d], api_err is [%d]", SIM_subscription_id[i], api_err); - ret_val = FALSE; - break; - } - } - tel_register_app_name(PHONE_PKG); - return ret_val; + int ret = tel_deinit(handle); + handle = NULL; + return ret; } -int GCF_unsubscribe_tapi_events() +static void sim_async_response_verify_puk(TapiHandle *handle, int result, void *data, void *user_data) { - int i = 0; - TapiResult_t api_err; - int ret_val = TRUE; - - for (i=0;i<iNumOfSIMEvt; i++) { - api_err = tel_deregister_event(SIM_subscription_id[i]); - if (api_err != TAPI_API_SUCCESS) { - ERR("TelTapiDeRegister isn't unsubscribed. sub id is [%d] api_err is [%d]", SIM_subscription_id[i], api_err); - ret_val = FALSE; - break; + TelSimPinOperationResult_t sec_rt = result; + TelSimSecResult_t *pPinInfo = data; + + if (sec_rt == TAPI_SIM_PIN_OPERATION_SUCCESS) { + if (pPinInfo->type == TAPI_SIM_PTYPE_PUK1) { + ph_dialer_data *dial_d = user_data; + phone_show_popup(dial_d->navi, T_(PH_GET_TEXT_BASIC, PHTEXT_REQUEST_SUCCESS), 2.0); } + else if (pPinInfo->type == TAPI_SIM_PTYPE_PIN2) + PH_DBG("Unblock PIN2 Success!"); } - tel_deinit(); - return ret_val; + else { + if (pPinInfo->type == TAPI_SIM_PTYPE_PUK1) { + ph_dialer_data *dial_d = user_data; + phone_show_popup(dial_d->navi, T_(PH_GET_TEXT_BASIC, PHTEXT_REQUEST_FAIL), 2.0); + } + else if (pPinInfo->type == TAPI_SIM_PTYPE_PIN1 + || pPinInfo->type == TAPI_SIM_PTYPE_PIN2 + || pPinInfo->type == TAPI_SIM_PTYPE_PUK2) { + ERR("%d Verification Failed! - PIN Required", pPinInfo->type); + PH_DBG("Remainint attempts [%d]", pPinInfo->retry_count); + } + } + + GCF_tapi_deinit(); } -void GCF_test_puk_operation(const char *puk1, const char *pin1) +void GCF_test_puk_operation(const char *puk1, const char *pin1, void *user_data) { - int length = TAPI_SIM_PIN_LENGTH+1; - char init_pin_val[TAPI_SIM_PIN_LENGTH+1]={0}; - char init_puk_val[TAPI_SIM_PIN_LENGTH+1]={0}; + char init_pin_val[PH_TEXT_MAX_LEN] = {0}; + char init_puk_val[PH_TEXT_MAX_LEN]={0}; TelSimSecPw_t puk_data; TelSimSecPw_t new_pin_data; @@ -184,37 +109,68 @@ void GCF_test_puk_operation(const char *puk1, const char *pin1) puk_data.type = TAPI_SIM_PTYPE_PUK1; // 0x00 puk_data.pw_len = strlen(init_puk_val); - puk_data.pw = (unsigned char*)calloc(1, length); - memcpy(puk_data.pw, init_puk_val, sizeof(init_puk_val)); + puk_data.pw = (unsigned char*)calloc(1, puk_data.pw_len); + memcpy(puk_data.pw, init_puk_val, puk_data.pw_len); new_pin_data.type = TAPI_SIM_PTYPE_PIN1; // 0x00 new_pin_data.pw_len = strlen(init_pin_val); - new_pin_data.pw = (unsigned char*)calloc(1, length); - memcpy(new_pin_data.pw, init_pin_val, sizeof(init_pin_val)); + new_pin_data.pw = (unsigned char*)calloc(1, new_pin_data.pw_len); + memcpy(new_pin_data.pw, init_pin_val, new_pin_data.pw_len); - ret = tel_verify_sim_puks(&puk_data, &new_pin_data, &request_id); - if (ret != TAPI_API_SUCCESS) + ret = tel_verify_sim_puks(handle, &puk_data, &new_pin_data, sim_async_response_verify_puk, user_data); + if (ret != TAPI_API_SUCCESS) { ERR("TAPI API FAIL: Error Code [0x%x]", ret); + GCF_tapi_deinit(); + } free(puk_data.pw); free(new_pin_data.pw); } -void GCF_test_read_contact(int index) +static void sim_async_response_read_contact(TapiHandle *handle, int result, void *data, void *user_data) +{ + PH_FN_CALL; + TelSimPbAccessResult_t sec_rt = result; + TelSimPbRecord_t *sim_acces_info = data; + + if (sec_rt != TAPI_SIM_PB_SUCCESS) { + ERR("SIM phone book access error [%d]", sec_rt); + GCF_tapi_deinit(); + return; + } + + if (sim_acces_info->phonebook_type == TAPI_SIM_PB_ADN) //KKC - ADN number value! + ph_dialer_util_show_matched_one_number(user_data, (char *)sim_acces_info->name, (char *)sim_acces_info->number); + else if (sim_acces_info->phonebook_type == TAPI_SIM_PB_3GSIM) { + if(sim_acces_info->number && *sim_acces_info->number) + ph_dialer_util_show_matched_one_number(user_data, (char *)sim_acces_info->name, (char*)(sim_acces_info->number)); + if (sim_acces_info->anr1_ton == TAPI_SIM_TON_ABBREVIATED_NUMBER) //KKC - USIM ADN number value! + ph_dialer_util_show_matched_one_number(user_data, NULL, (char*)(sim_acces_info->anr1)); + if (sim_acces_info->anr2_ton == TAPI_SIM_TON_ABBREVIATED_NUMBER) //KKC - USIM ADN number value! + ph_dialer_util_show_matched_one_number(user_data, NULL, (char*)(sim_acces_info->anr2)); + if (sim_acces_info->anr3_ton == TAPI_SIM_TON_ABBREVIATED_NUMBER) //KKC - USIM ADN number value! + ph_dialer_util_show_matched_one_number(user_data, NULL, (char*)(sim_acces_info->anr3)); + } + GCF_tapi_deinit(); +} + +void GCF_test_read_contact(int index, void *user_data) { - TelSimPbFileType_t storage_type = 0; + TelSimPbType_t pb_type = 0; TelSimCardType_t card_type = 0; int ret; - tel_get_sim_type(&card_type); + tel_get_sim_type(handle, &card_type); if (card_type == TAPI_SIM_CARD_TYPE_GSM) - storage_type = TAPI_SIM_PB_ADN; + pb_type = TAPI_SIM_PB_ADN; else if (card_type == TAPI_SIM_CARD_TYPE_USIM) - storage_type = TAPI_SIM_PB_3GSIM; + pb_type = TAPI_SIM_PB_3GSIM; - ret = tel_read_sim_pb_record(storage_type, index, &request_id); - if (ret != TAPI_API_SUCCESS) + ret = tel_read_sim_pb_record(handle, pb_type, index, sim_async_response_read_contact, user_data); + if (ret != TAPI_API_SUCCESS) { ERR("TAPI API FAIL: Error Code [0x%x]", ret); + GCF_tapi_deinit(); + } } /* Gcf Puk1*/ diff --git a/lib/dialer/ph-dialer-tapi.h b/lib/dialer/ph-dialer-tapi.h index 76b57f3..d9ed592 100755 --- a/lib/dialer/ph-dialer-tapi.h +++ b/lib/dialer/ph-dialer-tapi.h @@ -17,10 +17,10 @@ #ifndef __PH_DIALER_TAPI_H__ #define __PH_DIALER_TAPI_H__ -int GCF_subscribe_tapi_events(void *data); -int GCF_unsubscribe_tapi_events(); -void GCF_test_puk_operation(const char *puk1, const char *pin1); -void GCF_test_read_contact(int index); +int GCF_tapi_init(); +int GCF_tapi_deinit(); +void GCF_test_puk_operation(const char *puk1, const char *pin1, void *user_data); +void GCF_test_read_contact(int index, void *user_data); int GCF_check_puk1_str(const char *number, char *dest_puk, char *dest_pin1, char *dest_pin2, int size_dest); bool GCF_check_admin_sim(const char *number, int *ret_index); diff --git a/lib/dialer/ph-dialer-utils.c b/lib/dialer/ph-dialer-utils.c index 133d51e..9450234 100755 --- a/lib/dialer/ph-dialer-utils.c +++ b/lib/dialer/ph-dialer-utils.c @@ -20,59 +20,74 @@ #include <vconf-keys.h> #include <bundle.h> #include <aul.h> -#include <TapiCommon.h> +#include <tapi_common.h> #include <ITapiSim.h> -#include <appsvc.h> +#include <TapiUtility.h> +#include <feedback.h> #include "phone.h" #include "phone-dialer.h" +#include "phone-speed.h" #include "ph-dialer-utils.h" #include "ph-dialer-view.h" +#include "ph-dialer-search.h" #define PH_DIALER_KEY_MAX_LEN 256 +ph_speeddial_info* ph_dialer_util_get_speeddial_by_number(void *data, int number) +{ + ph_speeddial_info * find_sd = NULL; + ph_dialer_data *dial_d = data; + Eina_List *l; + + p_retvm_if(NULL == dial_d->speeddial_list, NULL, "There is no speeddial list"); + + EINA_LIST_FOREACH(dial_d->speeddial_list, l, find_sd) { + if (!find_sd) continue; + if (number == find_sd->dial_number && find_sd->ph_number) + break; + } + return find_sd; +} + void ph_dialer_util_entry_clear(ph_dialer_data *dial_d) { ph_dialer_util_del_all_number(dial_d); - ph_dialer_entry_set_number(dial_d, "", 0, TRUE); + ph_dialer_entry_set_number(dial_d, "", 0); if (dial_d->has_focus) { elm_object_focus_set(dial_d->entry, EINA_FALSE); dial_d->has_focus = false; } + ph_dialer_search_request(dial_d, FALSE); } void ph_dialer_util_launch_call(ph_dialer_data *dial_d) { char num[PH_TEXT_MAX_LEN] = {0}; - char buf[PH_TEXT_MAX_LEN] = {0}; int text_len; - bundle* b; + bundle* kb; p_retm_if(dial_d == NULL, "Invalid argument: ph_dialer_data *is NULL"); text_len = ph_dialer_util_get_pure_numstr_with_plus(dial_d, num); if (0 < text_len) { - b = bundle_create(); - p_retm_if(NULL == b, "bundle_create() Failed"); - if (PH_DAILER_EMERGENCY == dial_d->run_mode) { - bundle_add(b, "launch-type", "EMERGENCY"); - bundle_add(b, "number", num); - aul_launch_app(VOICECALL_PKG, b); + kb = bundle_create(); + p_retm_if(NULL == kb, "bundle_create() Failed"); + bundle_add(kb, "launch-type", "EMERGENCY"); + bundle_add(kb, "number", num); + aul_launch_app(VOICECALL_PKG, kb); + bundle_free(kb); } - else { - appsvc_set_operation(b, APPSVC_OPERATION_CALL); - snprintf(buf, sizeof(buf), "tel:%s", (char*)num); - appsvc_set_uri(b, buf); - appsvc_run_service(b, 0, NULL, NULL); - } - bundle_free(b); + else + phone_launch_voice_call(-1, num); } ph_dialer_util_entry_clear(dial_d); } + int ph_dialer_util_get_cursor_pos(ph_dialer_data *dial_d) { InputNumber *node; @@ -200,33 +215,45 @@ static int dialer_util_is_num_length_over(int len) int ph_dialer_util_append_node_from_numstr(ph_dialer_data *dial_d, char *string) { int i = 0; + int j = 0; int len = 0; InputNumber *node; InputNumber *tmp_node = NULL; + char* tmp_string = NULL; ph_dialer_util_del_all_number(dial_d); + p_retvm_if(NULL == string, 0, "string data is null"); + node = &dial_d->number_head; + len = strlen(string); if (dialer_util_is_num_length_over(len-1) == TRUE) { - if (dial_d->popup) - evas_object_del(dial_d->popup); - dial_d->popup = phone_create_popup(dial_d->win, T_(PH_GET_TEXT_BASIC, PHTEXT_EXCEED_NUM_MAX_LENGTH), 2.0); - evas_object_smart_callback_add(dial_d->popup, "timeout", ph_dialer_util_popup_response_cb, dial_d); + phone_show_popup(dial_d->navi, T_(PH_GET_TEXT_BASIC, PHTEXT_EXCEED_NUM_MAX_LENGTH), 2.0); len = PH_DIALER_KEY_MAX_LEN; string[len] = '\0'; } - for (; i<len; i++) { + tmp_string = calloc(1, len); + for(i = 0; i<len; i++) { + if(string[i] >= '0' && string[i] <= '9') { + tmp_string[j++] = string[i]; + } + } + len = strlen(tmp_string); + tmp_string[len] = '\0'; + + for (i = 0; i<len; i++) { tmp_node = calloc(1, sizeof(InputNumber)); tmp_node->next = NULL; tmp_node->prev = node; - tmp_node->num = string[i]; + tmp_node->num = tmp_string[i]; node->next = tmp_node; node = node->next; } dial_d->number_cursor = tmp_node; + free(tmp_string); return len; } @@ -241,10 +268,7 @@ int ph_dialer_util_append_node_from_numstr_with_strip(ph_dialer_data *dial_d, ch node = &dial_d->number_head; len = strlen(string); if (dialer_util_is_num_length_over(len-1) == TRUE) { - if (dial_d->popup) - evas_object_del(dial_d->popup); - dial_d->popup = phone_create_popup(dial_d->win, T_(PH_GET_TEXT_BASIC, PHTEXT_EXCEED_NUM_MAX_LENGTH), 2.0); - evas_object_smart_callback_add(dial_d->popup, "timeout", ph_dialer_util_popup_response_cb, dial_d); + phone_show_popup(dial_d->navi, T_(PH_GET_TEXT_BASIC, PHTEXT_EXCEED_NUM_MAX_LENGTH), 2.0); len = PH_DIALER_KEY_MAX_LEN; string[len] = '\0'; } @@ -266,6 +290,90 @@ int ph_dialer_util_append_node_from_numstr_with_strip(ph_dialer_data *dial_d, ch return cnt; } +char ph_dialer_util_get_value_word(char in) +{ + switch (in) { + case '2': + return 'a'; + case '3': + return 'd'; + case '4': + return 'g'; + case '5': + return 'j'; + case '6': + return 'm'; + case '7': + return 'p'; + case '8': + return 't'; + case '9': + return 'w'; + default: + return ' '; + } +} + +char ph_dialer_util_get_next_value_abcmode(char in) +{ + switch (in) { + case 'a': + return 'b'; + case 'b': + return 'c'; + case 'c': + return 'a'; + case 'd': + return 'e'; + case 'e': + return 'f'; + case 'f': + return 'd'; + case 'g': + return 'h'; + case 'h': + return 'i'; + case 'i': + return 'g'; + case 'j': + return 'k'; + case 'k': + return 'l'; + case 'l': + return 'j'; + case 'm': + return 'n'; + case 'n': + return 'o'; + case 'o': + return 'm'; + case 'p': + return 'q'; + case 'q': + return 'r'; + case 'r': + return 's'; + case 's': + return 'p'; + case 't': + return 'u'; + case 'u': + return 'v'; + case 'v': + return 't'; + case 'w': + return 'x'; + case 'x': + return 'y'; + case 'y': + return 'z'; + case 'z': + return 'w'; + default: + return ' '; + } +} + static InputNumber* dialer_util_insert_number_after(InputNumber *node, char num) { InputNumber *tmp; @@ -298,10 +406,7 @@ void ph_dialer_util_insert_number_at_cursor(ph_dialer_data *dial_d, char num) /* check length */ len = ph_dialer_util_get_numstr_from_node(dial_d, buf); if (dialer_util_is_num_length_over(len) == TRUE) { - if (dial_d->popup) - evas_object_del(dial_d->popup); - dial_d->popup = phone_create_popup(dial_d->win, T_(PH_GET_TEXT_BASIC, PHTEXT_EXCEED_NUM_MAX_LENGTH), 2.0); - evas_object_smart_callback_add(dial_d->popup, "timeout", ph_dialer_util_popup_response_cb, dial_d); + phone_show_popup(dial_d->navi, T_(PH_GET_TEXT_BASIC, PHTEXT_EXCEED_NUM_MAX_LENGTH), 2.0); return; } @@ -460,13 +565,98 @@ void ph_dialer_util_add_dashes(ph_dialer_data *dial_d, DashMode kMode) } } -void ph_dialer_util_popup_response_cb(void *data, Evas_Object *obj, void *event_info) +void ph_dialer_util_highlight_substring(char *dest, int dest_len, char *string, + char *substr) +{ + char middle[PH_TEXT_MAX_LEN] = {0}; + char first[PH_TEXT_MAX_LEN] = {0}; + const char *highlight_color = "#00ffff"; + const char *default_color = "#737373"; + + p_retm_if(NULL == string, "string is null"); + + if (substr && *substr) { + int len = strlen(substr); + snprintf(first, sizeof(first), "%s", string); + char *last = strcasestr(first, substr); + if (last) { + int ret; + snprintf(middle, strlen(substr)+1, "%s", last); + *(last) = '\0'; + ret = snprintf(dest, dest_len-7, "<left><color=%s>%s</><color=%s>%s</><color=%s>%s</></>", + default_color, first, highlight_color, middle, default_color, last+len); + snprintf(dest+ret, 7, "</></>"); + } + else + snprintf(dest, dest_len, "<left><color=%s>%s</></>", default_color, string); + } + else + snprintf(dest, dest_len, "<left><color=%s>%s</></>", default_color, string); +} + +void ph_dialer_util_highlight_substring_with_pos(char *dest, int dest_len, char *string, + int position, int length) +{ + char middle[PH_TEXT_MAX_LEN] = {0}; + char first[PH_TEXT_MAX_LEN] = {0}; + const char *highlight_color = "#00ffff"; + const char *default_color = "#737373"; + + p_retm_if(NULL == string, "string is null"); + + if (0 < length) { + int ret; + snprintf(first, sizeof(first), "%s", string); + snprintf(middle, length+1, "%s", string + position); + first[position] = '\0'; + ret = snprintf(dest, dest_len-7, "<left><color=%s>%s</><color=%s>%s</><color=%s>%s</></>", + default_color, first, highlight_color, middle, default_color, string + position + length); + snprintf(dest+ret, 7, "</></>"); + } + else + snprintf(dest, dest_len, "<left>%s</>", string); +} + +int ph_dialer_util_show_matched_one_number(ph_dialer_data *dial_d, char *name, char *number) +{ + PH_FN_CALL; + p_retvm_if(dial_d==NULL, 0, "dialer data is null"); + + if (dial_d->slide) { + edje_object_signal_emit(_EDJ(dial_d->layout), "elm,state,slide,stop", "elm"); + dial_d->slide = false; + } + + edje_object_signal_emit(_EDJ(dial_d->layout), "viewcontrol/search_result", "viewcontrol"); + edje_object_part_text_set(_EDJ(dial_d->layout), "search_result/item/number/textblock", number); + + if (name && *name) { + edje_object_part_text_set(_EDJ(dial_d->layout), "search_result/item/name/text", name); + edje_object_signal_emit(_EDJ(dial_d->layout), "viewobject/search_result/search_number", "viewobject/search_result"); + } + else + edje_object_signal_emit(_EDJ(dial_d->layout), "viewcontrol/noname", "viewcontrol"); + + ph_dialer_update_cnt_btn(dial_d, 1); + dial_d->is_show_items = true; + return 0; +} + +void ph_dialer_util_speeddial_show_cb(void *data, Evas_Object *obj, void *event_info) { ph_dialer_data *dial_d = data; - evas_object_del(obj); + phone_create_speeddial_view(dial_d->ug, dial_d->win, dial_d->navi); + evas_object_del(dial_d->popup); dial_d->popup = NULL; } +void ph_dialer_util_show_speeddial_msg(ph_dialer_data *dial_d, const char *msg) +{ + char dest[PH_TEXT_MAX_LEN] = {0}; + snprintf(dest, sizeof(dest), "%s", msg); + phone_create_confirm_popup(&dial_d->popup, dial_d->win, msg, ph_dialer_util_speeddial_show_cb, dial_d); +} + void ph_dialer_util_setup_run_mode(ph_dialer_data *dial_d) { int ret = 0; @@ -499,3 +689,50 @@ void ph_dialer_util_setup_run_mode(ph_dialer_data *dial_d) } } +void ph_dialer_util_init_sim_value(ph_dialer_data *dial_d) +{ + /* Network MCC */ + int value = 0; + int ret; + TelSimImsiInfo_t sim_imsi_info; + TapiHandle *handle; + ret = vconf_get_int(VCONFKEY_TELEPHONY_PLMN, &value); + if (ret < 0) + dial_d->cur_mcc = -1; + else + dial_d->cur_mcc = value / 1000; + + /* SIM MCC/MNC */ + dial_d->cur_sim_mcc = -1; + handle = tel_init(NULL); + if (NULL == handle) { + ERR("tel_init() Failed"); + } + else { + ret = tel_get_sim_imsi(handle, &sim_imsi_info); + if (0 == ret) + dial_d->cur_sim_mcc = atoi(sim_imsi_info.szMcc); + else + ERR("tel_get_sim_imsi() Failed(%d)", ret); + tel_deinit(handle); + } + dial_d->cur_cc_index = -1; + + ret = vconf_get_int(VCONFKEY_TELEPHONY_SVC_ROAM, &value); + if (ret < 0) + dial_d->roaming = 0; + else + dial_d->roaming = value; +} + +void ph_dialer_util_svi_play(int vibration_key, int sound_key) +{ + int effect_status = FALSE; + vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &effect_status); + if (effect_status) + feedback_play_type(FEEDBACK_TYPE_SOUND, sound_key); + + vconf_get_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, &effect_status); + if (effect_status) + feedback_play_type(FEEDBACK_TYPE_VIBRATION, vibration_key); +} diff --git a/lib/dialer/ph-dialer-utils.h b/lib/dialer/ph-dialer-utils.h index 98db1af..809cbcb 100755 --- a/lib/dialer/ph-dialer-utils.h +++ b/lib/dialer/ph-dialer-utils.h @@ -19,6 +19,29 @@ #include <stdio.h> +typedef struct +{ + char *plog_number; +}ph_dial_log_d; + +typedef struct +{ + char *display; + char *number; + char *find_number; + + int type; + int contact_id; + int position; + int len; +}ph_dial_search_d; + +typedef struct{ + char *cc; + char *name; + int mcc; +}ph_cc_name_mcc_info; + void ph_dialer_util_launch_call(ph_dialer_data *dial_d); int ph_dialer_util_get_pure_numstr_with_plus(ph_dialer_data *dial_d, char *dest); @@ -34,14 +57,26 @@ void ph_dialer_util_insert_number_at_cursor(ph_dialer_data *dial_d, char num); char ph_dialer_util_get_number_at_cursor(ph_dialer_data *dial_d); int ph_dialer_util_get_cursor_pos(ph_dialer_data *dial_d); +char ph_dialer_util_get_next_value_abcmode(char in); +char ph_dialer_util_get_value_word(char in); InputNumber *ph_dialer_util_get_node_by_index(ph_dialer_data *dial_d, int index); void ph_dialer_util_strip_from_number_node(ph_dialer_data *dial_d); int ph_dialer_util_is_dash(char ch); void ph_dialer_util_add_dashes(ph_dialer_data *dial_d, DashMode kMode); void ph_dialer_util_entry_clear(ph_dialer_data *dial_d); -void ph_dialer_util_popup_response_cb(void *data, Evas_Object *obj, void *event_info); +void ph_dialer_util_highlight_substring(char *dest, int dest_len, char *allpart, char *part); +void ph_dialer_util_highlight_substring_with_pos(char *dest, int dest_len, char *string, + int position, int length); + +ph_speeddial_info* ph_dialer_util_get_speeddial_by_number(void *data, int speednumber); + +int ph_dialer_util_show_matched_one_number(ph_dialer_data *dial_d, char *name, char *number); +void ph_dialer_util_show_speeddial_msg(ph_dialer_data *dial_d, const char *msg); +void ph_dialer_util_speeddial_show_cb(void *data, Evas_Object *obj, void *event_info); +void ph_dialer_util_init_sim_value(ph_dialer_data *dial_d); void ph_dialer_util_setup_run_mode(ph_dialer_data *dial_d); +void ph_dialer_util_svi_play(int vibration_key, int sound_key); #endif //__PH_DIALER_UTIL_H__ diff --git a/lib/dialer/ph-dialer-view.c b/lib/dialer/ph-dialer-view.c index 1083d8d..9f6c2cb 100644..100755 --- a/lib/dialer/ph-dialer-view.c +++ b/lib/dialer/ph-dialer-view.c @@ -15,12 +15,11 @@ */ #include <string.h> -#include <malloc.h> +#include <feedback.h> #include <Ecore_X.h> #include <vconf.h> #include <vconf-keys.h> -#include <TapiEvent.h> #include <ui-gadget-module.h> #include "phone.h" @@ -28,8 +27,9 @@ #include "ph-dialer-view.h" #include "ph-dialer-utils.h" +#include "ph-dialer-search.h" -#define PH_DIALER_ENTRY_DEFAULT_STYLE "<align=center font=SLP:style=Roman font_size=%d color=#ffffff>%s</>" +#define PH_DIALER_ENTRY_DEFAULT_STYLE "<align=center font=SLP:style=Roman text_class=slp_roman font_size=%d color=#000000>%s</>" #define PH_DIALER_ENTRY_EMPTY_STYLE "<align=center font_size=%d>​</>" static void dialer_entry_cursor_changed(void *data, Evas_Object *entry, void *event_info) @@ -38,6 +38,53 @@ static void dialer_entry_cursor_changed(void *data, Evas_Object *entry, void *ev dial_d->cursor_changed = true; } +static void dialer_show_search_list_toggle(ph_dialer_data *dial_d, bool show) +{ + PH_FN_CALL; + if (show) + { + edje_object_signal_emit(_EDJ(dial_d->layout), + "viewobject/search_list/show", "viewobject/search_list"); + dial_d->count_button_status = COUNT_BUTTON_OPEN; + edje_object_signal_emit(_EDJ(dial_d->count_layout), "count_button/closed", "count_button"); + } + else + { + edje_object_signal_emit(_EDJ(dial_d->layout), + "viewobject/search_list/hide", "viewobject/search_list"); + dial_d->count_button_status = COUNT_BUTTON_CLOSE; + edje_object_signal_emit(_EDJ(dial_d->count_layout), "count_button/opened", "count_button"); + } + + edje_object_signal_emit(_EDJ(dial_d->layout), + "viewobject/search_list/index/hide", "viewobject/search_list/index"); + +} + +static void dialer_entry_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + ph_dialer_data *dial_d = data; + + if (dial_d->list_mode == MODE_DIAL_NUMBER) { + if (NULL == dial_d->search_list || eina_list_count(dial_d->search_list) < 2 || !dial_d->is_show_items) + edje_object_signal_emit(_EDJ(dial_d->layout), + "viewobject/search_result/count/hide", "viewobject/search_result/count"); + else + edje_object_signal_emit(_EDJ(dial_d->layout), + "viewobject/search_result/count/show", "viewobject/search_result/count"); + } + else { + if (NULL == dial_d->cc_list_sorted || eina_list_count(dial_d->cc_list_sorted) < 2 || !dial_d->is_show_items) + edje_object_signal_emit(_EDJ(dial_d->layout), + "viewobject/search_result/count/hide", "viewobject/search_result/count"); + else + edje_object_signal_emit(_EDJ(dial_d->layout), + "viewobject/search_result/count/show", "viewobject/search_result/count"); + } + + dialer_show_search_list_toggle(dial_d, false); +} + static void dialer_entry_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info) { ph_dialer_data *dial_d = data; @@ -60,10 +107,34 @@ static void dialer_softkey_longpress(char *source, ph_dialer_data *dial_d) pos = ph_dialer_util_remove_node_at_cursor(dial_d); edje_object_signal_emit(_EDJ(dial_d->layout), "pad_clicked", "P"); ph_dialer_util_get_numstr_from_node(dial_d, dest); - ph_dialer_entry_set_number(dial_d, dest, 0, TRUE); + ph_dialer_entry_set_number(dial_d, dest, 0); + } + } + else if (strcmp(source, "sharp") == 0 || strcmp(source, "#") == 0) { + + ph_dialer_util_get_numstr_from_node(dial_d, dest); + if(strlen(dest) > 1) /* '#' longpress disable after number typed */ + return; + + int value = 1; + vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &value); + if(!value) { + vconf_set_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, TRUE); + phone_show_popup(dial_d->win, T_(PH_GET_TEXT_BASIC, PHTEXT_SOUND_ON), 2.0); + } + else { + vconf_set_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, FALSE); + phone_show_popup(dial_d->win, T_(PH_GET_TEXT_BASIC, PHTEXT_SOUND_OFF), 2.0); + } + + if(ph_dialer_util_get_number_at_cursor(dial_d) == '#') { + pos = ph_dialer_util_remove_node_at_cursor(dial_d); + ph_dialer_util_get_numstr_from_node(dial_d, dest); + ph_dialer_entry_set_number(dial_d, dest, 0); + ph_dialer_search_request(dial_d, FALSE); } } - else if (strcmp(source, "input_back") == 0) + else if (strcmp(source, "input_del") == 0) ph_dialer_util_entry_clear(dial_d); } @@ -89,6 +160,21 @@ static Eina_Bool dialer_keypad_longpress(void *data) edje_object_signal_emit(_EDJ(dial_d->layout), "pad_clicked", "+"); break; } + /* speed dial: 2 ~ 9 */ + if (0 < text_len && text_len <= 2) { + if ('0' <= dest[0] && dest[0] <= '9' && atoi(dest) < 10) { + ph_speeddial_info * speed_info = NULL; + if ((speed_info = ph_dialer_util_get_speeddial_by_number(dial_d, atoi(dest))) != NULL) { + ph_dialer_util_append_node_from_numstr_with_strip(dial_d, speed_info->ph_number); + ph_dialer_util_add_dashes(dial_d, DASH_REAL); + ph_dialer_util_get_numstr_from_node(dial_d, dest); + ph_dialer_entry_set_number(dial_d, dest, CURSOR_END); + ph_dialer_util_launch_call(dial_d); + } + else + ph_dialer_util_show_speeddial_msg(dial_d, T_(PH_GET_TEXT_BASIC, PHTEXT_SPEED_DIAL_REQUEST)); + } + } break; default: dialer_softkey_longpress(source, dial_d); @@ -138,11 +224,14 @@ static void dialer_keypad_down(void *data, Evas_Object *obj, const char *emissio break; } + if (PH_DAILER_DURING_CALL != dial_d->run_mode) + ph_dialer_util_svi_play(FEEDBACK_PATTERN_TOUCH_TAP , FEEDBACK_PATTERN_TOUCH_KEY); + ph_dialer_util_strip_from_number_node(dial_d); ph_dialer_util_insert_number_at_cursor(dial_d, source[0]); ph_dialer_util_add_dashes(dial_d, DASH_REAL); ph_dialer_util_get_numstr_from_node(dial_d, dest); - ph_dialer_entry_set_number(dial_d, dest, 0, TRUE); + ph_dialer_entry_set_number(dial_d, dest, 0); /* create new longpress timer */ if (dial_d->longpress_timer) { @@ -151,6 +240,7 @@ static void dialer_keypad_down(void *data, Evas_Object *obj, const char *emissio } FREEandSTRDUP(dial_d->longpress_source, source); dial_d->longpress_timer = ecore_timer_add(elm_config_longpress_timeout_get(), dialer_keypad_longpress, dial_d); + ph_dialer_search_request(dial_d, FALSE); } static Eina_Bool dialer_dash_add_timer(void *data) @@ -161,7 +251,7 @@ static Eina_Bool dialer_dash_add_timer(void *data) ph_dialer_util_strip_from_number_node(dial_d); ph_dialer_util_add_dashes(dial_d, DASH_PREVIEW); ph_dialer_util_get_numstr_from_node(dial_d, dest); - ph_dialer_entry_set_number(dial_d, dest, 0, TRUE); + ph_dialer_entry_set_number(dial_d, dest, 0); dial_d->dash_timer = NULL; return ECORE_CALLBACK_CANCEL; @@ -194,7 +284,7 @@ static void dialer_keypad_clicked(void *data, Evas_Object *obj, const char *emis p_retm_if(NULL == source, "source is null"); p_retm_if(NULL == data, "Invalid argument: ph_dialer_data is NULL"); - if (strcmp(source, "+") !=0 && strcmp(source, "P") !=0) + if (0 != strcmp(source, "+") && 0 != strcmp(source, "P") && 0 != strcmp(source, "W")) return; if (dial_d->dash_timer) { @@ -206,7 +296,8 @@ static void dialer_keypad_clicked(void *data, Evas_Object *obj, const char *emis ph_dialer_util_insert_number_at_cursor(dial_d, source[0]); ph_dialer_util_add_dashes(dial_d, DASH_REAL); ph_dialer_util_get_numstr_from_node(dial_d, dest); - ph_dialer_entry_set_number(dial_d, dest, 0, FALSE); + ph_dialer_entry_set_number(dial_d, dest, 0); + ph_dialer_search_request(dial_d, FALSE); } static void dialer_softkey_down(void *data, Evas_Object *obj, const char *emission, const char *source) @@ -216,7 +307,11 @@ static void dialer_softkey_down(void *data, Evas_Object *obj, const char *emissi ph_dialer_data *dial_d = data; p_retm_if(data == NULL, "Invalid argument: ph_dialer_data *is NULL"); - if (0 != strcmp(source, "input_back")) + if (0 == strcmp(source, "back_btn") || 0 == strcmp(source, "option_btn")) + return; + + ph_dialer_util_svi_play(FEEDBACK_PATTERN_TOUCH_TAP , FEEDBACK_PATTERN_TOUCH_TAP); + if (0 != strcmp(source, "input_del")) return; if (dial_d->dash_timer) { @@ -228,7 +323,7 @@ static void dialer_softkey_down(void *data, Evas_Object *obj, const char *emissi ph_dialer_util_remove_node_at_cursor(dial_d); ph_dialer_util_add_dashes(dial_d, DASH_REAL); ph_dialer_util_get_numstr_from_node(dial_d, dest); - ph_dialer_entry_set_number(dial_d, dest, 0, FALSE); + ph_dialer_entry_set_number(dial_d, dest, 0); if (!*dest && dial_d->has_focus) { elm_object_focus_set(dial_d->entry, EINA_FALSE); @@ -240,8 +335,9 @@ static void dialer_softkey_down(void *data, Evas_Object *obj, const char *emissi dial_d->longpress_timer = NULL; } FREEandSTRDUP(dial_d->longpress_source, source); - dial_d->longpress_timer =ecore_timer_add(elm_config_longpress_timeout_get(), dialer_keypad_longpress, dial_d); + dial_d->longpress_timer = ecore_timer_add(elm_config_longpress_timeout_get(), dialer_keypad_longpress, dial_d); + ph_dialer_search_request(dial_d, FALSE); } static void dialer_softkey_up(void *data, Evas_Object *obj, const char *emission, const char *source) @@ -250,7 +346,7 @@ static void dialer_softkey_up(void *data, Evas_Object *obj, const char *emission ph_dialer_data *dial_d = data; p_retm_if(NULL == data, "Invalid argument: ph_dialer_data *is NULL"); - if (0 != strcmp(source, "input_back")) + if (0 != strcmp(source, "input_del")) return; if (dial_d->longpress_timer) { @@ -266,6 +362,35 @@ static void dialer_softkey_up(void *data, Evas_Object *obj, const char *emission PH_FN_END; } +static void dialer_destroy_child_ug(void *data) +{ + ph_dialer_data *dial_d = data; + dial_d->child_ug = NULL; +} + + +static void dialer_cnt_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; + ph_dialer_data *dial_d = data; + p_retm_if(dial_d == NULL, "Invalid argument: ph_dialer_data *is NULL"); + + ph_dialer_util_svi_play(FEEDBACK_PATTERN_TOUCH_TAP , FEEDBACK_PATTERN_TOUCH_TAP); + if (dial_d->count_button_status == COUNT_BUTTON_CLOSE) { + dialer_show_search_list_toggle(dial_d, true); + } + else { + dialer_show_search_list_toggle(dial_d, false); + } + + if (dial_d->count_button_status == COUNT_BUTTON_OPEN) { + if (dial_d->list_mode == MODE_DIAL_NUMBER) + ph_dialer_search_fill_genlist_by_list(dial_d); + else if (dial_d->list_mode == MODE_COUNTRY_CODE) + ph_dialer_search_fill_genlist_by_cc_list(dial_d); + } +} + static void dialer_softkey_call_clicked(void *data, int type) { PH_FN_CALL; @@ -279,14 +404,13 @@ static void dialer_softkey_call_clicked(void *data, int type) if (len == 0) { PH_DBG("text is NULL so input recent number "); char *get_str; - if (0 == type) - get_str = contacts_svc_phonelog_get_last_number(CTS_PLOG_LAST_CALL_ONLY); - + get_str = contacts_svc_phonelog_get_last_number(CTS_PLOG_LAST_ALL); if (get_str) { ph_dialer_util_append_node_from_numstr(dial_d, get_str); ph_dialer_util_add_dashes(dial_d, DASH_REAL); ph_dialer_util_get_numstr_from_node(dial_d, buf); - ph_dialer_entry_set_number(dial_d, buf, CURSOR_END, TRUE); + ph_dialer_entry_set_number(dial_d, buf, CURSOR_END); + ph_dialer_search_request(dial_d, FALSE); free(get_str); } return; @@ -295,6 +419,104 @@ static void dialer_softkey_call_clicked(void *data, int type) ph_dialer_util_launch_call(dial_d); } +static void dialer_back_btn_cb(ph_dialer_data *dial_d) +{ + dial_d->initialized = FALSE; + ph_dialer_util_entry_clear(dial_d); +} + +static void dialer_popup_del_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_dialer_data *dial_d = data; + evas_object_del(dial_d->popup); + dial_d->popup = NULL; +} + +static void dialer_ctx_message_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_dialer_data *dial_d = data; + char num[PH_TEXT_SHORT_LEN] = {0}; + ph_dialer_util_get_pure_numstr_with_plus(dial_d, num); + dial_d->child_ug = phone_launch_msg_composer_ug(dial_d->ug, num, 0, + dialer_destroy_child_ug, dial_d); + dialer_popup_del_cb(dial_d, NULL, NULL); +} + +static void dialer_add_pause_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_dialer_data *dial_d = data; + char dest[PH_TEXT_MAX_LEN] = {0}; + + dialer_show_search_list_toggle(dial_d, false); + ph_dialer_util_strip_from_number_node(dial_d); + ph_dialer_util_insert_number_at_cursor(dial_d, 'P'); + ph_dialer_util_add_dashes(dial_d, DASH_REAL); + ph_dialer_util_get_numstr_from_node(dial_d, dest); + ph_dialer_entry_set_number(dial_d, dest, 0); + ph_dialer_search_request(dial_d, FALSE); + dialer_popup_del_cb(dial_d, NULL, NULL); +} + +static void dialer_add_wait_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_dialer_data *dial_d = data; + char dest[PH_TEXT_MAX_LEN] = {0}; + + dialer_show_search_list_toggle(dial_d, false); + ph_dialer_util_strip_from_number_node(dial_d); + ph_dialer_util_insert_number_at_cursor(dial_d, 'W'); + ph_dialer_util_add_dashes(dial_d, DASH_REAL); + ph_dialer_util_get_numstr_from_node(dial_d, dest); + ph_dialer_entry_set_number(dial_d, dest, 0); + ph_dialer_search_request(dial_d, FALSE); + dialer_popup_del_cb(dial_d, NULL, NULL); +} +static void dialer_exit_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_dialer_data *dial_d = data; + p_retm_if(NULL == dial_d, "dial_d is null"); + dialer_back_btn_cb(dial_d); + phone_back_btn_clicked_cb(dial_d->win, NULL, NULL); + dialer_popup_del_cb(dial_d, NULL, NULL); +} +static void dialer_option_btn_cb(ph_dialer_data *dial_d) +{ + PH_FN_CALL; + char buf[PH_TEXT_SHORT_LEN] = {0}; + + if (dial_d->popup) + evas_object_del(dial_d->popup); + + dial_d->popup = elm_ctxpopup_add(dial_d->navi); + p_retm_if(NULL == dial_d->popup, "elm_ctxpopup_add() return NULL"); + elm_ctxpopup_direction_priority_set(dial_d->popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT); + + ph_dialer_util_get_pure_numstr_with_plus(dial_d, buf); + + evas_object_smart_callback_add(dial_d->popup, "dismissed", dialer_popup_del_cb, dial_d); + + if (!dial_d->ug) + elm_ctxpopup_item_append(dial_d->popup, S_(PH_SYS_BODY_MESSAGE), NULL, + dialer_ctx_message_cb, dial_d); + elm_ctxpopup_item_append(dial_d->popup, T_(PH_GET_TEXT_BASIC, PHTEXT_SPEEDDIAL), NULL, + ph_dialer_util_speeddial_show_cb, dial_d); + snprintf(buf, sizeof(buf), T_(PH_GET_TEXT_BASE_OP, PHTEXT_ADD_PAUSE), 2); + elm_ctxpopup_item_append(dial_d->popup, buf, NULL, + dialer_add_pause_cb, dial_d); + elm_ctxpopup_item_append(dial_d->popup, T_(PH_GET_TEXT_BASE_OP, PHTEXT_ADD_WAIT), NULL, + dialer_add_wait_cb, dial_d); + + if (!dial_d->ug) + elm_ctxpopup_item_append(dial_d->popup, T_(PH_GET_TEXT_BASE_OP, PHTEXT_EXIT), NULL, + dialer_exit_cb, dial_d); + + int x, y, w, h; + edje_object_part_geometry_get(_EDJ(dial_d->layout), "option_btn", &x, &y, &w, &h); + + evas_object_move(dial_d->popup, x+(w/2), (y+167)+(h/2)); + evas_object_show(dial_d->popup); +} + static void dialer_softkey_clicked(void *data, Evas_Object *obj, const char *emission, const char *source) { PH_FN_CALL; @@ -304,6 +526,8 @@ static void dialer_softkey_clicked(void *data, Evas_Object *obj, const char *emi PH_DBG("source:[%s]", source); + /* defense code for long-press */ + /* remove longpress timer */ if (dial_d->longpress_timer) { ecore_timer_del(dial_d->longpress_timer); dial_d->longpress_timer=NULL; @@ -311,13 +535,169 @@ static void dialer_softkey_clicked(void *data, Evas_Object *obj, const char *emi if (strstr(source, "call") != NULL) /* normal/call, dc/call */ dialer_softkey_call_clicked(dial_d, 0); + else if (0 == strcmp(source, "return_btn")) { + if (dial_d->ug) + phone_ug_destroy_me_cb(dial_d->ug, NULL, NULL); + return; + } + else if (0 == strcmp(source, "option_btn")) { + dialer_option_btn_cb(dial_d); + return; + } ph_dialer_util_get_numstr_from_node(dial_d, buf); - if (strcmp(source, "input_back") != 0) - ph_dialer_entry_set_number(dial_d, buf, CURSOR_END, TRUE); + if (strcmp(source, "input_del") != 0) + ph_dialer_entry_set_number(dial_d, buf, CURSOR_END); + else + ph_dialer_entry_set_number(dial_d, buf, 0); +} + +static char* dialer_gl_cc_label_get(ph_dialer_data *dial_d, ph_cc_name_mcc_info *item, Evas_Object *obj, const char *part) +{ + char buf[PH_TEXT_MAX_LEN] = {0}; + char text[PH_TEXT_MAX_LEN] = {0}; + int text_len; + p_retvm_if(NULL == dial_d, NULL, "dial data is null"); + + if (0 == strcmp(part, "elm.text.left.name")) { + return strdup(item->name); + } + else if (0 == strcmp(part, "elm.text.left.number")) { + text_len = ph_dialer_util_get_pure_numstr(dial_d, text); + ph_dialer_util_highlight_substring(buf, sizeof(buf), item->cc, text); + return strdup(buf); + } + else + return NULL; +} + +char* ph_dialer_gl_label_get(void *data, Evas_Object *obj, const char *part) +{ + ph_dialer_data *dial_d = evas_object_data_get(obj, KEY_DIALER_DATA); + ph_dial_search_d *sd = data; + char buf[PH_TEXT_MAX_LEN] = {0}; + + p_retvm_if(NULL == dial_d, NULL, "dialer data is null"); + p_retvm_if(NULL == data, NULL, "dialer data is null"); + + if (dial_d->list_mode == MODE_COUNTRY_CODE) + return dialer_gl_cc_label_get(dial_d, data, obj, part); + + if (0 == strcmp(part, "elm.text.left.name")) { + if (sd->display && *sd->display) { + if (sd->type == SEARCH_CONTACT_NAME_TYPE) { + ph_dialer_util_highlight_substring_with_pos(buf, sizeof(buf), sd->display, sd->position, sd->len); + return strdup(buf); + } + else + return strdup(sd->display); + } + return NULL; + } + else if (0 == strcmp(part, "elm.text.left.number")) { + if (sd->type == SEARCH_CONTACT_NAME_TYPE) + return strdup(sd->number); + else { + ph_dialer_util_highlight_substring(buf, sizeof(buf), sd->number, sd->find_number); + return strdup(buf); + } + } else - ph_dialer_entry_set_number(dial_d, buf, 0, TRUE); + return NULL; +} + +static void dialer_fastscroll_level_up(void *data, Evas_Object *obj, void *event_info) +{ + int level = elm_index_item_level_get(obj); + const Elm_Object_Item *it; + const Elm_Object_Item *index; + ph_cc_name_mcc_info *item; + char prev_ch[2] = {0}; + char prev_ch_first[2] = {0}; + p_retm_if(1 != level, "level is not 1"); + + index = elm_index_selected_item_get(obj, level - 1); + elm_index_item_clear(obj); + + it= elm_object_item_data_get(index); + p_retm_if(NULL == it, "elm_object_item_data_get(%p) returns NULL", index); + + item = elm_object_item_data_get(it); + prev_ch_first[0]=item->name[0]; + + while (it) { + item = elm_object_item_data_get(it); + + if (prev_ch_first[0] != item->name[0]) + break; + + if (prev_ch[0] != item->name[1]) { + prev_ch[0] = item->name[1]; + elm_index_item_append(obj, prev_ch, NULL, it); + } + it = elm_genlist_item_next_get(it); + } + elm_index_level_go(obj, level); +} + +static void dialer_fastscroll_level_down(void *data, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; +} + +static void dialer_fastscroll_index_changed(void *data, Evas_Object *obj, void *event_info) +{ + PH_DBG("obj:%x, level:%d", (unsigned int)obj, elm_index_item_level_get(obj)); + elm_genlist_item_bring_in(elm_object_item_data_get(event_info), + ELM_GENLIST_ITEM_SCROLLTO_TOP); +} + +static Evas_Object* dialer_create_genlist(ph_dialer_data *dial_d) +{ + Evas_Object *genlist; + Elm_Theme *th; + + genlist = elm_genlist_add(dial_d->layout); + p_retvm_if(NULL == genlist, NULL, "elm_genlist_add is failed"); + + th = elm_theme_new(); + elm_theme_ref_set(th, NULL); + elm_theme_extension_add(th, DIALER_THEME_EDJ); + dial_d->th = th; + elm_object_theme_set(genlist, dial_d->th); + evas_object_data_set(genlist, KEY_DIALER_DATA, dial_d); + + return genlist; +} + +static void dialer_create_index(ph_dialer_data *dial_d) +{ + dial_d->fast_index = elm_index_add(dial_d->layout); + elm_object_part_content_set(dial_d->layout, "search_list/index", dial_d->fast_index); + edje_object_signal_emit(_EDJ(dial_d->layout), + "viewobject/search_list/index/hide", "viewobject/search_list/index"); + + evas_object_smart_callback_add(dial_d->fast_index, "level,up", dialer_fastscroll_level_up, NULL); + evas_object_smart_callback_add(dial_d->fast_index, "level,down", dialer_fastscroll_level_down, NULL); + evas_object_smart_callback_add(dial_d->fast_index, "delay,changed", dialer_fastscroll_index_changed, NULL); + evas_object_smart_callback_add(dial_d->fast_index, "selected", dialer_fastscroll_index_changed, NULL); + elm_index_level_go(dial_d->fast_index, 0); +} + + +void ph_dialer_update_cnt_btn(ph_dialer_data *dial_d, int count) +{ + char buf[PH_TEXT_MAX_LEN] = {0}; + if (count < 2) { + elm_object_part_text_set(dial_d->count_layout, "btn_style/number", NULL); + elm_object_disabled_set(dial_d->count_button, EINA_TRUE); + } + else { + snprintf(buf, sizeof(buf), "%d", count); + elm_object_part_text_set(dial_d->count_layout, "btn_style/number", buf); + elm_object_disabled_set(dial_d->count_button, EINA_FALSE); + } } static void dialer_entry_set_number_noresize(ph_dialer_data *dial_d, char *text) @@ -333,26 +713,14 @@ static void dialer_entry_set_number_noresize(ph_dialer_data *dial_d, char *text) snprintf(buf, sizeof(buf), PH_DIALER_ENTRY_EMPTY_STYLE, size); elm_entry_entry_set(dial_d->entry, buf); - if (text && *text) - edje_object_signal_emit(_EDJ(dial_d->layout), "input_back/default", "input_back"); - else - edje_object_signal_emit(_EDJ(dial_d->layout), "input_back/dim", "input_back"); - pos = ph_dialer_util_get_cursor_pos(dial_d); elm_entry_cursor_pos_set(dial_d->entry, pos); } -void ph_dialer_entry_set_number(ph_dialer_data *dial_d, char *orig, int cursor, int is_need_emit) +void ph_dialer_entry_set_number(ph_dialer_data *dial_d, char *orig, int cursor) { char text[PH_TEXT_MAX_LEN] = {0}; - if (is_need_emit == TRUE) { - if (orig && *orig) - edje_object_signal_emit(_EDJ(dial_d->layout), "input_back/default", "input_back"); - else - edje_object_signal_emit(_EDJ(dial_d->layout), "input_back/dim", "input_back"); - } - if (orig && *orig) snprintf(text, sizeof(text), PH_DIALER_ENTRY_DEFAULT_STYLE, dial_d->entry_font_size, orig); else @@ -370,27 +738,180 @@ void ph_dialer_entry_set_number(ph_dialer_data *dial_d, char *orig, int cursor, elm_entry_cursor_pos_set(dial_d->entry, cursor); } +static void dialer_clear_thread(ph_dialer_data *dial_d) +{ + dial_d->t_info->alive = false; + if (dial_d->t_info->epipe) { + ecore_pipe_write_close(dial_d->t_info->epipe); + ecore_pipe_read_close(dial_d->t_info->epipe); + ecore_pipe_del(dial_d->t_info->epipe); + dial_d->t_info->epipe = NULL; + } + pthread_join(dial_d->t_info->thread, NULL); + free(dial_d->t_info); + dial_d->t_info = NULL; +} + +Eina_Bool ph_dialer_reload_data(void *data) +{ + PH_FN_CALL; + int count = 0; + ph_dialer_data *dial_d = data; + p_retvm_if(NULL == data, ECORE_CALLBACK_CANCEL, "data is null"); + p_retvm_if(!dial_d->data_dirty_flag, ECORE_CALLBACK_CANCEL, "data is not changed"); + + if (dial_d->data_dirty_flag & CONTACT_DATA_CHAGNED) { + phone_free_speeddial_data(dial_d->speeddial_list); + dial_d->speeddial_list = phone_load_speeddial_data(&count); + + if (dial_d->t_info) + dialer_clear_thread(dial_d); + dial_d->loading = false; + + if (dial_d->contact_list) { + phone_free_contacts(dial_d->contact_list); + dial_d->contact_list = NULL; + } + } + else if (dial_d->data_dirty_flag & SPEEDDIAL_DATA_CHAGNED) { + phone_free_speeddial_data(dial_d->speeddial_list); + dial_d->speeddial_list = phone_load_speeddial_data(&count); + } + dial_d->data_dirty_flag = 0; + ph_dialer_search_request(dial_d, TRUE); + dial_d->update_timer = NULL; + return ECORE_CALLBACK_CANCEL; +} + +static void dialer_contact_data_changed_cb(void *data) +{ + PH_FN_CALL; + ph_dialer_data *dial_d = data; + p_retm_if(NULL == data, "data is null"); + + if (dial_d->update_timer) { + ecore_timer_del(dial_d->update_timer); + dial_d->update_timer = NULL; + } + + if (dial_d->is_background) { + dial_d->data_dirty_flag |= CONTACT_DATA_CHAGNED; + dial_d->update_timer = ecore_timer_add(3.0, ph_dialer_reload_data, dial_d); + } + else { + int count = 0; + phone_free_speeddial_data(dial_d->speeddial_list); + dial_d->speeddial_list = phone_load_speeddial_data(&count); + + if (dial_d->t_info) + dialer_clear_thread(dial_d); + dial_d->loading = false; + + if (dial_d->contact_list) { + phone_free_contacts(dial_d->contact_list); + dial_d->contact_list = NULL; + } + + ph_dialer_search_request(dial_d, TRUE); + } + PH_FN_END; +} + +static void dialer_speeddial_data_changed_cb(void *data) +{ + PH_FN_CALL; + ph_dialer_data *dial_d = data; + p_retm_if(NULL == data, "data is null"); + + if (dial_d->update_timer) { + ecore_timer_del(dial_d->update_timer); + dial_d->update_timer = NULL; + } + + if (dial_d->is_background) { + dial_d->data_dirty_flag |= SPEEDDIAL_DATA_CHAGNED; + dial_d->update_timer = ecore_timer_add(3.0, ph_dialer_reload_data, dial_d); + } + else { + int count = 0; + phone_free_speeddial_data(dial_d->speeddial_list); + dial_d->speeddial_list = phone_load_speeddial_data(&count); + ph_dialer_search_request(dial_d, TRUE); + } +} + +static void dialer_log_data_changed_cb(void *data) +{ + PH_FN_CALL; + ph_dialer_data *dial_d = data; + p_retm_if(NULL == data, "data is null"); + + if (dial_d->update_timer) { + ecore_timer_del(dial_d->update_timer); + dial_d->update_timer = NULL; + } + + if (dial_d->is_background) { + dial_d->data_dirty_flag |= LOG_DATA_CHAGNED; + dial_d->update_timer = ecore_timer_add(3.0, ph_dialer_reload_data, dial_d); + } + else + ph_dialer_search_request(dial_d, TRUE); +} + static void dialer_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { PH_FN_CALL; ph_dialer_data *dial_d = data; + contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_CONTACT_CHANGE, + dialer_contact_data_changed_cb, dial_d); + contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_PLOG_CHANGE, + dialer_log_data_changed_cb, dial_d); + contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_SPEEDDIAL_CHANGE, + dialer_speeddial_data_changed_cb, dial_d); + ph_dialer_util_del_all_number(dial_d); + if (dial_d->t_info) + dialer_clear_thread(dial_d); + + if (dial_d->search_idler) + ecore_idler_del(dial_d->search_idler); + if (dial_d->popup) evas_object_del(dial_d->popup); if (dial_d->job) ecore_job_del(dial_d->job); + if (dial_d->search_timer) + ecore_timer_del(dial_d->search_timer); + if (dial_d->dash_timer) ecore_timer_del(dial_d->dash_timer); if (dial_d->longpress_timer) ecore_timer_del(dial_d->longpress_timer); + if (dial_d->update_timer) + ecore_timer_del(dial_d->update_timer); + + if (dial_d->slide_timer) + ecore_timer_del(dial_d->slide_timer); + + feedback_deinitialize(); + + if (dial_d->th) { + elm_theme_extension_del(dial_d->th, DIALER_THEME_EDJ); + elm_theme_free(dial_d->th); + } + + phone_free_speeddial_data(dial_d->speeddial_list); + phone_free_contacts(dial_d->contact_list); + free(dial_d->longpress_source); - free(dial_d->init_text); + free(dial_d->searched_text); free(dial_d); } @@ -400,16 +921,18 @@ static void dialer_entry_font_check(Evas_Object *entry, ph_dialer_data *dial_d, Ecore_X_Window win; int size; int win_width; + int max_width; int entry_width; char buf[PH_TEXT_MAX_LEN] = {0}; win = ecore_x_window_root_get(ecore_x_window_focus_get()); ecore_x_window_size_get(win, &win_width, NULL); evas_object_size_hint_min_get(entry, &entry_width, NULL); + max_width = win_width-124; size = dial_d->entry_font_size; - if (win_width < entry_width) { + if (max_width < entry_width) { if (MIN_DIAL_NUMBER_FONT_SIZE < size) { size--; snprintf(buf, sizeof(buf), PH_DIALER_ENTRY_DEFAULT_STYLE, size, text); @@ -419,7 +942,7 @@ static void dialer_entry_font_check(Evas_Object *entry, ph_dialer_data *dial_d, elm_entry_cursor_pos_set(dial_d->entry, pos); } } - else if (entry_width < win_width) { + else if (entry_width < max_width) { if (status == -1) { status = 0; return; @@ -486,11 +1009,11 @@ static void dialer_entry_text_changed(void *data, Evas_Object *obj, void *event_ int pos, cursor; char node_text[PH_TEXT_MAX_LEN] = {0}; char entry_text[PH_TEXT_MAX_LEN] = {0}; - char *org; + const char *org; char *text; int differ = 0; - org = SAFE_STRDUP(elm_entry_entry_get(obj)); + org = elm_entry_entry_get(obj); p_retm_if(NULL == org , "entry text is null"); text = elm_entry_markup_to_utf8(org); @@ -502,14 +1025,12 @@ static void dialer_entry_text_changed(void *data, Evas_Object *obj, void *event_ if (0 <= dialer_include_zero_space(text) && strlen(text) == 3 && 0 == differ) { free(text); - free(org); return; } else if (*text == '\0') { snprintf(node_text, sizeof(node_text), PH_DIALER_ENTRY_EMPTY_STYLE, dial_d->entry_font_size); elm_entry_entry_set(dial_d->entry, node_text); free(text); - free(org); return; } @@ -518,19 +1039,20 @@ static void dialer_entry_text_changed(void *data, Evas_Object *obj, void *event_ dial_d->number_cursor = ph_dialer_util_get_node_by_index(dial_d, cursor); ph_dialer_util_add_dashes(dial_d, DASH_REAL); ph_dialer_util_get_numstr_from_node(dial_d, node_text); - ph_dialer_entry_set_number(dial_d, node_text, 0, TRUE); + ph_dialer_entry_set_number(dial_d, node_text, 0); + ph_dialer_search_request(dial_d, FALSE); free(text); - free(org); return; } - if (NULL == strstr(org,"font_size")) { - if (MAX_DIAL_NUMBER_FONT_SIZE == dial_d->entry_font_size) dial_d->entry_font_size--; - else if (MIN_DIAL_NUMBER_FONT_SIZE == dial_d->entry_font_size) dial_d->entry_font_size++; + if (NULL == strstr(org, "font_size")) { + if (MAX_DIAL_NUMBER_FONT_SIZE == dial_d->entry_font_size) + dial_d->entry_font_size--; + else if (MIN_DIAL_NUMBER_FONT_SIZE == dial_d->entry_font_size) + dial_d->entry_font_size++; } dialer_entry_font_check(obj, dial_d, text, pos); free(text); - free(org); } static void dialer_create_entry(ph_dialer_data *dial_d) @@ -556,6 +1078,7 @@ static void dialer_create_entry(ph_dialer_data *dial_d) evas_object_smart_callback_add(entry, "cursor,changed", dialer_entry_cursor_changed, dial_d); evas_object_smart_callback_add(entry, "changed", dialer_entry_text_changed, dial_d); + evas_object_event_callback_add(entry, EVAS_CALLBACK_MOUSE_DOWN, dialer_entry_mouse_down, dial_d); evas_object_event_callback_add(entry, EVAS_CALLBACK_MOUSE_UP, dialer_entry_mouse_up, dial_d); } @@ -572,12 +1095,12 @@ static void dialer_entry_number_init(void *data) value = FALSE; ret = vconf_get_bool(VCONFKEY_CISSAPPL_PREFIX_DIAL_BOOL, &value); - - if(dial_d->init_text) { - ph_dialer_util_append_node_from_numstr_with_strip(dial_d, dial_d->init_text); + if(dial_d->searched_text) { + ph_dialer_util_append_node_from_numstr_with_strip(dial_d, dial_d->searched_text); ph_dialer_util_add_dashes(dial_d, DASH_REAL); ph_dialer_util_get_numstr_from_node(dial_d, num); - ph_dialer_entry_set_number(dial_d, num, CURSOR_END, TRUE); + ph_dialer_entry_set_number(dial_d, num, CURSOR_END); + ph_dialer_search_request(dial_d, TRUE); } else if (value == TRUE) { ret = vconf_get_int(VCONFKEY_CISSAPPL_PREFIX_DIAL_VALUE_INT, &value); @@ -608,7 +1131,8 @@ static void dialer_entry_number_init(void *data) ph_dialer_util_append_node_from_numstr_with_strip(dial_d, buf); ph_dialer_util_add_dashes(dial_d, DASH_REAL); ph_dialer_util_get_numstr_from_node(dial_d, num); - ph_dialer_entry_set_number(dial_d, num, CURSOR_END, TRUE); + ph_dialer_entry_set_number(dial_d, num, CURSOR_END); + ph_dialer_search_request(dial_d, FALSE); free(buf); } } @@ -621,19 +1145,25 @@ static void dialer_lazy_init(void *data) { PH_FN_CALL; ph_dialer_data *dial_d = data; + Evas_Object *genlist; + int count; + dialer_create_index(dial_d); dialer_create_entry(dial_d); dial_d->entry_font_size = MAX_DIAL_NUMBER_FONT_SIZE; dial_d->number_cursor = &(dial_d->number_head); + feedback_initialize(); + edje_object_signal_callback_add(_EDJ(dial_d->layout), "pad_clicked", "*", dialer_keypad_clicked, dial_d); edje_object_signal_callback_add(_EDJ(dial_d->layout), "pad_down", "*", dialer_keypad_down, dial_d); edje_object_signal_callback_add(_EDJ(dial_d->layout), "pad_up", "*", dialer_keypad_up, dial_d); edje_object_signal_callback_add(_EDJ(dial_d->layout), "softkey_clicked", "*", dialer_softkey_clicked, dial_d); edje_object_signal_callback_add(_EDJ(dial_d->layout), "softkey_up", "*", dialer_softkey_up, dial_d); edje_object_signal_callback_add(_EDJ(dial_d->layout), "softkey_down", "*", dialer_softkey_down, dial_d); - + count = 0; + dial_d->speeddial_list = phone_load_speeddial_data(&count); dial_d->job = ecore_job_add(dialer_entry_number_init, dial_d); } @@ -641,24 +1171,28 @@ static void dialer_layout_flush_post_cb(void *data, Evas *e, void *event_info) { ph_dialer_data *dial_d = data; evas_event_callback_del(evas_object_evas_get(dial_d->layout), - EVAS_CALLBACK_RENDER_FLUSH_POST, dialer_layout_flush_post_cb); + EVAS_CALLBACK_RENDER_FLUSH_POST, dialer_layout_flush_post_cb); dial_d->job = ecore_job_add(dialer_lazy_init, dial_d); } -static void dialer_back_btn_cb(void *data, Evas_Object *obj, void *event_info) +static void dialer_mousedown(void *data, Evas *evas, Evas_Object *obj, + void *event_info) { + Evas_Event_Mouse_Up *ev = event_info; ph_dialer_data *dial_d = data; - dial_d->initialized = FALSE; - ph_dialer_util_entry_clear(dial_d); + dial_d->touch_x = ev->canvas.x; + dial_d->touch_y = ev->canvas.y; } int ph_dialer_create_content(ph_dialer_data *dial_d) { PH_FN_CALL; + dial_d->layout = elm_layout_add(dial_d->navi); p_retvm_if(NULL == dial_d->layout, 0, "elm_layout_add() Failed"); elm_layout_file_set(dial_d->layout, DIALER_EDJ, "dialer/main"); evas_object_size_hint_weight_set(dial_d->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_event_callback_add(dial_d->layout, EVAS_CALLBACK_MOUSE_DOWN, dialer_mousedown, dial_d); if (dial_d->is_emergency) dial_d->run_mode = PH_DAILER_EMERGENCY; @@ -670,11 +1204,38 @@ int ph_dialer_create_content(ph_dialer_data *dial_d) evas_object_data_set(dial_d->layout, KEY_DIALER_DATA, dial_d); + PH_DBG("run_mode(before emit):%d", dial_d->run_mode); + if (PH_DAILER_NORMAL != dial_d->run_mode) + { + if (PH_DAILER_EMERGENCY == dial_d->run_mode) + { + edje_object_signal_emit(_EDJ(dial_d->layout), "option_btn/hide", "option_btn"); + edje_object_part_text_set(_EDJ(dial_d->layout), "return_btn/text", "Back to screen"); + } + else if (PH_DAILER_DURING_CALL == dial_d->run_mode) + { + edje_object_part_text_set(_EDJ(dial_d->layout), "return_btn/text", "Back to call"); + } + edje_object_signal_emit(_EDJ(dial_d->layout), "return_btn/default", "return_btn"); + } + else + { + edje_object_signal_emit(_EDJ(dial_d->layout), "return_btn/hide", "return_btn"); + edje_object_signal_emit(_EDJ(dial_d->layout), "softkey/normal", "softkey"); + } + evas_object_event_callback_add(dial_d->layout, EVAS_CALLBACK_DEL, dialer_view_delete_cb, dial_d); + contacts_svc_subscribe_change(CTS_SUBSCRIBE_PLOG_CHANGE, + dialer_log_data_changed_cb, dial_d); + contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE, + dialer_contact_data_changed_cb, dial_d); + contacts_svc_subscribe_change(CTS_SUBSCRIBE_SPEEDDIAL_CHANGE, + dialer_speeddial_data_changed_cb, dial_d); + evas_event_callback_add(evas_object_evas_get(dial_d->layout), - EVAS_CALLBACK_RENDER_FLUSH_POST, dialer_layout_flush_post_cb, dial_d); + EVAS_CALLBACK_RENDER_FLUSH_POST, dialer_layout_flush_post_cb, dial_d); return 1; } @@ -683,27 +1244,18 @@ API void phone_dialer_set_navi(Evas_Object *layout) PH_FN_CALL; ph_dialer_data *dial_d; Evas_Object *cbar; - Evas_Object *l_btn; Elm_Object_Item *navi_it; + dial_d = evas_object_data_get(layout, KEY_DIALER_DATA); p_retm_if(NULL == dial_d, "dialer data is null"); navi_it = elm_naviframe_bottom_item_get(dial_d->navi); cbar = elm_object_item_part_content_get(navi_it, "controlbar"); - if (cbar) - phone_cbar_item_clear(cbar); - - if (!dial_d->ug) { - l_btn = elm_button_add(dial_d->navi); - evas_object_smart_callback_add(l_btn, "clicked", dialer_back_btn_cb, dial_d); - evas_object_smart_callback_add(l_btn, "clicked", phone_back_btn_clicked_cb, dial_d ->win); - elm_object_style_set(l_btn, "naviframe/back_btn/default"); + if (cbar) { + elm_object_item_part_content_unset(navi_it, "controlbar"); + evas_object_del(cbar); } - else { - l_btn = phone_naviframe_btn(dial_d->navi, S_(PH_SYS_SK_CANCEL)); - evas_object_smart_callback_add(l_btn, "clicked", phone_ug_destroy_me_cb, dial_d->ug); - } - elm_object_item_part_content_set(navi_it, "prev_btn", l_btn); + elm_object_item_part_content_set(navi_it, "prev_btn", NULL); } API void phone_dialer_view_reset(Evas_Object *layout) @@ -715,12 +1267,9 @@ API void phone_dialer_view_reset(Evas_Object *layout) dial_d = evas_object_data_get(layout, KEY_DIALER_DATA); p_retm_if(NULL == dial_d, "dialer data is null"); - if (!dial_d->ug) { - Evas_Object *back_btn; - Elm_Object_Item *navi_it = elm_naviframe_bottom_item_get(dial_d->navi); - back_btn = elm_object_item_part_content_get(navi_it, "prev_btn"); - if(back_btn) - evas_object_smart_callback_del(back_btn, "clicked", dialer_back_btn_cb); + if (dial_d->child_ug) { + ug_destroy(dial_d->child_ug); + dial_d->child_ug = NULL; } item = elm_naviframe_bottom_item_get(dial_d->navi); @@ -771,10 +1320,24 @@ API void phone_dialer_view_set_num(Evas_Object *layout, char *number) ph_dialer_util_append_node_from_numstr_with_strip(dial_d, number); ph_dialer_util_add_dashes(dial_d, DASH_REAL); ph_dialer_util_get_numstr_from_node(dial_d, dest); - ph_dialer_entry_set_number(dial_d, dest, CURSOR_END, TRUE); + ph_dialer_entry_set_number(dial_d, dest, CURSOR_END); + ph_dialer_search_request(dial_d, FALSE); } else - dial_d->init_text = SAFE_STRDUP(number); + dial_d->searched_text = SAFE_STRDUP(number); } - +API void phone_dialer_set_background(Evas_Object *obj, bool is_background) +{ + PH_FN_CALL; + ph_dialer_data *dial_d; + dial_d = evas_object_data_get(obj, KEY_DIALER_DATA); + p_retm_if(NULL == dial_d, "log data is null"); + + dial_d->is_background = is_background; + if (dial_d->update_timer) { + ecore_timer_del(dial_d->update_timer); + dial_d->update_timer = NULL; + ph_dialer_reload_data(dial_d); + } +} diff --git a/lib/dialer/ph-dialer-view.h b/lib/dialer/ph-dialer-view.h index 9509e9c..fbf4766 100755 --- a/lib/dialer/ph-dialer-view.h +++ b/lib/dialer/ph-dialer-view.h @@ -17,10 +17,25 @@ #ifndef __PH_DIALER_VIEW_H__ #define __PH_DIALER_VIEW_H__ +enum { + COUNT_BUTTON_CLOSE, + COUNT_BUTTON_OPEN +}; + +typedef enum { + SEARCH_LOG_TYPE, + SEARCH_SPEEDDIAL_TYPE, + SEARCH_CONTACT_NUM_TYPE, + SEARCH_CONTACT_NAME_TYPE, +} search_type; + #define KEY_DIALER_DATA "dialer_data" int ph_dialer_create_content(ph_dialer_data *dial_d); -void ph_dialer_entry_set_number(ph_dialer_data *dial_d, char *orig, int cursor, int is_need_emit); -void phone_dialer_view_set_num(Evas_Object *layout, char *number); +void ph_dialer_entry_set_number(ph_dialer_data *dial_d, char *orig, int cursor); +void ph_dialer_update_cnt_btn(ph_dialer_data *dial_d, int count); +char* ph_dialer_gl_label_get(void *data, Evas_Object *obj, const char *part); +Eina_Bool ph_dialer_reload_data(void *data); + #endif /* __PH_DIALER_VIEW_H__ */ diff --git a/lib/edc/contacts.edc b/lib/edc/contacts.edc new file mode 100644 index 0000000..ffbcdcd --- /dev/null +++ b/lib/edc/contacts.edc @@ -0,0 +1,19 @@ +/* + * 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 "list.edc" +#include "gl_title.edc" +#include "input_theme.edc" diff --git a/lib/edc/detail_theme.edc b/lib/edc/detail_theme.edc new file mode 100644 index 0000000..53cb36f --- /dev/null +++ b/lib/edc/detail_theme.edc @@ -0,0 +1,1001 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define GENLIST_PART_BG_COLOR_INC 249 249 249 255 +#define GENLIST_PART_LIST_LINE_COLOR_INC 169 169 169 255 +#define GENLIST_DIALOGUE_FONT_SUB_TITLE_COLOR_INC 102 102 102 255 +#define GENLIST_PART_LIST_TEXT_DEFAULT 0 0 0 255 + +#define GENLIST_BASEINFO_PART_BASE(height) \ +part { \ + name: "base"; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: 0 height; \ + } \ +} + +#define GENLIST_PART_BASE( param_item_height ) \ +part { \ + name: "base"; \ + type: RECT; \ + repeat_events: 1; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: 0 param_item_height; \ + color: GENLIST_PART_BG_COLOR_INC; \ + } \ +} +#define GENLIST_PART_BOTTOM_LINE \ +part { \ + name: "bottom_line"; \ + type: RECT; \ + mouse_events: 0; \ + description { state: "default" 0.0; \ + min: 0 1; \ + fixed: 0 1; \ + visible: 1; \ + color: GENLIST_PART_LIST_LINE_COLOR_INC; \ + rel1 { \ + relative: 0.0 1.0; \ + offset: 0 -1; \ + } \ + } \ +} + +#define GENLIST_PART_PADDING_TOP( param_padding_size ) \ +part { \ + name: "elm.padding.top"; \ + type: RECT; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: 0 param_padding_size; \ + fixed: 0 1; \ + visible: 0; \ + rel2.relative: 1.0 0.0; \ + align: 0.0 0.0; \ + } \ +} + +#define GENLIST_PART_PADDING_BOTTOM( param_padding_size ) \ +part { \ + name: "elm.padding.bottom"; \ + type: RECT; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: 0 param_padding_size; \ + fixed: 0 1; \ + visible: 0; \ + rel1.relative: 0.0 1.0; \ + align: 0.0 1.0; \ + } \ +} + +#define GENLIST_PART_PADDING_LEFT( param_padding_size ) \ +part { \ + name: "elm.padding.left"; \ + type: RECT; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: param_padding_size 0; \ + fixed: 1 0; \ + visible: 0; \ + rel2.relative: 0.0 1.0; \ + align: 0.0 0.0; \ + } \ +} + +#define GENLIST_PART_PADDING_RIGHT( param_padding_size ) \ +part { \ + name: "elm.padding.right"; \ + type: RECT; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: param_padding_size 0; \ + fixed: 1 0; \ + visible: 0; \ + rel1.relative: 1.0 0.0; \ + align: 1.0 0.0; \ + } \ +} + +styles { + style { + name: "baseinfo_name_textblock_style"; + base: "font=SLP:style=Medium text_class=slp_medium color=#000000 ellipsis=1.0 font_size=50"; + } + style { + name: "baseinfo_subname_textblock_style"; + base: "font=SLP:style=Medium text_class=slp_medium color=#727272 ellipsis=1.0 font_size=32"; + } +} +collections +{ + group { + name: "elm/genlist/item/baseinfo.1text.1icon/default"; + alias: "elm/genlist/item_odd/baseinfo.1text.1icon/default"; + alias: "elm/genlist/item_compress/baseinfo.1text.1icon/default"; + alias: "elm/genlist/item_compress_odd/baseinfo.1text.1icon/default"; + data.item: "stacking" "above"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text.name"; + data.item: "contents" "elm.icon.favorite"; + parts { + GENLIST_BASEINFO_PART_BASE(142) + part { + name: "elm.icon.image.rect"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 88 0; + fixed: 1 0; + align: 1.0 0.0; + color: 0 0 0 0; + rel1.relative: 1.0 0.0; + } + } + part { + name: "elm.icon.favorite"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 56 56; + fixed: 1 1; + align: 0.5 0.5; + rel1.to: "elm.icon.image.rect"; + rel2.to: "elm.icon.image.rect"; + } + } + part { + name: "elm.text.name"; + type: TEXTBLOCK; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.5; offset: 16 0; to: "base"; } + rel2 { relative: 0.0 0.5; offset: -16 0; to: "elm.icon.image.rect"; } + text { + style: "baseinfo_name_textblock_style"; + min: 0 1; + } + } + } + } + } + group { + name: "elm/genlist/item/baseinfo.1text.2icon/default"; + alias: "elm/genlist/item_odd/baseinfo.1text.2icon/default"; + alias: "elm/genlist/item_compress/baseinfo.1text.2icon/default"; + alias: "elm/genlist/item_compress_odd/baseinfo.1text.2icon/default"; + data.item: "stacking" "above"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text.name"; + data.item: "contents" "elm.icon.image elm.icon.favorite"; + parts { + GENLIST_BASEINFO_PART_BASE(142) + part { + name: "elm.icon.image.rect"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 141 0; + fixed: 1 0; + align: 1.0 0.0; + color: 0 0 0 0; + rel1.relative: 1.0 0.0; + } + } + part { + name: "elm.icon.image"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1.to: "elm.icon.image.rect"; + rel2.to: "elm.icon.image.rect"; + } + } + part { + name: "elm.icon.favorite.rect"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 88 0; + fixed: 1 0; + align: 1.0 0.0; + color: 0 0 0 0; + rel1 { relative: 0.0 0.0; to: "elm.icon.image.rect"; } + rel2 { relative: 0.0 1.0; to: "elm.icon.image.rect"; } + } + } + part { + name: "elm.icon.favorite"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 56 56; + fixed: 1 1; + align: 0.5 0.5; + rel1.to: "elm.icon.favorite.rect"; + rel2.to: "elm.icon.favorite.rect"; + } + } + part { + name: "elm.text.name"; + type: TEXTBLOCK; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.5; offset: 16 0; to: "base"; } + rel2 { relative: 0.0 0.5; offset: -16 0; to: "elm.icon.favorite.rect"; } + text { + style: "baseinfo_name_textblock_style"; + min: 0 1; + } + } + } + } + } + group { + name: "elm/genlist/item/baseinfo.2text.1icon/default"; + alias: "elm/genlist/item_odd/baseinfo.2text.1icon/default"; + alias: "elm/genlist/item_compress/baseinfo.2text.1icon/default"; + alias: "elm/genlist/item_compress_odd/baseinfo.2text.1icon/default"; + data.item: "stacking" "above"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text.name elm.text.subname"; + data.item: "contents" "elm.icon.favorite"; + parts { + GENLIST_BASEINFO_PART_BASE(142) + part { + name: "elm.icon.image.rect"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 88 0; + fixed: 1 0; + align: 1.0 0.0; + color: 0 0 0 0; + rel1.relative: 1.0 0.0; + } + } + part { + name: "elm.icon.favorite"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 56 56; + fixed: 1 1; + align: 0.5 0.5; + rel1.to: "elm.icon.image.rect"; + rel2.to: "elm.icon.image.rect"; + } + } + part { + name: "elm.text.name"; + type: TEXTBLOCK; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 50.0/142.0; offset: 16 0; } + rel2 { relative: 0.0 50.0/142.0; offset: -16 0; to_x: "elm.icon.image.rect"; } + text { + style: "baseinfo_name_textblock_style"; + min: 0 1; + } + } + } + part { + name: "elm.text.subname"; + type: TEXTBLOCK; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 101.0/142.0; offset: 16 0; to: "base"; } + rel2 { relative: 0.0 101.0/142.0; offset: -16 0; to_x: "elm.icon.image.rect"; } + text { + style: "baseinfo_subname_textblock_style"; + min: 0 1; + } + } + } + } + } + group { + name: "elm/genlist/item/baseinfo.2text.2icon/default"; + alias: "elm/genlist/item_odd/baseinfo.2text.2icon/default"; + alias: "elm/genlist/item_compress/baseinfo.2text.2icon/default"; + alias: "elm/genlist/item_compress_odd/baseinfo.2text.2icon/default"; + data.item: "stacking" "above"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text.name elm.text.subname"; + data.item: "contents" "elm.icon.image elm.icon.favorite"; + parts { + GENLIST_BASEINFO_PART_BASE(142) + part { + name: "elm.icon.image.rect"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 141 0; + fixed: 1 0; + align: 1.0 0.0; + color: 0 0 0 0; + rel1.relative: 1.0 0.0; + } + } + part { + name: "elm.icon.image"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1.to: "elm.icon.image.rect"; + rel2.to: "elm.icon.image.rect"; + } + } + part { + name: "elm.icon.favorite.rect"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 88 0; + fixed: 1 0; + align: 1.0 0.0; + color: 0 0 0 0; + rel1 { relative: 0.0 0.0; to: "elm.icon.image.rect"; } + rel2 { relative: 0.0 1.0; to: "elm.icon.image.rect"; } + } + } + part { + name: "elm.icon.favorite"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 56 56; + fixed: 1 1; + align: 0.5 0.5; + rel1.to: "elm.icon.favorite.rect"; + rel2.to: "elm.icon.favorite.rect"; + } + } + part { + name: "elm.text.name"; + type: TEXTBLOCK; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 50.0/142.0; offset: 16 0; } + rel2 { relative: 0.0 50.0/142.0; offset: -16 0; to_x: "elm.icon.favorite.rect"; } + text { + style: "baseinfo_name_textblock_style"; + min: 0 1; + } + } + } + part { + name: "elm.text.subname"; + type: TEXTBLOCK; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 101.0/142.0; offset: 16 0; to: "base"; } + rel2 { relative: 0.0 101.0/142.0; offset: -16 0; to_x: "elm.icon.favorite.rect"; } + text { + style: "baseinfo_subname_textblock_style"; + min: 0 1; + } + } + } + } + } + group { + name: "elm/genlist/item/baseinfo.3text.1icon/default"; + alias: "elm/genlist/item_odd/baseinfo.3text.1icon/default"; + alias: "elm/genlist/item_compress/baseinfo.3text.1icon/default"; + alias: "elm/genlist/item_compress_odd/baseinfo.3text.1icon/default"; + data.item: "stacking" "above"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text.name elm.text.subname elm.text.subname2"; + data.item: "contents" "elm.icon.favorite"; + parts { + GENLIST_BASEINFO_PART_BASE(142) + part { + name: "elm.icon.image.rect"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 88 0; + fixed: 1 0; + align: 1.0 0.0; + color: 0 0 0 0; + rel1.relative: 1.0 0.0; + } + } + part { + name: "elm.icon.favorite"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 56 56; + fixed: 1 1; + align: 0.5 0.5; + rel1.to: "elm.icon.image.rect"; + rel2.to: "elm.icon.image.rect"; + } + } + part { + name: "elm.text.name"; + type: TEXTBLOCK; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 34.0/142.0; offset: 16 0; } + rel2 { relative: 0.0 34.0/142.0; offset: -16 0; to_x: "elm.icon.image.rect"; } + text { + style: "baseinfo_name_textblock_style"; + min: 0 1; + } + } + } + part { + name: "elm.text.subname"; + type: TEXTBLOCK; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 79.0/142.0; offset: 16 0; to: "base"; } + rel2 { relative: 0.0 79.0/142.0; offset: -16 0; to_x: "elm.icon.image.rect"; } + text { + style: "baseinfo_subname_textblock_style"; + min: 0 1; + } + } + } + part { + name: "elm.text.subname2"; + type: TEXTBLOCK; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 117.0/142.0; offset: 16 0; to: "base"; } + rel2 { relative: 0.0 117.0/142.0; offset: -16 0; to_x: "elm.icon.image.rect"; } + text { + style: "baseinfo_subname_textblock_style"; + min: 0 1; + } + } + } + } + } + group { + name: "elm/genlist/item/baseinfo.3text.2icon/default"; + alias: "elm/genlist/item_odd/baseinfo.3text.2icon/default"; + alias: "elm/genlist/item_compress/baseinfo.3text.2icon/default"; + alias: "elm/genlist/item_compress_odd/baseinfo.3text.2icon/default"; + data.item: "stacking" "above"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text.name elm.text.subname elm.text.subname2"; + data.item: "contents" "elm.icon.image elm.icon.favorite"; + parts { + GENLIST_BASEINFO_PART_BASE(142) + part { + name: "elm.icon.image.rect"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 141 0; + fixed: 1 0; + align: 1.0 0.0; + color: 0 0 0 0; + rel1.relative: 1.0 0.0; + } + } + part { + name: "elm.icon.image"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1.to: "elm.icon.image.rect"; + rel2.to: "elm.icon.image.rect"; + } + } + part { + name: "elm.icon.favorite.rect"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 88 0; + fixed: 1 1; + align: 1.0 0.0; + color: 0 0 0 0; + rel1 { relative: 0.0 0.0; to: "elm.icon.image.rect"; } + rel2 { relative: 0.0 1.0; to: "elm.icon.image.rect"; } + } + } + part { + name: "elm.icon.favorite"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 56 56; + fixed: 1 1; + align: 0.5 0.5; + rel1.to: "elm.icon.favorite.rect"; + rel2.to: "elm.icon.favorite.rect"; + } + } + part { + name: "elm.text.name"; + type: TEXTBLOCK; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 34.0/142.0; offset: 16 0; } + rel2 { relative: 0.0 34.0/142.0; offset: -16 0; to_x: "elm.icon.favorite.rect"; } + text { + style: "baseinfo_name_textblock_style"; + min: 0 1; + } + } + } + part { + name: "elm.text.subname"; + type: TEXTBLOCK; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 79.0/142.0; offset: 16 0; to: "base"; } + rel2 { relative: 0.0 79.0/142.0; offset: -16 0; to_x: "elm.icon.favorite.rect"; } + text { + style: "baseinfo_subname_textblock_style"; + min: 0 1; + } + } + } + part { + name: "elm.text.subname2"; + type: TEXTBLOCK; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 117.0/142.0; offset: 16 0; to: "base"; } + rel2 { relative: 0.0 117.0/142.0; offset: -16 0; to_x: "elm.icon.favorite.rect"; } + text { + style: "baseinfo_subname_textblock_style"; + min: 0 1; + } + } + } + } + } + group { + name: "elm/genlist/item/detail.title/default"; + alias: "elm/genlist/item_odd/detail.title/default"; + alias: "elm/genlist/item_compress/detail.title/default"; + alias: "elm/genlist/item_compress_odd/detail.title/default"; + data.item: "stacking" "above"; + data.item: "stacking" "above"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text"; + parts { + GENLIST_BASEINFO_PART_BASE(77); + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + color: GENLIST_DIALOGUE_FONT_SUB_TITLE_COLOR_INC; + text { + font: "SLP:style=Medium"; + text_class: "slp_medium"; + size: 28; + min: 0 1; + align: 0.0 1.0; + } + rel1 { offset: 10 0; } + rel2 { offset: -10 -10; } + } + } + } + } + + group { + name: "elm/genlist/item/detail.3icon/default"; + alias: "elm/genlist/item_odd/detail.3icon/default"; + alias: "elm/genlist/item_compress/detail.3icon/default"; + alias: "elm/genlist/item_compress_odd/detail.3icon/default"; + data.item: "stacking" "above"; + data.item: "selectraise" "on"; + data.item: "contents" "elm.icon.1 elm.icon.2 elm.icon.3"; + + parts { + part { + name: "base"; + type: RECT; + repeat_events: 1; + scale: 1; + description { + state: "default" 0.0; + min: 0 112; + } + } + part { + name: "elm.icon.1"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min:0 74; + fixed: 0 1; + rel1.relative: 0.021 0.5; + rel2.relative: 0.327 0.5; + align: 0.5 0.5; + } + } + + part { + name: "elm.icon.2"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 0 74; + fixed: 0 1; + rel1.relative: 0.348 0.5; + rel2.relative: 0.652 0.5; + align: 0.5 0.5; + } + } + + part { + name: "elm.icon.3"; + type: SWALLOW; + scale:1 ; + description { + state: "default" 0.0; + min: 0 74; + fixed: 0 1; + rel1.relative: 0.673 0.5; + rel2.relative: 0.979 0.5; + align: 0.5 0.5; + } + } + } + } + + group { + name: "elm/genlist/item/history_list/default"; + alias: "elm/genlist/item_odd/history_list/default"; + alias: "elm/genlist/item_compress/history_list/default"; + alias: "elm/genlist/item_compress_odd/history_list/default"; + data.item: "stacking" "above"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text.1 elm.text.2 elm.text.3"; + data.item: "contents" "elm.icon.1 elm.icon.2"; + data.item: "flips" "elm.flip.content"; + parts { + GENLIST_PART_BASE(128) + GENLIST_PART_BOTTOM_LINE + GENLIST_PART_PADDING_TOP(10) + GENLIST_PART_PADDING_BOTTOM(10) + GENLIST_PART_PADDING_LEFT(16) + GENLIST_PART_PADDING_RIGHT(16) + part { + name: "elm.icon.1"; + clip_to: "disclip"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 32 32; + max: 32 32; + fixed: 1 1; + rel1 { + relative: 1.0 1.0; + to_x: "elm.padding.left"; + to_y: "elm.text.1"; + } + rel2 { + relative: 1.0 0.0; + to_x: "elm.padding.left"; + to_y: "elm.padding.bottom"; + } + align: 0.0 0.5; + } + } + part { + name: "elm.padding.icon1.right"; + clip_to: "disclip"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 16 0; + fixed: 1 0; + rel1 { + relative: 1.0 0.0; + to_x: "elm.icon.1"; + } + rel2.to_x: "elm.icon.1"; + align: 0.0 0.0; + visible: 0; + } + } + part { + name: "elm.icon.2"; + clip_to: "disclip"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 32 32; + max: 32 32; + fixed: 1 1; + rel1 { + relative: 0.0 1.0; + to_x: "elm.padding.right"; + to_y: "elm.padding.top"; + } + rel2 { + relative: 0.0 1.0; + to_x: "elm.padding.right"; + to_y: "elm.text.1"; + } + align: 1.0 0.5; + } + } + part { + name: "elm.padding.icon2.left"; + clip_to: "disclip"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 16 0; + fixed: 1 0; + rel1 { + relative: 0.0 0.0; + to_x: "elm.icon.2"; + } + rel2.to_x: "elm.icon.2"; + align: 1.0 0.0; + visible: 0; + } + } + part { + name: "elm.text.1"; + clip_to: "disclip"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 0 60; + fixed: 0 1; + rel1 { + relative: 1.0 1.0; + to_x: "elm.padding.left"; + to_y: "elm.padding.top"; + } + rel2 { + relative: 0.0 1.0; + to_x: "elm.padding.icon2.left"; + to_y: "elm.padding.top"; + } + align: 0.0 0.0; + color: GENLIST_PART_LIST_TEXT_DEFAULT; + text { + font: "SLP:style=Roman"; + size: 44; + min: 0 1; + align: 0.0 0.5; + text_class: "list_item"; + } + } + } + part { + name: "elm.text.2"; + clip_to: "disclip"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 1.0 1.0; + to_x: "elm.padding.icon1.right"; + to_y: "elm.text.1"; + } + rel2 { + relative: 0.8 0.0; + to_x: "elm.text.1"; + to_y: "elm.padding.bottom"; + } + color: 68 68 68 255; + text { + font: "SLP:style=Medium"; + size: 32; + min: 0 1; + align: 0.0 0.5; + text_class: "slp_medium"; + } + } + } + part { + name: "elm.text.3"; + clip_to: "disclip"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 1.0 1.0; + to_x: "elm.text.2"; + to_y: "elm.text.1"; + } + rel2 { + relative: 0.0 0.0; + offset: 5 0; + to_x: "elm.padding.right"; + to_y: "elm.padding.bottom"; + } + color: 68 68 68 255; + text { + font: "SLP:style=Medium"; + size: 32; + min: 0 1; + align: 1.0 0.5; + text_class: "slp_medium"; + } + } + } + part { + name: "disclip"; + type: RECT; + description { + state: "default" 0.0; + color: 255 255 255 255; + } + } + } + } + + group { + name: "elm/genlist/item/detail.5icon/default"; + alias: "elm/genlist/item_odd/detail.5icon/default"; + alias: "elm/genlist/item_compress/detail.5icon/default"; + alias: "elm/genlist/item_compress_odd/detail.5icon/default"; + data.item: "stacking" "above"; + data.item: "selectraise" "on"; + data.item: "contents" "elm.icon.1 elm.icon.2 elm.icon.3 elm.icon.4 elm.icon.5"; + + parts { + part { + name: "base"; + type: RECT; + repeat_events: 1; + scale: 1; + description { + state: "default" 0.0; + min: 0 112; + color : 36 36 36 255; + } + } + part { + name: "elm.icon.1"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min:0 74; + fixed: 0 1; + rel1.relative: 0.021 0.5; + rel2.relative: 0.196 0.5; + align: 0.5 0.5; + } + } + + part { + name: "elm.icon.2"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 0 74; + fixed: 0 1; + rel1.relative: 0.218 0.5; + rel2.relative: 0.392 0.5; + align: 0.5 0.5; + } + } + + part { + name: "elm.icon.3"; + type: SWALLOW; + scale:1 ; + description { + state: "default" 0.0; + min: 0 74; + fixed: 0 1; + rel1.relative: 0.414 0.5; + rel2.relative: 0.588 0.5; + align: 0.5 0.5; + } + } + part { + name: "elm.icon.4"; + type: SWALLOW; + scale:1 ; + description { + state: "default" 0.0; + min: 0 74; + fixed: 0 1; + rel1.relative: 0.61 0.5; + rel2.relative: 0.783 0.5; + align: 0.5 0.5; + } + } + part { + name: "elm.icon.5"; + type: SWALLOW; + scale:1 ; + description { + state: "default" 0.0; + min: 0 74; + fixed: 0 1; + rel1.relative: 0.806 0.5; + rel2.relative: 0.979 0.5; + align: 0.5 0.5; + } + } + } + } +} diff --git a/lib/edc/dialer.edc b/lib/edc/dialer.edc index b5d22a0..9eda633 100644..100755 --- a/lib/edc/dialer.edc +++ b/lib/edc/dialer.edc @@ -17,55 +17,64 @@ #define MAIN_H 1280 #define MAIN_W 720 #define INDICATOR_H 50 -#define NAVIFRAME_H 100 -#define CONTROLBAR_H 124 -#define KEYPAD_START 265 -#define TEXT_AREA 123 -#define KEYPAD_H 741 -#define BUTTON_W 234 -#define BUTTON_W_PAD 9 -#define BUTTON_H 136 -#define BUTTON_H_PAD 12 -#define MAIN_H_PURE (MAIN_H-INDICATOR_H-CONTROLBAR_H-NAVIFRAME_H) -#define BTN_2_COL_W (BUTTON_W+BUTTON_W_PAD) -#define BTN_3_COL_W ((BUTTON_W*2)+(BUTTON_W_PAD*2)) -#define BTN_2_ROW_H (BUTTON_H+BUTTON_H_PAD) -#define BTN_3_ROW_H ((BUTTON_H*2)+(BUTTON_H_PAD*2)) -#define BTN_4_ROW_H ((BUTTON_H*3)+(BUTTON_H_PAD*3)) -#define BTN_5_ROW_H ((BUTTON_H*4)+(BUTTON_H_PAD*4)) +#define CONTROLBAR_H 117 +#define KEYPAD_START 359 +#define TEXT_AREA 217 +#define KEYPAD_H 754 +#define BUTTON_W 224 +#define BUTTON_W_PAD 12 +#define BUTTON_H 138 +#define BUTTON_H_PAD 10 +#define MAIN_H_PURE (MAIN_H-INDICATOR_H-CONTROLBAR_H) +#define BTN_1_COL_X 12 +#define BTN_2_COL_X (BTN_1_COL_X + BUTTON_W + BUTTON_W_PAD) +#define BTN_3_COL_X (BTN_1_COL_X + (BUTTON_W*2)+(BUTTON_W_PAD*2)) +#define BTN_1_ROW_Y 12 +#define BTN_2_ROW_Y (BTN_1_ROW_Y + BUTTON_H + BUTTON_H_PAD) +#define BTN_3_ROW_Y (BTN_1_ROW_Y + (BUTTON_H*2)+(BUTTON_H_PAD*2)) +#define BTN_4_ROW_Y (BTN_1_ROW_Y + (BUTTON_H*3)+(BUTTON_H_PAD*3)) +#define BTN_5_ROW_Y (BTN_1_ROW_Y + (BUTTON_H*4)+(BUTTON_H_PAD*4)) #define IMAGE_PATH "../images/dialer_images/" +#define IMAGES "../images/phoneug_images/" #define KEYPAD_ANI_TIME 0.03 images { - image: IMAGE_PATH"C01-3_dialer_btn_01.png" COMP; - image: IMAGE_PATH"C01-3_dialer_btn_02.png" COMP; - image: IMAGE_PATH"C01-3_dialer_btn_03.png" COMP; - image: IMAGE_PATH"C01-3_dialer_btn_press.png" COMP; + image: IMAGE_PATH"C01-3_dialer_btn.png" COMP; + image: IMAGE_PATH"C01-3_dialer_btn_press.png" COMP; + image: IMAGE_PATH"C01-3_dialer_btn_cal.png" COMP; + image: IMAGE_PATH"C01-3_dialer_btn_call_press.png" COMP; image: IMAGE_PATH"C01-3_dialer_icon_01.png" COMP; image: IMAGE_PATH"C01-3_dialer_icon_01_press.png" COMP; + image: IMAGE_PATH"C01-3_dialer_icon_02.png" COMP; + image: IMAGE_PATH"C01-3_dialer_icon_02_press.png" COMP; image: IMAGE_PATH"C01-3_dialer_icon_03.png" COMP; image: IMAGE_PATH"C01-3_dialer_icon_03_press.png" COMP; + image: IMAGE_PATH"C01-3_dialer_icon_star.png" COMP; image: IMAGE_PATH"C01-3_dialer_icon_call.png" COMP; image: IMAGE_PATH"C01-3_dialer_icon_clear.png" COMP; - image: IMAGE_PATH"C01-3_dialer_icon_video_call.png" COMP; - image: IMAGE_PATH"C01-3_dialer_icon_video_call_dim.png" COMP; + image: IMAGE_PATH"C01-3_dialer_btn_option_bg.png" COMP; + image: IMAGE_PATH"C01-3_dialer_btn_option_press.png" COMP; + image: IMAGE_PATH"C01-3_dialer_icon_option.png" COMP; + image: IMAGE_PATH"C01-3_icon_clear.png" COMP; + image: IMAGES"00_button_icon_expand_opened.png" COMP; + image: IMAGES"00_button_icon_expand_closed.png" COMP; } color_classes { color_class { name: "color/textblock/bg"; - color: 0 0 0 255; + color: 232 245 253 255; } } collections { + #include "dialer_btn.edc" /***************************************************************************** * dialer main edc group *****************************************************************************/ group { name: "dialer/main"; - parts { /***************************************************************************** * Main background @@ -78,7 +87,7 @@ collections { state: "default" 0.0; rel1 { relative: 0.0 0.0; } rel2 { relative: 1.0 1.0; } - color_class: "color/textblock/bg"; + color_class: "color/textblock/bg"; //right below input_field to the end } } @@ -88,133 +97,167 @@ collections { part { name: "keypad/bg"; type: RECT; - scale: 1; description { state: "default" 0.0; rel1 { relative: 0.0 KEYPAD_START/MAIN_H_PURE; to: "background"; } - rel2 { relative: 1.0 1.0; to: "background"; } - color: 0 0 0 255; + rel2 { relative: 1.0 1.0; offset: 0 0; to: "background";} + color: 32 32 32 255; //bg for only KEYPAD } } /***************************************************************************** * Softkey button *****************************************************************************/ -#define PART_CALL_SOFTKEY(txt,offx, offy, w, h, icon, icon_press, icon_dim, file, file_press, file_dim) \ - part { \ - name: txt; \ - type: IMAGE; \ - scale: 1; \ - description { \ - state: "default" 0.0; \ - rel1 { relative: offx/MAIN_W offy/KEYPAD_H; to:"keypad/bg";} \ - rel2 { relative: (offx+w)/MAIN_W (offy+h)/KEYPAD_H; to:"keypad/bg";} \ - image { \ - normal: file; \ - border: 8 8 8 8; \ - border_scale: 1; \ - } \ - } \ - description { \ - state: "pressed" 0.0; \ - inherit: "default" 0.0; \ - image.normal: file_press; \ - } \ - description { \ - state: "dim" 0.0; \ - inherit: "default" 0.0; \ - image.normal: file_dim; \ - } \ - description { \ - state: "hide" 0.0; \ - visible: 0; \ - } \ - } \ - part { \ - name: txt"_icon"; \ - type: IMAGE; \ - scale: 1; \ - mouse_events: 0; \ - description { \ - state: "default" 0.0; \ - min: 234 h; \ - fixed: 1 1; \ - rel1 { relative: 0.5 0.5; to: txt;} \ - rel2 { relative: 0.5 0.5; to: txt;} \ - align: 0.5 0.5; \ - image.normal: icon; \ - } \ - description { \ - state: "pressed" 0.0; \ - inherit: "default" 0.0; \ - image.normal: icon_press; \ - } \ - description { \ - state: "dim" 0.0; \ - inherit: "default" 0.0; \ - image.normal: icon_dim; \ - } \ - description { \ - state: "hide" 0.0; \ - visible: 0; \ - } \ - } - + // call btn //////////////////////////////////////////////////////////////////////////// part { - name: "input_back"; + name: "normal/call"; type: IMAGE; scale: 1; description { state: "default" 0.0; - rel1 { relative: BTN_3_COL_W/MAIN_W BTN_5_ROW_H/KEYPAD_H; to:"keypad/bg";} - rel2 { relative: (BTN_3_COL_W+BUTTON_W)/MAIN_W (BTN_5_ROW_H+BUTTON_H)/KEYPAD_H; to:"keypad/bg";} + rel1 { relative: BTN_2_COL_X/MAIN_W BTN_5_ROW_Y/KEYPAD_H; to:"keypad/bg";} + rel2 { relative: (BTN_2_COL_X+BUTTON_W)/MAIN_W (BTN_5_ROW_Y+BUTTON_H)/KEYPAD_H; to:"keypad/bg";} image { - border: 8 8 8 8; + normal: IMAGE_PATH"C01-3_dialer_btn_cal.png"; + border: 30 40 35 35; border_scale: 1; - normal: IMAGE_PATH"C01-3_dialer_btn_01.png"; } } description { state: "pressed" 0.0; inherit: "default" 0.0; - image.normal: IMAGE_PATH"C01-3_dialer_btn_press.png"; + image.normal: IMAGE_PATH"C01-3_dialer_btn_call_press.png"; } description { - state: "dim" 0.0; - inherit: "default" 0.0; - image.normal: IMAGE_PATH"C01-3_dialer_btn_01.png"; + state: "expand" 0.0; + rel1 { relative: BTN_1_COL_X/MAIN_W BTN_5_ROW_Y/KEYPAD_H; to:"keypad/bg";} + rel2 { relative: (BTN_2_COL_X+BUTTON_W)/MAIN_W (BTN_5_ROW_Y+BUTTON_H)/KEYPAD_H; to:"keypad/bg";} + image { + normal: IMAGE_PATH"C01-3_dialer_btn_cal.png"; + border: 30 40 35 35; + border_scale: 1; + } + } + description { + state: "expand_pressed" 0.0; + inherit: "expand" 0.0; + image.normal: IMAGE_PATH"C01-3_dialer_btn_call_press.png"; } } - part { - name: "input_back_icon"; + name: "normal/call_icon"; type: IMAGE; scale: 1; mouse_events: 0; description { state: "default" 0.0; - rel1 { relative: BTN_3_COL_W/MAIN_W BTN_5_ROW_H/KEYPAD_H; to:"keypad/bg";} - rel2 { relative: (BTN_3_COL_W+BUTTON_W)/MAIN_W (BTN_5_ROW_H+BUTTON_H)/KEYPAD_H; to:"keypad/bg";} - image.normal: IMAGE_PATH"C01-3_dialer_icon_clear.png"; + min: BUTTON_W BUTTON_H; + fixed: 1 1; + rel1 { relative: 0.5 0.5; to: "normal/call";} + rel2 { relative: 0.5 0.5; to: "normal/call";} + align: 0.5 0.5; + image.normal: IMAGE_PATH"C01-3_dialer_icon_call.png"; + } + } + + // back_btn //////////////////////////////////////////////////////////////////////////// + part { + name: "input_del"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: BTN_3_COL_X/MAIN_W BTN_5_ROW_Y/KEYPAD_H; to:"keypad/bg";} + rel2 { relative: (BTN_3_COL_X+BUTTON_W)/MAIN_W (BTN_5_ROW_Y+BUTTON_H)/KEYPAD_H; to:"keypad/bg";} + image { + border: 30 40 35 35; + border_scale: 1; + normal: IMAGE_PATH"C01-3_dialer_btn.png"; + } } description { state: "pressed" 0.0; inherit: "default" 0.0; - image.normal: IMAGE_PATH"C01-3_dialer_icon_clear.png"; + image.normal: IMAGE_PATH"C01-3_dialer_btn_press.png"; } + } + part { + name: "input_del_icon"; + type: IMAGE; + scale: 1; + mouse_events: 0; description { - state: "dim" 0.0; - inherit: "default" 0.0; - image.normal: IMAGE_PATH"C01-3_dialer_icon_clear.png"; + state: "default" 0.0; + min : 76 44; + fixed: 1 1; + rel1 { relative: 0.5 0.5; to:"input_del";} + rel2 { relative: 0.5 0.5; to:"input_del";} + + image.normal: IMAGE_PATH"C01-3_icon_clear.png"; } } - PART_CALL_SOFTKEY("normal/call", 0, BTN_5_ROW_H, 477, BUTTON_H, IMAGE_PATH"C01-3_dialer_icon_call.png", IMAGE_PATH"C01-3_dialer_icon_call.png", IMAGE_PATH"C01-3_dialer_icon_call.png", IMAGE_PATH"C01-3_dialer_btn_03.png", IMAGE_PATH"C01-3_dialer_btn_press.png", IMAGE_PATH"C01-3_dialer_btn_03.png") + // return_btn //////////////////////////////////////////////////////////////////////////// +#define PART_KEYPAD_RETURN_BTN \ + part { \ + name: "return_btn"; \ + type: IMAGE; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + rel1 { relative: BTN_1_COL_X/MAIN_W BTN_5_ROW_Y/KEYPAD_H; to:"keypad/bg";} \ + rel2 { relative: (BTN_1_COL_X+BUTTON_W)/MAIN_W (BTN_5_ROW_Y+BUTTON_H)/KEYPAD_H; to:"keypad/bg";} \ + image { \ + normal: IMAGE_PATH"C01-3_dialer_btn.png"; \ + border: 30 40 35 35; \ + border_scale: 1; \ + } \ + visible: 1; \ + } \ + description { \ + state: "pressed" 0.0; \ + inherit: "default" 0.0; \ + image.normal: IMAGE_PATH"C01-3_dialer_btn_press.png"; \ + } \ + description { \ + state: "hide" 0.0; \ + inherit: "default" 0.0; \ + visible: 0; \ + } \ + } \ + part { \ + name: "return_btn/text"; \ + type: TEXT; \ + scale: 1; \ + effect: SHADOW; \ + mouse_events: 0; \ + description { \ + state: "default" 0.0; \ + rel1 { relative: 0.05 0.0; to: "return_btn";} \ + rel2 { relative: 0.95 1.0; to: "return_btn";} \ + fixed: 1 1; \ + align: 0.5 0.5; \ + text { \ + font: "SLP:style=Medium"; \ + text_class: "slp_medium"; \ + size: 35; \ + min: 1 1; \ + fit: 1 1; \ + } \ + visible: 1; \ + } \ + description { \ + state: "hide" 0.0; \ + inherit: "default" 0.0; \ + visible: 0; \ + } \ + } + PART_KEYPAD_RETURN_BTN /***************************************************************************** * Number Keypad button *****************************************************************************/ -#define PART_KEYPAD_CUSTOM_TWO_LABLE(txt, offx, offy, file, file_press,label_left_text,label_left_font,label_left_size,label_right_text,label_right_font,label_right_size) \ +#define PART_KEYPAD_CUSTOM_TWO_LABLE(txt, offx, offy, file, file_press,label_left_text,label_left_font,label_left_font_class,label_left_size,label_right_text,label_right_font,label_right_font_class,label_right_size) \ part { \ name: txt; \ type: IMAGE; \ @@ -225,7 +268,7 @@ collections { rel2 { relative: (offx+BUTTON_W)/MAIN_W (offy+BUTTON_H)/KEYPAD_H; to:"keypad/bg"; } \ image { \ normal: file; \ - border: 8 8 8 8; \ + border: 30 40 35 35; \ border_scale: 1; \ } \ } \ @@ -254,6 +297,7 @@ collections { color: 249 249 249 255; \ text { \ font: label_left_font; \ + text_class: label_left_font_class; \ text: label_left_text; \ size: label_left_size; \ min: 1 1; \ @@ -277,9 +321,10 @@ collections { rel2 { relative: 0.92 1.0; to: txt;} \ fixed: 1 1; \ align: 0.5 0.5; \ - color: 124 124 124 255; \ + color: 148 177 200 255; \ text { \ font: label_right_font; \ + text_class: label_right_font_class; \ text: label_right_text; \ size: label_right_size; \ min: 1 1; \ @@ -287,13 +332,18 @@ collections { } \ } \ description { \ + state: "pressed" 0.0; \ + inherit: "default" 0.0; \ + color: 255 255 255 255; \ + } \ + description { \ state: "hide" 0.0; \ visible: 0; \ } \ } -#define PART_KEYPAD_CUSTOM_ONEICON_ONELABEL(txt, offx, offy, file, file_press,icon_left,icon_left_press,icon_left_sizex,icon_left_sizey,label_right_text,label_right_font,label_right_size) \ +#define PART_KEYPAD_CUSTOM_ONEICON_ONELABEL(txt, offx, offy, file, file_press,icon_left,icon_left_press,icon_left_sizex,icon_left_sizey,label_right_text,label_right_font,label_right_font_class,label_right_size) \ part { \ name: txt; \ type: IMAGE; \ @@ -304,7 +354,7 @@ collections { rel2 { relative: (offx+BUTTON_W)/MAIN_W (offy+BUTTON_H)/KEYPAD_H; to:"keypad/bg"; } \ image { \ normal: file; \ - border: 8 8 8 8; \ + border: 30 40 35 35; \ border_scale: 1; \ } \ } \ @@ -354,9 +404,10 @@ collections { rel2 { relative: 0.92 1.0; to: txt;} \ fixed: 1 1; \ align: 0.5 0.5; \ - color: 124 124 124 255; \ + color: 148 177 200 255; \ text { \ font: label_right_font; \ + text_class: label_right_font_class; \ text: label_right_text; \ size: label_right_size; \ min: 1 1; \ @@ -364,12 +415,17 @@ collections { } \ } \ description { \ + state: "pressed" 0.0; \ + inherit: "default" 0.0; \ + color: 255 255 255 255; \ + } \ + description { \ state: "hide" 0.0; \ visible: 0; \ } \ } -#define PART_KEYPAD_CUSTOM_ONELABEL(txt, offx, offy, file, file_press,label_left_text,label_left_font,label_left_size) \ +#define PART_KEYPAD_CUSTOM_ONELABEL_ONEICON(txt, offx, offy, file, file_press,icon_right,icon_right_press,icon_right_sizex,icon_right_sizey,label_left_text,label_left_font,label_left_font_class,label_left_size) \ part { \ name: txt; \ type: IMAGE; \ @@ -380,7 +436,7 @@ collections { rel2 { relative: (offx+BUTTON_W)/MAIN_W (offy+BUTTON_H)/KEYPAD_H; to:"keypad/bg"; } \ image { \ normal: file; \ - border: 8 8 8 8; \ + border: 30 40 35 35; \ border_scale: 1; \ } \ } \ @@ -395,6 +451,30 @@ collections { } \ } \ part { \ + name: txt"_right"; \ + type: IMAGE; \ + scale: 1; \ + mouse_events: 0; \ + description { \ + state: "default" 0.0; \ + min: icon_right_sizex icon_right_sizey; \ + rel1 { relative: 0.66 0.5; to: txt;} \ + rel2 { relative: 0.66 0.5; to: txt;} \ + fixed: 1 1; \ + align: 0.5 0.5; \ + image.normal: icon_right; \ + } \ + description { \ + state: "pressed" 0.0; \ + inherit: "default" 0.0; \ + image.normal: icon_right_press; \ + } \ + description { \ + state: "hide" 0.0; \ + visible: 0; \ + } \ + } \ + part { \ name: txt"_left"; \ type: TEXT; \ scale: 1; \ @@ -402,13 +482,14 @@ collections { mouse_events: 0; \ description { \ state: "default" 0.0; \ - rel1 { relative: 0.0 0.0; to: txt;} \ - rel2 { relative: 1.0 1.0; to: txt;} \ + rel1 { relative: 0.08 0.0; to: txt;} \ + rel2 { relative: 0.4 1.0; to: txt;} \ fixed: 1 1; \ align: 0.5 0.5; \ color: 249 249 249 255; \ text { \ font: label_left_font; \ + text_class: label_left_font_class; \ text: label_left_text; \ size: label_left_size; \ min: 1 1; \ @@ -421,42 +502,68 @@ collections { } \ } - PART_KEYPAD_CUSTOM_ONELABEL("1", 0,0, IMAGE_PATH"C01-3_dialer_btn_01.png",IMAGE_PATH"C01-3_dialer_btn_press.png","1","SLP:style=Light",116) - PART_KEYPAD_CUSTOM_ONELABEL("2", BTN_2_COL_W,0, IMAGE_PATH"C01-3_dialer_btn_01.png",IMAGE_PATH"C01-3_dialer_btn_press.png","2","SLP:style=Light",116) - PART_KEYPAD_CUSTOM_ONELABEL("3", BTN_3_COL_W,0, IMAGE_PATH"C01-3_dialer_btn_01.png",IMAGE_PATH"C01-3_dialer_btn_press.png","3","SLP:style=Light",116) - PART_KEYPAD_CUSTOM_ONELABEL("4", 0,BTN_2_ROW_H, IMAGE_PATH"C01-3_dialer_btn_01.png",IMAGE_PATH"C01-3_dialer_btn_press.png","4","SLP:style=Light",116) - PART_KEYPAD_CUSTOM_ONELABEL("5", BTN_2_COL_W,BTN_2_ROW_H, IMAGE_PATH"C01-3_dialer_btn_01.png",IMAGE_PATH"C01-3_dialer_btn_press.png","5","SLP:style=Light",116) - PART_KEYPAD_CUSTOM_ONELABEL("6", BTN_3_COL_W,BTN_2_ROW_H, IMAGE_PATH"C01-3_dialer_btn_01.png",IMAGE_PATH"C01-3_dialer_btn_press.png","6","SLP:style=Light",116) - PART_KEYPAD_CUSTOM_ONELABEL("7", 0,BTN_3_ROW_H,IMAGE_PATH"C01-3_dialer_btn_01.png",IMAGE_PATH"C01-3_dialer_btn_press.png","7","SLP:style=Light",116) - PART_KEYPAD_CUSTOM_ONELABEL("8", BTN_2_COL_W,BTN_3_ROW_H,IMAGE_PATH"C01-3_dialer_btn_01.png",IMAGE_PATH"C01-3_dialer_btn_press.png","8","SLP:style=Light",116) - PART_KEYPAD_CUSTOM_ONELABEL("9", BTN_3_COL_W,BTN_3_ROW_H,IMAGE_PATH"C01-3_dialer_btn_01.png",IMAGE_PATH"C01-3_dialer_btn_press.png","9","SLP:style=Light",116) - PART_KEYPAD_CUSTOM_ONELABEL("sharp",BTN_3_COL_W, BTN_4_ROW_H, IMAGE_PATH"C01-3_dialer_btn_01.png",IMAGE_PATH"C01-3_dialer_btn_press.png","#","SLP:style=Light",116) + PART_KEYPAD_CUSTOM_ONELABEL_ONEICON("1", BTN_1_COL_X,BTN_1_ROW_Y, IMAGE_PATH"C01-3_dialer_btn.png",IMAGE_PATH"C01-3_dialer_btn_press.png",IMAGE_PATH"C01-3_dialer_icon_01.png",IMAGE_PATH"C01-3_dialer_icon_01_press.png",75,75,"1","SLP:style=Roman","slp_roman",116) + PART_KEYPAD_CUSTOM_TWO_LABLE("2", BTN_2_COL_X, BTN_1_ROW_Y, IMAGE_PATH"C01-3_dialer_btn.png",IMAGE_PATH"C01-3_dialer_btn_press.png","2","SLP:style=Regular","slp_regular",116,"ABC","SLP:style=Roman","slp_roman",40) + PART_KEYPAD_CUSTOM_TWO_LABLE("3", BTN_3_COL_X, BTN_1_ROW_Y, IMAGE_PATH"C01-3_dialer_btn.png",IMAGE_PATH"C01-3_dialer_btn_press.png","3","SLP:style=Regular","slp_regular",116,"DEF","SLP:style=Roman","slp_roman",40) + PART_KEYPAD_CUSTOM_TWO_LABLE("4", BTN_1_COL_X, BTN_2_ROW_Y, IMAGE_PATH"C01-3_dialer_btn.png",IMAGE_PATH"C01-3_dialer_btn_press.png","4","SLP:style=Regular","slp_regular",116,"GHI","SLP:style=Roman","slp_roman",40) + PART_KEYPAD_CUSTOM_TWO_LABLE("5", BTN_2_COL_X, BTN_2_ROW_Y, IMAGE_PATH"C01-3_dialer_btn.png",IMAGE_PATH"C01-3_dialer_btn_press.png","5","SLP:style=Regular","slp_regular",116,"JKL","SLP:style=Roman","slp_roman",40) + PART_KEYPAD_CUSTOM_TWO_LABLE("6", BTN_3_COL_X, BTN_2_ROW_Y, IMAGE_PATH"C01-3_dialer_btn.png",IMAGE_PATH"C01-3_dialer_btn_press.png","6","SLP:style=Regular","slp_regular",116,"MNO","SLP:style=Roman","slp_roman",40) + PART_KEYPAD_CUSTOM_TWO_LABLE("7", BTN_1_COL_X, BTN_3_ROW_Y, IMAGE_PATH"C01-3_dialer_btn.png",IMAGE_PATH"C01-3_dialer_btn_press.png","7","SLP:style=Regular","slp_regular",116,"PQRS","SLP:style=Roman","slp_roman",40) + PART_KEYPAD_CUSTOM_TWO_LABLE("8", BTN_2_COL_X, BTN_3_ROW_Y, IMAGE_PATH"C01-3_dialer_btn.png",IMAGE_PATH"C01-3_dialer_btn_press.png","8","SLP:style=Regular","slp_regular",116,"TUV","SLP:style=Roman","slp_roman",40) + PART_KEYPAD_CUSTOM_TWO_LABLE("9", BTN_3_COL_X, BTN_3_ROW_Y, IMAGE_PATH"C01-3_dialer_btn.png",IMAGE_PATH"C01-3_dialer_btn_press.png","9","SLP:style=Regular","slp_regular",116,"WXYZ","SLP:style=Roman","slp_roman",40) - PART_KEYPAD_CUSTOM_ONEICON_ONELABEL("star", 0,BTN_4_ROW_H,IMAGE_PATH"C01-3_dialer_btn_01.png",IMAGE_PATH"C01-3_dialer_btn_press.png",IMAGE_PATH"C01-3_dialer_icon_03.png",IMAGE_PATH"C01-3_dialer_icon_03_press.png",75,75,"P","SLP:style=Roman",56) - PART_KEYPAD_CUSTOM_TWO_LABLE("0", BTN_2_COL_W,BTN_4_ROW_H,IMAGE_PATH"C01-3_dialer_btn_01.png",IMAGE_PATH"C01-3_dialer_btn_press.png","0","SLP:style=Light",116,"+","SLP:style=Roman",64) + PART_KEYPAD_CUSTOM_ONEICON_ONELABEL("star", BTN_1_COL_X, BTN_4_ROW_Y, IMAGE_PATH"C01-3_dialer_btn.png",IMAGE_PATH"C01-3_dialer_btn_press.png",IMAGE_PATH"C01-3_dialer_icon_03.png",IMAGE_PATH"C01-3_dialer_icon_03_press.png",75,75,"P","SLP:style=Roman","slp_roman",56) + PART_KEYPAD_CUSTOM_TWO_LABLE("0", BTN_2_COL_X, BTN_4_ROW_Y, IMAGE_PATH"C01-3_dialer_btn.png",IMAGE_PATH"C01-3_dialer_btn_press.png","0","SLP:style=Regular","slp_regular",116,"+","SLP:style=Roman","slp_roman",64) + PART_KEYPAD_CUSTOM_ONELABEL_ONEICON("sharp", BTN_3_COL_X, BTN_4_ROW_Y, IMAGE_PATH"C01-3_dialer_btn.png",IMAGE_PATH"C01-3_dialer_btn_press.png",IMAGE_PATH"C01-3_dialer_icon_02.png",IMAGE_PATH"C01-3_dialer_icon_02_press.png",75,75,"#","SLP:style=Roman","slp_roman",116) /***************************************************************************** - * Common place (1 row) + * option menu *****************************************************************************/ part { - name: "common_place"; - type: RECT; - mouse_events: 0; + name: "option_btn"; + type: IMAGE; scale: 1; description { state: "default" 0.0; - rel1 { relative: 0.0 (TEXT_AREA+1)/MAIN_H_PURE; to: "background"; } - rel2 { relative: 1.0 KEYPAD_START/MAIN_H_PURE; to: "background"; } - color: 0 0 0 0; - align: 0.0 0.0; + rel1 { relative: 602/720 (TEXT_AREA+1)/MAIN_H_PURE; offset: 0 16; to:"background";} + rel2 { relative: 1.0 0.0; offset: -16 -12; to:"keypad/bg";} + image { + border: 8 8 8 8; + border_scale: 1; + normal: IMAGE_PATH"C01-3_dialer_btn_option_bg.png"; + } } description { - state: "hide" 0.0; + state: "pressed" 0.0; inherit: "default" 0.0; + image.normal: IMAGE_PATH"C01-3_dialer_btn_option_press.png"; + } + description { + state: "hide" 0.0; + visible: 0; + } + } + + part { + name: "option_btn_icon"; + type: IMAGE; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + min : 40 40; + fixed: 1 1; + rel1 { relative: 0.5 0.5; to:"option_btn";} + rel2 { relative: 0.5 0.5; to:"option_btn";} + image.normal: IMAGE_PATH"C01-3_dialer_icon_option.png"; + } + description { + state: "hide" 0.0; visible: 0; } } + /***************************************************************************** * Textblock *****************************************************************************/ @@ -470,7 +577,7 @@ collections { rel1 { relative: 0.0 0.0; to: "background";} rel2 { relative: 1.0 TEXT_AREA/MAIN_H_PURE; to: "background";} align: 0.5 1.0; - color_class: "color/textblock/bg"; + color_class: "color/textblock/bg"; //bg for entry(phonenumber_input_field) } } @@ -486,6 +593,7 @@ collections { } } + /***************************************************************************** * Programs *****************************************************************************/ @@ -497,15 +605,6 @@ collections { action: SIGNAL_EMIT "EXIT" "EDJ"; } - program { - name: "keyinit"; - source: "keyinit"; - signal: "keyinit"; - script { - emit ("show_star","star"); - } - } - /***************************************************************************** * Program: Keypad button *****************************************************************************/ @@ -516,6 +615,7 @@ collections { source: txt; \ script { \ set_state(PART:txt, "pressed", 0.0); \ + set_state(PART:txt"_right", "pressed", 0.0); \ emit("pad_down", txt); \ } \ } \ @@ -534,6 +634,7 @@ collections { script { \ emit("pad_up", txt); \ emit("ani", txt); \ + set_state(PART:txt"_right", "default", 0.0); \ } \ } \ program { \ @@ -565,14 +666,14 @@ collections { } \ } -#define PROG_KEYPAD_LEFT_EFFECT(txt) \ +#define PROG_KEYPAD_RIGHT_EFFECT(txt) \ program { \ name: "down_"txt; \ signal: "mouse,down,*"; \ source: txt; \ script { \ set_state(PART:txt, "pressed", 0.0); \ - set_state(PART:txt"_left", "pressed", 0.0); \ + set_state(PART:txt"_right", "pressed", 0.0); \ emit("pad_down", txt); \ } \ } \ @@ -591,7 +692,7 @@ collections { script { \ emit("pad_up", txt); \ emit("ani", txt); \ - set_state(PART:txt"_left", "default", 0.0); \ + set_state(PART:txt"_right", "default", 0.0); \ } \ } \ program { \ @@ -623,7 +724,7 @@ collections { } \ } -#define PROG_KEYPAD_ONE_EFFECT(txt) \ +#define PROG_KEYPAD_LEFT_EFFECT(txt) \ program { \ name: "down_"txt; \ signal: "mouse,down,*"; \ @@ -631,6 +732,7 @@ collections { script { \ set_state(PART:txt, "pressed", 0.0); \ set_state(PART:txt"_left", "pressed", 0.0); \ + set_state(PART:txt"_right", "pressed", 0.0); \ emit("pad_down", txt); \ } \ } \ @@ -650,6 +752,7 @@ collections { emit("pad_up", txt); \ emit("ani", txt); \ set_state(PART:txt"_left", "default", 0.0); \ + set_state(PART:txt"_right", "default", 0.0); \ } \ } \ program { \ @@ -666,6 +769,7 @@ collections { source: txt; \ script { \ set_state(PART:txt"_left", "hide", 0.0); \ + set_state(PART:txt"_right", "hide", 0.0); \ set_state(PART:txt, "hide", 0.0); \ } \ } \ @@ -675,132 +779,194 @@ collections { source: txt; \ script { \ set_state(PART:txt"_left", "default", 0.0); \ + set_state(PART:txt"_right", "default", 0.0); \ set_state(PART:txt, "default", 0.0); \ } \ } - PROG_KEYPAD_ONE_EFFECT("1") - PROG_KEYPAD_ONE_EFFECT("2") - PROG_KEYPAD_ONE_EFFECT("3") - PROG_KEYPAD_ONE_EFFECT("4") - PROG_KEYPAD_ONE_EFFECT("5") - PROG_KEYPAD_ONE_EFFECT("6") - PROG_KEYPAD_ONE_EFFECT("7") - PROG_KEYPAD_ONE_EFFECT("8") - PROG_KEYPAD_ONE_EFFECT("9") + PROG_KEYPAD_RIGHT_EFFECT("1") + PROG_KEYPAD("2") + PROG_KEYPAD("3") + PROG_KEYPAD("4") + PROG_KEYPAD("5") + PROG_KEYPAD("6") + PROG_KEYPAD("7") + PROG_KEYPAD("8") + PROG_KEYPAD("9") PROG_KEYPAD_LEFT_EFFECT("star") PROG_KEYPAD("0") - PROG_KEYPAD_ONE_EFFECT("sharp") + PROG_KEYPAD_RIGHT_EFFECT("sharp") /***************************************************************************** * Program: Softkey button *****************************************************************************/ -#define PROG_SOFTKEY(txt) \ - program { \ - name: "down_"txt; \ - signal: "mouse,down,*"; \ - source: txt; \ - script { \ - new st[30]; \ - new Float:vl; \ - get_state (PART:txt, st, 30, vl); \ - if (strcmp(st, "dim") != 0) { \ - set_state(PART:txt, "pressed", 0.0); \ - emit("softkey_down", txt); \ - } \ - } \ - } \ - program { \ - name: "up_"txt; \ - signal: "mouse,up,1"; \ - source: txt; \ - script { \ - new st[30]; \ - new Float:vl; \ - get_state (PART:txt, st, 30, vl); \ - if (strcmp(st, "dim") != 0) { \ - set_state(PART:txt, "default", 0.0); \ - emit("softkey_up", txt); \ - } \ - } \ - } \ - program { \ - name: "clicked_"txt; \ - signal: "mouse,clicked,1"; \ - source: txt; \ - script { \ - new st[30]; \ - new Float:vl; \ - get_state (PART:txt, st, 30, vl); \ - if (strcmp(st, "dim") != 0) { \ - emit("softkey_clicked", txt); \ - } \ - } \ - } - + // call ////////////////////////////////////////////////////////////////////////// program { - name: "down_input_back"; + name: "down_normal/call"; signal: "mouse,down,*"; - source: "input_back"; + source: "normal/call"; script { new st[30]; new Float:vl; - get_state (PART:"input_back", st, 30, vl); - if (strcmp(st, "dim") != 0) { - set_state(PART:"input_back", "pressed", 0.0); - emit("softkey_down", "input_back"); + get_state (PART:"normal/call", st, 30, vl); + if (strcmp(st, "default") == 0) { + set_state(PART:"normal/call", "pressed", 0.0); + emit("softkey_down", "normal/call"); + } + else if (strcmp(st, "expand") == 0) { + set_state(PART:"normal/call", "expand_pressed", 0.0); + emit("softkey_down", "normal/call"); } } } - program { - name: "up_input_back"; + name: "up_normal/call"; signal: "mouse,up,1"; - source: "input_back"; + source: "normal/call"; script { new st[30]; new Float:vl; - get_state (PART:"input_back", st, 30, vl); - if (strcmp(st, "dim") != 0) { - set_state(PART:"input_back", "default", 0.0); - emit("softkey_up", "input_back"); + get_state (PART:"normal/call", st, 30, vl); + if (strcmp(st, "pressed") == 0) { + set_state(PART:"normal/call", "default", 0.0); + emit("softkey_up", "normal/call"); + } + else if (strcmp(st, "expand_pressed") == 0) { + set_state(PART:"normal/call", "expand", 0.0); + emit("softkey_up", "normal/call"); } } } + program { + name: "clicked_normal/call"; + signal: "mouse,clicked,1"; + source: "normal/call"; + script { + emit("softkey_clicked", "normal/call"); + } + } + + // return_btn ////////////////////////////////////////////////////////////////////////// program { - name: "dim_input_back"; - signal: "input_back/dim"; - source: "input_back"; + name: "down_normal/return_btn"; + signal: "mouse,down,*"; + source: "return_btn"; script { - set_state(PART:"input_back", "dim", 0.0); + set_state(PART:"return_btn", "pressed", 0.0); + emit("softkey_down", "return_btn"); } } program { - name: "default_input_back"; - signal: "input_back/default"; - source: "input_back"; + name: "up_normal/return_btn"; + signal: "mouse,up,1"; + source: "return_btn"; script { - set_state(PART:"input_back", "default", 0.0); + set_state(PART:"return_btn", "default", 0.0); + emit("softkey_up", "return_btn"); } } - program { - name: "clicked_input_back"; + name: "clicked_normal/return_btn"; signal: "mouse,clicked,1"; - source: "input_back"; + source: "return_btn"; script { - new st[30]; - new Float:vl; - get_state (PART:"input_back", st, 30, vl); - if (strcmp(st, "dim") != 0) { - emit("softkey_clicked", "input_back"); - } + emit("softkey_clicked", "return_btn"); + } + } + program { + name: "hide/return_btn"; + signal: "return_btn/hide"; + source: "return_btn"; + script { + set_state(PART:"return_btn", "hide", 0.0); + set_state(PART:"return_btn/text", "hide", 0.0); + } + } + program { + name: "show/return_btn"; + signal: "return_btn/default"; + source: "return_btn"; + script { + set_state(PART:"return_btn", "default", 0.0); + set_state(PART:"return_btn/text", "default", 0.0); } } - PROG_SOFTKEY("normal/call") + // option_btn //////////////////////////////////////////////////// + program { + name: "down_option_btn"; + signal: "mouse,down,*"; + source: "option_btn"; + script { + set_state(PART:"option_btn", "pressed", 0.0); + emit("softkey_down", "option_btn"); + } + } + program { + name: "up_option_btn"; + signal: "mouse,up,1"; + source: "option_btn"; + script { + set_state(PART:"option_btn", "default", 0.0); + emit("softkey_up", "option_btn"); + } + } + program { + name: "clicked_option_btn"; + signal: "mouse,clicked,1"; + source: "option_btn"; + script { + emit("softkey_clicked", "option_btn"); + } + } + program { + name: "hide_option_btn"; + signal: "option_btn/hide"; + source: "option_btn"; + script { + set_state(PART:"option_btn", "hide", 0.0); + set_state(PART:"option_btn_icon", "hide", 0.0); + } + } + program { + name: "default_option_btn"; + signal: "option_btn/default"; + source: "option_btn"; + script { + set_state(PART:"option_btn", "default", 0.0); + set_state(PART:"option_btn_icon", "default", 0.0); + } + } + // input_del //////////////////////////////////////////////////// + program { + name: "down_input_del"; + signal: "mouse,down,*"; + source: "input_del"; + script { + set_state(PART:"input_del", "pressed", 0.0); + emit("softkey_down", "input_del"); + } + } + program { + name: "up_input_del"; + signal: "mouse,up,1"; + source: "input_del"; + script { + set_state(PART:"input_del", "default", 0.0); + emit("softkey_up", "input_del"); + } + } + + program { + name: "clicked_input_del"; + signal: "mouse,clicked,1"; + source: "input_del"; + script { + emit("softkey_clicked", "input_del"); + } + } /***************************************************************************** * Program: Softkey - normal mode @@ -810,8 +976,7 @@ collections { source: "softkey"; signal: "softkey/normal"; script { - set_state (PART:"normal/call", "default", 0.0); - set_state (PART:"normal/call_icon", "default", 0.0); + set_state (PART:"normal/call", "expand", 0.0); } } @@ -824,7 +989,6 @@ collections { signal: "softkey/dc"; script { set_state (PART:"normal/call", "default", 0.0); - set_state (PART:"normal/call_icon", "default", 0.0); } } @@ -837,9 +1001,6 @@ collections { signal: "main/default"; script { emit ("viewcontrol/button", "viewcontrol"); - emit ("keyinit", "keyinit"); - emit ("input_back/dim", "input_back"); - emit ("softkey/normal", "softkey"); } } } // programs end diff --git a/lib/edc/dialer_btn.edc b/lib/edc/dialer_btn.edc new file mode 100755 index 0000000..7d8cfbe --- /dev/null +++ b/lib/edc/dialer_btn.edc @@ -0,0 +1,99 @@ +/* + * 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. + */ + +group { + name: "dialer/btn_style"; + styles { + style { + name: "Favorites_contact_01"; + base: "font=SLP:style=Medium text_class=slp_medium font_size=32 color=#94B1C8 align=center"; + } + } + parts { + part { + name: "base"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + image { + border: 8 8 8 8; + border_scale: 1; + normal: IMAGE_PATH"C01-3_dialer_btn_option_bg.png"; + } + } + description { + state: "pressed" 0.0; + inherit: "default" 0.0; + image.normal: IMAGE_PATH"C01-3_dialer_btn_option_press.png"; + } + } + part { + name: "btn_style/number"; + type: TEXTBLOCK; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; to: "base"; } + rel2 { relative: 1.0 0.5; to: "base"; } + text { + style: "Favorites_contact_01"; + align: 0.5 1.0; + } + } + } + part { + name: "btn_style/icon"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + align: 0.5 0.5; + min: 50 50; + fixed: 1 1; + rel1 { relative: 0.0 0.75; to: "base"; } + rel2 { relative: 1.0 0.75; to: "base"; } + image.normal : IMAGES"00_button_icon_expand_opened.png"; + } + description { + state: "pressed" 0.0; + inherit: "default" 0.0; + image.normal: IMAGES"00_button_icon_expand_closed.png"; + } + } + } + programs { + program { + name: "prog/dialer/count_button/opened"; + source: "count_button"; + signal: "count_button/opened"; + script { + set_state (PART:"btn_style/icon", "default", 0.0); + } + } + program { + name: "prog/dialer/count_button/closed"; + source: "count_button"; + signal: "count_button/closed"; + script { + set_state (PART:"btn_style/icon", "pressed", 0.0); + } + } + } +} diff --git a/lib/edc/dialer_theme.edc b/lib/edc/dialer_theme.edc new file mode 100644 index 0000000..273ff3f --- /dev/null +++ b/lib/edc/dialer_theme.edc @@ -0,0 +1,278 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define ITEM_H 128 +#define DIALER_TEXTBLOCK_TEXT_SIZE 35 + +collections { + styles { + style { + name: "dialer_textblock_style"; + base: "font=SLP text_class=slp font_size=35 align=left color=#737373 wrap=word ellipsis=1.0"; + tag: "color80" "+ color=#24c4ff"; + tag: "color01" "+ color=#ffffff"; + tag: "gray" "+ color=#808080"; + tag: "m" "+ font=SLP:style=Medium text_class=slp_medium"; + tag: "b" "+ font=SLP:style=Bold text_class=slp_bold"; + tag: "hilight" "+ font=SLP:style=Medium text_class=slp_medium"; + } + } + +#define COMMON_BASE_STYLE\ + part { \ + name: "base"; \ + type: RECT; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: 0 ITEM_H; \ + color: 31 31 31 255; \ + rel1 { relative: 0.0 0.0; } \ + rel2 { relative: 1.0 1.0; } \ + } \ + } + +#define COMMON_BG \ + part { \ + name: "bg"; \ + clip_to: "disclip"; \ + type: RECT; \ + description { \ + state: "default" 0.0; \ + visible: 1; \ + rel1 { relative: 0.0 0.0; } \ + rel2 { relative: 1.0 1.0; } \ + color: 31 31 31 255; \ + } \ + description { \ + state: "selected" 0.0; \ + inherit: "default" 0.0; \ + visible: 1; \ + rel1 { relative: 0.0 0.0; } \ + rel2 { relative: 1.0 1.0; } \ + color: 65 65 65 255; \ + } \ + } + +#define COMMON_BOTTOM_LINE \ + part { \ + name: "bottom_line"; \ + type: RECT; \ + description { \ + state: "default" 0.0; \ + min: 0 1; \ + fixed: 0 1; \ + visible: 1; \ + color: 81 81 81 255; \ + rel1 { relative: 0.0 1.0; to: "base";} \ + rel2 { relative: 1.0 1.0; to: "base";} \ + align: 0.5 1.0; \ + } \ + } + +#define COMMON_DISCLIP \ + part { \ + name: "disclip"; \ + type: RECT; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + rel1 { to: "bg"; } \ + rel2 { to: "bg"; } \ + } \ + description { \ + state: "disabled" 0.0; \ + inherit: "default" 0.0; \ + color: 255 255 255 64; \ + } \ + } + +#define COMMON_NAME_TEXTBLOCK\ + part { \ + name: "elm.text.left.name"; \ + type: TEXTBLOCK; \ + scale: 1; \ + mouse_events: 0; \ + description { \ + state: "default" 0.0; \ + rel1 { relative: 0.0 0.0; offset: 15 0; to: "bg"; } \ + rel2 { relative: 1.0 0.5; offset: -15 0; to: "bg"; } \ + color: 255 255 255 255; \ + text { min: 0 1; style: "dialer_textblock_style"; } \ + } \ + } \ + part { \ + name: "elm.text.left.number"; \ + type: TEXT; \ + scale: 1; \ + mouse_events: 0; \ + description { \ + state: "default" 0.0; \ + rel1 { relative: 0.0 0.5; offset: 15 0; to: "bg"; } \ + rel2 { relative: 1.0 1.0; offset: -15 0; to: "bg"; } \ + color: 255 255 255 255; \ + text { \ + font: "SLP:style=Medium"; \ + text_class: "slp_medium"; \ + size: DIALER_TEXTBLOCK_TEXT_SIZE; \ + min: 0 1; \ + align: 0.0 0.5; \ + } \ + } \ + } + +#define COMMON_NUM_TEXTBLOCK\ + part { \ + name: "elm.text.left.name"; \ + type: TEXT; \ + scale: 1; \ + mouse_events: 0; \ + description { \ + state: "default" 0.0; \ + rel1 { relative: 0.0 0.0; offset: 15 0; to: "bg"; } \ + rel2 { relative: 1.0 0.5; offset: -15 0; to: "bg"; } \ + color: 255 255 255 255; \ + text { \ + font: "SLP:style=Medium"; \ + text_class: "slp_medium"; \ + size: DIALER_TEXTBLOCK_TEXT_SIZE; \ + min: 0 1; \ + align: 0.0 0.5; \ + } \ + } \ + } \ + part { \ + name: "elm.text.left.number"; \ + type: TEXTBLOCK; \ + scale: 1; \ + mouse_events: 0; \ + description { \ + state: "default" 0.0; \ + rel1 { relative: 0.0 0.5; offset: 15 0; to: "bg"; } \ + rel2 { relative: 1.0 1.0; offset: -15 0; to: "bg"; } \ + color: 255 255 255 255; \ + text { min: 0 1;style: "dialer_textblock_style"; } \ + } \ + } + +#define COMMON_NONAME_TEXTBLOCK\ + part { \ + name: "elm.text.left.number"; \ + type: TEXTBLOCK; \ + scale: 1; \ + mouse_events: 0; \ + description { \ + state: "default" 0.0; \ + rel1 { relative: 0.0 0.25; offset: 15 0; to: "bg"; } \ + rel2 { relative: 1.0 0.75; offset: -15 0; to: "bg"; } \ + color: 255 255 255 255; \ + text { min: 0 1;style: "dialer_textblock_style"; } \ + } \ + } + +#define COMMON_PROGRAM \ + program { \ + name: "go_active"; \ + signal: "elm,state,selected"; \ + source: "elm"; \ + action: STATE_SET "selected" 0.0; \ + target: "bg"; \ + } \ + program { \ + name: "go_passive"; \ + signal: "elm,state,unselected"; \ + source: "elm"; \ + action: STATE_SET "default" 0.0; \ + target: "bg"; \ + transition: LINEAR 0.1; \ + } \ + program { \ + name: "go_disabled"; \ + signal: "elm,state,disabled"; \ + source: "elm"; \ + action: STATE_SET "disabled" 0.0; \ + target: "disclip"; \ + } \ + program { \ + name: "go_enabled"; \ + signal: "elm,state,enabled"; \ + source: "elm"; \ + action: STATE_SET "default" 0.0; \ + target: "disclip"; \ + } + + + /* Genlist */ + group { + name: "elm/genlist/item/number_textblock/default"; + alias: "elm/genlist/item_odd/number_textblock/default"; + data.item: "stacking" "above"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text.left.name elm.text.left.number"; + data.item: "treesize" "20"; + parts { + COMMON_BASE_STYLE + COMMON_BG + COMMON_NUM_TEXTBLOCK + COMMON_DISCLIP + COMMON_BOTTOM_LINE + } + programs { + COMMON_PROGRAM + } + } + + /* Genlist */ + group { + name: "elm/genlist/item/name_textblock/default"; + alias: "elm/genlist/item_odd/name_textblock/default"; + data.item: "stacking" "above"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text.left.name elm.text.left.number"; + data.item: "treesize" "20"; + parts { + COMMON_BASE_STYLE + COMMON_BG + COMMON_NAME_TEXTBLOCK + COMMON_DISCLIP + COMMON_BOTTOM_LINE + } + programs { + COMMON_PROGRAM + } + } + + /* Genlist */ + group { + name: "elm/genlist/item/noname_textblock/default"; + alias: "elm/genlist/item_odd/noname_textblock/default"; + data.item: "stacking" "above"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text.left.number"; + data.item: "treesize" "20"; + parts { + COMMON_BASE_STYLE + COMMON_BG + COMMON_NONAME_TEXTBLOCK + COMMON_DISCLIP + COMMON_BOTTOM_LINE + } + programs { + COMMON_PROGRAM + } + } +} + diff --git a/lib/edc/favorites.edc b/lib/edc/favorites.edc new file mode 100755 index 0000000..595b6fd --- /dev/null +++ b/lib/edc/favorites.edc @@ -0,0 +1,191 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define FAVORITE_BG_COLOR 0 0 0 255 +#define FAVORITE_GROUP_INDEX_BG_COLOR 128 158 182 255 +#define IMAGE_PATH "../images/phoneug_images/" + +images { + image: IMAGE_PATH"00_index_list_bg.png" COMP; +} +collections { + group { + name: "layout"; + styles { + style { + name: "Favorites_contact_01"; + base: "font=SLP:style=Medium text_class=slp_medium font_size=32 color=#1d6495"; + } + } + parts { + part { + name: "bg"; + type: RECT; + description { + state: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "layout/most_frequent"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 0.0; } + color: FAVORITE_BG_COLOR; + min: 0 293; + fixed: 0 1; + } + description { + state: "hide" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 0.0 0.0; } + visible: 0; + } + } + part { + name: "base"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + min: 0 48; + fixed: 0 1; + rel1 { relative: 0.0 1.0; to: "layout/most_frequent"; } + rel2 { relative: 1.0 1.0; to: "layout/most_frequent"; } + image { normal: IMAGE_PATH"00_index_list_bg.png"; } + } + description { + state: "hide" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 0.0 0.0; } + visible: 0; + } + } + part { + name: "layout/favorites/title"; + type: TEXTBLOCK; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + rel1 { relative: 0.0 0.0; offset: 16 0; to: "base"; } + rel2 { relative: 1.0 1.0; to: "base"; } + text { + style: "Favorites_contact_01"; + } + } + description { + state: "hide" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 0.0 0.0; } + visible: 0; + } + } + part { + name: "layout/favorites"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: 0.0 1.0; to: "base"; } + rel2 { relative: 1.0 1.0; } + } + } + } + programs { + program { + name: "prog/favorites/exist_mf"; + source: "favorites"; + signal: "favorites/exist_mf"; + script { + set_state (PART:"layout/most_frequent", "default", 0.0); + set_state (PART:"base", "default", 0.0); + set_state (PART:"layout/favorites/title", "default", 0.0); + } + } + program { + name: "prog/favorites/no_mf"; + source: "favorites"; + signal: "favorites/no_mf"; + script { + set_state (PART:"layout/most_frequent", "hide", 0.0); + set_state (PART:"base", "hide", 0.0); + set_state (PART:"layout/favorites/title", "hide", 0.0); + } + } + } + } + group { + name: "most_frequent"; + styles { + style { + name: "Frequent_contact_01"; + base: "font=SLP:style=Medium text_class=slp_medium font_size=32 color=#1D6495"; + } + } + parts { + part { + name: "bg"; + type: RECT; + description { + state: "default" 0.0; + color: FAVORITE_BG_COLOR; + } + } + part { + name: "base"; + type: RECT; + description { + state: "default" 0.0; + align: 0.0 0.0; + rel1.to: "bg"; + rel2.to: "bg"; + } + } + part { + name: "most_frequent/title"; + type: TEXTBLOCK; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + min: 0 38; + fixed: 0 1; + rel1 { relative: 16.0/720.0 18.0/293.0; to: "base"; } + rel2 { relative: 1.0 18.0/293.0; to: "base"; } + text { + style: "Frequent_contact_01"; + } + } + } + part { + name: "most_frequent/layout"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: 16.0/720.0 1.0; to: "most_frequent/title"; } + rel2 { relative: 1.0 1.0; to: "base"; } + color: FAVORITE_BG_COLOR; + } + } + } + } +} diff --git a/lib/edc/favorites_theme.edc b/lib/edc/favorites_theme.edc new file mode 100644 index 0000000..e43f338 --- /dev/null +++ b/lib/edc/favorites_theme.edc @@ -0,0 +1,263 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define WIDTH 720 +#define MIN_SIZE (WIDTH/3) +#define FAVORITE_ITEM_BG_COLOR 255 255 255 255 + +styles { + style { + name: "gengrid_textblock_style"; + base: "font=SLP:style=Medium text_class=slp_medium font_size=24 color=#F9F9F9 wrap=word ellipsis=1.0"; + } + style { + name: "gengrid_noid_textblock_style"; + base: "font=SLP:style=Medium text_class=slp_medium font_size=40 color=#FFFFFF wrap=word ellipsis=1.0"; + } +} + +collections { + group{ + name: "elm/gengrid/item/gridtext_favorites/default"; + data.item: "texts" "elm.text"; + data.item: "contents" "elm.swallow.icon elm.swallow.expand.icon elm.swallow.end"; + + parts{ + part{ + name: "bg"; + type: RECT; + description { + state: "default" 0.0; + } + } + part { + name: "item_bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: MIN_SIZE MIN_SIZE; + fixed: 1 1; + color: FAVORITE_ITEM_BG_COLOR; + rel1.to: "bg"; + rel2.to: "bg"; + } + } + part { + name: "elm.icon.bg"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + rel1 { relative: 0.0 0.0; to: "item_bg"; } + rel2 { relative: 1.0 1.0; offset: -2 -2; to: "item_bg"; } + } + description { + state: "edit" 0.0; + color: 0 0 0 0; + rel1 { relative: 0.05 0.05; to: "item_bg"; } + rel2 { relative: 0.95 0.95; offset: -2 -2; to: "item_bg"; } + } + } + part{ + name: "elm.swallow.icon"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; to: "elm.icon.bg"; } + rel2 { relative: 1.0 1.0; to: "elm.icon.bg"; } + } + } + part { + name: "label_bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 78; + min: 0 72; + fixed: 0 1; + align: 0.0 1.0; + rel1 { relative: 0.0 1.0; to: "elm.icon.bg"; } + rel2 { relative: 1.0 1.0; to: "elm.icon.bg"; } + } + } + part { + name: "elm.text"; + type: TEXTBLOCK; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; offset: 16 6; to: "label_bg"; } + rel2 { relative: 0.75 1.0; offset: -20 0; to: "label_bg"; } + text { + style: "gengrid_textblock_style"; + align: 0.5 0.5; + } + } + description { + state: "edit" 0.0; + inherit: "default" 0.0; + rel1 { relative: 0.0 0.0; offset: 18 6; to: "label_bg"; } + rel2 { relative: 0.75 1.0; offset: -22 0; to: "label_bg"; } + } + } + part { + name: "elm.swallow.expand.icon"; + type: SWALLOW; + mouse_events: 1; + description { + state: "default" 0.0; + min: 50 40; + fixed: 1 1; + rel1 { relative: 1.0 0.5; to: "label_bg"; } + rel2 { relative: 1.0 0.5; to: "label_bg"; } + align: 1.0 0.5; + } + } + part { + name: "elm.swallow.end"; + type: SWALLOW; + description { + state: "default" 0.0; + align: 0.5 0.5; + rel1.to: "elm.swallow.icon"; + rel2.to: "elm.swallow.icon"; + } + } + } + programs { + program { + name: "prog/favorites_theme/edit"; + source: "favorites_theme"; + signal: "favorites_theme/edit"; + action: STATE_SET "edit" 0.0; + transition: DECELERATE 0.7; + target: "elm.icon.bg"; + target: "elm.text"; + } + program { + name: "prog/favorites_theme/edit_no_effect"; + source: "favorites_theme"; + signal: "favorites_theme/edit_no_effect"; + action: STATE_SET "edit" 0.0; + target: "elm.icon.bg"; + target: "elm.text"; + } + } + } + group{ + name: "elm/gengrid/item/gridtext_favorites_no_id/default"; + data.item: "texts" "elm.text"; + data.item: "contents" "elm.swallow.expand.icon elm.swallow.end"; + + parts{ + part { + name: "item_bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: FAVORITE_ITEM_BG_COLOR; + min: MIN_SIZE MIN_SIZE; + fixed: 1 1; + } + } + part { + name: "label_bg"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 25; + rel1 { relative: 0.0 0.0; to: "item_bg"; } + rel2 { relative: 1.0 1.0; to: "item_bg"; } + } + description { + state: "edit" 0.0; + color: 0 0 0 25; + rel1 { relative: 0.05 0.05; to: "item_bg"; } + rel2 { relative: 0.95 0.95; to: "item_bg"; } + } + } + part { + name: "elm.text"; + type: TEXTBLOCK; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 0 96; + fixed: 0 1; + rel1 { relative: 0.0 0.0; offset: 20 12; to: "label_bg"; } + rel2 { relative: 1.0 0.45; offset: -20 12; to: "label_bg"; } + text { + style: "gengrid_noid_textblock_style"; + align: 0.0 0.0; + } + } + description { + state: "edit" 0.0; + inherit: "default" 0.0; + rel1 { relative: 0.0 0.0; offset: 18 12; to: "label_bg"; } + rel2 { relative: 1.0 0.5; offset: -22 12; to: "label_bg"; } + } + } + part { + name: "elm.swallow.expand.icon"; + type: SWALLOW; + mouse_events: 1; + description { + state: "default" 0.0; + min: 50 40; + fixed: 1 1; + rel1 { relative: 1.0 1.0; to: "label_bg"; } + rel2 { relative: 1.0 1.0; to: "label_bg"; } + align: 1.0 1.0; + } + } + part { + name: "elm.swallow.end"; + type: SWALLOW; + description { + state: "default" 0.0; + align: 0.5 0.5; + rel1.to: "label_bg"; + rel2.to: "label_bg"; + } + } + } + programs { + program { + name: "prog/favorites_theme/edit"; + source: "favorites_theme"; + signal: "favorites_theme/edit"; + action: STATE_SET "edit" 0.0; + transition: DECELERATE 0.7; + target: "label_bg"; + target: "elm.text"; + } + program { + name: "prog/favorites_theme/edit_no_effect"; + source: "favorites_theme"; + signal: "favorites_theme/edit_no_effect"; + action: STATE_SET "edit" 0.0; + target: "label_bg"; + target: "elm.text"; + } + } + } +} diff --git a/lib/edc/gl_title.edc b/lib/edc/gl_title.edc new file mode 100644 index 0000000..4236164 --- /dev/null +++ b/lib/edc/gl_title.edc @@ -0,0 +1,56 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define GENLIST_TITLE_TEXT_COLOR 124 124 124 255 + +collections +{ + group { + name: "gl_title"; + parts { + part { + name: "bg"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + visible: 1; + } + } + + part { + name: "title.text"; + type: TEXT; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + color: GENLIST_TITLE_TEXT_COLOR; + rel1.to: "bg"; + rel2.to: "bg"; + text { + font: "SLP:style=Medium"; + text_class: "slp_medium"; + size: 32; + min: 0 1; + align: 0.0 0.5; + ellipsis: 0.0; + } + } + } + } + } +} diff --git a/lib/edc/input_theme.edc b/lib/edc/input_theme.edc new file mode 100644 index 0000000..c5b1d55 --- /dev/null +++ b/lib/edc/input_theme.edc @@ -0,0 +1,1255 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define GENLIST_PART_BG_COLOR 249 249 249 255 +#define INPUT_DIALOGUE_COLOR 108 168 199 255 +#define INPUT_DIALOGUE_BG_COLOR 236 240 242 255 + +#define GENLIST_FONT_32_INC 32 +#define GENLIST_FONT_44_INC 44 +#define GENLIST_PADDING_12_INC 12 +#define GENLIST_PADDING_16_INC 16 +#define GENLIST_PADDING_27_INC 27 +#define GENLIST_SIZE_163_INC 163 +#define GENLIST_PART_LIST_LINE_COLOR_INC 169 169 169 255 +#define GENLIST_DIALOGUE_FONT_EDIT_MODE_TEXT_01_COLOR_INC 100 100 100 255 +#define GENLIST_PART_FONT_LIST_MAIN_TEXT_UNREAD_COLOR_INC 0 0 0 255 +#define GENLIST_DIALOGUE_GROUP_LEFT_BG_COLOR_INC 108 168 199 255 +#define GENLIST_PART_DISCLIP_COLOR_INC 255 255 255 10 +#define GENLIST_PART_BG_COLOR_INC 236 240 242 255 +#define GENLIST_DIALOGUE_BG_IMAGE_COLOR_INC 236 240 242 255 +#define GENLIST_PART_LIST_PRESS_COLOR_INC 42 137 194 255 + + +#define GENLIST_PART_BASE( param_item_height ) \ + part { name: "base"; \ + type: RECT; \ + repeat_events: 1; \ + scale: 1; \ + description { state: "default" 0.0; \ + min: 0 param_item_height; \ + color: GENLIST_PART_BG_COLOR_INC; \ + } \ + } + +#define GENLIST_PART_DIALOGUE_BG_IMAGE \ + part { name: "bg_image"; \ + type: RECT; \ + clip_to: "disclip"; \ + mouse_events: 0; \ + description { state: "default" 0.0; \ + color: GENLIST_DIALOGUE_BG_IMAGE_COLOR_INC; \ + } \ + description { state: "selected" 0.0; \ + inherit: "default" 0.0; \ + color: GENLIST_PART_LIST_PRESS_COLOR_INC; \ + } \ + } + +#define GENLIST_PART_BOTTOM_LINE \ +part { name: "bottom_line"; \ + type: RECT; \ + mouse_events: 0; \ + description { state: "default" 0.0; \ + min: 0 1; \ + fixed: 0 1; \ + visible: 1; \ + color: GENLIST_PART_LIST_LINE_COLOR_INC; \ + rel1 { \ + relative: 0.0 1.0; \ + offset: 0 -1; \ + } \ + } \ +} + +#define GENLIST_PART_PADDING_LEFT( param_padding_size ) \ +part { name: "elm.padding.left"; \ + type: RECT; \ + scale: 1; \ + description { state: "default" 0.0; \ + min: param_padding_size 0; \ + fixed: 1 0; \ + visible: 0; \ + rel2.relative: 0.0 1.0; \ + align: 0.0 0.0; \ + } \ +} + +#define GENLIST_PART_PADDING_RIGHT( param_padding_size ) \ +part { name: "elm.padding.right"; \ + type: RECT; \ + scale: 1; \ + description { state: "default" 0.0; \ + min: param_padding_size 0; \ + fixed: 1 0; \ + visible: 0; \ + rel1.relative: 1.0 0.0; \ + align: 1.0 0.0; \ + } \ +} + +#define GENLIST_PART_DIALOGUE_ITEM \ +part { name: "elm.rect.dialogue"; \ + type: RECT; \ + scale: 1; \ + description { state: "default" 0.0; \ + min: GENLIST_PADDING_12_INC 0; \ + fixed: 1 0; \ + color: GENLIST_DIALOGUE_GROUP_LEFT_BG_COLOR_INC; \ + rel2.relative: 0.0 1.0; \ + align: 0.0 0.0; \ + } \ +} + +#define GENLIST_PART_DIALOGUE_RIGHT_LINE \ +part { name: "elm.rect.dialogue.right.line"; \ + type: RECT; \ + scale: 1; \ + description { state: "default" 0.0; \ + min: 1 0; \ + fixed: 1 0; \ + visible: 1; \ + rel1.relative: 1.0 0.0; \ + align: 1.0 0.0; \ + color: GENLIST_PART_LIST_LINE_COLOR_INC; \ + } \ +} + +#define GENLIST_PART_DISCLIP \ +part { name: "disclip"; \ + type: RECT; \ + description { state: "default" 0.0; \ + } \ + description { state: "disabled" 0.0; \ + inherit: "default" 0.0; \ + color: GENLIST_PART_DISCLIP_COLOR_INC; \ + } \ +} + +#define GENLIST_DESCRIPTION_FLIP_ENABLED \ +description { state: "flip_enabled" 0.0; \ + inherit: "default" 0.0; \ + visible: 0; \ +} + +collections +{ + /* Genlist Item */ + group { + name: "dialogue/baseinfo.3icon"; + data.item: "contents" "elm.icon.name1 elm.icon.name2 elm.icon.image"; + parts { + part { + name: "base"; + scale: 1; + description { + state: "default" 0.0; + min: 0 267; + } + } + part { + name: "bg"; + type: RECT; + description { + state: "default" 0.0; + color: GENLIST_PART_BG_COLOR; + } + } + part { + name: "elm.rect.top_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + min: 0 40; + fixed: 0 1; + color: 0 0 0 0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 0.0; } + } + } + part { + name: "elm.icon.image.rect"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + align: 1.0 0.0; + min: 141 141; + fixed: 1 1; + color: 0 0 0 0; + rel1 { relative: 1.0 1.0; to: "elm.rect.top_padding"; } + rel2 { relative: 1.0 1.0; to: "base"; } + } + } + part { + name: "elm.rect.right_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + align: 1.0 0.0; + min: 15 0; + fixed: 1 0; + color: 0 0 0 0; + rel1 { relative: 0.0 0.0; to: "elm.icon.image.rect"; } + rel2 { relative: 0.0 1.0; to: "elm.icon.image.rect"; } + } + } + part { + name: "elm.rect.top_line"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 1; + fixed: 0 1; + align: 0.0 0.0; + color: GENLIST_PART_LIST_LINE_COLOR_INC; + rel1 { relative: 0.0 1.0; to: "elm.rect.top_padding"; } + rel2 { relative: 0.0 0.0; to: "elm.rect.right_padding"; } + } + } + part { + name: "elm.rect.dialogue"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 12 0; + fixed: 1 0; + align: 0.0 0.0; + color: INPUT_DIALOGUE_COLOR; + rel1 { relative: 0.0 1.0; to: "elm.rect.top_padding"; } + rel2 { relative: 0.0 1.0; to: "base"; } + } + } + part { + name: "elm.icon.name1.rect"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 112; + fixed: 0 1; + align: 0.0 0.0; + color: INPUT_DIALOGUE_BG_COLOR; + rel1 { relative: 1.0 1.0; to_x: "elm.rect.dialogue"; to_y: "elm.rect.top_line"; } + rel2 { relative: 1.0 1.0; to: "elm.rect.top_line"; } + } + } + part { + name: "elm.rect.middle_line"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 1; + fixed: 0 1; + align: 0.0 0.0; + color: GENLIST_PART_LIST_LINE_COLOR_INC; + rel1 { relative: 0.0 1.0; to: "elm.icon.name1.rect"; } + rel2 { relative: 1.0 1.0; to: "elm.icon.name1.rect"; } + } + } + part { + name: "elm.icon.name2.rect"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 112; + fixed: 0 1; + align: 0.0 0.0; + color: INPUT_DIALOGUE_BG_COLOR; + rel1 { relative: 1.0 1.0; to_x: "elm.rect.dialogue"; to_y: "elm.rect.middle_line"; } + rel2 { relative: 1.0 1.0; to: "elm.rect.middle_line"; } + } + } + part { + name: "elm.rect.bottom_line"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 1; + fixed: 0 1; + align: 0.0 0.0; + color: GENLIST_PART_LIST_LINE_COLOR_INC; + rel1 { relative: 0.0 1.0; to: "elm.icon.name2.rect"; } + rel2 { relative: 1.0 1.0; to: "elm.icon.name2.rect"; } + } + } + part { + name: "elm.rect.right_line"; + type: RECT; + description { + state: "default" 0.0; + min: 1 0; + fixed: 1 0; + align: 0.0 0.0; + color: GENLIST_PART_LIST_LINE_COLOR_INC; + rel1 { relative: 1.0 1.0; to: "elm.rect.top_line"; } + rel2 { relative: 0.0 1.0; to: "elm.rect.bottom_line"; } + } + } + part { + name: "elm.icon.name1"; + type: SWALLOW; + repeat_events: 1; + description { + state: "default" 0.0; + rel1 { offset: 16 0; to: "elm.icon.name1.rect"; } + rel2 { offset: -16 0; to: "elm.icon.name1.rect"; } + } + } + part { + name: "elm.icon.name2"; + type: SWALLOW; + repeat_events: 1; + description { + state: "default" 0.0; + rel1 { offset: 16 0; to: "elm.icon.name2.rect"; } + rel2 { offset: -16 0; to: "elm.icon.name2.rect"; } + } + } + part { + name: "elm.icon.image"; + type: SWALLOW; + description { + state: "default" 0.0; + align: 0.0 0.0; + rel1.to: "elm.icon.image.rect"; + rel2.to: "elm.icon.image.rect"; + } + } + } + } + /* Genlist Item */ + group { + name: "dialogue/baseinfo.1text.1icon"; + data.item: "texts" "elm.text"; + data.item: "contents" "elm.icon"; + styles { + style { + name: "text_style"; + base: "font=SLP:style=Roman text_class=slp_roman font_size=32 color=#7C7C7C wrap=word ellipsis=1.0"; + } + } + parts { + part { + name: "base"; + scale: 1; + description { + state: "default" 0.0; + min: 0 152; + } + } + part { + name: "bg"; + type: RECT; + description { + state: "default" 0.0; + color: GENLIST_PART_BG_COLOR; + } + } + part { + name: "elm.rect.top_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + min: 0 26; + fixed: 0 1; + color: 0 0 0 0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 0.0; } + } + } + part { + name: "elm.icon.rect"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + align: 1.0 0.5; + min: 74 74; + fixed: 1 1; + color: 0 0 0 0; + rel1 { relative: 1.0 1.0; to: "elm.rect.top_padding"; } + rel2 { relative: 1.0 1.0; to: "base"; } + } + } + part { + name: "elm.rect.right_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + align: 1.0 0.0; + min: 16 0; + fixed: 1 0; + color: 0 0 0 0; + rel1 { relative: 0.0 0.0; to: "elm.icon.rect"; } + rel2 { relative: 0.0 1.0; to: "elm.icon.rect"; } + } + } + part { + name: "elm.text.rect"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 100; + fixed: 0 1; + align: 0.0 0.0; + color: 0 0 0 0; + rel1 { relative: 0.0 1.0; to: "elm.rect.top_padding"; } + rel2 { relative: 0.0 1.0; to_x: "elm.rect.right_padding"; to_y: "elm.rect.top_padding"; } + } + } + part { + name: "elm.icon"; + type: SWALLOW; + repeat_events: 1; + description { + state: "default" 0.0; + rel1 { to: "elm.icon.rect"; } + rel2 { to: "elm.icon.rect"; } + } + } + part { + name: "elm.text"; + type: TEXTBLOCK; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + text { + style: "text_style"; + // TODO: Localization + text: "If you want to enter more fields.<br>Tap the right button."; + } + rel1 { offset: 16 0; to: "elm.text.rect"; } + rel2 { offset: -16 0; to: "elm.text.rect"; } + } + } + } + } + /* Genlist Item */ + group { + name: "dialogue/baseinfo.expand.2icon"; + data.item: "contents" "elm.icon.name elm.icon.expand"; + parts { + part { + name: "base"; + scale: 1; + description { + state: "default" 0.0; + min: 0 113; + } + } + part { + name: "bg"; + type: RECT; + description { + state: "default" 0.0; + color: GENLIST_PART_BG_COLOR; + } + } + part { + name: "elm.icon.expand.rect"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + align: 1.0 0.0; + min: 74 0; + fixed: 1 0; + color: 0 0 0 0; + rel1 { relative: 1.0 0.0; to: "base"; } + rel2 { relative: 1.0 1.0; to: "base"; } + } + } + part { + name: "elm.rect.right_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + align: 1.0 0.0; + min: 82 0; + fixed: 1 0; + color: 0 0 0 0; + rel1 { relative: 0.0 0.0; to: "elm.icon.expand.rect"; } + rel2 { relative: 0.0 1.0; to: "elm.icon.expand.rect"; } + } + } + part { + name: "elm.rect.top_line"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 1; + fixed: 0 1; + align: 0.0 0.0; + visible: 0; + color: GENLIST_PART_LIST_LINE_COLOR_INC; + rel1 { relative: 0.0 0.0; to: "base"; } + rel2 { relative: 0.0 0.0; to_x: "elm.rect.right_padding"; to_y: "base"; } + } + } + part { + name: "elm.rect.dialogue"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 12 0; + fixed: 1 0; + align: 0.0 0.0; + color: INPUT_DIALOGUE_COLOR; + rel2.relative: 0.0 1.0; + } + } + part { + name: "elm.icon.name.rect"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 111; + fixed: 0 1; + align: 0.0 0.0; + color: INPUT_DIALOGUE_BG_COLOR; + rel1 { relative: 1.0 1.0; to_x: "elm.rect.dialogue"; to_y: "elm.rect.top_line"; } + rel2 { relative: 1.0 1.0; to: "elm.rect.top_line"; } + } + } + part { + name: "elm.rect.bottom_line"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 1; + fixed: 0 1; + align: 0.0 0.0; + color: GENLIST_PART_LIST_LINE_COLOR_INC; + rel1 { relative: 0.0 1.0; to: "elm.icon.name.rect"; } + rel2 { relative: 1.0 1.0; to: "elm.icon.name.rect"; } + } + } + part { + name: "elm.rect.right_line"; + type: RECT; + description { + state: "default" 0.0; + min: 1 0; + fixed: 1 0; + align: 0.0 0.0; + color: GENLIST_PART_LIST_LINE_COLOR_INC; + rel1 { relative: 1.0 1.0; to: "elm.rect.top_line"; } + rel2 { relative: 0.0 1.0; to: "elm.rect.bottom_line"; } + } + } + part { + name: "elm.icon.name"; + type: SWALLOW; + repeat_events: 1; + description { + state: "default" 0.0; + rel1 { offset: 16 0; to: "elm.icon.name.rect"; } + rel2 { offset: -16 0; to: "elm.icon.name.rect"; } + } + } + part { + name: "elm.icon.expand"; + type: SWALLOW; + description { + state: "default" 0.0; + align: 0.5 0.5; + rel1.to: "elm.icon.expand.rect"; + rel2.to: "elm.icon.expand.rect"; + } + } + } + } + group { + name: "dialogue/1text.2icon"; + data.item: "texts" "elm.text"; + data.item: "contents" "elm.icon.1 elm.icon.2"; + parts { + part { + name: "base"; + type: RECT; + repeat_events: 1; + scale: 1; + description { state: "default" 0.0; + min: 0 129; + color: INPUT_DIALOGUE_BG_COLOR; + } + } + part { name: "bottom_line"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + min: 0 1; + fixed: 0 1; + visible: 1; + color: GENLIST_PART_LIST_LINE_COLOR_INC; + rel1 { + relative: 0.0 1.0; + offset: 0 -1; + } + } + } + part { + name: "elm.rect.dialgoue"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 12 0; + fixed: 1 0; + color: INPUT_DIALOGUE_COLOR; + align: 0.0 0.0; + rel2.relative: 0.0 1.0; + } + } + part { + name: "elm.padding.top"; + scale: 1; + description { + state: "default" 0.0; + min: 0 10; + fixed: 0 1; + align: 0.0 0.0; + rel2.relative: 1.0 0.0; + } + } + part { + name: "elm.padding.left"; + scale: 1; + description { + state: "default" 0.0; + min: 28 0; + fixed: 1 0; + align: 0.0 0.0; + rel2.relative: 0.0 1.0; + } + } + part { + name: "elm.rect.icon.2"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 96 0; + fixed: 1 0; + align: 1.0 0.0; + color: 0 0 0 0; + rel1.relative: 1.0 0.0; + } + } + part { + name: "elm.icon.2"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 64 64; + fixed: 1 1; + rel1.to: "elm.rect.icon.2"; + rel2.to: "elm.rect.icon.2"; + } + } + part { + name: "elm.rect.text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 48; + fixed: 0 1; + align: 0.0 0.0; + color: 0 0 0 0; + rel1 { relative: 1.0 1.0; to_x: "elm.padding.left"; to_y: "elm.padding.top"; } + rel2 { relative: 0.0 1.0; to_x: "elm.rect.icon.2"; to_y: "elm.padding.top"; } + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 129 129 129 255; + text { + font: "SLP:style=Roman"; + text_class: "slp_roman"; + size: 32; + min: 0 1; + align: 0.0 0.5; + text_class: "slp_roman"; + } + rel1.to: "elm.rect.text"; + rel2.to: "elm.rect.text"; + } + } + part { + name: "elm.rect.icon.1"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 60; + fixed: 0 1; + align: 0.0 0.0; + color: 0 0 0 0; + rel1 { relative: 1.0 1.0; to_x: "elm.padding.left"; to_y: "elm.rect.text"; } + rel2 { relative: 0.0 1.0; to_x: "elm.rect.icon.2"; to_y: "elm.rect.text"; } + } + } + part { + name: "elm.icon.1"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1.to: "elm.rect.icon.1"; + rel2.to: "elm.rect.icon.1"; + } + } + } + } + group { + name: "dialogue/1title.7text"; + data.item: "stacking" "above"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.title elm.text.1 elm.text.2 elm.text.3 elm.text.4 elm.text.5 elm.text.6 elm.text.7"; + data.item: "flips" "elm.flip.content.title elm.flip.content.1 elm.flip.content.2 elm.flip.content.3 elm.flip.content.4 elm.flip.content.5 elm.flip.content.6 elm.flip.content.7"; + + parts { + GENLIST_PART_BASE(792) + GENLIST_PART_DIALOGUE_BG_IMAGE + GENLIST_PART_BOTTOM_LINE + GENLIST_PART_PADDING_LEFT( GENLIST_PADDING_27_INC ) + GENLIST_PART_PADDING_RIGHT( GENLIST_PADDING_16_INC ) + GENLIST_PART_DIALOGUE_ITEM + GENLIST_PART_DIALOGUE_RIGHT_LINE + part { name: "vertical_line"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + min: 1 0; + fixed: 1 0; + color: GENLIST_PART_LIST_LINE_COLOR_INC; + rel1 { + relative: 1.0 0.0; + to_x: "elm.title"; + } + rel2.to_x: "elm.title"; + align: 0.0 0.5; + } + } + part { name: "center1_line"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + min: 0 1; + fixed: 0 1; + color: GENLIST_PART_LIST_LINE_COLOR_INC; + rel1 { + relative: 1.0 1.0/7.0; + to_x: "vertical_line"; + } + rel2.relative: 1.0 1.0/7.0; + align: 0.5 1.0; + } + } + part { name: "center2_line"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + min: 0 1; + fixed: 0 1; + color: GENLIST_PART_LIST_LINE_COLOR_INC; + rel1 { + relative: 1.0 2.0/7.0; + to_x: "vertical_line"; + } + rel2.relative: 1.0 2.0/7.0; + align: 0.5 1.0; + } + } + part { name: "center3_line"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + min: 0 1; + fixed: 0 1; + color: GENLIST_PART_LIST_LINE_COLOR_INC; + rel1 { + relative: 1.0 3.0/7.0; + to_x: "vertical_line"; + } + rel2.relative: 1.0 3.0/7.0; + align: 0.5 1.0; + } + } + part { name: "center4_line"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + min: 0 1; + fixed: 0 1; + color: GENLIST_PART_LIST_LINE_COLOR_INC; + rel1 { + relative: 1.0 4.0/7.0; + to_x: "vertical_line"; + } + rel2.relative: 1.0 4.0/7.0; + align: 0.5 1.0; + } + } + part { name: "center5_line"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + min: 0 1; + fixed: 0 1; + color: GENLIST_PART_LIST_LINE_COLOR_INC; + rel1 { + relative: 1.0 5.0/7.0; + to_x: "vertical_line"; + } + rel2.relative: 1.0 5.0/7.0; + align: 0.5 1.0; + } + } + part { name: "center6_line"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + min: 0 1; + fixed: 0 1; + color: GENLIST_PART_LIST_LINE_COLOR_INC; + rel1 { + relative: 1.0 6.0/7.0; + to_x: "vertical_line"; + } + rel2.relative: 1.0 6.0/7.0; + align: 0.5 1.0; + } + } + part { name: "elm.title"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: GENLIST_SIZE_163_INC 0; + fixed: 1 0; + rel1 { + relative: 1.0 0.0; + to_x: "elm.padding.left"; + } + rel2.to_x: "elm.padding.left"; + align: 0.0 0.5; + color: GENLIST_DIALOGUE_FONT_EDIT_MODE_TEXT_01_COLOR_INC; + text { + font: "SLP:style=Medium"; + size: GENLIST_FONT_32_INC; + min: 0 1; + align: 0.0 0.5; + text_class: "slp_medium"; + } + } + GENLIST_DESCRIPTION_FLIP_ENABLED + } + part { name: "elm.flip.content.title"; + clip_to: "disclip"; + type: SWALLOW; + description { state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1.to: "elm.title"; + rel2.to: "elm.title"; + } + description { state: "flip_enabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "elm.padding.title.right"; + type: RECT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: GENLIST_PADDING_16_INC 0; + fixed: 1 0; + rel1 { + relative: 1.0 0.0; + to_x: "elm.title"; + } + rel2.to_x: "elm.title"; + visible: 0; + align: 0.0 0.5; + } + } + part { name: "elm.text.1"; + clip_to: "disclip"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + rel1 { + relative: 1.0 0.0; + to_x: "elm.padding.title.right"; + } + rel2 { + relative: 0.0 0.0; + to_x: "elm.padding.right"; + to_y: "center1_line"; + } + color: GENLIST_PART_FONT_LIST_MAIN_TEXT_UNREAD_COLOR_INC; + text { + font: "SLP:style=Roman"; + size: GENLIST_FONT_44_INC; + min: 0 1; + align: 0.0 0.5; + text_class: "list_item"; + } + } + GENLIST_DESCRIPTION_FLIP_ENABLED + } + part { name: "elm.flip.content.1"; + clip_to: "disclip"; + type: SWALLOW; + description { state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1.to: "elm.text.1"; + rel2.to: "elm.text.1"; + } + description { state: "flip_enabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "elm.text.2"; + clip_to: "disclip"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + rel1 { + relative: 1.0 1.0/7.0; + to_x: "elm.padding.title.right"; + } + rel2 { + relative: 0.0 0.0; + to_x: "elm.padding.right"; + to_y: "center2_line"; + } + color: GENLIST_PART_FONT_LIST_MAIN_TEXT_UNREAD_COLOR_INC; + text { + font: "SLP:style=Roman"; + size: GENLIST_FONT_44_INC; + min: 0 1; + align: 0.0 0.5; + text_class: "slp_roman"; + } + } + GENLIST_DESCRIPTION_FLIP_ENABLED + } + part { name: "elm.flip.content.2"; + clip_to: "disclip"; + type: SWALLOW; + description { state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1.to: "elm.text.2"; + rel2.to: "elm.text.2"; + } + description { state: "flip_enabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "elm.text.3"; + clip_to: "disclip"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + rel1 { + relative: 1.0 2.0/7.0; + to_x: "elm.padding.title.right"; + } + rel2 { + relative: 0.0 0.0; + to_x: "elm.padding.right"; + to_y: "center3_line"; + } + color: GENLIST_PART_FONT_LIST_MAIN_TEXT_UNREAD_COLOR_INC; + text { + font: "SLP:style=Roman"; + size: GENLIST_FONT_44_INC; + min: 0 1; + align: 0.0 0.5; + text_class: "slp_roman"; + } + } + GENLIST_DESCRIPTION_FLIP_ENABLED + } + part { name: "elm.flip.content.3"; + clip_to: "disclip"; + type: SWALLOW; + description { state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1.to: "elm.text.3"; + rel2.to: "elm.text.3"; + } + description { state: "flip_enabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "elm.text.4"; + clip_to: "disclip"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + rel1 { + relative: 1.0 3.0/7.0; + to_x: "elm.padding.title.right"; + } + rel2 { + relative: 0.0 0.0; + to_x: "elm.padding.right"; + to_y: "center4_line"; + } + color: GENLIST_PART_FONT_LIST_MAIN_TEXT_UNREAD_COLOR_INC; + text { + font: "SLP:style=Roman"; + size: GENLIST_FONT_44_INC; + min: 0 1; + align: 0.0 0.5; + text_class: "slp_roman"; + } + } + GENLIST_DESCRIPTION_FLIP_ENABLED + } + part { name: "elm.flip.content.4"; + clip_to: "disclip"; + type: SWALLOW; + description { state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1.to: "elm.text.4"; + rel2.to: "elm.text.4"; + } + description { state: "flip_enabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "elm.text.5"; + clip_to: "disclip"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + rel1 { + relative: 1.0 4.0/7.0; + to_x: "elm.padding.title.right"; + } + rel2 { + relative: 0.0 0.0; + to_x: "elm.padding.right"; + to_y: "center5_line"; + } + color: GENLIST_PART_FONT_LIST_MAIN_TEXT_UNREAD_COLOR_INC; + text { + font: "SLP:style=Roman"; + size: GENLIST_FONT_44_INC; + min: 0 1; + align: 0.0 0.5; + text_class: "slp_roman"; + } + } + GENLIST_DESCRIPTION_FLIP_ENABLED + } + part { name: "elm.flip.content.5"; + clip_to: "disclip"; + type: SWALLOW; + description { state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1.to: "elm.text.5"; + rel2.to: "elm.text.5"; + } + description { state: "flip_enabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "elm.text.6"; + clip_to: "disclip"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + rel1 { + relative: 1.0 5.0/7.0; + to_x: "elm.padding.title.right"; + } + rel2 { + relative: 0.0 0.0; + to_x: "elm.padding.right"; + to_y: "center6_line"; + } + color: GENLIST_PART_FONT_LIST_MAIN_TEXT_UNREAD_COLOR_INC; + text { + font: "SLP:style=Roman"; + size: GENLIST_FONT_44_INC; + min: 0 1; + align: 0.0 0.5; + text_class: "slp_roman"; + } + } + GENLIST_DESCRIPTION_FLIP_ENABLED + } + part { name: "elm.flip.content.6"; + clip_to: "disclip"; + type: SWALLOW; + description { state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1.to: "elm.text.6"; + rel2.to: "elm.text.6"; + } + description { state: "flip_enabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "elm.text.7"; + clip_to: "disclip"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + rel1 { + relative: 1.0 6.0/7.0; + to_x: "elm.padding.title.right"; + } + rel2 { + relative: 0.0 0.0; + to_x: "elm.padding.right"; + to_y: "bottom_line"; + } + color: GENLIST_PART_FONT_LIST_MAIN_TEXT_UNREAD_COLOR_INC; + text { + font: "SLP:style=Roman"; + size: GENLIST_FONT_44_INC; + min: 0 1; + align: 0.0 0.5; + text_class: "slp_roman"; + } + } + GENLIST_DESCRIPTION_FLIP_ENABLED + } + part { name: "elm.flip.content.7"; + clip_to: "disclip"; + type: SWALLOW; + description { state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1.to: "elm.text.7"; + rel2.to: "elm.text.7"; + } + description { state: "flip_enabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + GENLIST_PART_DISCLIP + } + programs { + program { name: "go_disabled"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "disclip"; + } + program { name: "go_enabled"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "disclip"; + } + program { name: "flip_enabled"; + signal: "elm,state,flip,enabled"; + source: "elm"; + action: STATE_SET "flip_enabled" 0.0; + target: "elm.title"; + target: "elm.text.1"; + target: "elm.text.2"; + target: "elm.text.3"; + target: "elm.text.4"; + target: "elm.text.5"; + target: "elm.text.6"; + target: "elm.text.7"; + target: "elm.flip.content.title"; + target: "elm.flip.content.1"; + target: "elm.flip.content.2"; + target: "elm.flip.content.3"; + target: "elm.flip.content.4"; + target: "elm.flip.content.5"; + target: "elm.flip.content.6"; + target: "elm.flip.content.7"; + + } + program { name: "flip_disabled"; + signal: "elm,state,flip,disabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.title"; + target: "elm.text.1"; + target: "elm.text.2"; + target: "elm.text.3"; + target: "elm.text.4"; + target: "elm.text.5"; + target: "elm.text.6"; + target: "elm.text.7"; + target: "elm.flip.content.title"; + target: "elm.flip.content.1"; + target: "elm.flip.content.2"; + target: "elm.flip.content.3"; + target: "elm.flip.content.4"; + target: "elm.flip.content.5"; + target: "elm.flip.content.6"; + target: "elm.flip.content.7"; + } + } + } +} diff --git a/lib/edc/list.edc b/lib/edc/list.edc new file mode 100644 index 0000000..3ce8d4c --- /dev/null +++ b/lib/edc/list.edc @@ -0,0 +1,64 @@ +/* + * 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. + */ +collections +{ + group { + name: "genlist"; + parts + { + part { + name: "bg"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + } + part { + name: "searchbar"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + min: 0 106; + fixed: 0 1; + rel2 { relative: 1.0 0.0; } + } + } + part { + name: "content"; + type: SWALLOW; + description { + state: "default" 0.0; + align: 0.0 0.0; + rel1 { relative: 0.0 1.0; to: "searchbar"; } + rel2.to: "bg"; + } + } + part { + name: "fastscroll"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1.to: "content"; + rel2.to: "content"; + } + } + } + } +} diff --git a/lib/edc/list_theme.edc b/lib/edc/list_theme.edc new file mode 100644 index 0000000..7a7bf98 --- /dev/null +++ b/lib/edc/list_theme.edc @@ -0,0 +1,579 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define GENLIST_PART_BG_COLOR_INC 249 249 249 255 +#define GENLIST_PART_LIST_LINE_COLOR_INC 169 169 169 255 +#define GENLIST_PART_LIST_PRESS_COLOR_INC 42 137 194 255 +#define GENLIST_PART_LIST_COUNT_COLOR_INC 124 124 124 255 +#define GENLIST_PART_LIST_TEXT_DEFAULT 0 0 0 255 + +#define GENLIST_PART_BASE( param_item_height ) \ +part { \ + name: "base"; \ + type: RECT; \ + repeat_events: 1; \ + scale: 1; \ + description { state: "default" 0.0; \ + min: 0 param_item_height; \ + color: GENLIST_PART_BG_COLOR_INC; \ + } \ +} + +#define GENLIST_PART_BOTTOM_LINE \ +part { name: "bottom_line"; \ + type: RECT; \ + mouse_events: 0; \ + description { state: "default" 0.0; \ + min: 0 1; \ + fixed: 0 1; \ + visible: 1; \ + color: GENLIST_PART_LIST_LINE_COLOR_INC; \ + rel1 { \ + relative: 0.0 1.0; \ + offset: 0 -1; \ + } \ + } \ +} + +#define GENLIST_PART_PADDING_LEFT( param_padding_size ) \ +part { \ + name: "elm.padding.left"; \ + type: RECT; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: param_padding_size 0; \ + fixed: 1 0; \ + visible: 0; \ + rel2.relative: 0.0 1.0; \ + align: 0.0 0.0; \ + } \ +} + +#define GENLIST_PART_PADDING_RIGHT( param_padding_size ) \ +part { \ + name: "elm.padding.right"; \ + type: RECT; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: param_padding_size 0; \ + fixed: 1 0; \ + visible: 0; \ + rel1.relative: 1.0 0.0; \ + align: 1.0 0.0; \ + } \ +} + +#define GENLIST_PART_BG_IMAGE \ +part { \ + name: "bg_image"; \ + type: RECT; \ + clip_to: "disclip"; \ + mouse_events: 0; \ + description { \ + state: "default" 0.0; \ + color: GENLIST_PART_BG_COLOR_INC; \ + } \ + description { \ + state: "selected" 0.0; \ + inherit: "default" 0.0; \ + color: GENLIST_PART_LIST_PRESS_COLOR_INC; \ + } \ +} + +#define GENLIST_DESCRIPTION_FLIP_ENABLED \ +description { \ + state: "flip_enabled" 0.0; \ + inherit: "default" 0.0; \ + visible: 0; \ +} + +collections +{ + styles { + style { + name: "genlist_default_textblock_style"; + base: "font=SLP:style=Roman text_class=list_item font_size=44 align=left color=#000000 wrap=word ellipsis=1.0"; + tag: "br" "\n"; + tag: "ps" "ps"; + tag: "tab" "\t"; + tag: "b" "+ font=SLP:style=Bold"; + tag: "match" "+ color=#2A89C2"; + } + } + /* Genlist Item */ + group { + name: "elm/genlist/item/1text_center/default"; + alias: "elm/genlist/item_odd/1text_center/default"; + alias: "elm/genlist/item_compress/1text_center/default"; + alias: "elm/genlist/item_compress_odd/1text_center/default"; + data.item: "stacking" "above"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text"; + parts { + GENLIST_PART_BASE(113); + GENLIST_PART_BOTTOM_LINE + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + clip_to: "disclip"; + description { + state: "default" 0.0; + color: GENLIST_PART_LIST_COUNT_COLOR_INC; + text { + font: "SLP:style=Roman"; + text_class: "slp_roman"; + size: 44; + min: 0 1; + align: 0.5 0.5; + text_class: "slp_roman"; + } + } + } + part { + name: "disclip"; + type: RECT; + description { + state: "default" 0.0; + color: 255 255 255 255; + } + } + } + } + group { + name: "elm/genlist/item/link_list/default"; + alias: "elm/genlist/item_odd/link_list/default"; + alias: "elm/genlist/item_compress/link_list/default"; + alias: "elm/genlist/item_compress_odd/link_list/default"; + data.item: "stacking" "above"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text"; + data.item: "contents" "elm.icon.1 elm.icon.2 elm.icon.3 elm.icon.4"; + data.item: "flips" "elm.flip.content"; + parts { + GENLIST_PART_BASE(113) + GENLIST_PART_BG_IMAGE + GENLIST_PART_BOTTOM_LINE + GENLIST_PART_PADDING_LEFT(16) + GENLIST_PART_PADDING_RIGHT(16) + part { + name: "elm.icon.1"; + type: SWALLOW; + clip_to: "disclip"; + scale: 1; + description { + state: "default" 0.0; + min: 96 96; + max: 96 96; + fixed: 1 1; + rel1 { + relative: 0.0 0.0; + to_x: "elm.padding.right"; + } + rel2 { + relative: 0.0 1.0; + to_x: "elm.padding.right"; + } + align: 1.0 0.5; + } + GENLIST_DESCRIPTION_FLIP_ENABLED + } + part { + name: "elm.padding.icon1.left"; + type: RECT; + clip_to: "disclip"; + scale: 1; + description { + state: "default" 0.0; + min: 16 0; + fixed: 1 0; + visible: 0; + rel1.to_x: "elm.icon.1"; + rel2 { + relative: 0.0 1.0; + to_x: "elm.icon.1"; + } + align: 1.0 0.0; + } + } + part { + name: "elm.padding.icon1.left2"; + type: RECT; + clip_to: "disclip"; + scale: 1; + description { + state: "default" 0.0; + min: 134 0; + fixed: 1 0; + visible: 0; + rel1.to_x: "elm.icon.1"; + rel2 { + relative: 0.0 1.0; + to_x: "elm.icon.1"; + } + align: 1.0 0.0; + } + } + part { + name: "elm.padding.icon1.left3"; + type: RECT; + clip_to: "disclip"; + scale: 1; + description { + state: "default" 0.0; + min: 51 0; + fixed: 1 0; + visible: 0; + rel1.to_x: "elm.icon.1"; + rel2 { + relative: 0.0 1.0; + to_x: "elm.icon.1"; + } + align: 1.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + clip_to: "disclip"; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 1.0 0.0; + to_x: "elm.padding.left"; + } + rel2 { + relative: 0.0 1.0; + to_x: "elm.padding.icon1.left2"; + } + align: 0.0 0.5; + color: GENLIST_PART_LIST_TEXT_DEFAULT; + text { + font: "SLP:style=Roman"; + size: 44; + min: 0 1; + max: 1 0; + align: 0.0 0.5; + text_class: "list_item"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + } + GENLIST_DESCRIPTION_FLIP_ENABLED + } + part { + name: "elm.padding.text.right"; + type: RECT; + clip_to: "disclip"; + scale: 1; + description { + state: "default" 0.0; + min: 16 0; + fixed: 1 0; + rel1 { + relative: 1.0 0.0; + to_x: "elm.text"; + } + rel2.to_x: "elm.text"; + align: 0.0 0.0; + visible: 0; + } + } + part { + name: "elm.icon.2.rect"; + type: RECT; + clip_to: "disclip"; + scale: 1; + description { + state: "default" 0.0; + min: 32 32; + max: 32 32; + fixed: 1 1; + rel1 { + relative: 1.0 0.0; + to_x: "elm.padding.text.right"; + } + rel2 { + relative: 1.0 1.0; + to_y: "elm.padding.icon1.left3"; + } + align: 0.0 0.5; + color: 0 0 0 0; + } + GENLIST_DESCRIPTION_FLIP_ENABLED + } + part { + name: "elm.icon.2"; + type: SWALLOW; + clip_to: "disclip"; + description { + state: "default" 0.0; + rel1.to: "elm.icon.2.rect"; + rel2.to: "elm.icon.2.rect"; + } + GENLIST_DESCRIPTION_FLIP_ENABLED + } + part { + name: "elm.padding.icon2.right"; + type: RECT; + clip_to: "disclip"; + scale: 1; + description { + state: "default" 0.0; + min: 3 0; + fixed: 1 0; + visible: 0; + rel1 { + relative: 1.0 0.0; + to: "elm.icon.2.rect"; + } + rel2 { + relative: 1.0 1.0; + to: "elm.icon.2.rect"; + } + align: 0.0 0.0; + } + } + part { + name: "elm.icon.3.rect"; + type: RECT; + clip_to: "disclip"; + scale: 1; + description { + state: "default" 0.0; + min: 32 32; + max: 32 32; + fixed: 1 1; + rel1 { + relative: 1.0 0.0; + to_x: "elm.padding.icon2.right"; + } + rel2 { + relative: 0.0 1.0; + to_y: "elm.padding.icon1.left3"; + } + align: 0.0 0.5; + color: 0 0 0 0; + } + GENLIST_DESCRIPTION_FLIP_ENABLED + } + part { + name: "elm.icon.3"; + type: SWALLOW; + clip_to: "disclip"; + description { + state: "default" 0.0; + rel1.to: "elm.icon.3.rect"; + rel2.to: "elm.icon.3.rect"; + } + GENLIST_DESCRIPTION_FLIP_ENABLED + } + part { + name: "elm.padding.icon3.right"; + type: RECT; + clip_to: "disclip"; + scale: 1; + description { + state: "default" 0.0; + min: 3 0; + fixed: 1 0; + visible: 0; + rel1 { + relative: 1.0 0.0; + to: "elm.icon.3.rect"; + } + rel2 { + relative: 1.0 1.0; + to: "elm.icon.3.rect"; + } + align: 0.0 0.0; + } + } + part { + name: "elm.icon.4.rect"; + type: RECT; + clip_to: "disclip"; + scale: 1; + description { + state: "default" 0.0; + min: 32 32; + max: 32 32; + fixed: 1 1; + rel1 { + relative: 1.0 0.0; + to_x: "elm.padding.icon3.right"; + } + rel2 { + relative: 0.0 1.0; + to_y: "elm.padding.icon1.left"; + } + align: 0.0 0.5; + color: 0 0 0 0; + } + GENLIST_DESCRIPTION_FLIP_ENABLED + } + part { + name: "elm.icon.4"; + type: SWALLOW; + clip_to: "disclip"; + description { + state: "default" 0.0; + rel1.to: "elm.icon.4.rect"; + rel2.to: "elm.icon.4.rect"; + } + GENLIST_DESCRIPTION_FLIP_ENABLED + } + part { + name: "disclip"; + type: RECT; + description { + state: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + color: 255 255 255 110; + } + } + part { + name: "elm.flip.content"; + clip_to: "disclip"; + type: SWALLOW; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1 { + relative: 1.0 0.5; + to_x: "elm.padding.left"; + } + rel2 { + relative: 0.0 0.5; + to_x: "elm.padding.right"; + } + } + description { + state: "flip_enabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { + name: "go_active"; + signal: "elm,state,selected"; + source: "elm"; + action: STATE_SET "selected" 0.0; + target: "bg_image"; + target: "elm.text"; + } + program { + name: "go_passive"; + signal: "elm,state,unselected"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg_image"; + target: "elm.text"; + transition: LINEAR 0.1; + } + program { + name: "go_disabled"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "disclip"; + } + program { + name: "go_enabled"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "disclip"; + } + program { + name: "flip_enabled"; + signal: "elm,state,flip,enabled"; + source: "elm"; + action: STATE_SET "flip_enabled" 0.0; + target: "elm.text"; + target: "elm.icon.1"; + target: "elm.icon.2"; + target: "elm.icon.3"; + target: "elm.icon.4"; + target: "elm.flip.content"; + } + program { + name: "flip_disabled"; + signal: "elm,state,flip,disabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.text"; + target: "elm.icon.1"; + target: "elm.icon.2"; + target: "elm.icon.3"; + target: "elm.icon.4"; + target: "elm.flip.content"; + } + } + } + group { + name: "elm/genlist/item_compress/link_list.tb/default"; + inherit: "elm/genlist/item/link_list/default"; + parts { + part { + name: "elm.text"; + type: TEXTBLOCK; + clip_to: "disclip"; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 1.0 0.0; + to_x: "elm.padding.left"; + } + rel2 { + relative: 0.0 1.0; + to_x: "elm.padding.icon1.left2"; + } + align: 0.0 0.5; + text { + style: "genlist_default_textblock_style"; + min: 0 1; + max: 1 0; + align: 0.0 0.5; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + } + GENLIST_DESCRIPTION_FLIP_ENABLED + } + } + } +} diff --git a/lib/edc/progress.edc b/lib/edc/progress.edc index fa67cb8..82ef99e 100644 --- a/lib/edc/progress.edc +++ b/lib/edc/progress.edc @@ -15,165 +15,167 @@ */ collections { - group { name: "popup_center_text_progressview"; - parts{ - part { name: "pad_t"; - scale : 1; - mouse_events: 0; - repeat_events: 1; - description { state: "default" 0.0; - align: 0.5 0.0; - min: 0 14; - fixed: 0 1; - rel1 { - relative: 1.0 0.0; - to_x: "pad_l"; - } - rel2 { - relative: 0.0 0.0; - to_x: "pad_r"; - } - } - } - part { name: "pad_l"; - scale: 1; - description { state: "default" 0.0; - min : 10 0; - fixed: 1 0; - rel1 { - relative: 0.0 0.0; - } - rel2 { - relative: 0.0 1.0; - } - align: 0.0 0.0; - } - } - part { name: "pad_r"; - scale: 1; - description { state: "default" 0.0; - min : 10 0; - fixed: 1 0; - rel1 { - relative: 1.0 0.0; - } - rel2 { - relative: 1.0 1.0; - } - align: 1.0 0.0; - } - } - part{ name:"elm.swallow.content"; - type: SWALLOW; - description { state: "default" 0.0; - rel1 { - relative: 0.0 1.0; - to: "pad_t"; - } - rel2 { - relative: 1.0 0.0; - to: "pad_b"; - } - } - } - part { name: "pad_b"; - scale : 1; - mouse_events: 0; - repeat_events: 1; - description { state: "default" 0.0; - align: 0.5 1.0; - min: 0 90; - fixed: 0 1; - rel1 { - relative: 1.0 1.0; - to_x: "pad_l"; - } - rel2 { - relative: 0.0 1.0; - to_x: "pad_r"; - } - } - } - part { name: "elm.swallow.end"; - type: SWALLOW; - scale : 1; - mouse_events: 1; - repeat_events: 1; - description { state: "default" 0.0; - align: 0.0 0.0; - fixed: 1 1; - rel1 { - relative: 0.0 0.0; - to: "pad_b"; - } - rel2 { - relative: 1.0 1.0; - to: "pad_b"; - } - } - } - part { name: "pad_bm"; - scale : 1; - mouse_events: 0; - repeat_events: 1; - description { state: "default" 0.0; - align: 0.0 1.0; - min: 0 52; - fixed: 0 1; - rel1 { - relative: 0.0 1.0; - to: "pad_b"; - } - rel2 { - relative: 1.0 1.0; - to: "pad_b"; - } - } - } - part { name: "elm.text.subtext1"; - type: TEXT; - scale : 1; - description { state: "default" 0.0; - text { - font: "SLP:style=Medium"; - size: 16; - min: 0 0; - align: 0.0 1.0; - } - color: 108 108 108 255; - align: 0.0 0.5; - rel1 { - relative: 0.0 0.0; - to: "pad_bm"; - } - rel2 { - relative: 1.0 1.0; - to: "pad_bm"; - } - } - } - part { name: "elm.text.subtext2"; - type: TEXT; - scale : 1; - description { state: "default" 0.0; - text { - font: "SLP:style=Medium"; - size: 16; - min: 0 0; - align: 1.0 1.0; - } - color: 108 108 108 255; - align: 1.0 0.5; - rel1 { - relative: 0.0 0.0; - to: "pad_bm"; - } - rel2 { - relative: 1.0 1.0; - to: "pad_bm"; - } - } - } - } - } + group { name: "popup_center_text_progressview"; + parts{ + part { name: "pad_t"; + scale : 1; + mouse_events: 0; + repeat_events: 1; + description { state: "default" 0.0; + align: 0.5 0.0; + min: 0 14; + fixed: 0 1; + rel1 { + relative: 1.0 0.0; + to_x: "pad_l"; + } + rel2 { + relative: 0.0 0.0; + to_x: "pad_r"; + } + } + } + part { name: "pad_l"; + scale: 1; + description { state: "default" 0.0; + min : 10 0; + fixed: 1 0; + rel1 { + relative: 0.0 0.0; + } + rel2 { + relative: 0.0 1.0; + } + align: 0.0 0.0; + } + } + part { name: "pad_r"; + scale: 1; + description { state: "default" 0.0; + min : 10 0; + fixed: 1 0; + rel1 { + relative: 1.0 0.0; + } + rel2 { + relative: 1.0 1.0; + } + align: 1.0 0.0; + } + } + part{ name:"elm.swallow.content"; + type: SWALLOW; + description { state: "default" 0.0; + rel1 { + relative: 0.0 1.0; + to: "pad_t"; + } + rel2 { + relative: 1.0 0.0; + to: "pad_b"; + } + } + } + part { name: "pad_b"; + scale : 1; + mouse_events: 0; + repeat_events: 1; + description { state: "default" 0.0; + align: 0.5 1.0; + min: 0 90; + fixed: 0 1; + rel1 { + relative: 1.0 1.0; + to_x: "pad_l"; + } + rel2 { + relative: 0.0 1.0; + to_x: "pad_r"; + } + } + } + part { name: "elm.swallow.end"; + type: SWALLOW; + scale : 1; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + align: 0.0 0.0; + fixed: 1 1; + rel1 { + relative: 0.0 0.0; + to: "pad_b"; + } + rel2 { + relative: 1.0 1.0; + to: "pad_b"; + } + } + } + part { name: "pad_bm"; + scale : 1; + mouse_events: 0; + repeat_events: 1; + description { state: "default" 0.0; + align: 0.0 1.0; + min: 0 52; + fixed: 0 1; + rel1 { + relative: 0.0 1.0; + to: "pad_b"; + } + rel2 { + relative: 1.0 1.0; + to: "pad_b"; + } + } + } + part { name: "elm.text.subtext1"; + type: TEXT; + scale : 1; + description { state: "default" 0.0; + text { + font: "SLP:style=Medium"; + text_class: "slp_medium"; + size: 18; + min: 0 0; + align: 0.0 1.0; + } + color: 124 124 124 255; + align: 0.0 0.5; + rel1 { + relative: 0.0 0.0; + to: "pad_bm"; + } + rel2 { + relative: 1.0 1.0; + to: "pad_bm"; + } + } + } + part { name: "elm.text.subtext2"; + type: TEXT; + scale : 1; + description { state: "default" 0.0; + text { + font: "SLP:style=Medium"; + text_class: "slp_medium"; + size: 18; + min: 0 0; + align: 1.0 1.0; + } + color: 124 124 124 255; + align: 1.0 0.5; + rel1 { + relative: 0.0 0.0; + to: "pad_bm"; + } + rel2 { + relative: 1.0 1.0; + to: "pad_bm"; + } + } + } + } + } } diff --git a/lib/edc/speeddial_theme.edc b/lib/edc/speeddial_theme.edc new file mode 100644 index 0000000..c6db04d --- /dev/null +++ b/lib/edc/speeddial_theme.edc @@ -0,0 +1,141 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define WIDTH 720 +#define MIN_SIZE (WIDTH/3) + +collections { + group{ + name: "elm/gengrid/item/gridtext_speeddial/default"; + data.item: "texts" "elm.text elm.text.number"; + data.item: "contents" "elm.swallow.icon elm.swallow.check.icon"; + + parts{ + part{ + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + } + } + part { + name: "icon_bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: MIN_SIZE MIN_SIZE; + fixed: 1 1; + visible: 1; + color: 51 51 51 200; + rel1 { relative: 0.0 0.0; to: "bg"; } + rel2 { relative: 1.0 1.0; to: "bg"; } + } + } + part { + name: "elm.swallow.icon.bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + color: 0 0 0 255; + rel1 { relative: 0.0 0.0; to: "icon_bg"; } + rel2 { relative: 1.0 1.0; offset: -2 -2;to: "icon_bg"; } + } + } + part{ + name: "elm.swallow.icon"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; to: "elm.swallow.icon.bg"; } + rel2 { relative: 1.0 1.0; to: "elm.swallow.icon.bg"; } + } + } + part { + name: "label_bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: MIN_SIZE 30; + fixed: 1 1; + align: 0.0 1.0; + visible: 0; + rel1 { relative: 0.0 1.0; offset: 0 0; to: "elm.swallow.icon.bg"; } + rel2 { relative: 1.0 1.0; offset: 0 -10; to: "elm.swallow.icon.bg"; } + } + } + part { + name: "elm.text"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; to: "label_bg"; } + rel2 { relative: 1.0 1.0; to: "label_bg"; } + color: 255 255 255 255; + color2: 0 0 0 185; + color3: 0 0 0 185; + text { + font: "SLP:style=Medium"; + text_class: "slp_medium"; + size: 25; + align: 0.5 0.5; + } + } + } + part { + name: "elm.text.number"; + type: TEXT; + effect: SHADOW; + scale: 1; + description { + state: "default" 0.0; + align: 0.5 0.5; + rel1 { relative: 0.0 0.0; to: "elm.swallow.icon.bg"; } + rel2 { relative: 1.0 1.0; to: "elm.swallow.icon.bg"; } + color: 255 255 255 255; + color2: 0 0 0 185; + color3: 0 0 0 185; + text { + font: "SLP:style=Medium"; + text_class: "slp_medium"; + size: 35; + align: 0.5 0.5; + } + } + } + part { + name: "elm.swallow.check.icon"; + type: SWALLOW; + description { + state: "default" 0.0; + align: 0.5 0.5; + rel1 { relative: 0.0 0.0; to: "elm.swallow.icon";} + rel2 { relative: 1.0 1.0; to: "elm.swallow.icon";} + } + } + } + } +} diff --git a/lib/favor/CMakeLists.txt b/lib/favor/CMakeLists.txt new file mode 100755 index 0000000..25c4341 --- /dev/null +++ b/lib/favor/CMakeLists.txt @@ -0,0 +1,9 @@ +LINK_DIRECTORIES(${CMAKE_BINARY_DIR}) + +FILE(GLOB FAVOR_SRCS *.c) + +ADD_LIBRARY(${FAVOR_LIB} STATIC ${FAVOR_SRCS}) +SET_TARGET_PROPERTIES(${FAVOR_LIB} PROPERTIES COMPILE_FLAGS ${EXTRA_CFLAGS}) +TARGET_LINK_LIBRARIES(${FAVOR_LIB} ${COMMON_LIB} ${ug_pkgs_LDFLAGS} ${CT_DETAILS} ${CT_LIST}) +ADD_DEPENDENCIES(${FAVOR_LIB} favorites_edj_build) +ADD_DEPENDENCIES(${FAVOR_LIB} favorites_theme_build) diff --git a/lib/favor/ph-favorite-edit-view.c b/lib/favor/ph-favorite-edit-view.c new file mode 100755 index 0000000..b9d5e4b --- /dev/null +++ b/lib/favor/ph-favorite-edit-view.c @@ -0,0 +1,425 @@ +/* + * 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-favor.h" +#include "ph-favorite-view.h" +#include "ph-favorite-edit-view.h" +#include "ct-list.h" + + +static inline void favor_edit_all_item_check_set(Evas_Object *gengrid, + Eina_Bool checked) +{ + Elm_Object_Item *item; + + item = elm_gengrid_first_item_get(gengrid); + while (item) { + ph_favor_info *f_info = elm_object_item_data_get(item); + f_info->checked = checked; + item = elm_gengrid_item_next_get(item); + } + elm_gengrid_realized_items_update(gengrid); +} + +static Eina_Bool favor_edit_del_timer(void *data) +{ + PH_FN_CALL; + ph_favorite_data *favor_d = data; + ph_progress_info *p_info = favor_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; + bool deleted = false; + + pthread_join(p_info->thread, NULL); + + if (favor_d->popup) { + evas_object_del(favor_d->popup); + favor_d->popup = NULL; + } + + if (p_info->cnt == p_info->cnt_checked_total) { + ret = contacts_svc_end_trans(true); + ph_favor_edit_mode_end(favor_d, true); + deleted = true; + } + else + ret = contacts_svc_end_trans(false); + + if (ret < CTS_SUCCESS) { + ERR("contacts_svc_end_trans() Failed(%d)", ret); + deleted = false; + } + + if (NULL != p_info) { + favor_d->p_info = NULL; + free(p_info); + } + + if (deleted) + phone_show_tickernoti(S_(PH_SYS_POP_DELETED)); + else + phone_show_tickernoti(S_(PH_SYS_POP_FAILED)); + return ECORE_CALLBACK_CANCEL; + } +} + +static PTHREAD_FN favor_edit_del(void *data) +{ + ph_favor_info*f_info; + ct_contact_list*mf_info; + Eina_List *l; + ph_favorite_data *favor_d = data; + ph_progress_info *p_info = favor_d->p_info; + + EINA_LIST_FOREACH(favor_d->mf_list, l, mf_info) { + if (!p_info->alive) { + p_info->completed = true; + break; + } + if (!mf_info) continue; + + if (TRUE == mf_info->checked) { + if (CTS_SUCCESS != contacts_svc_reset_outgoing_count(mf_info->id)) { + p_info->completed = true; + break; + } + p_info->cnt++; + } + if (p_info->cnt == p_info->cnt_checked_total) + break; + } + + EINA_LIST_FOREACH(favor_d->favor_list, l, f_info) { + if (!p_info->alive) { + p_info->completed = true; + break; + } + if (!f_info) continue; + + if (TRUE == f_info->checked) { + if (CTS_SUCCESS != contacts_svc_delete_favorite(f_info->id)) { + p_info->completed = true; + break; + } + p_info->cnt++; + } + if (p_info->cnt == p_info->cnt_checked_total) + break; + } + pthread_exit(NULL); + +} + +void ph_favor_edit_del_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + ph_favorite_data *favor_d = data; + ph_progress_info *p_info; + + p_info = calloc(1, sizeof(ph_progress_info)); + p_retm_if(NULL == p_info, "calloc return NULL"); + + favor_d->p_info = p_info; + p_info->cnt_checked_total = favor_d->checked_cnt; + p_info->alive = true; + + ret = contacts_svc_begin_trans(); + if (ret < CTS_SUCCESS) { + ERR("contacts_svc_begin_trans() Failed(%d)", ret); + free(p_info); + favor_d->p_info = NULL; + return; + } + + ret = pthread_create(&p_info->thread, NULL, favor_edit_del, favor_d); + if (0 != ret) { + ERR("Thread creation failed(%d)", ret); + free(p_info); + favor_d->p_info = NULL; + + ret = contacts_svc_end_trans(false); + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); + return; + } + + p_info->timer = ecore_timer_add(0.2, favor_edit_del_timer, favor_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); + favor_d->p_info = NULL; + + ret = contacts_svc_end_trans(false); + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); + return; + } + favor_d->popup = phone_progressbar_popup(favor_d->win, p_info, T_(PH_GET_TEXT_BASIC, PHTEXT_DELETING_FAVORITES)); +} + +void ph_favor_edit_check_for_number(Elm_Object_Item *item, ph_favorite_data *favor_d) +{ + int ret; + GSList *list = NULL; + ph_favor_info *f_info; + CTSstruct* contact; + Evas_Object *list_nums; + + f_info = elm_object_item_data_get(item); + p_retm_if(NULL == f_info, "elm_object_item_data_get() return NULL"); + + ret = contacts_svc_get_contact(f_info->contact_id, &contact); + p_retm_if(ret<CTS_SUCCESS, "contacts_svc_get_contact() Failed(%d)", ret); + + contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &list); + + if (NULL == list) { + ERR("contacts_svc_struct_get_list() return NULL"); + contacts_svc_struct_free(contact); + phone_show_popup(favor_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_NO_NUMBER), 1.5); + + f_info->checked = EINA_FALSE; + favor_d->checked_cnt--; + + elm_gengrid_item_update(item); + return; + } + + if (1 == g_slist_length(list)) { + f_info->id_ret = contacts_svc_value_get_int(list->data, CTS_NUM_VAL_ID_INT); + ph_favor_edit_set_selection_info(favor_d); + } + else { + list_nums = ph_favor_create_value_list_popup(CTS_VALUE_NUMBER, favor_d, f_info->contact_id, list); + p_retm_if(NULL == list, "ph_favor_create_value_list_popup() return NULL"); + evas_object_data_set(list_nums, "item", item); + } + + contacts_svc_struct_free(contact); +} + +void ph_favor_edit_check_for_email(Elm_Object_Item *item, ph_favorite_data *favor_d) +{ + int ret; + GSList *list = NULL; + CTSstruct *contact; + Evas_Object *list_emails; + ph_favor_info *f_info; + + f_info = elm_object_item_data_get(item); + p_retm_if(NULL == f_info, "elm_object_item_data_get() return NULL"); + + ret = contacts_svc_get_contact(f_info->contact_id, &contact); + p_retm_if(ret<CTS_SUCCESS, "contacts_svc_get_contact() Failed(%d)", ret); + + contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &list); + + if (NULL == list) { + ERR("contacts_svc_struct_get_list() return NULL"); + contacts_svc_struct_free(contact); + phone_show_popup(favor_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_NO_EMAIL), 1.5); + + f_info->checked = EINA_FALSE; + favor_d->checked_cnt--; + + elm_gengrid_item_update(item); + return; + } + + if (1 == g_slist_length(list)) { + f_info->id_ret = contacts_svc_value_get_int(list->data, CTS_EMAIL_VAL_ID_INT); + ph_favor_edit_set_selection_info(favor_d); + } + else { + list_emails = ph_favor_create_value_list_popup(CTS_VALUE_EMAIL, favor_d, f_info->contact_id, list); + p_retm_if(NULL == list_emails, "ph_favor_create_value_list_popup() return NULL"); + evas_object_data_set(list_emails, "item", item); + } + + contacts_svc_struct_free(contact); +} + +void ph_frequent_edit_check_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; + ph_favorite_data *favor_d = evas_object_data_get(obj, "favor_d"); + Elm_Object_Item *item; + Eina_Bool checked = elm_check_state_get(obj); + ct_contact_list *mf_info = data; + p_retm_if(NULL == mf_info, "mf info is NULL"); + item = mf_info->item; + + if (checked) + favor_d->checked_cnt++; + else { + favor_d->checked_cnt--; + ph_favor_edit_set_selection_info(favor_d); + return; + } + + if (PH_UG_REQUEST_CHECK_FOR_NUMBER == favor_d->ug_request) + ph_favor_edit_check_for_number(item, favor_d); + else if (PH_UG_REQUEST_CHECK_FOR_EMAIL== favor_d->ug_request) + ph_favor_edit_check_for_email(item, favor_d); + else + ph_favor_edit_set_selection_info(favor_d); +} + +void ph_favor_edit_check_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_favorite_data *favor_d = evas_object_data_get(obj, "favor_d"); + Elm_Object_Item *item; + Eina_Bool checked = elm_check_state_get(obj); + + ph_favor_info *f_info = data; + p_retm_if(NULL == f_info, "favor info is NULL"); + item = f_info->item; + + if (favor_d->longpressed) { + favor_d->checked_cnt=0; + elm_check_state_set(obj, EINA_FALSE); + favor_d->longpressed = EINA_FALSE; + ph_favor_edit_set_selection_info(favor_d); + return; + } + + if (checked) + favor_d->checked_cnt++; + else { + favor_d->checked_cnt--; + ph_favor_edit_set_selection_info(favor_d); + return; + } + + if (PH_UG_REQUEST_CHECK_FOR_NUMBER == favor_d->ug_request) + ph_favor_edit_check_for_number(item, favor_d); + else if (PH_UG_REQUEST_CHECK_FOR_EMAIL== favor_d->ug_request) + ph_favor_edit_check_for_email(item, favor_d); + else + ph_favor_edit_set_selection_info(favor_d); +} + +void ph_favor_edit_set_selection_info(ph_favorite_data * favor_d) +{ + p_retm_if(NULL == favor_d, "Selection info is null"); + + if (0 == favor_d->checked_cnt) + phone_show_notify(favor_d->navi, T_(CT_GET_TEXT_BASIC, CTTEXT_SELECT_CONTACTS)); + else { + char info_text[PH_TEXT_SHORT_LEN]={0}; + snprintf(info_text, sizeof(info_text), "%s (%d)", S_(PH_SYS_POP_SELECTED), + favor_d->checked_cnt); + phone_show_notify(favor_d->navi, info_text); + } + + ph_favor_update_button_status(favor_d); +} + +static void favor_gengrid_realized(void *data, Evas_Object *obj, void *event_info) +{ + ph_favor_info *f_info; + Elm_Object_Item *it = event_info; + ph_favorite_data *favor_d = data; + f_info = elm_object_item_data_get(it); + p_retm_if(NULL == f_info, "elm_object_item_data_get() return NULL"); + + if (favor_d->list_mode == PH_FAVOR_MODE_EDIT) + elm_object_item_signal_emit(f_info->item, "favorites_theme/edit_no_effect", "favorites_theme"); +} + +API void phone_favor_edit_mode_start(ph_favorite_data *favor_d) +{ + PH_FN_CALL; + Eina_List *list; + Eina_List *cursor; + Elm_Object_Item *it; + ph_favor_info *f_info; + p_retm_if(NULL == favor_d, "Favorite data is null"); + favor_d->list_mode = PH_FAVOR_MODE_EDIT; + phone_favor_set_navi(favor_d->layout, PH_FAVOR_MODE_EDIT); + phone_show_notify(favor_d->navi, T_(CT_GET_TEXT_BASIC, CTTEXT_SELECT_CONTACTS)); + elm_gengrid_reorder_mode_set(favor_d->favor_gengrid, EINA_TRUE); + + elm_gengrid_realized_items_update(favor_d->mf_gengrid); + elm_gengrid_realized_items_update(favor_d->favor_gengrid); + + evas_object_smart_callback_add(favor_d->favor_gengrid, "realized", favor_gengrid_realized, favor_d); + list = elm_gengrid_realized_items_get(favor_d->favor_gengrid); + EINA_LIST_FOREACH(list, cursor, it) { + f_info = elm_object_item_data_get(it); + p_retm_if(NULL == f_info, "elm_object_item_data_get() return NULL"); + elm_object_item_signal_emit(f_info->item, "favorites_theme/edit", "favorites_theme"); + } +} + +void ph_favor_edit_mode_end(ph_favorite_data *favor_d, bool redraw) +{ + Evas_Object *bg; + + favor_d->list_mode = PH_FAVOR_MODE_DEFAULT; + + bg = elm_object_part_content_unset(favor_d->layout, "elm.swallow.bg"); + if (bg) + evas_object_del(bg); + + phone_hide_notify(favor_d->navi); + + if (favor_d->checked_cnt) + favor_d->checked_cnt = 0; + + if (favor_d->mf_gengrid) { + ph_favor_load_mf_list(favor_d); + ph_favor_mf_fill_layout(favor_d); + } + + if (favor_d->favor_gengrid) { + favor_edit_all_item_check_set(favor_d->favor_gengrid, EINA_FALSE); + elm_gengrid_reorder_mode_set(favor_d->favor_gengrid, EINA_FALSE); + } + + if (redraw) + phone_favor_set_navi(favor_d->layout, PH_FAVOR_MODE_DEFAULT); +} + +void ph_favor_edit_cancel_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_favorite_data *favor_d = data; + ph_favor_edit_mode_end(favor_d, true); +} diff --git a/lib/phoneui/ph-favorite-edit-view.h b/lib/favor/ph-favorite-edit-view.h index 53ddf9e..e9be048 100644 --- a/lib/phoneui/ph-favorite-edit-view.h +++ b/lib/favor/ph-favorite-edit-view.h @@ -17,11 +17,13 @@ #ifndef __PH_FAVORITE_EDIT_H__ #define __PH_FAVORITE_EDIT_H__ -void ph_favor_edit_mode_start(ph_favorite_data *favor_d); void ph_favor_edit_mode_end(ph_favorite_data *favor_d, bool redraw); -void ph_favor_edit_set_selection_info(const void *data); +void ph_favor_edit_set_selection_info(ph_favorite_data *favor_d); void ph_favor_edit_check_changed_cb(void *data, Evas_Object *obj, void *event_info); +void ph_frequent_edit_check_changed_cb(void *data, Evas_Object *obj, void *event_info); void ph_favor_edit_del_btn_cb(void *data, Evas_Object *obj, void *event_info); void ph_favor_edit_cancel_cb(void *data, Evas_Object *obj, void *event_info); +void ph_favor_edit_check_for_number(Elm_Object_Item *item, ph_favorite_data *favor_d); +void ph_favor_edit_check_for_email(Elm_Object_Item *item, ph_favorite_data *favor_d); #endif /* __PH_FAVORITE_EDIT_H__ */ diff --git a/lib/favor/ph-favorite-view.c b/lib/favor/ph-favorite-view.c new file mode 100755 index 0000000..b6c65c4 --- /dev/null +++ b/lib/favor/ph-favorite-view.c @@ -0,0 +1,1636 @@ +/* + * 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 <Ecore_X.h> +#include <contacts-svc.h> +#include <ui-gadget-module.h> + +#include "phone.h" +#include "phone-common.h" +#include "ct-favor.h" +#include "ct-list.h" +#include "ct-detail.h" +#include "ph-favorite-view.h" +#include "ph-favorite-edit-view.h" + +#define KEY_FAVOR_DATA "favor_d" +#define PH_FAVOR_LIST_ICON_SIZE 70 + +static Elm_Gengrid_Item_Class grid_itc_favor, grid_itc_favor_no_id, grid_itc_mf; + +static char* favor_get_contact_number(int contact_id) +{ + int ret; + char *number; + CTSvalue *value; + + ret = contacts_svc_get_contact_value(CTS_GET_DEFAULT_NUMBER_VALUE, contact_id, &value); + p_retvm_if(ret != CTS_SUCCESS, NULL, "contacts_svc_get_contact_value() Failed(%d)", ret); + + number = contacts_svc_value_steal_str(value, CTS_NUM_VAL_NUMBER_STR); + contacts_svc_value_free(value); + + return number; +} + +static void favor_load_favorite_data(ph_favorite_data *favor_d) +{ + int count = 0; + int ret = 0; + Eina_List *list = NULL; + CTSiter *iter; + + switch (favor_d->ug_request) { + //case PH_UG_REQUEST_SELECT_NUMBER: + //case PH_UG_REQUEST_CHECK_FOR_NUMBER: + case CT_UG_REQUEST_SELECT_NUMBER: + case CT_UG_REQUEST_CHECK_FOR_NUMBER: + ret = contacts_svc_get_list(CTS_LIST_ALL_CONTACT_FAVORITE_HAD_NUMBER, &iter); + break; + //case PH_UG_REQUEST_SELECT_EMAIL: + //case PH_UG_REQUEST_CHECK_FOR_EMAIL: + case CT_UG_REQUEST_SELECT_EMAIL: + case CT_UG_REQUEST_CHECK_FOR_EMAIL: + ret = contacts_svc_get_list(CTS_LIST_ALL_CONTACT_FAVORITE_HAD_EMAIL, &iter); + break; + default : + ret = contacts_svc_get_list(CTS_LIST_ALL_CONTACT_FAVORITE, &iter); + break; + } + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_get_list is failed"); + favor_d->favor_list_count = 0; + return; + } + + ret = contacts_svc_iter_next(iter); + contacts_svc_begin_trans(); + favor_d->version = contacts_svc_end_trans(true); + + while (CTS_SUCCESS == ret) { + CTSvalue *pfav = NULL; + ph_favor_info *f_info; + pfav = contacts_svc_iter_get_info(iter); + + f_info = calloc(1, sizeof(ph_favor_info)); + f_info->id = contacts_svc_value_get_int(pfav, CTS_LIST_SHORTCUT_ID_INT); + f_info->contact_id = contacts_svc_value_get_int(pfav, CTS_LIST_SHORTCUT_CONTACT_ID_INT); + f_info->display = phone_get_display_name_from_value(pfav, CTS_LIST_SHORTCUT_DISPLAY_NAME_STR, + CTS_LIST_SHORTCUT_FIRST_NAME_STR, CTS_LIST_SHORTCUT_LAST_NAME_STR); + f_info->img_path = contacts_svc_value_steal_str(pfav, CTS_LIST_SHORTCUT_IMG_PATH_STR); + + list = eina_list_append(list, (void*)f_info); + count++; + contacts_svc_value_free(pfav); + ret = contacts_svc_iter_next(iter); + } + contacts_svc_iter_remove(iter); + + favor_d->favor_list_count = count; + favor_d->favor_list = list; +} + +static void favor_free_data(Eina_List *list) +{ + Eina_List *l; + ph_favor_info *f_info; + p_retm_if(NULL == list, "List is null"); + + EINA_LIST_FOREACH(list, l, f_info) { + if (NULL == f_info) + continue; + free(f_info->display); + free(f_info->img_path); + free(f_info->number); + free(f_info); + } + eina_list_free(list); +} + +static void favor_destroy_child_ug(void *data) +{ + ph_favorite_data *favor_d = data; + favor_d->child_ug = NULL; +} + +static void favor_ctxpopup_hide_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *icon; + Evas_Object *btn; + ph_favorite_data *favor_d = data; + btn = evas_object_data_get(obj, "expand_btn"); + icon = elm_object_part_content_get(btn, "icon"); + elm_icon_file_set(icon, CTUI_IMG_ICON_EXPAND_OPENED, NULL); + elm_object_part_content_set(btn, "icon", icon); + evas_object_del(favor_d->ctx_popup); + favor_d->ctx_popup = NULL; + +} + +static void favor_msg_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_favor_info *f_info; + ph_favorite_data *favor_d = data; + + f_info = evas_object_data_get(obj, "f_info"); + p_retm_if(NULL == f_info, "evas_object_data_get() return NULL"); + + favor_ctxpopup_hide_cb(favor_d, favor_d->ctx_popup, NULL); + + favor_d->child_ug = phone_launch_msg_composer_ug(favor_d->ug, f_info->number, 0, + favor_destroy_child_ug, favor_d); +} + +static void favor_call_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_favor_info *f_info; + ph_favorite_data *favor_d = data; + + f_info = evas_object_data_get(obj, "f_info"); + p_retm_if(NULL == f_info, "evas_object_data_get() return NULL"); + + favor_ctxpopup_hide_cb(favor_d, favor_d->ctx_popup, NULL); + phone_launch_voice_call(f_info->contact_id, f_info->number); +} + +static void favor_load_favor_list(ph_favorite_data *favor_d) +{ + p_retm_if(NULL == favor_d, "Parameter is null"); + + favor_free_data(favor_d->favor_list); + favor_d->favor_list = NULL; + favor_load_favorite_data(favor_d); +} + +static void favor_img_crop_result(ui_gadget_h ug, service_h service, void *data) +{ + PH_FN_CALL; + ph_favorite_data *favor_d = data; + + p_retm_if(NULL == ug || NULL == data, "ug or data is NULL"); + + if (service) { + char *normal = NULL; + char *full = NULL; + + service_get_extra_data(service, "crop_image_path", &normal); + p_retm_if(!normal, "return value is NULL.\n"); + contacts_svc_save_image(CTS_IMG_NORMAL, favor_d->selected_contact, (char *)normal); + + service_get_extra_data(service, "image_path", &full); + contacts_svc_save_image(CTS_IMG_FULL, favor_d->selected_contact, (char *)full); + PH_DBG("%s, %s", normal, full); + + free(normal); + free(full); + } + + ug_destroy(ug); + favor_d->child_ug = NULL; + ug_destroy_me(favor_d->ug); +} + +static void favor_popup_response_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_favorite_data *favor_d = data; + if (PH_UG_REQUEST_SET_WITH_RINGTONE == favor_d->ug_request) + ug_destroy_me(favor_d->ug); +} + +static void favor_value_list_popup_hide_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_favorite_data *favor_d; + Elm_Object_Item *item; + ph_favor_info *f_info; + + favor_d = evas_object_data_get(data, "favor_d"); + p_retm_if(NULL == favor_d, "evas_object_data_get() return NULL"); + + evas_object_del(favor_d->popup); + favor_d->popup = NULL; + + if (NULL!= obj) { + item = evas_object_data_get(data, "item"); + p_retm_if(NULL == item, "evas_object_data_get() return NULL"); + + f_info = elm_object_item_data_get(item); + p_retm_if(NULL == f_info, "elm_object_item_data_get() return NULL"); + + f_info->checked = EINA_FALSE; + favor_d->checked_cnt--; + elm_genlist_item_update(item); + } +} + +static void favor_del_response_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + ph_favor_info *f_info = data; + ph_favorite_data *favor_d; + favor_d = evas_object_data_get(obj, KEY_FAVOR_DATA); + + evas_object_del(favor_d->popup); + favor_d->popup = NULL; + + ret = contacts_svc_delete_favorite(f_info->id); + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_delete_favorite() Failed(%d)", ret); + phone_show_tickernoti(S_(PH_SYS_POP_FAILED)); + } + else + phone_show_tickernoti(S_(PH_SYS_POP_DELETED)); +} + +static void favor_delete_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_favorite_data *favor_d = data; + ph_favor_info *f_info; + Evas_Object *btn; + char buf[PH_TEXT_MAX_LEN] = {0}; + + f_info = evas_object_data_get(obj, "f_info"); + p_retm_if(NULL == f_info, "evas_object_data_get() return NULL"); + + favor_ctxpopup_hide_cb(favor_d, favor_d->ctx_popup, NULL); + + snprintf(buf, sizeof(buf), "%s?", S_(PH_SYS_SK_DELETE)); + btn = phone_create_confirm_popup(&favor_d->popup, favor_d->win, buf, favor_del_response_cb, f_info); + evas_object_data_set(btn, KEY_FAVOR_DATA, favor_d); +} + +static Evas_Object *favor_create_button(Evas_Object *box, char *fullpath, ph_favor_info *f_info) +{ + const int PH_FAVOR_BTN_WIDTH = 160; + const int PH_FAVOR_BTN_HEIGHT = 74; + const int PH_FAVOR_1BTN_WIDTH = 688; + Evas_Object *btn; + double scale; + scale = elm_scale_get(); + btn = phone_create_list_sweep_btn(box, fullpath); + p_retvm_if(NULL == btn, NULL, "phone_create_list_sweep_btn is failed"); + evas_object_data_set(btn, "f_info", f_info); + if (f_info->number) { + evas_object_size_hint_min_set(btn, (int)(PH_FAVOR_BTN_WIDTH*scale), (int)(PH_FAVOR_BTN_HEIGHT*scale)); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, 0.5); + } + else { + evas_object_size_hint_min_set(btn, (int)(PH_FAVOR_1BTN_WIDTH*scale), (int)(PH_FAVOR_BTN_HEIGHT*scale)); + evas_object_size_hint_align_set(btn, 0.5, 0.5); + } + evas_object_show(btn); + elm_box_pack_end(box, btn); + return btn; +} + +static Evas_Object *favor_create_popup_button(Evas_Object *parent, ph_favorite_data *favor_d, ph_favor_info *f_info) +{ + Evas_Object *btn1, *btn2, *btn3, *btn4; + Evas_Object *box; + + box = elm_box_add(parent); + elm_box_padding_set(box, 16, 0); + + if (f_info->number) { + elm_box_horizontal_set(box, EINA_TRUE); + btn1 = favor_create_button(box, PH_IMG_ICON_CALL, f_info); + evas_object_smart_callback_add(btn1, "clicked", favor_call_btn_cb, favor_d); + + btn2 = favor_create_button(box, PH_IMG_ICON_MESSAGE, f_info); + evas_object_smart_callback_add(btn2, "clicked", favor_msg_btn_cb, favor_d); + +#ifdef _CT_RCS + btn3 = favor_create_button(box, PH_IMG_ICON_CHAT_ON, f_info); + evas_object_smart_callback_add(btn3, "clicked", NULL, favor_d); + btn4 = favor_create_button(box, PH_IMG_ICON_FILETRANSFER, f_info); + evas_object_smart_callback_add(btn4, "clicked", NULL, favor_d); +#endif + + btn3 = favor_create_button(box, PH_IMG_ICON_VIDEOCALL, f_info); + elm_object_disabled_set(btn3, EINA_TRUE); + + btn4 = favor_create_button(box, PH_IMG_ICON_DELETE, f_info); + evas_object_smart_callback_add(btn4, "clicked", favor_delete_btn_cb, favor_d); + } + else { + btn4 = favor_create_button(box, PH_IMG_ICON_DELETE, f_info); + evas_object_smart_callback_add(btn4, "clicked", favor_delete_btn_cb, favor_d); + } + + return box; +} + +static void favor_expand_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + const char *file_icon; + const char *file_group; + const int PH_CTX_POPUP_HEIGHT = 112; + Evas_Object *ctx_popup; + Evas_Object *box; + Evas_Object *icon; + ph_favor_info *f_info; + ph_favorite_data *favor_d = data; + Ecore_X_Window win; + int win_width; + double scale; + + icon = elm_object_part_content_get(obj, "icon"); + + elm_icon_file_get(icon, &file_icon, &file_group); + p_retm_if(NULL == file_icon, "elm_icon_file_set() return NULL"); + + if (0 == strcmp(file_icon, CTUI_IMG_ICON_EXPAND_CLOSED)) { // OPENED + elm_icon_file_set(icon, CTUI_IMG_ICON_EXPAND_OPENED, NULL); + elm_object_part_content_set(obj, "icon", icon); + } + else { + win = ecore_x_window_root_get(ecore_x_window_focus_get()); + ecore_x_window_size_get(win, &win_width, NULL); + + scale = elm_scale_get(); + elm_icon_file_set(icon, CTUI_IMG_ICON_EXPAND_CLOSED, NULL); + elm_object_part_content_set(obj, "icon", icon); + + ctx_popup = elm_ctxpopup_add(favor_d->navi); + evas_object_size_hint_min_set(ctx_popup, win_width, (int)(PH_CTX_POPUP_HEIGHT*scale)); + elm_ctxpopup_horizontal_set(ctx_popup, EINA_TRUE); + evas_object_data_set(ctx_popup, "expand_btn", obj); + favor_d->ctx_popup = ctx_popup; + + elm_ctxpopup_direction_priority_set(ctx_popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT); + + evas_object_smart_callback_add(ctx_popup, "dismissed", favor_ctxpopup_hide_cb, favor_d); + + f_info = evas_object_data_get(obj, "f_info"); + p_retm_if(NULL == f_info, "evas_object_data_get() return NULL"); + + f_info->number = SAFE_STRDUP(favor_get_contact_number(f_info->contact_id)); + + box = favor_create_popup_button(favor_d->layout, favor_d, f_info); + evas_object_show(box); + elm_object_content_set(ctx_popup, box); + phone_move_ctxpopup(favor_d->ctx_popup, obj); + evas_object_show(ctx_popup); + } +} + + +static void favor_nums_popup_sel(void *data, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; + ph_favorite_data *favor_d = evas_object_data_get(obj, "favor_d"); + int contact_id = (int)evas_object_data_get(obj, "ct_id"); + + if (CT_UG_REQUEST_CHECK_FOR_NUMBER == favor_d->ug_request) { + Elm_Object_Item *item; + ph_favor_info *f_info; + + item = evas_object_data_get(obj, "item"); + p_retm_if(NULL == item, "evas_object_data_get() return NULL"); + + f_info = elm_object_item_data_get(item); + p_retm_if(NULL == f_info, "elm_object_item_data_get() return NULL"); + + f_info->id_ret = (int)data; + ph_favor_edit_set_selection_info(favor_d); + favor_value_list_popup_hide_cb(obj, NULL, NULL); + } + else if (PH_UG_REQUEST_LAUNCH_VOICECALL == favor_d->ug_request) { + char *num_info = (char *)elm_object_item_text_get(event_info); + char *number; + strtok(num_info, " "); + number = strtok(NULL, " "); + favor_value_list_popup_hide_cb(obj, NULL, NULL); + phone_launch_voice_call(contact_id, number); + } + else { + phone_ug_return_id(favor_d->ug, contact_id, (int)data, 0); + ug_destroy_me(favor_d->ug); + } +} + +static inline void favor_handle_select_email(ph_favorite_data *favor_d, int contact_id) +{ + GSList *list=NULL; + CTSstruct *contact = NULL; + int ret = contacts_svc_get_contact(contact_id, &contact); + p_retm_if(ret<CTS_SUCCESS, "contacts_svc_get_contact() Failed(%d)", ret); + + contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &list); + + if (list) { + if (1 == g_slist_length(list)) { + int email_id = contacts_svc_value_get_int(list->data, CTS_EMAIL_VAL_ID_INT); + phone_ug_return_id(favor_d->ug, contact_id, 0, email_id); + ug_destroy_me(favor_d->ug); + } + else + ph_favor_create_value_list_popup(CTS_VALUE_EMAIL, favor_d, contact_id, list); + } + else + phone_show_popup(favor_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_NO_EMAIL), 1.5); + contacts_svc_struct_free(contact); +} + +static void favor_emails_popup_sel(void *data, Evas_Object *obj, void *event_info) +{ + ph_favorite_data *favor_d = evas_object_data_get(obj, "favor_d"); + int contact_id = (int)evas_object_data_get(obj, "ct_id"); + + if (CT_UG_REQUEST_CHECK_FOR_EMAIL == favor_d->ug_request) { + Elm_Object_Item *item; + ph_favor_info *f_info; + + item = evas_object_data_get(obj, "item"); + p_retm_if(NULL == item, "evas_object_data_get() return NULL"); + + f_info = elm_object_item_data_get(item); + p_retm_if(NULL == f_info, "elm_object_item_data_get() return NULL"); + + f_info->id_ret = (int)data; + ph_favor_edit_set_selection_info(favor_d); + favor_value_list_popup_hide_cb(obj, NULL, NULL); + } + else { + phone_ug_return_id(favor_d->ug, contact_id, 0, (int)data); + ug_destroy_me(favor_d->ug); + } +} + +static inline void favor_handle_select_number(ph_favorite_data *favor_d, int contact_id) +{ + GSList *list=NULL; + CTSstruct *contact = NULL; + int ret = contacts_svc_get_contact(contact_id, &contact); + p_retm_if(ret<CTS_SUCCESS, "contacts_svc_get_contact() Failed(%d)", ret); + + contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &list); + + if (list) { + if (1 == g_slist_length(list)) { + if (PH_UG_REQUEST_LAUNCH_VOICECALL == favor_d->ug_request) + phone_launch_voice_call(contact_id, (void*)contacts_svc_value_get_str(list->data, CTS_NUM_VAL_NUMBER_STR)); + else { + int num_id = contacts_svc_value_get_int(list->data, CTS_NUM_VAL_ID_INT); + phone_ug_return_id(favor_d->ug, contact_id, num_id, 0); + ug_destroy_me(favor_d->ug); + } + } + else + ph_favor_create_value_list_popup(CTS_VALUE_NUMBER, favor_d, contact_id, list); + } + else + phone_show_popup(favor_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_NO_NUMBER), 1.5); + contacts_svc_struct_free(contact); +} + +Evas_Object* ph_favor_create_value_list_popup(int type, ph_favorite_data *favor_d, + int contact_id, GSList *values) +{ + Evas_Object *popup; + Evas_Object *list; + Evas_Object *btn; + + popup = elm_popup_add(favor_d->navi); + elm_object_style_set(popup, "min_liststyle"); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + if (CTS_VALUE_EMAIL == type) + list = ctui_list_create_values_list(type, popup, values, favor_emails_popup_sel); + else + list = ctui_list_create_values_list(type, popup, values, favor_nums_popup_sel); + + elm_object_content_set(popup, list); + evas_object_data_set(list, "favor_d", favor_d); + evas_object_data_set(list, "ct_id", (void *)contact_id); + + btn = elm_button_add(popup); + elm_object_text_set(btn, S_(PH_SYS_POP_CLOSE)); + elm_object_part_content_set(popup, "button1", btn); + elm_object_style_set(btn, "popup_button/default"); + evas_object_smart_callback_add(btn, "clicked", favor_value_list_popup_hide_cb, list); + + favor_d->popup = popup; + evas_object_show(popup); + return list; +} + +static void favor_destory_child_ug(ui_gadget_h ug, void *priv) +{ + ph_favorite_data *favor_d = priv; + p_retm_if(NULL == ug, "ug is NULL"); + ug_destroy(ug); + + p_retm_if(NULL == priv, "priv is NULL"); + favor_d->child_ug = NULL; +} + +static void favor_ug_check(ph_favorite_data *favor_d, int id) +{ + Evas_Object *popup; + ph_view_info *view_info; + struct ug_cbs cbs = {0}; + CTSvalue *value; + const char *err_msg; + int ret; + + switch (favor_d->ug_request) { + case PH_UG_REQUEST_SELECT: + phone_ug_return_id(favor_d->ug, id, 0, 0); + ug_destroy_me(favor_d->ug); + break; + case PH_UG_REQUEST_SELECT_EMAIL: + favor_handle_select_email(favor_d, id); + break; + case PH_UG_REQUEST_SELECT_NUMBER: + case PH_UG_REQUEST_LAUNCH_VOICECALL: + //FIXME : send selection info to caller + favor_handle_select_number(favor_d, id); + break; + case PH_UG_REQUEST_SET_WITH_NUM: + case PH_UG_REQUEST_SET_WITH_EMAIL: + case PH_UG_REQUEST_SET_WITH_WEB: + view_info = calloc(1, sizeof(ph_view_info)); + phone_set_view_info(view_info, favor_d->win, favor_d->navi, favor_d->ug, favor_d->ug_request, favor_d->ug_cnt_max, favor_d->ug_data); + ctui_list_update_with_data(view_info, favor_d, id,-1, -1); + free(view_info); + break; + case PH_UG_REQUEST_SET_WITH_IMG: + favor_d->selected_contact = id; + + cbs.result_cb = favor_img_crop_result; + cbs.destroy_cb = favor_destory_child_ug; + cbs.priv = favor_d; + favor_d->child_ug = phone_image_crop_ug(favor_d->ug, favor_d->ug_data, &cbs); + break; + case PH_UG_REQUEST_SET_WITH_RINGTONE: + value = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO); + + err_msg = S_(CT_SYS_POP_SUCCESS); + if (value) { + contacts_svc_value_set_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR, favor_d->ug_data); + ret = contacts_svc_put_contact_value(CTS_PUT_VAL_REPLACE_RINGTONE, id, value); + contacts_svc_value_free(value); + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_put_contact_value() Failed(%d)", ret); + if (CTS_ERR_DB_LOCK == ret) + err_msg = T_(CT_GET_TEXT_ERR, CTTEXT_ERR_DB_LOCKED); + else if (CTS_ERR_NO_SPACE == ret) + err_msg = S_(CT_SYS_POP_NOT_ENOUGH_MEMORY); + else + err_msg = S_(PH_SYS_POP_FAILED); + } + } + else + err_msg = S_(PH_SYS_POP_FAILED); + + popup = phone_show_popup(favor_d->navi, err_msg, 1.5); + evas_object_smart_callback_add(popup, "timeout", favor_popup_response_cb, favor_d); + break; + default: + ctui_create_detail_view_from_phone(favor_d->win, favor_d->navi, favor_d->ug, id); + break; + } + +} + +static void favor_mf_item_sel(void *data, Evas_Object* obj, void *event_info) +{ + ct_contact_list *item_data; + ph_favorite_data *favor_d = data; + Elm_Object_Item *item = event_info; + + elm_gengrid_item_selected_set(item, EINA_FALSE); + + item_data = elm_object_item_data_get(item); + p_retm_if(NULL == item_data, "elm_object_item_data_get() return NULL"); + + if (PH_FAVOR_MODE_EDIT != favor_d->list_mode) + favor_ug_check(favor_d, item_data->id); +} + +static void favor_item_sel(void *data, Evas_Object *obj, void *event_info) +{ + ph_favor_info *f_info; + ph_favorite_data *favor_d = data; + Elm_Object_Item *item = event_info; + + elm_gengrid_item_selected_set(item, EINA_FALSE); + + f_info = elm_object_item_data_get(item); + p_retm_if(NULL == f_info, "elm_object_item_data_get() return NULL"); + + if (PH_FAVOR_MODE_EDIT != favor_d->list_mode) + favor_ug_check(favor_d, f_info->contact_id); +} + +#define N 20 + +static Eina_Bool favor_append_item_part(void *data) +{ + int count; + Eina_List *l; + ph_favor_info *fd; + ph_favorite_data *favor_d = data; + + count = 0; + l = eina_list_nth_list(favor_d->favor_list, favor_d->readed_n); + EINA_LIST_FOREACH(l, l, fd) { + if (N == count) break; + if (!fd) continue; + if (fd->img_path) + fd->item = elm_gengrid_item_append(favor_d->favor_gengrid, &grid_itc_favor, fd, favor_item_sel, favor_d); + else + fd->item = elm_gengrid_item_append(favor_d->favor_gengrid, &grid_itc_favor_no_id, fd, favor_item_sel, favor_d); + count ++; + } + if (N <= count) { + favor_d->readed_n += N; + return ECORE_CALLBACK_RENEW; + } + else { + favor_d->list_idler = NULL; + return ECORE_CALLBACK_CANCEL; + } +} + +static void favor_fill_favor_gengrid(ph_favorite_data *favor_d) +{ + int count; + Eina_List *l; + ph_favor_info *f_info; + p_retm_if(NULL == favor_d->favor_gengrid, "Parameter is null"); + + if (favor_d->list_idler) { + ecore_idler_del(favor_d->list_idler); + favor_d->list_idler = NULL; + } + + favor_d->readed_n = 0; + count = 0; + EINA_LIST_FOREACH(favor_d->favor_list, l, f_info) { + if (N == count) break; + if (!f_info) continue; + if (f_info->img_path) + f_info->item = elm_gengrid_item_append(favor_d->favor_gengrid, &grid_itc_favor, f_info, favor_item_sel, favor_d); + else + f_info->item = elm_gengrid_item_append(favor_d->favor_gengrid, &grid_itc_favor_no_id, f_info, favor_item_sel, favor_d); + count++; + } + + if (N == count) { + favor_d->readed_n = N; + favor_d->list_idler = ecore_idler_add(favor_append_item_part, favor_d); + } +} + +static void favor_fill_mf_gengrid(ph_favorite_data *favor_d) +{ + PH_FN_CALL; + Eina_List *l; + ct_contact_list *mf_info; + p_retm_if(NULL == favor_d->mf_gengrid, "Parameter is null"); + + EINA_LIST_FOREACH(favor_d->mf_list, l, mf_info) { + if (!mf_info) continue; + mf_info->item = elm_gengrid_item_append(favor_d->mf_gengrid, &grid_itc_mf, mf_info, favor_mf_item_sel, favor_d); + } +} + +void ph_favor_update_button_status(ph_favorite_data *favor_d) +{ + p_retm_if(NULL == favor_d || NULL == favor_d->navi_btn, "Navi button is null"); + + if (favor_d->checked_cnt == 0 && PH_FAVOR_MODE_EDIT == favor_d->list_mode) + elm_object_item_disabled_set(favor_d->navi_btn, EINA_TRUE); + else if (favor_d->mf_list_count == 0 && favor_d->favor_list_count == 0) + elm_object_item_disabled_set(favor_d->navi_btn, EINA_TRUE); + else + elm_object_item_disabled_set(favor_d->navi_btn, EINA_FALSE); +} + +static char *favor_label_get(void *data, Evas_Object *obj, const char *part) +{ + ph_favor_info * f_info = data; + char buf[PATH_MAX]; + + if (0 == strcmp(part, "elm.text")) { + if (f_info->display && *f_info->display) + snprintf(buf, sizeof(buf), "%s", f_info->display); + else { + if (!f_info->number_loaded) { + f_info->number = SAFE_STRDUP(favor_get_contact_number(f_info->contact_id)); + f_info->number_loaded = true; + } + + if (!f_info->number || !*f_info->number) + return strdup(S_(PH_SYS_BODY_NONAME)); + else + snprintf(buf, sizeof(buf), "%s", f_info->number); + } + return strdup(buf); + } + return NULL; +} + +static char *favor_mf_label_get(void *data, Evas_Object *obj, const char *part) +{ + char buf[PATH_MAX]; + ct_contact_list * mf_info = data; + + if (0 == strcmp(part, "elm.text")) { + if (mf_info->display && *mf_info->display) + snprintf(buf, sizeof(buf), "%s", mf_info->display); + else { + if (!mf_info->number_loaded) { + mf_info->number = SAFE_STRDUP(favor_get_contact_number(mf_info->id)); + mf_info->number_loaded = true; + } + + if (!mf_info->number || !*mf_info->number) + return strdup(S_(PH_SYS_BODY_NONAME)); + else + snprintf(buf, sizeof(buf), "%s", mf_info->number); + } + return strdup(buf); + } + return NULL; +} + +static Evas_Object *favor_icon_get(void *data, Evas_Object *obj, const char *part) +{ + ph_favor_info * f_info = data; + ph_favorite_data *favor_d = evas_object_data_get(obj, KEY_FAVOR_DATA); + if (0 == strcmp(part, "elm.swallow.icon")) { + Evas_Object *ic; + char buf[PATH_MAX]={0}; + if (f_info->img_path) { + snprintf(buf, sizeof(buf), "%s", f_info->img_path); + + ic = elm_icon_add(obj); + p_retvm_if(NULL == ic, NULL, "elm_icon_add is failed"); + + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + return ic; + } + } + else if (0 == strcmp(part, "elm.swallow.expand.icon") && favor_d->list_mode == PH_FAVOR_MODE_DEFAULT) { + Evas_Object *exp_icon; + Evas_Object *btn; + btn = elm_button_add(obj); + exp_icon = elm_icon_add(btn); + elm_icon_file_set(exp_icon, CTUI_IMG_ICON_EXPAND_OPENED, NULL); + elm_object_part_content_set(btn, "icon", exp_icon); + evas_object_propagate_events_set(btn , EINA_FALSE); + evas_object_color_set(btn, 255, 255, 255, 100); + evas_object_data_set(btn, "f_info", f_info); + evas_object_smart_callback_add(btn, "clicked", favor_expand_btn_clicked_cb, favor_d); + evas_object_show(btn); + return btn; + } + else if (0 == strcmp(part, "elm.swallow.end") && favor_d->list_mode == PH_FAVOR_MODE_EDIT) { + Evas_Object *check; + check = elm_check_add(obj); + elm_object_style_set(check, "grid"); + elm_check_state_pointer_set(check, &(f_info->checked)); + evas_object_data_set(check, KEY_FAVOR_DATA, favor_d); + evas_object_smart_callback_add(check, "changed", ph_favor_edit_check_changed_cb, f_info); + return check; + } + return NULL; +} + +static Evas_Object *favor_mf_icon_get(void *data, Evas_Object *obj, const char *part) +{ + ct_contact_list * mf_info = data; + ph_favorite_data *favor_d = evas_object_data_get(obj, KEY_FAVOR_DATA); + if (0 == strcmp(part, "elm.swallow.icon")) { + Evas_Object *ic; + char buf[PATH_MAX]; + + if (!mf_info->img_path || !*mf_info->img_path) + mf_info->img_path = SAFE_STRDUP(CTUI_IMG_DEFAULT_PHOTO_SMALL); + + snprintf(buf, sizeof(buf), "%s", mf_info->img_path); + ic = elm_icon_add(obj); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + return ic; + } + else if (0 == strcmp(part, "elm.swallow.end") && favor_d->list_mode == PH_FAVOR_MODE_EDIT) { + Evas_Object *check = elm_check_add(obj); + elm_object_style_set(check, "grid"); + elm_check_state_pointer_set(check, &(mf_info->checked)); + evas_object_data_set(check, KEY_FAVOR_DATA, favor_d); + evas_object_smart_callback_add(check, "changed", ph_frequent_edit_check_changed_cb, mf_info); + return check; + } + return NULL; +} + +static void favor_grid_longpress(void *data, Evas_Object *obj, void *event_info) +{ + ph_favorite_data *favor_d = data; + favor_d->longpressed = (PH_FAVOR_MODE_EDIT == favor_d->list_mode ? EINA_TRUE : EINA_FALSE); +} + +static void favor_grid_move(void *data, Evas_Object *obj, void *event_info) +{ + int ori_favor_id = -1; + int front_favor_id = -1; + int back_favor_id = -1; + ph_favor_info *f_info; + Elm_Object_Item *prev_item; + Elm_Object_Item *next_item; + Elm_Object_Item *it = event_info; + + f_info = elm_object_item_data_get(it); + p_retm_if(NULL == f_info, "elm_object_item_data_get() return NULL"); + ori_favor_id = f_info->id; + + prev_item = elm_gengrid_item_prev_get(it); + if (prev_item) { + f_info = elm_object_item_data_get(prev_item); + if (f_info) + front_favor_id = f_info->id; + } + + next_item = elm_gengrid_item_next_get(it); + if (next_item) { + f_info = elm_object_item_data_get(next_item); + if (f_info) + back_favor_id = f_info->id; + } + + p_ret_if(-1 == back_favor_id && -1 == front_favor_id); + if (-1 == back_favor_id) + back_favor_id = 0; + if (-1 == front_favor_id) + front_favor_id = 0; + + PH_DBG("ori %d front %d back %d ", ori_favor_id, front_favor_id, back_favor_id); + + if (-1 != ori_favor_id && -1 != front_favor_id && -1 != back_favor_id) + contacts_svc_favorite_order(ori_favor_id, front_favor_id, back_favor_id); +} + +static void favor_edit_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_favorite_data *favor_d = data; + p_retm_if(NULL == favor_d, "parameter(favor_d) is NULL"); + + phone_favor_edit_mode_start(favor_d); +} + +static void favor_done_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + int i = 0; + int *result_list; + Eina_List *l; + ph_favor_info *f_info; + ph_favorite_data *favor_d = data; + p_retm_if(NULL == favor_d, "parameter(favor_d) is NULL"); + + result_list = calloc(favor_d->checked_cnt, sizeof(int)); + EINA_LIST_FOREACH(favor_d->favor_list, l, f_info) { + if (NULL == f_info || !f_info->checked) continue; + + if (PH_UG_REQUEST_CHECK_FOR_NUMBER == favor_d->ug_request) + result_list[i++] = f_info->id_ret; + else if (PH_UG_REQUEST_CHECK_FOR_EMAIL == favor_d->ug_request) + result_list[i++] = f_info->id_ret; + else + result_list[i++] = f_info->contact_id; + } + + if (PH_UG_REQUEST_CHECK_FOR_NUMBER == favor_d->ug_request) + phone_list_ug_return_ids(favor_d->ug, result_list, favor_d->checked_cnt, CT_UG_BUNDLE_RESULT_NUMBER_ID_LIST); + else if (PH_UG_REQUEST_CHECK_FOR_EMAIL == favor_d->ug_request) + phone_list_ug_return_ids(favor_d->ug, result_list, favor_d->checked_cnt, CT_UG_BUNDLE_RESULT_EMAIL_ID_LIST); + else + phone_list_ug_return_ids(favor_d->ug, result_list, favor_d->checked_cnt, CT_UG_BUNDLE_RESULT_CONTACT_ID_LIST); + + free(result_list); + ug_destroy_me(favor_d->ug); +} + +static Eina_List * favor_get_contact(Eina_List *favor_list) +{ + CTSiter *iter; + int ct_id; + Eina_List *result = NULL; + Eina_List *cursor; + ph_favor_info *f_info; + ct_contact_list *info; + CTSvalue *value; + int is_exist = false; + int ret = CTS_SUCCESS; + + ret = contacts_svc_get_list(CTS_LIST_ALL_CONTACT, &iter); + p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_get_list...() Failed(%d)", ret); + + while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { + is_exist = false; + + value = contacts_svc_iter_get_info(iter); + ct_id = contacts_svc_value_get_int(value, CTS_LIST_CONTACT_ID_INT); + + EINA_LIST_FOREACH(favor_list, cursor, f_info) { + if (!f_info) + continue; + if (f_info->contact_id == ct_id) { + is_exist = true; + break; + } + } + if (false == is_exist) { + info = calloc(1, sizeof(ct_contact_list)); + if (NULL == info) { + ERR("calloc() return NULL"); + contacts_svc_value_free(value); + break; + } + info->id = ct_id; + info->display = ct_list_get_display_name(value); + info->normalize = contacts_svc_value_steal_str(value, CTS_LIST_CONTACT_NORMALIZED_STR); + info->id_ab = contacts_svc_value_get_int(value, CTS_LIST_CONTACT_ADDRESSBOOK_ID_INT); + info->id_person = contacts_svc_value_get_int(value, CTS_LIST_CONTACT_PERSON_ID_INT); + result = eina_list_append(result, info); + } + contacts_svc_value_free(value); + } + contacts_svc_iter_remove(iter); + return result; +} + +static void favor_add_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_favorite_data *favor_d = data; + Eina_List *ct_list; + evas_object_data_set(favor_d->navi, "navi_it_pop_to", favor_d->navi_item); + ct_list = favor_get_contact(favor_d->favor_list); + ctui_create_favorite_list_select_view(favor_d->win, favor_d->navi, ct_list); +} + +void ph_favor_load_mf_list(void *data) +{ + int ret= 0; + int count = 0; + CTSiter *iter; + Eina_List *list = NULL; + ph_favorite_data *favor_d = data; + + ctui_list_free_contacts(favor_d->mf_list); + favor_d->mf_list = NULL; + favor_d->mf_list_count = 0; + + ret = contacts_svc_get_list(CTS_LIST_OFTEN_USED_CONTACT, &iter); + p_retm_if(CTS_SUCCESS != ret, "contacts_svc_get_list...() Failed(%d)", ret); + + while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { + CTSvalue *info; + ct_contact_list *item_data; + + if (4 <= count) + break; + + info = contacts_svc_iter_get_info(iter); + item_data = calloc(1, sizeof(ct_contact_list)); + if (NULL == item_data) { + ERR("calloc() return NULL"); + break; + } + + item_data->display = ct_list_get_display_name(info); + item_data->id = contacts_svc_value_get_int(info, CTS_LIST_CONTACT_ID_INT); + item_data->id_person = ctui_get_person_id(item_data->id); + item_data->img_path = contacts_svc_value_steal_str(info, CTS_LIST_CONTACT_IMG_PATH_STR); + list = eina_list_append(list, (void*)item_data); + count ++; + + contacts_svc_value_free(info); + } + contacts_svc_iter_remove(iter); + favor_d->mf_list = list; + favor_d->mf_list_count = count; +} + +static void favor_create_most_frequent(ph_favorite_data *favor_d) +{ + PH_FN_CALL; + Evas_Object *gengrid; + Evas_Object *layout; + double scale; + int wx; + int hy; + + layout = elm_layout_add(favor_d->layout); + gengrid = elm_gengrid_add(layout); + evas_object_size_hint_weight_set(gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gengrid, EVAS_HINT_FILL, EVAS_HINT_FILL); + + elm_layout_file_set(layout, FAVORITES_EDJ, "most_frequent"); + elm_object_part_text_set(layout, "most_frequent/title", T_(CT_GET_TEXT_BASIC, CTTEXT_MOST_FREQUENT_CONTACTS)); + elm_object_part_content_set(layout, "most_frequent/layout", gengrid); + + scale = elm_config_scale_get(); + wx = (int)(162*scale); + hy = (int)(234*scale); + elm_gengrid_item_size_set(gengrid, wx, hy); + elm_gengrid_align_set(gengrid, 0.0, 0.0); + elm_gengrid_horizontal_set(gengrid, EINA_TRUE); + elm_gengrid_multi_select_set(gengrid, EINA_TRUE); + + favor_d->mf_layout = layout; + favor_d->mf_gengrid = gengrid; + evas_object_data_set(gengrid, KEY_FAVOR_DATA, favor_d); + evas_object_show(favor_d->mf_gengrid); +} + +static void favor_create_favorite(ph_favorite_data *favor_d) +{ + PH_FN_CALL; + Evas_Object *layout; + Evas_Object *gengrid; + int wx = 0; + int hy = 0; + layout = elm_layout_add(favor_d->layout); + + gengrid = elm_gengrid_add(layout); + elm_object_theme_set(gengrid, favor_d->th); + evas_object_size_hint_weight_set(gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gengrid, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ecore_x_window_size_get(ecore_x_window_root_get(ecore_x_window_focus_get()), &wx, &hy); + + elm_gengrid_item_size_set(gengrid, wx/3, wx/3); + elm_gengrid_align_set(gengrid, 0.0, 0.0); + elm_gengrid_horizontal_set(gengrid, EINA_FALSE); + elm_gengrid_multi_select_set(gengrid, EINA_TRUE); + + evas_object_smart_callback_add(gengrid, "moved", favor_grid_move, favor_d); + evas_object_smart_callback_add(gengrid, "longpressed", favor_grid_longpress, favor_d); + + favor_d->favor_gengrid = gengrid; + evas_object_data_set(gengrid, KEY_FAVOR_DATA, favor_d); + evas_object_show(favor_d->favor_gengrid); +} + +void ph_favor_mf_fill_layout(ph_favorite_data *favor_d) +{ + if (0 < favor_d->mf_list_count) { + if (NULL == favor_d->mf_gengrid) + favor_create_most_frequent(favor_d); + else + elm_gengrid_clear(favor_d->mf_gengrid); + favor_fill_mf_gengrid(favor_d); + edje_object_signal_emit(_EDJ(favor_d->layout), "favorites/exist_mf", "favorites"); + elm_object_part_text_set(favor_d->layout, "layout/favorites/title", T_(PH_GET_TEXT_BASIC, PHTEXT_FAVORITES)); + elm_object_part_content_set(favor_d->layout, "layout/most_frequent", favor_d->mf_layout); + } + else { + edje_object_signal_emit(_EDJ(favor_d->layout), "favorites/no_mf", "favorites"); + evas_object_del(favor_d->mf_layout); + favor_d->mf_layout = NULL; + favor_d->mf_gengrid = NULL; + } +} + +static void favor_fill_layout(ph_favorite_data *favor_d) +{ + Evas_Object *noc; + + if (favor_d->ctx_popup) { + evas_object_del(favor_d->ctx_popup); + favor_d->ctx_popup = NULL; + } + + if (0 < favor_d->favor_list_count) { + if (NULL == favor_d->favor_gengrid) + favor_create_favorite(favor_d); + else + elm_gengrid_clear(favor_d->favor_gengrid); + favor_fill_favor_gengrid(favor_d); + elm_object_part_content_set(favor_d->layout, "layout/favorites", favor_d->favor_gengrid); + } + else { + noc = phone_create_nocontents(favor_d->layout, T_(PH_GET_TEXT_BASIC, PHTEXT_NO_FAVORITES)); + p_retm_if(NULL == noc, "phone_create_nocontents() return NULL"); + elm_object_part_content_set(favor_d->layout, "layout/favorites", noc); + favor_d->favor_gengrid = NULL; + } +} + +static Eina_Bool favor_data_changed_cb(void *data) +{ + ph_favorite_data *favor_d = data; + p_retvm_if(NULL == favor_d, ECORE_CALLBACK_CANCEL, "favor_d is null"); + + if (favor_d->update_timer_favor) { + ecore_timer_del(favor_d->update_timer_favor); + favor_d->update_timer_favor = NULL; + } + + favor_load_favor_list(favor_d); + favor_fill_layout(favor_d); + ph_favor_update_button_status(favor_d); + + return ECORE_CALLBACK_CANCEL; +} + +static void favor_data_lazy_update(void *data) +{ + PH_FN_CALL; + ph_favorite_data *favor_d = data; + + if (favor_d->update_timer_favor) { + ecore_timer_del(favor_d->update_timer_favor); + favor_d->update_timer_favor = NULL; + } + + PH_DBG("favor_d->is_background=%d",favor_d->is_background); + + if (favor_d->is_background) + favor_d->update_timer_favor = ecore_timer_add(3.0, favor_data_changed_cb, favor_d); + else + favor_data_changed_cb(favor_d); +} + + +static Eina_Bool favor_log_data_changed_cb(void *data) +{ + ph_favorite_data *favor_d = data; + p_retvm_if(NULL == favor_d, ECORE_CALLBACK_CANCEL, "favor_d is null"); + + if (favor_d->update_timer_log) { + ecore_timer_del(favor_d->update_timer_log); + favor_d->update_timer_log = NULL; + } + + ph_favor_load_mf_list(favor_d); + ph_favor_mf_fill_layout(favor_d); + ph_favor_update_button_status(favor_d); + + return ECORE_CALLBACK_CANCEL; +} + +static void favor_log_data_lazy_update(void *data) +{ + PH_FN_CALL; + ph_favorite_data *favor_d = data; + + if (favor_d->update_timer_log) { + ecore_timer_del(favor_d->update_timer_log); + favor_d->update_timer_log = NULL; + } + + PH_DBG("favor_d->is_background=%d",favor_d->is_background); + + if (favor_d->is_background) + favor_d->update_timer_log = ecore_timer_add(3.0, favor_log_data_changed_cb, favor_d); + else + favor_log_data_changed_cb(favor_d); +} + +static ph_favor_info* favor_find_info_by_contact_id (ph_favorite_data *favor_d, int contact_id) +{ + ph_favor_info *f_info; + Eina_List *l; + EINA_LIST_FOREACH(favor_d->favor_list, l, f_info) { + if (!f_info) continue; + if (f_info->contact_id == contact_id) + return f_info; + } + return NULL; +} + +static ct_contact_list* favor_find_mf_info_by_contact_id (ph_favorite_data *favor_d, int contact_id) +{ + ct_contact_list *mf_info; + Eina_List *l; + EINA_LIST_FOREACH(favor_d->mf_list, l, mf_info) { + if (!mf_info) continue; + if (mf_info->id == contact_id) + return mf_info; + } + return NULL; +} + +static int favor_set_updated_data(ph_favorite_data *favor_d, int ab_id) +{ + CTSiter *iter; + int contact_id; + int ret; + + ret = contacts_svc_get_updated_contacts(ab_id, favor_d->version, &iter); + if (CTS_SUCCESS != ret) { + if (CTS_ERR_DB_RECORD_NOT_FOUND == ret) + return TRUE; + ERR("contacts_svc_get_updated_contacts is failed(%d)", ret); + return FALSE; + } + + while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { + CTSvalue *value = NULL; + CTSvalue *row_info = NULL; + CTSstruct *contact = NULL; + ph_favor_info *f_info; + ct_contact_list *mf_info; + int type; + int ver; + + row_info = contacts_svc_iter_get_info(iter); + contact_id = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_ID_INT); + type = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_TYPE_INT); + ver = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_VER_INT); + if (favor_d->version < ver) + favor_d->version = ver; + + switch (type) { + case CTS_OPERATION_UPDATED : + contacts_svc_get_contact(contact_id, &contact); + mf_info = favor_find_mf_info_by_contact_id(favor_d, contact_id); + if (mf_info) + favor_d->is_mf_changed = true; + + f_info = favor_find_info_by_contact_id(favor_d, contact_id); + if (f_info) { + ret = contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &value); + if (ret < CTS_SUCCESS) { + ERR("contacts_svc_struct_get_value is failed"); + contacts_svc_struct_free(contact); + break; + } + else { + free(f_info->display); + f_info->display = phone_get_display_name_from_value(value, CTS_NAME_VAL_DISPLAY_STR, + CTS_NAME_VAL_FIRST_STR, CTS_NAME_VAL_LAST_STR); + f_info->number_loaded = false; + free(f_info->number); + f_info->number = NULL; + free(f_info->img_path); + ret = contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &value); + if (ret < CTS_SUCCESS) { + ERR("contacts_svc_struct_get_value is failed"); + contacts_svc_struct_free(contact); + f_info->img_path = NULL; + break; + } + f_info->img_path = contacts_svc_value_steal_str(value, CTS_BASE_VAL_IMG_PATH_STR); + } + + if (f_info->img_path && *f_info->img_path) + elm_gengrid_item_item_class_update(f_info->item, &grid_itc_favor); + else + elm_gengrid_item_item_class_update(f_info->item, &grid_itc_favor_no_id); + } + contacts_svc_struct_free(contact); + break; + case CTS_OPERATION_DELETED : + mf_info = favor_find_mf_info_by_contact_id(favor_d, contact_id); + if (mf_info) + favor_d->is_mf_changed = true; + + f_info = favor_find_info_by_contact_id(favor_d, contact_id); + if (f_info) { + favor_d->favor_list = eina_list_remove(favor_d->favor_list, f_info); + favor_d->favor_list_count--; + elm_object_item_del(f_info->item); + free(f_info->display); + free(f_info->img_path); + free(f_info->number); + free(f_info); + } + break; + case CTS_OPERATION_INSERTED : + default : + break; + } + contacts_svc_value_free(row_info); + } + contacts_svc_iter_remove(iter); + return TRUE; +} + +static Eina_Bool favor_contact_data_changed_cb(void *data) +{ + PH_FN_CALL; + ph_favorite_data *favor_d = data; + CTSiter *ab_iter; + int ab_id; + int ret; + p_retvm_if(NULL == favor_d, ECORE_CALLBACK_CANCEL, "favor_d is null"); + + favor_d->is_mf_changed = false; + + if (favor_d->update_timer_contact) { + ecore_timer_del(favor_d->update_timer_contact); + favor_d->update_timer_contact = NULL; + } + + ret = favor_set_updated_data(favor_d, 0); + if (!ret) { + ERR("favor_set_updated_data is failed(%d)", ret); + return ECORE_CALLBACK_CANCEL; + } + + ret = contacts_svc_get_list(CTS_LIST_ALL_ADDRESSBOOK, &ab_iter); + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_get_list is failed(%d)", ret); + return ECORE_CALLBACK_CANCEL; + } + + while (CTS_SUCCESS == contacts_svc_iter_next(ab_iter)) { + CTSvalue *info; + info = contacts_svc_iter_get_info(ab_iter); + ab_id = contacts_svc_value_get_int(info, CTS_LIST_ADDRESSBOOK_ID_INT); + ret = favor_set_updated_data(favor_d, ab_id); + if (!ret) { + ERR("favor_set_updated_data is failed"); + contacts_svc_iter_remove(ab_iter); + break; + } + } + contacts_svc_iter_remove(ab_iter); + + if (favor_d->is_mf_changed) + ph_favor_load_mf_list(favor_d); + + if (favor_d->favor_list_count <= 0 || favor_d->is_mf_changed) { + ph_favor_mf_fill_layout(favor_d); + favor_fill_layout(favor_d); + } + + ph_favor_update_button_status(favor_d); + return ECORE_CALLBACK_CANCEL; + PH_FN_END; +} + +static void favor_contact_data_lazy_update(void *data) +{ + PH_FN_CALL; + ph_favorite_data *favor_d = data; + + if (favor_d->update_timer_contact) { + ecore_timer_del(favor_d->update_timer_contact); + favor_d->update_timer_contact = NULL; + } + + PH_DBG("favor_d->is_background=%d",favor_d->is_background); + + if (favor_d->is_background) + favor_d->update_timer_contact = ecore_timer_add(3.0, favor_contact_data_changed_cb, favor_d); + else + favor_contact_data_changed_cb(favor_d); +} + + +static void favor_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + ph_favorite_data *favor_d = data; + int ret; + p_retm_if(NULL == favor_d, "favor_d is null"); + + if (favor_d->p_info) { + favor_d->p_info->alive = false; + pthread_join(favor_d->p_info->thread, NULL); + ret = contacts_svc_end_trans(false); + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); + ecore_timer_del(favor_d->p_info->timer); + free(favor_d->p_info); + } + contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_CONTACT_CHANGE, + favor_contact_data_lazy_update, favor_d); + contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_FAVORITE_CHANGE, + favor_data_lazy_update, favor_d); + contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_PLOG_CHANGE, + favor_log_data_lazy_update, favor_d); + + if (favor_d->th) { + elm_theme_extension_del(favor_d->th, FAVORITES_THEME_EDJ); + elm_theme_free(favor_d->th); + } + + if (favor_d->favor_list) + favor_free_data(favor_d->favor_list); + + if (favor_d->mf_list) + ctui_list_free_contacts(favor_d->mf_list); + + if (favor_d->popup) + evas_object_del(favor_d->popup); + + if (favor_d->update_timer_contact) + ecore_timer_del(favor_d->update_timer_contact); + + if (favor_d->update_timer_log) + ecore_timer_del(favor_d->update_timer_log); + + if (favor_d->update_timer_favor) + ecore_timer_del(favor_d->update_timer_favor); + + free(favor_d); +} + +static void favor_set_gengrid_item_style() +{ + grid_itc_favor.item_style = "gridtext_favorites"; + grid_itc_favor.func.text_get = favor_label_get; + grid_itc_favor.func.content_get = favor_icon_get; + grid_itc_favor.func.state_get = NULL; + grid_itc_favor.func.del = NULL; + + grid_itc_favor_no_id.item_style = "gridtext_favorites_no_id"; + grid_itc_favor_no_id.func.text_get = favor_label_get; + grid_itc_favor_no_id.func.content_get = favor_icon_get; + grid_itc_favor_no_id.func.state_get = NULL; + grid_itc_favor_no_id.func.del = NULL; + + grid_itc_mf.item_style = "default_gridtext"; + grid_itc_mf.func.text_get = favor_mf_label_get; + grid_itc_mf.func.content_get = favor_mf_icon_get; + grid_itc_mf.func.state_get = NULL; + grid_itc_mf.func.del = NULL; +} + +static int favor_create_layout(ph_favorite_data *favor_d, Evas_Object *parent) +{ + PH_FN_CALL; + Evas_Object *layout; + + favor_d->navi = parent; + layout = phone_create_base_layout(favor_d->navi, false); + p_retvm_if(NULL == layout, -1, "phone_create_base_layout is failed"); + + favor_d->layout = elm_layout_add(layout); + p_retvm_if(NULL == favor_d->layout, -1, "phone_create_base_layout is failed"); + elm_object_part_content_set(layout, "elm.swallow.content", favor_d->layout); + elm_layout_file_set(favor_d->layout, FAVORITES_EDJ, "layout"); + + favor_set_gengrid_item_style(); + ph_favor_load_mf_list(favor_d); + favor_load_favor_list(favor_d); + ph_favor_mf_fill_layout(favor_d); + favor_fill_layout(favor_d); + + evas_object_event_callback_add(favor_d->layout, EVAS_CALLBACK_DEL, + favor_view_delete_cb, favor_d); + + contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE, + favor_contact_data_lazy_update, favor_d); + contacts_svc_subscribe_change(CTS_SUBSCRIBE_FAVORITE_CHANGE, + favor_data_lazy_update, favor_d); + contacts_svc_subscribe_change(CTS_SUBSCRIBE_PLOG_CHANGE, + favor_log_data_lazy_update, favor_d); + + return 0; +} + +API void phone_favor_set_navi(Evas_Object *layout, int mode) +{ + PH_FN_CALL; + ph_favorite_data *favor_d = evas_object_data_get(layout, KEY_FAVOR_DATA); + Elm_Object_Item *navi_it; + Evas_Object *toolbar; + Evas_Object *l_btn; + + p_retm_if(NULL == favor_d, "favor data is NULL"); + navi_it = elm_naviframe_bottom_item_get(favor_d->navi); + p_retm_if(NULL == navi_it, "navi item is NULL"); + toolbar = elm_object_item_part_content_get(navi_it, "controlbar"); + if (toolbar) + phone_cbar_item_clear(toolbar); + else { + toolbar = elm_toolbar_add(favor_d->navi); + elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND); + elm_object_item_part_content_set(navi_it, "controlbar", toolbar); + } + + if (favor_d->ug) { + if (mode == PH_FAVOR_MODE_EDIT) { + favor_d->navi_btn = elm_toolbar_item_append(toolbar, PH_IMG_ICON_DONE, NULL, favor_done_btn_cb, favor_d); + phone_toolbar_disabled_item_append(toolbar, 3); + } + l_btn = phone_create_navi_btn(favor_d->navi, S_(PH_SYS_SK_CANCEL)); + evas_object_smart_callback_add(l_btn, "clicked", phone_ug_destroy_me_cb, favor_d->ug); + elm_object_item_part_content_set(favor_d->navi_item, "prev_btn", l_btn); + } + else { + if (mode == PH_FAVOR_MODE_DEFAULT) { + elm_toolbar_item_append(toolbar, CTUI_IMG_ICON_ADD_FAVORITE, NULL, favor_add_btn_cb, favor_d); + phone_toolbar_disabled_item_append(toolbar, 1); + favor_d->navi_btn = elm_toolbar_item_append(toolbar, PH_IMG_ICON_EDIT, NULL, favor_edit_btn_cb, favor_d); + phone_toolbar_disabled_item_append(toolbar, 1); + + l_btn = elm_button_add(favor_d->navi); + evas_object_smart_callback_add(l_btn, "clicked", phone_back_btn_clicked_cb, favor_d->win); + elm_object_style_set(l_btn, "naviframe/back_btn/default"); + elm_object_item_part_content_set(favor_d->navi_item, "prev_btn", l_btn); + } + else { // edit mode + favor_d->navi_btn = elm_toolbar_item_append(toolbar, PH_IMG_ICON_DELETE, NULL, ph_favor_edit_del_btn_cb, favor_d); + phone_toolbar_disabled_item_append(toolbar, 3); + + l_btn = phone_create_navi_btn(favor_d->navi, S_(PH_SYS_SK_CANCEL)); + evas_object_smart_callback_add(l_btn, "clicked", ph_favor_edit_cancel_cb, favor_d); + elm_object_item_part_content_set(favor_d->navi_item, "prev_btn", l_btn); + } + } + ph_favor_update_button_status(favor_d); +} + +Evas_Object* phone_favor_create_view(ph_view_info *view_info) +{ + int ret; + Elm_Theme *th; + ph_favorite_data *favor_d = calloc(1, sizeof(ph_favorite_data)); + p_retvm_if(NULL == favor_d, NULL, "Fail to calloc ph_favorite_data"); + favor_d->ug = view_info->ug; + favor_d->win = view_info->win; + favor_d->navi_item = elm_naviframe_bottom_item_get(view_info->navi); + favor_d->ug_request = view_info->ug_request; + favor_d->ug_data = view_info->ug_data; + favor_d->ug_cnt_max = view_info->ug_cnt_max; + favor_d->is_background = true; + + th = elm_theme_new(); + elm_theme_ref_set(th, NULL); + elm_theme_extension_add(th, FAVORITES_THEME_EDJ); + favor_d->th = th; + + ret = favor_create_layout(favor_d, view_info->navi); + if (ret < 0) { + free(favor_d); + return NULL; + } + + evas_object_data_set(favor_d->layout, KEY_FAVOR_DATA, favor_d); + return favor_d->layout; +} + +void phone_favor_view_reset(Evas_Object *base) +{ + PH_FN_CALL; + ph_favorite_data *favor_d; + Elm_Object_Item *item; + + favor_d = evas_object_data_get(base, KEY_FAVOR_DATA); + p_retm_if(NULL == favor_d, "favor_d is null"); + + if (favor_d->child_ug) { + ug_destroy(favor_d->child_ug); + favor_d->child_ug = NULL; + } + + if (PH_UG_REQUEST_CHECK != favor_d->ug_request && + PH_UG_REQUEST_CHECK_FOR_NUMBER != favor_d->ug_request && + PH_UG_REQUEST_CHECK_FOR_EMAIL != favor_d->ug_request) + if (PH_FAVOR_MODE_EDIT == favor_d->list_mode) + ph_favor_edit_mode_end(favor_d, false); + + item = elm_naviframe_bottom_item_get(favor_d->navi); + if (elm_naviframe_top_item_get(favor_d->navi) != item) + elm_naviframe_item_pop_to(item); + + favor_d->navi_btn = NULL; +} + +void phone_favor_set_background(Evas_Object *obj, bool is_background) +{ + ph_favorite_data *favor_d; + favor_d = evas_object_data_get(obj, KEY_FAVOR_DATA); + p_retm_if(NULL == favor_d, "favor data is null"); + + favor_d->is_background = is_background; + + if (favor_d->update_timer_contact) { + ecore_timer_del(favor_d->update_timer_contact); + favor_d->update_timer_contact = NULL; + favor_contact_data_changed_cb(favor_d); + } + + if (favor_d->update_timer_favor) { + ecore_timer_del(favor_d->update_timer_favor); + favor_d->update_timer_favor = NULL; + favor_data_changed_cb(favor_d); + } + + if (favor_d->update_timer_log) { + ecore_timer_del(favor_d->update_timer_log); + favor_d->update_timer_log = NULL; + favor_log_data_changed_cb(favor_d); + } +} + diff --git a/lib/favor/ph-favorite-view.h b/lib/favor/ph-favorite-view.h new file mode 100755 index 0000000..1ce0ad6 --- /dev/null +++ b/lib/favor/ph-favorite-view.h @@ -0,0 +1,27 @@ +/* + * 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 __PH_FAVORTIE_VIEW_H__ +#define __PH_FAVORTIE_VIEW_H__ + +void ph_favor_update_button_status(ph_favorite_data *favor_d); +Evas_Object* ph_favor_create_value_list_popup(int type, ph_favorite_data *favor_d, + int contact_id, GSList *values); +void ph_favor_load_mf_list(void *data); +void ph_favor_mf_fill_layout(ph_favorite_data *favor_d); + +#endif /* __PH_FAVORTIE_VIEW_H__ */ + diff --git a/lib/images/dialer_images/C01-3_dialer_btn_01.png b/lib/images/contact_images/00_check_checking.png Binary files differindex b809797..c6ce824 100644..100755 --- a/lib/images/dialer_images/C01-3_dialer_btn_01.png +++ b/lib/images/contact_images/00_check_checking.png diff --git a/lib/images/contact_images/01_controlbar_icon_add-to-bookmarks.png b/lib/images/contact_images/01_controlbar_icon_add-to-bookmarks.png Binary files differnew file mode 100644 index 0000000..bc2e48b --- /dev/null +++ b/lib/images/contact_images/01_controlbar_icon_add-to-bookmarks.png diff --git a/lib/images/contact_images/01_controlbar_icon_add_account.png b/lib/images/contact_images/01_controlbar_icon_add_account.png Binary files differnew file mode 100644 index 0000000..e5803cd --- /dev/null +++ b/lib/images/contact_images/01_controlbar_icon_add_account.png diff --git a/lib/images/contact_images/01_controlbar_icon_add_to_contact.png b/lib/images/contact_images/01_controlbar_icon_add_to_contact.png Binary files differnew file mode 100644 index 0000000..65d47e4 --- /dev/null +++ b/lib/images/contact_images/01_controlbar_icon_add_to_contact.png diff --git a/lib/images/contact_images/01_controlbar_icon_bluetooth_preview.png b/lib/images/contact_images/01_controlbar_icon_bluetooth_preview.png Binary files differnew file mode 100644 index 0000000..99946bb --- /dev/null +++ b/lib/images/contact_images/01_controlbar_icon_bluetooth_preview.png diff --git a/lib/images/contact_images/01_controlbar_icon_close.png b/lib/images/contact_images/01_controlbar_icon_close.png Binary files differnew file mode 100644 index 0000000..91b04e5 --- /dev/null +++ b/lib/images/contact_images/01_controlbar_icon_close.png diff --git a/lib/images/contact_images/01_controlbar_icon_exchangs_register.png b/lib/images/contact_images/01_controlbar_icon_exchangs_register.png Binary files differnew file mode 100644 index 0000000..58c6e27 --- /dev/null +++ b/lib/images/contact_images/01_controlbar_icon_exchangs_register.png diff --git a/lib/images/contact_images/01_controlbar_icon_groups.png b/lib/images/contact_images/01_controlbar_icon_groups.png Binary files differnew file mode 100644 index 0000000..e793512 --- /dev/null +++ b/lib/images/contact_images/01_controlbar_icon_groups.png diff --git a/lib/images/dialer_images/C01-3_dialer_btn_03.png b/lib/images/contact_images/01_controlbar_icon_more.png Binary files differindex de780cf..651c8e1 100644 --- a/lib/images/dialer_images/C01-3_dialer_btn_03.png +++ b/lib/images/contact_images/01_controlbar_icon_more.png diff --git a/lib/images/contact_images/C02_account_00.png b/lib/images/contact_images/C02_account_00.png Binary files differnew file mode 100644 index 0000000..d66d58b --- /dev/null +++ b/lib/images/contact_images/C02_account_00.png diff --git a/lib/images/contact_images/C02_account_01.png b/lib/images/contact_images/C02_account_01.png Binary files differnew file mode 100644 index 0000000..f5d015f --- /dev/null +++ b/lib/images/contact_images/C02_account_01.png diff --git a/lib/images/contact_images/C02_account_02.png b/lib/images/contact_images/C02_account_02.png Binary files differnew file mode 100644 index 0000000..0c48c5d --- /dev/null +++ b/lib/images/contact_images/C02_account_02.png diff --git a/lib/images/contact_images/C02_account_03.png b/lib/images/contact_images/C02_account_03.png Binary files differnew file mode 100644 index 0000000..4ba46fc --- /dev/null +++ b/lib/images/contact_images/C02_account_03.png diff --git a/lib/images/contact_images/C02_account_04.png b/lib/images/contact_images/C02_account_04.png Binary files differnew file mode 100644 index 0000000..4b0bf0b --- /dev/null +++ b/lib/images/contact_images/C02_account_04.png diff --git a/lib/images/contact_images/C02_account_default.png b/lib/images/contact_images/C02_account_default.png Binary files differnew file mode 100644 index 0000000..a6c579c --- /dev/null +++ b/lib/images/contact_images/C02_account_default.png diff --git a/lib/images/contact_images/C02_icon_add_group.png b/lib/images/contact_images/C02_icon_add_group.png Binary files differnew file mode 100644 index 0000000..2e5e5b6 --- /dev/null +++ b/lib/images/contact_images/C02_icon_add_group.png diff --git a/lib/images/contact_images/C02_icon_favorite.png b/lib/images/contact_images/C02_icon_favorite.png Binary files differnew file mode 100644 index 0000000..3792de0 --- /dev/null +++ b/lib/images/contact_images/C02_icon_favorite.png diff --git a/lib/images/contact_images/C02_icon_favorite_on.png b/lib/images/contact_images/C02_icon_favorite_on.png Binary files differnew file mode 100644 index 0000000..69608a3 --- /dev/null +++ b/lib/images/contact_images/C02_icon_favorite_on.png diff --git a/lib/images/contact_images/C02_icon_reset.png b/lib/images/contact_images/C02_icon_reset.png Binary files differnew file mode 100644 index 0000000..af4e43a --- /dev/null +++ b/lib/images/contact_images/C02_icon_reset.png diff --git a/lib/images/contact_images/caller_ID_default_128x128.png b/lib/images/contact_images/caller_ID_default_128x128.png Binary files differnew file mode 100644 index 0000000..40ebebb --- /dev/null +++ b/lib/images/contact_images/caller_ID_default_128x128.png diff --git a/lib/images/contact_images/caller_ID_default_96x96.png b/lib/images/contact_images/caller_ID_default_96x96.png Binary files differnew file mode 100644 index 0000000..271c3bf --- /dev/null +++ b/lib/images/contact_images/caller_ID_default_96x96.png diff --git a/lib/images/contact_images/caller_ID_edit.png b/lib/images/contact_images/caller_ID_edit.png Binary files differnew file mode 100644 index 0000000..90999b9 --- /dev/null +++ b/lib/images/contact_images/caller_ID_edit.png diff --git a/lib/images/contact_images/email.png b/lib/images/contact_images/email.png Binary files differnew file mode 100644 index 0000000..145a92f --- /dev/null +++ b/lib/images/contact_images/email.png diff --git a/lib/images/contact_images/message.png b/lib/images/contact_images/message.png Binary files differnew file mode 100644 index 0000000..8bf4018 --- /dev/null +++ b/lib/images/contact_images/message.png diff --git a/lib/images/dialer_images/C01-3_dialer_btn.png b/lib/images/dialer_images/C01-3_dialer_btn.png Binary files differnew file mode 100644 index 0000000..ab42aa5 --- /dev/null +++ b/lib/images/dialer_images/C01-3_dialer_btn.png diff --git a/lib/images/dialer_images/C01-3_dialer_btn_cal.png b/lib/images/dialer_images/C01-3_dialer_btn_cal.png Binary files differnew file mode 100644 index 0000000..801dd90 --- /dev/null +++ b/lib/images/dialer_images/C01-3_dialer_btn_cal.png diff --git a/lib/images/dialer_images/C01-3_dialer_btn_call.png b/lib/images/dialer_images/C01-3_dialer_btn_call.png Binary files differnew file mode 100644 index 0000000..d427249 --- /dev/null +++ b/lib/images/dialer_images/C01-3_dialer_btn_call.png diff --git a/lib/images/dialer_images/C01-3_dialer_btn_call_press.png b/lib/images/dialer_images/C01-3_dialer_btn_call_press.png Binary files differnew file mode 100644 index 0000000..90bdf97 --- /dev/null +++ b/lib/images/dialer_images/C01-3_dialer_btn_call_press.png diff --git a/lib/images/dialer_images/C01-3_dialer_btn_02.png b/lib/images/dialer_images/C01-3_dialer_btn_option_bg.png Binary files differindex ad06527..a327add 100644 --- a/lib/images/dialer_images/C01-3_dialer_btn_02.png +++ b/lib/images/dialer_images/C01-3_dialer_btn_option_bg.png diff --git a/lib/images/dialer_images/C01-3_dialer_btn_option_press.png b/lib/images/dialer_images/C01-3_dialer_btn_option_press.png Binary files differnew file mode 100644 index 0000000..76cbd46 --- /dev/null +++ b/lib/images/dialer_images/C01-3_dialer_btn_option_press.png diff --git a/lib/images/dialer_images/C01-3_dialer_btn_press.png b/lib/images/dialer_images/C01-3_dialer_btn_press.png Binary files differindex b3f4b0a..90bdf97 100644 --- a/lib/images/dialer_images/C01-3_dialer_btn_press.png +++ b/lib/images/dialer_images/C01-3_dialer_btn_press.png diff --git a/lib/images/dialer_images/C01-3_dialer_icon_01.png b/lib/images/dialer_images/C01-3_dialer_icon_01.png Binary files differindex 6d7fbc3..5753355 100644 --- a/lib/images/dialer_images/C01-3_dialer_icon_01.png +++ b/lib/images/dialer_images/C01-3_dialer_icon_01.png diff --git a/lib/images/dialer_images/C01-3_dialer_icon_02(_press).png b/lib/images/dialer_images/C01-3_dialer_icon_02(_press).png Binary files differnew file mode 100755 index 0000000..fdbe922 --- /dev/null +++ b/lib/images/dialer_images/C01-3_dialer_icon_02(_press).png diff --git a/lib/images/dialer_images/C01-3_dialer_icon_02.png b/lib/images/dialer_images/C01-3_dialer_icon_02.png Binary files differnew file mode 100644 index 0000000..4aba300 --- /dev/null +++ b/lib/images/dialer_images/C01-3_dialer_icon_02.png diff --git a/lib/images/dialer_images/C01-3_dialer_icon_02_press.png b/lib/images/dialer_images/C01-3_dialer_icon_02_press.png Binary files differnew file mode 100755 index 0000000..0aeb324 --- /dev/null +++ b/lib/images/dialer_images/C01-3_dialer_icon_02_press.png diff --git a/lib/images/dialer_images/C01-3_dialer_icon_clear.png b/lib/images/dialer_images/C01-3_dialer_icon_clear.png Binary files differindex c0a8884..719cde7 100644 --- a/lib/images/dialer_images/C01-3_dialer_icon_clear.png +++ b/lib/images/dialer_images/C01-3_dialer_icon_clear.png diff --git a/lib/images/dialer_images/C01-3_dialer_icon_option.png b/lib/images/dialer_images/C01-3_dialer_icon_option.png Binary files differnew file mode 100644 index 0000000..b524878 --- /dev/null +++ b/lib/images/dialer_images/C01-3_dialer_icon_option.png diff --git a/lib/images/dialer_images/C01-3_dialer_icon_star.png b/lib/images/dialer_images/C01-3_dialer_icon_star.png Binary files differnew file mode 100644 index 0000000..d3893b4 --- /dev/null +++ b/lib/images/dialer_images/C01-3_dialer_icon_star.png diff --git a/lib/images/dialer_images/C01-3_dialer_search_field_bg.png b/lib/images/dialer_images/C01-3_dialer_search_field_bg.png Binary files differnew file mode 100644 index 0000000..c80a019 --- /dev/null +++ b/lib/images/dialer_images/C01-3_dialer_search_field_bg.png diff --git a/lib/images/dialer_images/C01-3_icon_call.png b/lib/images/dialer_images/C01-3_icon_call.png Binary files differnew file mode 100644 index 0000000..767fd97 --- /dev/null +++ b/lib/images/dialer_images/C01-3_icon_call.png diff --git a/lib/images/dialer_images/C01-3_icon_clear.png b/lib/images/dialer_images/C01-3_icon_clear.png Binary files differnew file mode 100755 index 0000000..94fe6de --- /dev/null +++ b/lib/images/dialer_images/C01-3_icon_clear.png diff --git a/lib/images/dialer_images/C01-3_icon_message.png b/lib/images/dialer_images/C01-3_icon_message.png Binary files differnew file mode 100644 index 0000000..e53f31a --- /dev/null +++ b/lib/images/dialer_images/C01-3_icon_message.png diff --git a/lib/images/dialer_images/C01-3_dialer_icon_video_call_dim.png b/lib/images/dialer_images/C01-3_icon_voicecall.png Binary files differindex 473c90d..4d1019f 100644 --- a/lib/images/dialer_images/C01-3_dialer_icon_video_call_dim.png +++ b/lib/images/dialer_images/C01-3_icon_voicecall.png diff --git a/lib/images/dialer_images/C01_3_dialer_icon_option.png b/lib/images/dialer_images/C01_3_dialer_icon_option.png Binary files differnew file mode 100644 index 0000000..1d435fd --- /dev/null +++ b/lib/images/dialer_images/C01_3_dialer_icon_option.png diff --git a/lib/images/phoneug_images/00_button_icon_expand_closed.png b/lib/images/phoneug_images/00_button_icon_expand_closed.png Binary files differnew file mode 100644 index 0000000..acca071 --- /dev/null +++ b/lib/images/phoneug_images/00_button_icon_expand_closed.png diff --git a/lib/images/phoneug_images/00_button_icon_expand_opened.png b/lib/images/phoneug_images/00_button_icon_expand_opened.png Binary files differnew file mode 100644 index 0000000..cd36ac1 --- /dev/null +++ b/lib/images/phoneug_images/00_button_icon_expand_opened.png diff --git a/lib/images/phoneug_images/00_index_list_bg.png b/lib/images/phoneug_images/00_index_list_bg.png Binary files differnew file mode 100644 index 0000000..f41ec7c --- /dev/null +++ b/lib/images/phoneug_images/00_index_list_bg.png diff --git a/lib/images/phoneug_images/04_textinput_dialer_icon_voice_mail.png b/lib/images/phoneug_images/04_textinput_dialer_icon_voice_mail.png Binary files differnew file mode 100644 index 0000000..6d7fbc3 --- /dev/null +++ b/lib/images/phoneug_images/04_textinput_dialer_icon_voice_mail.png diff --git a/lib/images/phoneug_images/C01-4_btn_icon_call_dim.png b/lib/images/phoneug_images/C01-4_btn_icon_call_dim.png Binary files differnew file mode 100644 index 0000000..d2a68f6 --- /dev/null +++ b/lib/images/phoneug_images/C01-4_btn_icon_call_dim.png diff --git a/lib/images/phoneug_images/C01-4_btn_icon_message_dim.png b/lib/images/phoneug_images/C01-4_btn_icon_message_dim.png Binary files differnew file mode 100644 index 0000000..485ff79 --- /dev/null +++ b/lib/images/phoneug_images/C01-4_btn_icon_message_dim.png diff --git a/lib/images/phoneug_images/C01-4_btn_icon_video_call_dim.png b/lib/images/phoneug_images/C01-4_btn_icon_video_call_dim.png Binary files differnew file mode 100644 index 0000000..29ce012 --- /dev/null +++ b/lib/images/phoneug_images/C01-4_btn_icon_video_call_dim.png diff --git a/lib/images/phoneug_images/C01-4_list_icon_call.png b/lib/images/phoneug_images/C01-4_list_icon_call.png Binary files differnew file mode 100755 index 0000000..576ecab --- /dev/null +++ b/lib/images/phoneug_images/C01-4_list_icon_call.png diff --git a/lib/images/phoneug_images/C01-4_list_icon_mms.png b/lib/images/phoneug_images/C01-4_list_icon_mms.png Binary files differnew file mode 100644 index 0000000..aef7f9c --- /dev/null +++ b/lib/images/phoneug_images/C01-4_list_icon_mms.png diff --git a/lib/images/phoneug_images/C01-4_list_icon_sms.png b/lib/images/phoneug_images/C01-4_list_icon_sms.png Binary files differnew file mode 100644 index 0000000..399733d --- /dev/null +++ b/lib/images/phoneug_images/C01-4_list_icon_sms.png diff --git a/lib/images/phoneug_images/C01-4_icon_vt-call.png b/lib/images/phoneug_images/C01-4_list_icon_vt-call.png Binary files differindex 2e9f301..2e9f301 100644 --- a/lib/images/phoneug_images/C01-4_icon_vt-call.png +++ b/lib/images/phoneug_images/C01-4_list_icon_vt-call.png diff --git a/lib/images/phoneug_images/C02_icon_call.png b/lib/images/phoneug_images/C02_icon_call.png Binary files differnew file mode 100644 index 0000000..0b1038e --- /dev/null +++ b/lib/images/phoneug_images/C02_icon_call.png diff --git a/lib/images/phoneug_images/C02_icon_chat_on.png b/lib/images/phoneug_images/C02_icon_chat_on.png Binary files differnew file mode 100644 index 0000000..290857a --- /dev/null +++ b/lib/images/phoneug_images/C02_icon_chat_on.png diff --git a/lib/images/phoneug_images/C02_icon_filetransfer.png b/lib/images/phoneug_images/C02_icon_filetransfer.png Binary files differnew file mode 100644 index 0000000..ad235c7 --- /dev/null +++ b/lib/images/phoneug_images/C02_icon_filetransfer.png diff --git a/lib/images/phoneug_images/C02_icon_message.png b/lib/images/phoneug_images/C02_icon_message.png Binary files differnew file mode 100644 index 0000000..1eddabc --- /dev/null +++ b/lib/images/phoneug_images/C02_icon_message.png diff --git a/lib/images/phoneug_images/C02_icon_video_call.png b/lib/images/phoneug_images/C02_icon_video_call.png Binary files differnew file mode 100644 index 0000000..6c928ce --- /dev/null +++ b/lib/images/phoneug_images/C02_icon_video_call.png diff --git a/lib/images/phoneug_images/caller_ID_default_70x70_man.png b/lib/images/phoneug_images/caller_ID_default_70x70_man.png Binary files differindex 10a4d5b..b8e9ed9 100755..100644 --- a/lib/images/phoneug_images/caller_ID_default_70x70_man.png +++ b/lib/images/phoneug_images/caller_ID_default_70x70_man.png diff --git a/lib/images/phoneug_images/phone.png b/lib/images/phoneug_images/phone.png Binary files differnew file mode 100644 index 0000000..d66d58b --- /dev/null +++ b/lib/images/phoneug_images/phone.png diff --git a/lib/include/ct-detail.h b/lib/include/ct-detail.h new file mode 100755 index 0000000..15a9b8c --- /dev/null +++ b/lib/include/ct-detail.h @@ -0,0 +1,33 @@ +/* + * 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_H__ +#define __CONTACTS_DETAIL_H__ + +#include "phone-common.h" + +#define CT_DETAIL_DEFAULT_NUM_COLOR 213, 129, 31, 255 +#define CT_DETAIL_IMAGE_SIZE 128 +#define CT_DETAIL_RESET_BUTTON_SIZE 32 + +int ctui_create_detail_view(ct_list_data *clist_d, ct_contact_list *info); +int ctui_create_input_view(ct_detail_data *cdetail_d); +int ctui_create_detail_view_from_phone(Evas_Object *win, Evas_Object *navi, ui_gadget_h ug, int id); + +Evas_Object* ctui_contacts_viewer(Evas_Object *win, Evas_Object *navi, int ct_id, const char *vcard_stream); +Evas_Object* ctui_detail_genlist_update(ct_detail_data *cdetail_d); + +#endif //__CONTACTS_DETAIL_H__ diff --git a/lib/include/ct-favor.h b/lib/include/ct-favor.h new file mode 100644 index 0000000..92fff33 --- /dev/null +++ b/lib/include/ct-favor.h @@ -0,0 +1,74 @@ +/* + * 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_FAVOR_H__ +#define __CT_FAVOR_H__ + +#include "phone-common.h" + +enum { + PH_FAVOR_MODE_DEFAULT, + PH_FAVOR_MODE_EDIT, +}; + +typedef struct +{ + Evas_Object *win; + Evas_Object *mf_layout; + Evas_Object *navi; + Evas_Object *layout; + Evas_Object *cbar; + Evas_Object *favor_gengrid; + Evas_Object *mf_gengrid; + Evas_Object *popup; + Evas_Object *ctx_popup; + Elm_Theme *th; + Elm_Object_Item *navi_item; + Elm_Object_Item *navi_btn; + Eina_List *favor_list; + Eina_List *mf_list; + Eina_Bool longpressed; + Ecore_Timer *update_timer_contact; + Ecore_Timer *update_timer_favor; + Ecore_Timer *update_timer_log; + int list_mode; + int selected_contact; + int checked_cnt; + int favor_list_count; + int mf_list_count; + int readed_n; + int version; + int ug_request; + int ug_cnt_max; + int touch_x; + int touch_y; + bool is_background; + bool is_mf_changed; + char *ug_data; + Ecore_Idler *list_idler; + void *ug; + void *child_ug; + ph_progress_info *p_info; +}ph_favorite_data; + +Evas_Object* phone_favor_create_view(ph_view_info *view_info); +void phone_favor_set_navi(Evas_Object *base, int mode); +void phone_favor_view_reset(Evas_Object *base); +void phone_favor_set_background(Evas_Object *obj, bool is_background); +void phone_favor_edit_mode_start(ph_favorite_data *favor_d); + +#endif /* __CT_FAVOR_H__ */ + diff --git a/lib/include/ct-front.h b/lib/include/ct-front.h new file mode 100755 index 0000000..7644dbe --- /dev/null +++ b/lib/include/ct-front.h @@ -0,0 +1,64 @@ +/* + * 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_FRONT_H__ +#define __CT_FRONT_H__ + +#include "phone-common.h" +#include <app.h> + +enum { + CT_FRONT_CONTACT_NEW, + CT_FRONT_CONTACT_SEARCH, +}; + +enum CT_VIEW_TYPE { + CT_VIEW_NONE = -1, + CT_VIEW_CONTACT, + CT_VIEW_LOG, + CT_VIEW_FAVORITE, + CT_VIEW_MAX, +}; + +typedef struct +{ + Evas_Object *win; + Evas_Object *navi; + Evas_Object *layout; + Evas_Object *tabbar; + Evas_Object *sub_view[CT_VIEW_MAX]; + Elm_Object_Item *item[CT_VIEW_MAX]; + bool view_visible[CT_VIEW_MAX]; + void *ug; + char *ug_data; + int ug_request; + int cnt_max; + int select_tab; + app_device_orientation_e rotate; + Ecore_Idler *idler; + Ecore_Timer *timer; +}ct_front_data; + +ct_front_data* ctui_front_view_create(Evas_Object *win); +Eina_Bool ctui_front_view_load_timer(void *data); +void ctui_front_view_region_changed(ct_front_data *cfront_d); +void ctui_front_view_reset(ct_front_data *cfront_d, int tab_index, int op, service_h service); +void ctui_front_view_resume(ct_front_data *cfront_d); +void ctui_front_view_pause(ct_front_data *cfront_d); +int ctui_front_view_rotate(ct_front_data *cfront_d, app_device_orientation_e orientation); + +#endif /* __CT_FRONT_H__ */ + diff --git a/lib/include/ct-list.h b/lib/include/ct-list.h new file mode 100755 index 0000000..d9d59eb --- /dev/null +++ b/lib/include/ct-list.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_LIST_H__ +#define __CONTACTS_LIST_H__ + +#include "phone-common.h" + +#define CT_LIST_MAX_SEARCH_STR 1024 +#define CT_LIST_ICON_SIZE 70 + +enum { // this order affects to set list_op in ct_list_create_contact_view_with_info + CT_GET_LIST_ALL_CONTACTS = 0, + CT_GET_LIST_ALL_CONTACT_HAD_NUMBER = 10, + CT_GET_LIST_ALL_CONTACT_HAD_EMAIL = 11, + CT_GET_LIST_VCARD = 12, +}; + +enum { + CT_LIST_SINGLE_VIEW, + CT_LIST_IN_MULTI_TAB, +}; + +enum { + CT_LIST_MODE_DEFAULT, + CT_LIST_MODE_EDIT, +}; + +Evas_Object* ctui_create_list_view(Evas_Object *win); +Evas_Object* ctui_create_list_select_view(Evas_Object *navi, ct_select_result_cb result_cb, void *result_cb_data, int list_op, int id_ab, int id_grp); +void ctui_create_favorite_list_select_view(Evas_Object *win, Evas_Object *navi, Eina_List *list); +Evas_Object* ctui_create_vcard_list_select_view(Evas_Object *navi, Eina_List *list, const char *path, + ct_select_result_cb result_cb, void *result_cb_data); +Evas_Object* ctui_create_vcard_list_view(Evas_Object *win, Eina_List *list, const char *path); +Evas_Object* ctui_create_phone_list_view(ph_view_info *view_info); +Eina_Bool ctui_list_genlist_update(void *data); +void ctui_list_new_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info); +void ctui_list_navi_set(int mode, ct_list_data *clist_d); +void ctui_list_view_reset(ct_list_data *clist_d); +void ctui_list_view_resume(Evas_Object *navi); +void ctui_list_view_pause(Evas_Object *navi); +void ctui_list_set_search_text(ct_list_data *clist_d, const char *text); +void ctui_list_edit_mode_start(ct_list_data *clist_d); +void ctui_list_set_selectall(ct_list_data *clist_d); +void ctui_list_update_with_data(ph_view_info *view_info, void *data, int id, int grp_id, int ab_id); +Evas_Object* ctui_list_create_values_list(int type, Evas_Object *popup, + GSList *values, void cb(void *data, Evas_Object *obj, void *event_info)); + +char* ct_list_get_display_name(CTSvalue *list_info); + +int ct_list_get_contacts(ct_list_data *clist_d, Eina_List **list); +char* ct_list_gl_label_get(void *data, Evas_Object *obj, const char *part); +char* ct_list_count_gl_label_get(void *data, Evas_Object *obj, const char *part); +Evas_Object* ct_list_create_contact_layout(ct_list_data *clist_d); + +#endif //__CONTACTS_LIST_H__ diff --git a/lib/include/phone-ui.h b/lib/include/ph-front.h index 6f36a3c..41a0399 100755 --- a/lib/include/phone-ui.h +++ b/lib/include/ph-front.h @@ -14,45 +14,52 @@ * limitations under the License. */ -#ifndef __PHONE_UI_H__ -#define __PHONE_UI_H__ +#ifndef __PH_FRONT_H__ +#define __PH_FRONT_H__ #include "phone-common.h" - -#define PH_START_VIEW "db/phone/last_position" +#include <app.h> enum { - PH_FAVOR_MODE_DEFAULT, - PH_FAVOR_MODE_EDIT, + PH_FRONT_DIALER_WITH_NUM, + PH_FRONT_LOG_MISSED, +}; + +enum PH_VIEW_TYPE { + PH_VIEW_NONE = -1, + PH_VIEW_DIALER = 0, + PH_VIEW_CONTACT, + PH_VIEW_LOG, + PH_VIEW_FAVORITE, + PH_VIEW_MAX, }; typedef struct { Evas_Object *win; - Evas_Object *layout; Evas_Object *navi; + Evas_Object *layout; Evas_Object *tabbar; - Evas_Object *sub_view[4]; - struct ui_gadget *contact_ug; - Elm_Object_Item *item[4]; + Evas_Object *sub_view[PH_VIEW_MAX]; + Elm_Object_Item *item[PH_VIEW_MAX]; + bool view_visible[PH_VIEW_MAX]; void *ug; + char *ug_data; + int ug_request; + int cnt_max; int select_tab; Ecore_Idler *idler; Ecore_Timer *timer; }ph_phoneui_data; -ph_phoneui_data* phone_create_phoneui(Evas_Object *win); + +ph_phoneui_data* phone_front_view_create(Evas_Object *win); Eina_Bool phone_front_view_load_timer(void *data); -void phone_front_view_show_sub_view(ph_phoneui_data *phoneui_d, int type); -void phone_front_view_reset(ph_phoneui_data *phoneui_d, int tab_index, char *val); void phone_front_view_region_changed(ph_phoneui_data *phoneui_d); +void phone_front_view_reset(ph_phoneui_data *phoneui_d, int tab_index, int op, service_h service); void phone_front_view_resume(ph_phoneui_data *phoneui_d); void phone_front_view_pause(ph_phoneui_data *phoneui_d); int phone_front_view_show_call_app(ph_phoneui_data *phoneui_d); -Evas_Object* phone_create_favorite_view(void *ug, Evas_Object *win, Evas_Object *navi); -void phone_favor_set_navi(Evas_Object *base, int mode); -void phone_favor_view_reset(Evas_Object *base); - -#endif /* __PHONE_UI_H__ */ +#endif /* __PH_FRONT_H__ */ diff --git a/lib/include/phone-common.h b/lib/include/phone-common.h index 0523652..5f240a0 100755 --- a/lib/include/phone-common.h +++ b/lib/include/phone-common.h @@ -18,11 +18,16 @@ #define __PHONE_COMMON_H__ #include <time.h> +#include <libintl.h> +#include <ui-gadget.h> #include <contacts-svc.h> +#include <unicode/udat.h> +#include <bundle.h> #include "phone-ug.h" #include "phone-path.h" #include "phone-text.h" +#include "contacts-ug.h" #define PH_TIMECHECK #ifdef PH_TIMECHECK @@ -35,15 +40,15 @@ int ph_init_time(void); #define PH_START_TIME_CHECK \ ph_init_time();\ ph_startT = ph_set_start_time(); -#define PH_END_TIME_CHECK \ - DBG("time = %f ms\n", ph_exec_time(ph_startT)); +#define PH_END_TIME_CHECK(fmt, arg...) \ + DBG(fmt" time = %f ms\n", ##arg, ph_exec_time(ph_startT)); #else //PH_TIMECHECK #define PH_START_TIME_CHECK -#define PH_END_TIME_CHECK +#define PH_END_TIME_CHECK(arg) #endif //PH_TIMECHECK #if !defined(LOCALEDIR) -# define LOCALEDIR "/opt/ug/res/locale" +# define LOCALEDIR "/usr/ug/res/locale" #endif #ifndef STRLEN @@ -52,12 +57,34 @@ ph_startT = ph_set_start_time(); #define PH_TEXT_MAX_LEN 1024 #define PH_TEXT_SHORT_LEN 256 +#define CT_EDITFIELD_MAX_BYTE 1024 + +#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) + +#define MSG_COMPOSER_UG "msg-composer-efl" +#define EMAIL_COMPOSER_UG "email-composer-efl" +#define MYFILES_UG "myfile-efl" +#define ACCOUNT_UG "setting-myaccount-efl" +#define IMG_VIEWER_UG "image-viewer-efl" +#define GALLERY_UG "gallery-efl" +#define BLUETOOTH_UG "setting-bluetooth-efl" #define VOICECALL_PKG "org.tizen.call" #define VIDEOCALL_PKG "org.tizen.vtmain" +#define CONTACTS_VIEWER_PKG "org.tizen.contacts-viewer" +#define BROWSER_UI_PKG "org.tizen.browser" +#define CAMERA_PKG "org.tizen.camera-app" + +typedef enum date_style{ + PH_LOG_TIME_ONLY, + PH_LOG_DATE_ONLY, +}date_style; typedef enum{ - LOG_TYPE_VIDEO_CALL = 0, + LOG_TYPE_CALL = 0, + LOG_TYPE_VIDEO_CALL, + LOG_TYPE_SMS_MESSAGE, + LOG_TYPE_MMS_MESSAGE, LOG_TYPE_MAX } Log_Type; @@ -70,23 +97,59 @@ typedef enum{ LOG_ACTION_MAX } Log_Action; -enum -{ - PH_SUBSCRIBE_CONTACT_CHANGE = (1 << 0), - PH_SUBSCRIBE_FAVORITE_CHANGE = (1 << 1), - PH_SUBSCRIBE_PLOG_CHANGE = (1 << 2), + +enum { + CTTEXT_TYPE_MOBILE, + CTTEXT_TYPE_HOME, + CTTEXT_TYPE_WORK, + CTTEXT_TYPE_FAX_HOME, + CTTEXT_TYPE_FAX_WORK, + CTTEXT_TYPE_ASSISTANT, + CTTEXT_TYPE_PAGER, + CTTEXT_TYPE_OTHER, + CTTEXT_TYPE_TELEPHONE, + CTTEXT_TYPE_FAX, + CTTEXT_TYPE_CAR, + CTTEXT_TYPE_HOME2, + CTTEXT_TYPE_WORK2, + CTTEXT_TYPE_COMPANY_MAIN, + CTTEXT_TYPE_RADIO, +}; //CT_GET_TEXT_NUM_TYPE + +enum { + CT_VIEW_DETAIL, + CT_VIEW_INPUT, + CT_VIEW_ETC, }; -// for removing build warning //////////////////////////////////// -//////////////////////////////////////////////////////// +enum { + CTUG_MSG_INVALID = 0, + CTUG_MSG_KEY_END = 1, +}; typedef void* PTHREAD_FN; +typedef void (*ct_select_result_cb)(void *data, int *list, int cnt); +typedef void (*ct_contact_add_cb)(Evas_Object *win, Evas_Object *navi, int cnt); +typedef void (*ct_change_name_cb)(void *data, char *str); +typedef void (*selectall_changed_cb)(void *data, Eina_Bool checked); +typedef void (*ct_list_cbar_update_fn)(void *data); + +typedef struct { + Evas_Object *win; + Evas_Object *navi; + void *ug; + int ug_request; + int ug_cnt_max; + char *ug_data; // update contact info +}ph_view_info; typedef struct { int cnt; int cnt_checked_total; + int result; bool alive; bool completed; + bool without_cancel_btn; pthread_t thread; Ecore_Timer *timer; Evas_Object *layout; @@ -106,8 +169,10 @@ typedef struct int plog_log_type; int plog_duration; + int grouped_count; Eina_Bool checked;//for check genlist int group_index;//it's used as group index value. + Elm_Object_Item *item; } ph_log_info; typedef struct @@ -123,63 +188,370 @@ typedef struct { int id; int contact_id; + int id_ret; char *display; char *img_path; char *number; bool img_loaded; bool number_loaded; - Eina_Bool is_checked; + Eina_Bool checked; Elm_Object_Item *item; }ph_favor_info; -enum PH_VIEW_TYPE { - PH_VIEW_NONE = -1, - PH_VIEW_DIALER = 0, - PH_VIEW_CONTACT, - PH_VIEW_LOG, - PH_VIEW_FAVORITE, - PH_VIEW_MAX, -}; +typedef struct +{ + char *display; + char *img_path; + char *ph_number; + int contact_id; + int dial_number; + Eina_Bool is_checked; +}ph_speeddial_info; struct ug_priv_data { void (*result_cb)(void*, void*); - void (*destroy_cb)(void*); + void (*destroy_cb)(void *); void *cb_param; }; +typedef struct { + int position; + int skipped_count; + char index[10]; + char prev_index[4]; + Elm_Object_Item *item; +} ct_list_index_data; + +typedef struct { + void *user_data; + Evas_Smart_Cb cb; + char *icon_path; +} ctr_btn_info; + +typedef struct { + Evas_Object *win; + Evas_Object *navi; + Evas_Object *entry; + Elm_Object_Item *navi_it; + Elm_Object_Item *btn_op; + char *name_old; + void *info; + void *fn_data; +} ct_group_edit_data; + +typedef struct { + CTSstruct *contact; + Elm_Object_Item *item; + bool img_loaded; + bool number_loaded; + Eina_Bool checked; + char *img_path; + char *number; + char *display; + char *normalize; + int id; + int id_person; + int id_ret; + int id_ab; + int mode_ab; +}ct_contact_list; + +typedef struct { + Evas_Object *win; + Evas_Object *box; + Evas_Object *cbar; + Evas_Object *navi; + Evas_Object *content; + Evas_Object *layout; + Evas_Object *popup; + Elm_Object_Item *navi_item; + Elm_Object_Item *count_item; + Elm_Theme *th; + + int tab_mode; + int ug_request; + char *title; + char *sub_title; + char *ug_data; + void *ug; + void *child_ug; + + Elm_Genlist_Item_Class itcs[7]; + void(*gl_sel)(void *data, Evas_Object *obj, void *event_info); + void *gl_sel_data; + void (*edit_sel_update)(void *data); + + bool is_background; + bool gadd_mode; + + cts_order_type order_sorting; + cts_order_type order_display; + + Evas_Object *fast_index; + Evas_Object *genlist; + int list_op; + int base_ab; + int base_ab_mode; + int base_grp; + int readed_n; + Eina_List *list; + Ecore_Idler *list_idler; + Ecore_Timer *update_timer; + Ecore_Timer *update_queue_timer; + Elm_Object_Item *last_sweep_item; + + Eina_List *list_index; + ct_list_index_data *list_skipped_index; + bool need_update; + + Elm_Object_Item *group_item; + char group_index[4]; + Evas_Object *searchbar; + char *search_str; + char *search_normalize; + + Evas_Object *select_all_layout; + + int list_mode; + int cnt_total; + int cnt_checked; + int cnt_list; + int cnt_max; + int selected_contact; + + ph_progress_info *p_info; + + Eina_List *list_ab; + int idx_vcard; + const char *vcard_path; + int ct_id_caller; + + ct_select_result_cb select_result_cb; + ct_contact_add_cb contact_add_cb; + void *select_result_cb_data; + + ct_list_cbar_update_fn list_cbar_update_fn; +}ct_list_data; + +typedef struct { + Elm_Theme *th; + Evas_Object *win; + Evas_Object *navi; + Evas_Object *layout; + Evas_Object *noc; + Evas_Object* select_all_layout; + + Elm_Object_Item *titem; + Elm_Object_Item *navi_item; + Elm_Object_Item *prev_navi_item; + Elm_Object_Item *ctrl_item; + Elm_Object_Item *base_item; + Elm_Object_Item *util_item; + Elm_Object_Item *select_all_item; + + Evas_Object *popup; + Evas_Object *genlist; + Evas_Object *history_genlist; + Eina_List *list; + Ecore_Idler *idler; + int list_count; + int pre_date_type; + UDateFormat* hformatter[5]; + + Elm_Object_Item *ringtone_item; + + cts_order_type order_display; + + bool updated; + bool is_shortcut; + bool has_detail; + bool has_input; + bool ug_detail; + bool has_number; + int touch_x; + int touch_y; + int base_grp; + int base_ab; + int base_ab_mode; + int cnt_checked; + int view_mode; + char *base_ab_name; + int contact_id; + int person_id; + char* vcard; + ui_gadget_h ug; + void *child_ug; + int ug_request; + int view_creat_ver; + CTSstruct *contact; + GSList *person_list; + void *prev_view_data; + UDateFormat* formatter; + Evas_Object *genlist_unlink; + ph_progress_info *p_info; +}ct_detail_data; + +typedef struct { + Evas_Object *box; + Evas_Object *scroller; + Elm_Object_Item *save_btn; + Elm_Object_Item *pre_item; + Elm_Object_Item *navi_item; + Ecore_Event_Handler* win_prop_change; + + bool add_job_title; + bool add_department; + + Evas_Object *ly_baseinfo; + Evas_Object *ly_baseinfo_last; + Evas_Object *ly_baseinfo_suffix; + Evas_Object *ly_baseinfo_nick; + Evas_Object *ly_baseinfo_job_title; + Evas_Object *ly_baseinfo_department; + Evas_Object *ly_baseinfo_company; + Evas_Object *ly_baseinfo_expand; + Evas_Object *ly_number_first; + Evas_Object *ly_number_last; + Evas_Object *ly_number_default; + Evas_Object *ly_number_set_default_separator_before; + Evas_Object *ly_number_set_default; + Evas_Object *ly_number_set_default_separator_after; + Evas_Object *ly_email_first; + Evas_Object *ly_email_last; + Evas_Object *ly_addr_first; + Evas_Object *ly_addr_last; + + Evas_Object *ly_seperator_more; + Evas_Object *ly_seperator_baseinfo; + Evas_Object *ly_messenger_first; + Evas_Object *ly_messenger_last; + Evas_Object *ly_url_first; + Evas_Object *ly_url_last; + Evas_Object *ly_relationship; + Evas_Object *ly_birthday; + Evas_Object *ly_anniversary; + Evas_Object *ly_note; + + Evas_Object *ly_ringtone; + Evas_Object *ly_moreinfo; + + bool saved; + Eina_Bool save_disable; + int view_create_ver; + int cnt_addr; + int cnt_num; + int idx_append; + + int base_ab; + int base_ab_mode; + int base_ab_type; + char *base_ab_name; + + int contact_id; + CTSstruct *contact; + ct_detail_data *cdetail_d; + + ui_gadget_h src_ug; + ui_gadget_h crop_ug; +}ct_input_data; + +typedef struct { + Evas_Object *ly_main; + Evas_Object *ly_content; + CTSvalue *value; + Evas_Object *data; +}ct_input_typed_data; + // for removing build warning //////////////////////////////////// char* contacts_svc_value_steal_str(CTSvalue* value, int field); //////////////////////////////////////////////////////// char *phone_get_display_name_from_value(CTSvalue *name, int display_field, int first_field, int last_field); void phone_free_contacts(Eina_List *list); +Eina_List * phone_load_speeddial_data(int *ref_count); +void phone_free_speeddial_data(Eina_List *list); + +void* phone_launch_msg_composer_ug(void *parent_ug, char *data, int msg_id, void(*destroy_cb)(void*), void *cb_param); +void* phone_launch_contact_list_ug(void *parent_ug, int request, void(*result_cb)(void*, void*), void(*destroy_cb)(void *), void *cb_param); +void* phone_launch_contact_detail_ug(void *parent_ug, int contact_index, void (*destroy_cb)(void *), void *cb_param); +void* phone_launch_contact_add_list_edit_ug(void *parent_ug, char *data, void (*destroy_cb)(void *), void *cb_param); +void* phone_image_crop_ug(ui_gadget_h parent, const char *photo, + struct ug_cbs *cbs); +void* ctui_msg_ug(ui_gadget_h parent, const char *number, const int idx, const char *attach, void(*destroy_cb)(void*), void *cb_param); -void* phone_launch_msg_composer_ug(void *parent_ug, char *data, void(*destroy_cb)(void*), void *cb_param); -void* phone_launch_contact_list_ug(void *parent_ug, int request, void(*result_cb)(void*, void*), void(*destroy_cb)(void*), void *cb_param); -void* phone_launch_contact_detail_ug(void *parent_ug, int contact_index, void(*destroy_cb)(void*), void *cb_param); -void* phone_launch_contact_add_list_edit_ug(void *parent_ug, char *data, void(*destroy_cb)(void*), void *cb_param); +void ug_common_destroy_cb(ui_gadget_h ug, void *priv); +void ug_common_layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv); +void ctui_destroy_child_ug(void *data); -void phone_launch_voice_call(char *number, int ct_id); +void phone_launch_voice_call(const int id, const char* number); -Evas_Object* phone_create_layout(Evas_Object *parent, bool is_fullview); -Evas_Object *phone_create_popup(Evas_Object *parent, const char *desc, double timeout); -Evas_Object* phone_create_confirm_popup(Evas_Object *win, const char* description); +Evas_Object* phone_create_base_layout(Evas_Object *parent, bool is_fullview); +Evas_Object *phone_show_popup(Evas_Object *parent, const char *desc, double timeout); +Evas_Object* phone_create_confirm_popup(Evas_Object **popup, Evas_Object *win, const char* description, + void (*btn_clicked_cb)(void *, Evas_Object *, void *), void *cb_data); +Evas_Object* phone_create_list_sweep_btn(Evas_Object *parent, char *fullpath); Evas_Object* phone_create_bg(Evas_Object *parent); Evas_Object *phone_create_icon_with_img(Evas_Object *parent, char *full_path); +Evas_Object* phone_create_navi_btn(Evas_Object *parent, const char *label); + Evas_Object* phone_progressbar_popup(Evas_Object *parent, ph_progress_info *p_info, const char *title); Evas_Object *phone_get_notify(Evas_Object *parent); -void phone_show_notify(Evas_Object *parent, const char *msg, double timeout); +void phone_show_notify(Evas_Object *parent, const char *msg); void phone_hide_notify(Evas_Object *parent); -void phone_progress_popup_del(void *data, Evas_Object *obj, void *event_info); +void phone_show_tickernoti(const char *); void phone_view_back_btn_cb(void *data, Evas_Object *obj, void *event_info); void phone_ug_destroy_me_cb(void *data, Evas_Object *obj, void *event_info); void phone_back_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info); -void phone_cbar_item_clear(Evas_Object *toolbar); -Evas_Object* phone_naviframe_btn(Evas_Object *parent, const char *label); +void phone_cbar_item_clear(Evas_Object *controlbar); +void phone_set_view_info(ph_view_info *view_info, Evas_Object *win, Evas_Object *navi, + void *ug, int ug_request, int cnt_max, char *ug_data); + +void phone_list_ug_return_ids(ui_gadget_h ug, int *result_list, int cnt, const char *bd_key); +void phone_ug_return_id(ui_gadget_h ug, int ct_id, int num_id, int email_id); +void phone_ug_return_vcard(ui_gadget_h ug, int ct_id, char *vcard); Evas_Object* phone_create_nocontents(Evas_Object *parent, const char* label); -Evas_Object* phone_create_popup_button(Evas_Object *popup, int index, const char* label, Evas_Smart_Cb cb, void *cb_data); -void phone_toolbar_disalbed_item_append(Evas_Object *toolbar, int cnt); +void phone_toolbar_disabled_item_append(Evas_Object *toolbar, int cnt); + +char* ctui_get_addrbook_icon_path(int type); +const char* ctui_get_default_contact_img(int view_type); +int ctui_get_display_name(CTSvalue *name, char *dest, int dest_len); +void ctui_get_number_type_str(int cts_num_type, char *dest, int dest_len); +void ctui_ld_to_dd(ct_list_data *clist_d, ct_detail_data *cdetail_d); + +void ctui_entry_limit_size_set(Evas_Object *entry); +Evas_Object* ctui_create_btn(Evas_Object *parent, const char *label); +void ctui_genlist_append_separator_10px(Evas_Object *genlist); +void ctui_genlist_append_separator_20px(Evas_Object *genlist); +void ctui_cbar_btn_disabled_set(Evas_Object *cbar, Eina_Bool disabled); +char* ctui_entry_markup_to_utf8(const char *s); +void ctui_entry_entry_set(Evas_Object *entry, const char *s); +Evas_Object* ctui_create_editfield(Evas_Object *parent, const char *title, const char *guide, bool multiline); +void ctui_genlist_append_separator_20px_with_line(Evas_Object *genlist); +void ctui_navi_left_btn_disabled_set(Elm_Object_Item *item, Eina_Bool disabled); +int ctui_get_person_id(int ct_id); +void ctui_list_ug_hide_cb(void *data, Evas_Object *obj, void *event_info); +Evas_Object* phone_create_select_all(Evas_Object *box, const char *selectall_text, selectall_changed_cb cb, void *cb_data); +void ctui_list_free_contacts(Eina_List* list); +void ctui_list_refresh_genlist(ct_list_data *clist_d); +void ctui_list_handle_search(ct_list_data *clist_d); +int phone_detail_log_is_call_ing_type(int type); +int phone_detail_log_is_mms_type(int type); +int phone_detail_log_is_sms_type(int type); +int phone_detail_log_is_email_type(int type); +char* phone_detail_log_get_icon_type(int log_type); +char* phone_detail_log_get_duration_from_number(int number); +void phone_detail_log_init_time_format(void); +void phone_detail_log_generate_date_format(UDateFormat **formatter); +char* phone_detail_log_get_icon_path_with_action(int log_type); +char* phone_detail_log_get_date(UDateFormat ** formatter, int log_time); +char* phone_detail_log_get_time(UDateFormat ** formatter, int log_time); +int phone_detail_log_get_date_type(int log_time, int log_duration); +void phone_detail_log_delete_date_format(UDateFormat **formatter); +char *ph_log_util_get_formatted_date(UDateFormat **formatter, int log_time, date_style style); +void ct_list_clear_pdata(ct_list_data *clist_d); +void phone_move_ctxpopup(Evas_Object *popup, Evas_Object *item); +void phone_resize_notify(Evas_Object *parent, int rotate); #endif //__PHONE_COMMON_H__ diff --git a/lib/include/phone-dialer.h b/lib/include/phone-dialer.h index 17c7571..1fa73c7 100755 --- a/lib/include/phone-dialer.h +++ b/lib/include/phone-dialer.h @@ -19,7 +19,7 @@ #include "phone-common.h" -#define MAX_DIAL_NUMBER_FONT_SIZE 98 +#define MAX_DIAL_NUMBER_FONT_SIZE 94 #define MIN_DIAL_NUMBER_FONT_SIZE 67 #define CURSOR_BEGIN -1 @@ -31,17 +31,22 @@ enum PH_DAILER_TYPES { PH_DAILER_EMERGENCY }; +enum { + CONTACT_DATA_CHAGNED = 1 << 0, + LOG_DATA_CHAGNED = 1 << 1, + SPEEDDIAL_DATA_CHAGNED = 1 << 2, +}; + +typedef enum { + MODE_DIAL_NUMBER = 0, + MODE_COUNTRY_CODE +} ListMode; + typedef enum { DASH_REAL = 0, DASH_PREVIEW } DashMode; -typedef enum { - MODE_P = 0, - MODE_ABC, - MODE_123 -} ButtonFunctionMode; - typedef struct _InputNumber { char num; @@ -50,33 +55,76 @@ typedef struct _InputNumber { } InputNumber; typedef struct { + bool alive; + bool success; + bool completed; + pthread_t thread; + Ecore_Pipe *epipe; +} ph_thread_info; + +typedef struct { Evas_Object *win; Evas_Object *layout; Evas_Object *entry; Evas_Object *navi; + Evas_Object *genlist; + Evas_Object *fast_index; + Evas_Object *count_button; + Evas_Object *count_layout; Evas_Object *popup; + Ecore_Timer *search_timer; Ecore_Timer *dash_timer; Ecore_Timer *longpress_timer; + Ecore_Timer *update_timer; + Ecore_Timer *slide_timer; Ecore_Job *job; - char *init_text; + Ecore_Idler *search_idler; char *longpress_source; + char *searched_text; InputNumber number_head; InputNumber *number_cursor; + int cur_mcc; + int cur_sim_mcc; + int cur_cc_index; + int roaming; int entry_font_size; + int count_button_status; int run_mode; + int compare_N; + int show_N; + int searched_speed_id; + int data_dirty_flag; + int touch_x; + int touch_y; + ListMode list_mode; + bool is_background; bool is_emergency; bool cursor_changed; + bool is_show_items; bool has_focus; bool initialized; + bool searching; + bool loading; + bool slide; + ph_thread_info *t_info; // load contact + Eina_List *search_list; + Eina_List *contact_list; + Eina_List *speeddial_list; + Eina_List *log_list; + Eina_List *cc_list; + Eina_List *cc_list_sorted; void *ug; + void *child_ug; Elm_Theme *th; }ph_dialer_data; -Evas_Object* phone_create_dialer_view(void *ug, Evas_Object *win, Evas_Object *parent); +Evas_Object* phone_create_dialer_view(ph_view_info *view_info); void phone_dialer_set_navi(Evas_Object *layout); void phone_dialer_check_focus(Evas_Object *base); void phone_dialer_view_reset(Evas_Object *base); void phone_dialer_view_resume(Evas_Object *base); +void phone_dialer_set_background(Evas_Object *obj, bool is_background); void phone_dialer_view_set_num(Evas_Object *layout, char *number); + #endif /* __PHONE_DIALER_H__ */ diff --git a/lib/include/phone-log.h b/lib/include/phone-log.h index f5b794b..2cd6b2e 100755 --- a/lib/include/phone-log.h +++ b/lib/include/phone-log.h @@ -24,20 +24,25 @@ enum { LOG_VIEW_TYPE_NORMAL = 0, LOG_VIEW_TYPE_NORMAL_CHECK, - LOG_VIEW_TYPE_VOICE_CALL, - LOG_VIEW_TYPE_CHECK, - LOG_VIEW_TYPE_SELECT, + LOG_VIEW_TYPE_UG_NUMBER_CHECK, + LOG_VIEW_TYPE_UG_NUMBER_SELECT, + LOG_VIEW_TYPE_UG_EMAIL_CHECK, + LOG_VIEW_TYPE_UG_EMAIL_SELECT, + LOG_VIEW_TYPE_UG_LAUNCH_CALL, }; enum{ LOG_FORMAT_TIME_12 = 0, LOG_FORMAT_TIME_24, LOG_FORMAT_DATE, - LOG_FORMAT_DATE_TIME_12, - LOG_FORMAT_DATE_TIME_24, LOG_FORMAT_MAX, }; +enum{ + LOG_SEGMENT_ALL_VIEW, + LOG_SEGMENT_MISSED_VIEW, +}; + typedef struct { Evas_Object *win; @@ -46,36 +51,45 @@ typedef struct Evas_Object *cbar; Evas_Object *genlist; Evas_Object *popup; + Evas_Object *content; Elm_Object_Item *navi_item; Elm_Object_Item *ctrl_item; Eina_List *log_list; + Eina_List *log_all_list; + Eina_List *log_missed_list; + int log_type; int view_type; int log_list_count; int pre_date_type;//for index int readed_n; int heynoti_fd; + int ug_request; Ecore_Idler *list_idler; Elm_Object_Item *git; + Elm_Object_Item *item_last_sweep; Ecore_Timer *timer; void *ug; void *child_ug; UDateFormat *formatter[LOG_FORMAT_MAX]; - bool is_background; Ecore_Timer *update_timer; + bool is_background; + bool logdetail_update; /* edit mode */ - Eina_Bool select_all_checked; + Evas_Object *select_all_layout; int cnt_checked; ph_progress_info *p_info; - Evas_Object *select_all_check; }ph_log_data; -Evas_Object *phone_create_log_view(void *ug, Evas_Object *win, Evas_Object *parent); +Evas_Object *phone_create_log_view(ph_view_info *view_info); void phone_log_views_update(Evas_Object *navi); void phone_log_missed_info_update(void *navi); void phone_log_view_reset(Evas_Object *layout); +void phone_log_view_resume(Evas_Object *layout); void phone_log_set_navi(Evas_Object *layout); void phone_log_set_background(Evas_Object *obj, bool is_background); +void phone_log_check_mode_start(ph_log_data *log_d); +void phone_log_seg_set(Evas_Object *layout, int log_seg_type); #endif //__PHONE_LOG_H__ diff --git a/lib/include/phone-path.h b/lib/include/phone-path.h index 636ae3c..4bf4ee3 100755 --- a/lib/include/phone-path.h +++ b/lib/include/phone-path.h @@ -18,31 +18,70 @@ #define __PHONE_PATH_H__ #if !defined(IMGDIR) -# define IMGDIR "/opt/ug/res/images/ug-"PACKAGE +# define IMGDIR "/usr/ug/res/images/ug-"PACKAGE #endif #if !defined(EDJDIR) -# define EDJDIR "/opt/ug/res/edje/ug-"PACKAGE +# define EDJDIR "/usr/ug/res/edje/ug-"PACKAGE #endif #if !defined(UGDATAIDR) -# define UGDATAIDR "/opt/data/ug-contacts" +# define UGDATAIDR "/opt/ug/data/ug-"PACKAGE #endif #define PROGRESS_EDJ EDJDIR"/progress.edj" #define DIALER_EDJ EDJDIR"/dialer.edj" +#define DIALER_THEME_EDJ EDJDIR"/dialer_theme.edj" +#define SPEEDDIAL_THEME_EDJ EDJDIR"/speeddial_theme.edj" +#define CONTACTS_EDJ EDJDIR"/contacts.edj" +#define FAVORITES_EDJ EDJDIR"/favorites.edj" +#define FAVORITES_THEME_EDJ EDJDIR"/favorites_theme.edj" +#define LIST_THEME_EDJ EDJDIR"/list_theme.edj" +#define DETAIL_THEME_EDJ EDJDIR"/detail_theme.edj" #define IMG_DEFAULT IMGDIR"/caller_ID_default_70x70_man.png" +#define IMG_VOICEMAIL_ICON IMGDIR"/04_textinput_dialer_icon_voice_mail.png" #define IMG_BLOCKED_64x64_ICON IMGDIR"/C01-4_icon_Blocked(Auto-rejected)_64x64.png" -#define IMG_DIALER_ICON IMGDIR"/01_controlbar_icon_dialer.png" -#define IMG_CONTACTS_ICON IMGDIR"/01_controlbar_icon_contacts.png" -#define IMG_LOGS_ICON IMGDIR"/01_controlbar_icon_logs.png" -#define IMG_FAVORITE_ICON IMGDIR"/01_controlbar_icon_favorite.png" -#define IMG_DELETE_ICON IMGDIR"/01_controlbar_icon_delete.png" -#define IMG_DONE_ICON IMGDIR"/01_controlbar_icon_save.png" -#define IMG_EDIT_ICON IMGDIR"/01_controlbar_icon_edit.png" -#define IMG_ADD_ICON IMGDIR"/01_controlbar_icon_create.png" +#define PH_IMG_ICON_DIALER IMGDIR"/01_controlbar_icon_dialer.png" +#define PH_IMG_ICON_CONTACTS IMGDIR"/01_controlbar_icon_contacts.png" +#define PH_IMG_ICON_LOGS IMGDIR"/01_controlbar_icon_logs.png" +#define PH_IMG_ICON_FAVORITE IMGDIR"/01_controlbar_icon_favorite.png" +#define PH_IMG_ICON_DELETE IMGDIR"/01_controlbar_icon_delete.png" +#define PH_IMG_ICON_DONE IMGDIR"/01_controlbar_icon_save.png" +#define PH_IMG_ICON_EDIT IMGDIR"/01_controlbar_icon_edit.png" +#define PH_IMG_ICON_ADD IMGDIR"/01_controlbar_icon_create.png" +#define PH_IMG_ICON_MORE IMGDIR"/01_controlbar_icon_more.png" +#define PH_IMG_ICON_PHONE IMGDIR"/phone.png" +#define PH_IMG_ICON_CALL IMGDIR"/C02_icon_call.png" +#define PH_IMG_ICON_CALL_DIM IMGDIR"/C01-4_btn_icon_call_dim.png" +#define PH_IMG_ICON_MESSAGE IMGDIR"/C02_icon_message.png" +#define PH_IMG_ICON_MESSAGE_DIM IMGDIR"/C01-4_btn_icon_message_dim.png" +#define PH_IMG_ICON_VIDEOCALL IMGDIR"/C02_icon_video_call.png" +#define PH_IMG_ICON_VIDEOCALL_DIM IMGDIR"/C01-4_btn_icon_video_call_dim.png" +#define PH_IMG_ICON_CHAT_ON IMGDIR"/C02_icon_chat_on.png" +#define PH_IMG_ICON_FILETRANSFER IMGDIR"/C02_icon_filetransfer.png" + +#define CTUI_IMG_ICON_ADD_FAVORITE IMGDIR"/01_controlbar_icon_add-to-bookmarks.png" +#define CTUI_IMG_ICON_ADD_TO_CONTACTS IMGDIR"/01_controlbar_icon_add_to_contact.png" +#define CTUI_IMG_ICON_CLOSE IMGDIR"/01_controlbar_icon_close.png" +#define CTUI_IMG_ICON_EXPAND_OPENED IMGDIR"/00_button_icon_expand_opened.png" +#define CTUI_IMG_ICON_EXPAND_CLOSED IMGDIR"/00_button_icon_expand_closed.png" +#define CTUI_IMG_ICON_VIEW IMGDIR"/01_controlbar_icon_bluetooth_preview.png" +#define CTUI_IMG_ICON_RESET IMGDIR"/C02_icon_reset.png" +#define CTUI_IMG_ICON_FAVORITE IMGDIR"/C02_icon_favorite.png" +#define CTUI_IMG_ICON_FAVORITE_ON IMGDIR"/C02_icon_favorite_on.png" + +#define CTUI_IMG_ICON_EMAIL IMGDIR"/email.png" +#define CTUI_IMG_ICON_MESSAGE IMGDIR"/message.png" + +#define CTUI_IMG_CHECK IMGDIR"/00_check_checking.png" +#define CTUI_IMG_DEFAULT_PHOTO_SMALL IMGDIR"/caller_ID_default_96x96.png" +#define CTUI_IMG_DEFAULT_PHOTO_BIG IMGDIR"/caller_ID_default_128x128.png" +#define CTUI_IMG_PHOTO_EDIT IMGDIR"/caller_ID_edit.png" + +#define CTUI_IMG_ACC_PHONE IMGDIR"/C02_account_00.png" +#define CTUI_IMG_ACC_DEFAULT IMGDIR"/C02_account_default.png" #endif //__PHONE_PATH_H__ diff --git a/lib/include/phone-speed.h b/lib/include/phone-speed.h new file mode 100755 index 0000000..0bdf959 --- /dev/null +++ b/lib/include/phone-speed.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 __PHONE_SPEED_H__ +#define __PHONE_SPEED_H__ + +#include "phone-common.h" + +Evas_Object *phone_create_speeddial_view(void *ug, Evas_Object *win, Evas_Object *navi); + +#endif //__PHONE_SPEED_H__ diff --git a/lib/include/phone-text.h b/lib/include/phone-text.h index fcf16e1..a81a818 100755 --- a/lib/include/phone-text.h +++ b/lib/include/phone-text.h @@ -19,46 +19,225 @@ #include <libintl.h> +#define gettext_noop(String) (String) +#define N_(String) gettext_noop (String) + enum { - PHTEXT_DIALER, + PHTEXT_KEYPAD, PHTEXT_FAVORITES, + PHTEXT_SPEEDDIAL, PHTEXT_VOICE_MAIL, PHTEXT_LOGS, + PHTEXT_SPEED_DIAL_REQUEST, PHTEXT_REQUEST_FAIL, PHTEXT_REQUEST_SUCCESS, PHTEXT_EMERGENCY_CALL, PHTEXT_NO_LOGS, PHTEXT_NO_FAVORITES, + PHTEXT_NOT_EXIST_MESSAGE, PHTEXT_EXCEED_NUM_MAX_LENGTH, PHTEXT_DELETING_LOGS, PHTEXT_DELETING_FAVORITES, PHTEXT_INITIALIZING, -}; + PHTEXT_SOUND_OFF, + PHTEXT_SOUND_ON, +}; //PH_GET_TEXT_BASIC + + +enum { + CTTEXT_ALL_CONTACTS, + CTTEXT_NOT_ASSIGNED, + CTTEXT_SDN, + CTTEXT_PHONE, + CTTEXT_GROUP, + CTTEXT_DEFAULT, + CTTEXT_RINGTONE, + CTTEXT_URL, + CTTEXT_INSTANT_MESSENGER, + CTTEXT_EMAIL, + CTTEXT_NUMBER, + CTTEXT_NOTE, + CTTEXT_POSTAL_ADDRESS, + CTTEXT_DETAILS, + CTTEXT_COMPANY, + CTTEXT_ORDER_DISPLAY_NAME, + CTTEXT_OWN_NUMBER, + CTTEXT_FIRSTNAME, + CTTEXT_LASTNAME, + CTTEXT_MIDDLE, + CTTEXT_SUFFIX, + CTTEXT_NICKNAME, + CTTEXT_SELECT_EXPORT_ADDRBOOK, + CTTEXT_SELECT_CONTACTS, + CTTEXT_POSTAL_CODE, + CTTEXT_COUNTRY, + CTTEXT_PROVINCE, + CTTEXT_CITY, + CTTEXT_STREET, + CTTEXT_SAVED_IN, + CTTEXT_MOST_FREQUENT_CONTACTS, + CTTEXT_COPIED, + CTTEXT_EXPORTED, + CTTEXT_DELETING_CONTACTS, + CTTEXT_MOVING_CONTACTS, + CTTEXT_COPYING_CONTACTS, + CTTEXT_IMPORTING_SIM_CONTACTS, + CTTEXT_IMPORTING_SD_CONTACTS, + CTTEXT_EXPORTING_CONTACTS_TO, + CTTEXT_VCARD_CONTACTS, + CTTEXT_LOADING_VCARD, + CTTEXT_IMPORTED, + CTTEXT_NA, + CTTEXT_ALL_LINKED_CONTACTS, + CTTEXT_LINKED_CONTACTS, + CTTEXT_MORE_INFORMATION, + CTTEXT_JOB_TITLE, + CTTEXT_DEPARTMENT, + CTTEXT_GROUP_NAME, + CTTEXT_ADD_ACCOUNT, + CTTEXT_ADDING_MEMBERS_TO_GROUP, + CTTEXT_VIEW, + CTTEXT_COUNT_CONTACTS, + CTTEXT_RENAME, + CTTEXT_RELATIONSHIP, + CTTEXT_NO_HISTORIES, + CTTEXT_NO_ACTIVITIES, + CTTEXT_ADDING_ING, + CTTEXT_CUSTOM, + CTTEXT_ADDITIONAL_INFO, + CTTEXT_PO_BOX, + CTTEXT_STATE, +}; //CT_GET_TEXT_BASIC + +enum { + CTTEXT_NONAME, + CTTEXT_INVALID_EMAIL, + CTTEXT_SAVE_FAIL, + CTTEXT_ERR_DB_LOCKED, + CTTEXT_ADD_FAIL_EXIST, + CTTEXT_ALREADY_EXIST, + CTTEXT_NO_GROUP, + CTTEXT_NO_NUMBER, + CTTEXT_NO_EMAIL, + CTTEXT_NO_CONTACTS, + CTTEXT_IMPORT_SIM_NO_DATA, + CTTEXT_EXCEED_LIMIT, + CTTEXT_DATA_NOT_EXIST, + CTTEXT_INVALID_NUMBER, +};//CT_GET_TEXT_ERR enum { PHTEXT_SELECT_LOGS, + PHTEXT_SELECT_SPEED_DIAL_CONTACTS, + PHTEXT_UNBLOCK, PHTEXT_CHANGE_CONTACT, -}; + PHTEXT_ADD_PAUSE, + PHTEXT_ADD_WAIT, + PHTEXT_MISSED, + PHTEXT_EXIT, +}; // PH_GET_TEXT_BASE_OP + +enum { + PHTEXT_BODY_SUNDAY, + PHTEXT_BODY_MONDAY, + PHTEXT_BODY_TUESDAY, + PHTEXT_BODY_WEDNESDAY, + PHTEXT_BODY_THURSDAY, + PHTEXT_BODY_FRIDAY, + PHTEXT_BODY_SATURDAY, +}; // PH_GET_TEXT_DAY + +enum { + CTTEXT_SET_DEFAULT_NUM, + CTTEXT_IMAGE, + CTTEXT_TAKE_A_PHOTO, + CTTEXT_DELETE_PHOTO, + CTTEXT_SAVE_CONTACT_TO, + CTTEXT_SAVE_TO, + CTTEXT_IMPORT_SIM_CONTACTS, + CTTEXT_FIRSTLAST, + CTTEXT_LASTFIRST, + CTTEXT_SEND_NAME_CARD, + CTTEXT_CONFIRM_DELETE_CONTACT, + CTTEXT_CREATE_GROUP, + CTTEXT_SELECT_GROUP, + CTTEXT_EXPORT_CONTACTS, + CTTEXT_IMPORT_CONTACTS, + CTTEXT_LINK_CONTACTS, + CTTEXT_UNLINK, + CTTEXT_ALL_LINKED_CONTACTS_WILL_BE_DELETED, +}; //CT_GET_TEXT_BASE_OP + +enum { + CTTEXT_REL_ASSISTANT, + CTTEXT_REL_BROTHER, + CTTEXT_REL_CHILD, + CTTEXT_REL_DOMESTIC_PARTNER, + CTTEXT_REL_FATHER, + CTTEXT_REL_FRIEND, + CTTEXT_REL_MANAGER, + CTTEXT_REL_MOTHER, + CTTEXT_REL_PARENT, + CTTEXT_REL_PARTNER, + CTTEXT_REL_REFERRED_BY, + CTTEXT_REL_RELATIVE, + CTTEXT_REL_SISTER, + CTTEXT_REL_SPOUSE, + CTTEXT_REL_CUSTOM, +}; //CT_GET_TEXT_RELATIONSHIP_TYPE enum { PH_GET_TEXT_BASIC, PH_GET_TEXT_BASE_OP, + PH_GET_TEXT_DAY, + CT_GET_TEXT_BASIC, + CT_GET_TEXT_ERR, + CT_GET_TEXT_BASE_OP, + CT_GET_TEXT_NUM_TYPE, + CT_GET_TEXT_EMAIL_TYPE, + CT_GET_TEXT_WEBSITE_TYPE, + CT_GET_TEXT_POSTAL_TYPE, + CT_GET_TEXT_EVENT_TYPE, + CT_GET_TEXT_IM_TYPE, + CT_GET_TEXT_MONTH, + CT_GET_TEXT_ACC_TYPE, + CT_GET_TEXT_RELATIONSHIP_TYPE, }; const char* phone_get_text(int op, int type); #define T_(op, type) phone_get_text(op, type) enum { PH_SYS_SK_OK, + CT_SYS_SK_SAVE, + CT_SYS_SK_DONE, PH_SYS_SK_EDIT, PH_SYS_SK_DELETE, PH_SYS_SK_CANCEL, + PH_SYS_SK3_BLOCK, + PH_SYS_SK_NO, + PH_SYS_SK_YES, PH_SYS_BODY_CALL, PH_SYS_BODY_MESSAGE, + PH_SYS_BODY_VIDEO_CALL, PH_SYS_BODY_UNKNOWN, PH_SYS_BODY_SELECT_ALL, PH_SYS_BODY_CONTACTS, PH_SYS_BODY_DETAILS, PH_SYS_BODY_REMOVE, + PH_SYS_BODY_TODAY, + PH_SYS_BODY_YESTERDAY, + PH_SYS_BODY_PREVIOUS, + PH_SYS_BODY_NONAME, + CT_SYS_BODY_CREATE, + CT_SYS_BODY_MOVE, + CT_SYS_BODY_COPY, + CT_SYS_BODY_PHONE, + CT_SYS_BODY_SEARCH, + CT_SYS_BODY_BLUETOOTH, + CT_SYS_BODY_EMAIL, + CT_SYS_BODY_SIM, + CT_SYS_BODY_MEMORYCARD, + PH_SYS_BODY_ALL, PH_SYS_POP_FAIL, PH_SYS_POP_FAILED, PH_SYS_POP_CLOSE, @@ -67,11 +246,16 @@ enum { PH_SYS_POP_INCORRECT_PASSWORD, PH_SYS_POP_ALREDY_EXISTS, PH_SYS_POP_SELECTED, + CT_SYS_POP_SUCCESS, + CT_SYS_POP_ERROR, + CT_SYS_POP_MOVED, + CT_SYS_POP_ADDED, + CT_SYS_POP_NOT_ENOUGH_MEMORY, + CT_SYS_POP_NOTHING_SELECTED, + CT_SYS_POP_FILE_NOT_FOUND, + CT_SYS_POP_ADDRESS, PH_SYS_OPT_ADD_TO_CONTACTS, - PH_SYS_BODY_TODAY, - PH_SYS_BODY_YESTERDAY, - PH_SYS_BODY_PREVIOUS, - PH_SYS_BODY_NONAME, + PH_SYS_BODY_SELECTED_DATA_NOT_FOUND, }; const char* phone_get_system_string(int type); diff --git a/lib/list/CMakeLists.txt b/lib/list/CMakeLists.txt new file mode 100755 index 0000000..b2e29d1 --- /dev/null +++ b/lib/list/CMakeLists.txt @@ -0,0 +1,18 @@ +LINK_DIRECTORIES(${CMAKE_BINARY_DIR}) + +SET(TARGET ${CT_LIST}) + +FILE(GLOB SRCS *.c) + +ADD_LIBRARY(${TARGET} SHARED ${SRCS}) +SET_TARGET_PROPERTIES(${TARGET} PROPERTIES SOVERSION ${VERSION_MAJOR}) +SET_TARGET_PROPERTIES(${TARGET} PROPERTIES VERSION ${VERSION}) + +SET_TARGET_PROPERTIES(${TARGET} PROPERTIES COMPILE_FLAGS ${EXTRA_CFLAGS}) +TARGET_LINK_LIBRARIES(${TARGET} ${COMMON_LIB} ${ug_pkgs_LDFLAGS} ${CT_DETAILS}) + +ADD_DEPENDENCIES(${TARGET} contacts_edj_build contacts_theme_build list_theme_edj_build) + +INSTALL(TARGETS ${TARGET} DESTINATION ${UGLIBDIR}) + +INSTALL(FILES ${CMAKE_BINARY_DIR}/lib/list/contacts-list-efl.xml DESTINATION "/usr/share/packages") diff --git a/lib/list/contacts-list-efl.xml b/lib/list/contacts-list-efl.xml new file mode 100644 index 0000000..fc1a2bc --- /dev/null +++ b/lib/list/contacts-list-efl.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns="http://tizen.org/ns/packages" package="contacts-list-efl" version="0.1.0-0" install-location="internal-only"> + <label>contacts-list-efl</label> + <author email="ensung.park@samsung.com" href="www.samsung.com">ensung park</author> + <description>contacts-list-efl Application</description> + <ui-application appid="contacts-list-efl" exec="/opt/ug/bin/contacts-list-efl" nodisplay="true" multiple="true" type="capp" taskmanage="false"> + <icon>org.tizen.contacts.png</icon> + <label>Contacts</label> + <label xml:lang="en-us">Contacts</label> + <label xml:lang="nl-nl">Contacten</label> + <label xml:lang="de-de">Kontakte</label> + <label xml:lang="en-gb">Contacts</label> + <label xml:lang="zh-hk">聯絡人</label> + <label xml:lang="zh-cn">联系人</label> + <label xml:lang="ru-ru">Контакты</label> + <label xml:lang="zh-tw">聯絡人</label> + <label xml:lang="ja-jp">電話帳</label> + <label xml:lang="es-es">Contacts</label> + <label xml:lang="el-gr">Επαφές</label> + <label xml:lang="it-it">Rubrica</label> + <label xml:lang="tr-tr">Rehber</label> + <label xml:lang="pt-pt">Contactos</label> + <label xml:lang="fr-fr">Contacts</label> + <label xml:lang="ko-kr">전화번호부</label> + <application-service> + <operation name="http://tizen.org/ns/packages"/> + </application-service> + </ui-application> +</manifest> diff --git a/lib/list/ct-list-contact-view.c b/lib/list/ct-list-contact-view.c new file mode 100755 index 0000000..2d4166e --- /dev/null +++ b/lib/list/ct-list-contact-view.c @@ -0,0 +1,359 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define _GNU_SOURCE +#include <string.h> +#include <pthread.h> +#include <ui-gadget-module.h> + +#include "phone.h" +#include "ct-detail.h" +#include "ct-list.h" +#include "ct-list-utils.h" +#include "ct-list-view-ug.h" +#include "ct-list-edit-view.h" +#include "ct-list-contact-view.h" + +API void ctui_list_new_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_list_data *clist_d = data; + ct_detail_data *cdetail_d; + ph_view_info *view_info; + + switch (clist_d->ug_request) + { + //case PH_UG_REQUEST_SET_WITH_NUM: + //case PH_UG_REQUEST_SET_WITH_EMAIL: + //case PH_UG_REQUEST_SET_WITH_WEB: + case PH_UG_REQUEST_SET_WITH_IMG: + case PH_UG_REQUEST_SET_WITH_RINGTONE: + case CT_UG_REQUEST_UPDATE_WITH_NUM: + case CT_UG_REQUEST_UPDATE_WITH_EMAIL: + case CT_UG_REQUEST_UPDATE_WITH_WEB: + case CT_UG_REQUEST_SAVE_IMG: + case CT_UG_REQUEST_SAVE_RINGTONE: + view_info = calloc(1, sizeof(ph_view_info)); + phone_set_view_info(view_info, clist_d->win, clist_d->navi, clist_d->ug, clist_d->ug_request, clist_d->cnt_max, clist_d->ug_data); + ctui_list_update_with_data(view_info, clist_d, 0, clist_d->base_grp, clist_d->base_ab); + free(view_info); + break; + default: + cdetail_d = calloc(1, sizeof(ct_detail_data)); + p_retm_if(!cdetail_d, "cdetail_d is NULL, Not enough memory"); + + ctui_ld_to_dd(clist_d, cdetail_d); + cdetail_d->base_ab_mode = CTS_ADDRESSBOOK_MODE_NONE; + cdetail_d->base_ab_name = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_PHONE)); + ctui_create_input_view(cdetail_d); + + break; + } +} + +static void list_cbar_update(void *data) +{ + Elm_Object_Item *edit_item; + Elm_Object_Item *new_item; + Elm_Object_Item *add_item; + Elm_Object_Item *null_item; + + ct_list_data *clist_d = data; + p_retm_if(NULL == clist_d, "parameter(clist_d) is NULL"); + + new_item = evas_object_data_get(clist_d->cbar, "new_item"); + edit_item = evas_object_data_get(clist_d->cbar, "edit_item"); + + if (!clist_d->ug) { + if (NULL == clist_d->list && edit_item) { + elm_object_item_del(edit_item); + evas_object_data_del(clist_d->cbar, "edit_item"); + phone_toolbar_disabled_item_append(clist_d->cbar, 1); + } + else if (clist_d->list && NULL == edit_item) { + add_item = evas_object_data_get(clist_d->cbar, "add_item"); + p_retm_if(NULL == add_item, "evas_object_data_get() return NULL"); + null_item = elm_toolbar_item_next_get(add_item); + if (null_item) + elm_object_item_del(null_item); + null_item = elm_toolbar_last_item_get(clist_d->cbar); + if (null_item) { + edit_item = elm_toolbar_item_insert_before(clist_d->cbar, null_item, PH_IMG_ICON_EDIT, NULL, ct_list_edit_button_cb, clist_d); + evas_object_data_set(clist_d->cbar, "edit_item", edit_item); + } + } + + } +} + +static void list_make_cbar(ct_list_data *clist_d) +{ + Evas_Object *l_btn; + Elm_Object_Item *item; + + if (NULL == clist_d->list_cbar_update_fn) + clist_d->list_cbar_update_fn = list_cbar_update; + + // FIXME : should be rearragned accoring to new UX + if (CT_GET_LIST_VCARD == clist_d->list_op) { + l_btn = elm_button_add(clist_d->navi); + p_retm_if(NULL == l_btn, "elm_button_add() return NULL"); + + elm_object_style_set(l_btn, "naviframe/back_btn/default"); + evas_object_smart_callback_add(l_btn, "clicked", phone_back_btn_clicked_cb, clist_d->win); + elm_object_item_part_content_set(clist_d->navi_item, "prev_btn", l_btn); + } + else if (clist_d->navi_item != elm_naviframe_bottom_item_get(clist_d->navi)) { + l_btn = elm_button_add(clist_d->navi); + elm_object_style_set(l_btn, "naviframe/back_btn/default"); + evas_object_smart_callback_add(l_btn, "clicked", phone_view_back_btn_cb, clist_d->navi); + elm_object_item_part_content_set(clist_d->navi_item, "prev_btn", l_btn); + } + else if (clist_d->ug && (PH_UG_REQUEST_LAUNCH_VOICECALL == clist_d->ug_request || + CT_UG_REQUEST_LIST == clist_d->ug_request)) { + l_btn = phone_create_navi_btn(clist_d->navi, S_(PH_SYS_SK_CANCEL)); + evas_object_smart_callback_add(l_btn, "clicked", phone_ug_destroy_me_cb, clist_d->ug); + elm_object_item_part_content_set(clist_d->navi_item, "prev_btn", l_btn); + } + else { + /* create button */ + item = elm_toolbar_item_append(clist_d->cbar, CTUI_IMG_ICON_ADD_TO_CONTACTS, NULL, ctui_list_new_btn_clicked_cb, clist_d); + evas_object_data_set(clist_d->cbar, "new_item", item); + + /* edit, view button */ + if (!clist_d->ug) { + if (clist_d->list) { + item = elm_toolbar_item_append(clist_d->cbar, PH_IMG_ICON_EDIT, NULL, ct_list_edit_button_cb, clist_d); + evas_object_data_set(clist_d->cbar, "edit_item", item); + } + } + else + phone_toolbar_disabled_item_append(clist_d->cbar, 3); + + /* back or cancel button */ + if (NULL == clist_d->ug || clist_d->ug_request < CT_UG_REQUEST_SELECT_CONTACT) { + l_btn = elm_button_add(clist_d->navi); + p_retm_if(NULL == l_btn, "elm_button_add() return NULL"); + + elm_object_style_set(l_btn, "naviframe/back_btn/default"); + if (clist_d->ug_request) { + evas_object_smart_callback_add(l_btn, "clicked", phone_ug_destroy_me_cb, clist_d->ug); + phone_toolbar_disabled_item_append(clist_d->cbar, 1); + } + else + evas_object_smart_callback_add(l_btn, "clicked", phone_back_btn_clicked_cb, clist_d->win); + elm_object_item_part_content_set(clist_d->navi_item, "prev_btn", l_btn); + } + else { + l_btn = phone_create_navi_btn(clist_d->navi, S_(PH_SYS_SK_CANCEL)); + evas_object_smart_callback_add(l_btn, "clicked", phone_ug_destroy_me_cb, clist_d->ug); + elm_object_item_part_content_set(clist_d->navi_item, "prev_btn", l_btn); + } + } +} + +static Evas_Object* list_gl_icon_get(void *data, Evas_Object *obj, + const char *part) +{ + ct_contact_list* ct_info = data; + ct_list_data *clist_d = evas_object_data_get(obj, "clist_d"); + + p_retvm_if(NULL == ct_info, NULL, "ct_info is NULL"); + + if (strcmp(part, "elm.slide.swallow.1") == 0) { + Evas_Object *btn; + + if (NULL == ct_info->number || '\0' == *ct_info->number) { + btn = phone_create_list_sweep_btn(obj, PH_IMG_ICON_DELETE); + p_retvm_if(NULL == btn, NULL, "phone_create_list_sweep_btn() return NULL"); + + evas_object_data_set(btn, "clist_d", clist_d); + evas_object_smart_callback_add(btn, "clicked", ct_list_sweep_del_cb, + (void *)ct_info->id); + if (0 == ct_info->id || 0 == ct_info->id_person) + elm_object_disabled_set(btn, EINA_TRUE); + } + else { + btn = phone_create_list_sweep_btn(obj, PH_IMG_ICON_CALL); + p_retvm_if(NULL == btn, NULL, "phone_create_list_sweep_btn() return NULL"); + + if(clist_d->ug) + evas_object_smart_callback_add(btn, "clicked", NULL, ct_info); + else + evas_object_smart_callback_add(btn, "clicked", ct_list_call, ct_info); + + } + + return btn; + } + else if (strcmp(part, "elm.slide.swallow.2") == 0) { + Evas_Object *btn; + + if (NULL == ct_info->number || '\0' == *ct_info->number) + return NULL; + + btn = phone_create_list_sweep_btn(obj, PH_IMG_ICON_MESSAGE); + p_retvm_if(NULL == btn, NULL, "phone_create_list_sweep_btn() return NULL"); + + evas_object_data_set(btn, "clist_d", clist_d); + + if(clist_d->ug) + evas_object_smart_callback_add(btn, "clicked", NULL, ct_info); + else + evas_object_smart_callback_add(btn, "clicked", ct_list_msg, ct_info); + + + return btn; + } + else if (strcmp(part, "elm.slide.swallow.3") == 0) { + Evas_Object *btn; + + btn = phone_create_list_sweep_btn(obj, PH_IMG_ICON_VIDEOCALL); + p_retvm_if(NULL == btn, NULL, "phone_create_list_sweep_btn() return NULL"); + + elm_object_disabled_set(btn, EINA_TRUE); + + return btn; + } + else if (strcmp(part, "elm.slide.swallow.4") == 0) { + Evas_Object *btn; + + btn = phone_create_list_sweep_btn(obj, PH_IMG_ICON_DELETE); + p_retvm_if(NULL == btn, NULL, "phone_create_list_sweep_btn() return NULL"); + + evas_object_data_set(btn, "clist_d", clist_d); + evas_object_smart_callback_add(btn, "clicked", ct_list_sweep_del_cb, + (void *)ct_info->id); + + if (0 == ct_info->id || 0 == ct_info->id_person) + elm_object_disabled_set(btn, EINA_TRUE); + + return btn; + } + else if (0 == strcmp(part, "elm.icon.1")) { + const char *path; + Evas_Object *icon; + + if (!ct_info->img_loaded) { + contacts_svc_get_image(CTS_IMG_NORMAL, ct_info->id, &ct_info->img_path); + ct_info->img_loaded = true; + } + + path = ct_info->img_path; + if (NULL == path) return NULL; + + icon = elm_icon_add(obj); + if (icon) { + elm_icon_prescale_set(icon, CT_LIST_ICON_SIZE); + elm_icon_file_set(icon, path, NULL); + evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + evas_object_show(icon); + } + return icon; + } + else if (0 == strcmp(part, "elm.edit.icon.1")) { + Evas_Object *check; + check = ct_list_edit_add_check(obj, &ct_info->checked, clist_d); + p_retvm_if(NULL == check, NULL, "ct_list_edit_add_check() return NULL"); + evas_object_data_set(check, "ct_info", ct_info); + return check; + } + return NULL; +} + +static void list_create_itcs(ct_list_data *clist_d) +{ + clist_d->itcs[0].item_style = "link_list"; + clist_d->itcs[0].decorate_item_style = "mode/slide4"; + clist_d->itcs[0].func.text_get = ct_list_gl_label_get; + clist_d->itcs[0].func.content_get = list_gl_icon_get; + clist_d->itcs[0].decorate_all_item_style = "edit_default"; + + clist_d->itcs[1].item_style = "link_list"; + clist_d->itcs[1].decorate_item_style = "mode/slide"; + clist_d->itcs[1].func.text_get = ct_list_gl_label_get; + clist_d->itcs[1].func.content_get = list_gl_icon_get; + clist_d->itcs[1].decorate_all_item_style = "edit_default"; + + clist_d->itcs[2].item_style = "link_list.tb"; + clist_d->itcs[2].decorate_item_style = "mode/slide4"; + clist_d->itcs[2].func.text_get = ct_list_gl_label_get; + clist_d->itcs[2].func.content_get = list_gl_icon_get; + clist_d->itcs[2].decorate_all_item_style = "edit_default"; + + clist_d->itcs[3].item_style = "link_list.tb"; + clist_d->itcs[3].decorate_item_style = "mode/slide"; + clist_d->itcs[3].func.text_get = ct_list_gl_label_get; + clist_d->itcs[3].func.content_get = list_gl_icon_get; + clist_d->itcs[3].decorate_all_item_style = "edit_default"; + + clist_d->itcs[4].item_style= "1text_center"; + clist_d->itcs[4].func.text_get = ct_list_count_gl_label_get; +} + +API void ctui_list_navi_set(int mode, ct_list_data *clist_d) +{ + clist_d->cbar = elm_object_item_part_content_get(clist_d->navi_item, "controlbar"); + if (NULL == clist_d->cbar) { + clist_d->cbar = elm_toolbar_add(clist_d->navi); + p_retm_if(NULL == clist_d->cbar, "elm_toolbar_add() return NULL"); + elm_toolbar_shrink_mode_set(clist_d->cbar, ELM_TOOLBAR_SHRINK_EXPAND); + elm_object_item_part_content_set(clist_d->navi_item, "controlbar", clist_d->cbar); + } + else { + evas_object_data_del(clist_d->cbar, "done_item"); + evas_object_data_del(clist_d->cbar, "edit_item"); + evas_object_data_del(clist_d->cbar, "new_item"); + evas_object_data_del(clist_d->cbar, "delete_item"); + evas_object_data_del(clist_d->cbar, "share_item"); + evas_object_data_del(clist_d->cbar, "add_item"); + phone_cbar_item_clear(clist_d->cbar); + } + + switch (mode) { + case CT_LIST_MODE_DEFAULT: + list_make_cbar(clist_d); + break; + case CT_LIST_MODE_EDIT: + ct_list_edit_make_edit_cbar(clist_d); + if (!clist_d->gadd_mode) + ctui_cbar_btn_disabled_set(clist_d->cbar, EINA_TRUE); + break; + default: + return; + } +} + +Evas_Object* ct_list_create_contact_view(ct_list_data *clist_d) +{ + PH_FN_CALL; + list_create_itcs(clist_d); + clist_d->gl_sel = ct_list_ug_gl_sel; + clist_d->gl_sel_data = clist_d; + clist_d->edit_sel_update = ct_list_edit_update_selection_info; + return ct_list_create_contact_layout(clist_d); +} + +API void ctui_list_set_search_text(ct_list_data *clist_d, const char *text) +{ + p_retm_if(!clist_d, "clist_d is NULL"); + if (clist_d->searchbar) { + Evas_Object *en; + en = elm_object_part_content_get(clist_d->searchbar, "elm.swallow.content"); + elm_entry_entry_set(en, text); + } +} + + diff --git a/lib/list/ct-list-contact-view.h b/lib/list/ct-list-contact-view.h new file mode 100755 index 0000000..a500370 --- /dev/null +++ b/lib/list/ct-list-contact-view.h @@ -0,0 +1,22 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CONTACTS_LIST_CONTACT_VIEW_H__ +#define __CONTACTS_LIST_CONTACT_VIEW_H__ + +Evas_Object* ct_list_create_contact_view(ct_list_data *clist_d); + +#endif //__CONTACTS_LIST_CONTACT_VIEW_H__ diff --git a/lib/list/ct-list-edit-view.c b/lib/list/ct-list-edit-view.c new file mode 100755 index 0000000..7e3f392 --- /dev/null +++ b/lib/list/ct-list-edit-view.c @@ -0,0 +1,562 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <pthread.h> +#include <ui-gadget-module.h> +#include <app.h> +#include <fcntl.h> + +#include "phone.h" +#include "ct-list.h" +#include "ct-list-utils.h" +#include "ct-list-view-ug.h" +#include "ct-list-contact-view.h" + +#define TIMER_DURATION 0.2 + +static inline void list_edit_realized_items_checked_set(Evas_Object *genlist, + Eina_Bool checked) +{ + Elm_Object_Item *item; + + item = elm_genlist_first_item_get(genlist); + while (item) { + ct_contact_list *info = elm_object_item_data_get(item); + Elm_Genlist_Item_Type type = elm_genlist_item_type_get(item); + item = elm_genlist_item_next_get(item); + if (ELM_GENLIST_ITEM_GROUP == type) continue; + if (NULL == info) { + ERR("elm_object_item_data_get() return NULL"); + continue; + } + info->checked = checked; + } + elm_genlist_realized_items_update(genlist); +} + +static inline void list_edit_all_items_checked_set(Eina_List *list, + Eina_Bool checked) +{ + Eina_List *l; + ct_contact_list *info; + + EINA_LIST_FOREACH(list, l, info) { + if (NULL == info) { + ERR("elm_object_item_data_get() return NULL"); + continue; + } + info->checked = checked; + } +} + +void ct_list_edit_mode_end(ct_list_data *clist_d) +{ + Evas_Object *en; + char buf[PH_TEXT_SHORT_LEN]; + + clist_d->list_mode = CT_LIST_MODE_DEFAULT; + ct_list_clear_pdata(clist_d); + + if (clist_d->select_all_layout) { + elm_box_unpack(clist_d->box, clist_d->select_all_layout); + evas_object_del(clist_d->select_all_layout); + clist_d->select_all_layout = NULL; + } + clist_d->cnt_checked = 0; + list_edit_all_items_checked_set(clist_d->list, EINA_FALSE); + + if (NULL == clist_d->count_item && clist_d->cnt_total) { + clist_d->count_item = elm_genlist_item_append(clist_d->genlist, &clist_d->itcs[4], (void *)clist_d->cnt_total, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_object_item_disabled_set(clist_d->count_item, EINA_TRUE); + } + + elm_genlist_decorate_mode_set(clist_d->genlist, EINA_FALSE); + ctui_list_navi_set(CT_LIST_MODE_DEFAULT, clist_d); + + if(CT_LIST_IN_MULTI_TAB != clist_d->tab_mode && CT_UG_REQUEST_SELECT_CONTACT <= clist_d->ug_request) { + snprintf(buf, sizeof(buf), "%s (%d)", clist_d->title, clist_d->cnt_list); + elm_object_item_text_set(clist_d->navi_item, buf); + } + + en = elm_object_part_content_get(clist_d->searchbar, "elm.swallow.content"); + elm_entry_entry_set(en, NULL); + + phone_hide_notify(clist_d->navi); +} + +static void list_edit_cancel_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_list_data *clist_d = data; + ct_list_edit_mode_end(clist_d); +} + +static PTHREAD_FN list_edit_del_contacts(void *data) +{ + Elm_Object_Item *item; + ct_list_data *clist_d = data; + ph_progress_info *p_info = clist_d->p_info; + + item = elm_genlist_first_item_get(clist_d->genlist); + while (item) { + ct_contact_list *info; + Elm_Genlist_Item_Type type; + + if (!p_info->alive) { + p_info->result = FALSE; + break; + } + type = elm_genlist_item_type_get(item); + info = elm_object_item_data_get(item); + if (info && info->checked && ELM_GENLIST_ITEM_GROUP != type) { + int ret; + int person_id = ctui_get_person_id(info->id); + ret = contacts_svc_delete_person(person_id); + + if (CTS_SUCCESS != ret) { + p_info->result = FALSE; + p_info->completed = true; + break; + } + if (++p_info->cnt == p_info->cnt_checked_total) + break; + } + + item = elm_genlist_item_next_get(item); + } + pthread_exit(NULL); +} + +static void list_edit_process_end(void *data) +{ + ct_list_data *clist_d = data; + ph_progress_info *p_info = clist_d->p_info; + + clist_d->p_info = NULL; + + if (p_info->result) + ct_list_edit_mode_end(clist_d); + + free(p_info); +} + +static Eina_Bool list_edit_del_timer_cb(void *data) +{ + ct_list_data *clist_d = data; + ph_progress_info *p_info = clist_d->p_info; + + p_retvm_if(NULL == p_info, ECORE_CALLBACK_CANCEL, "parameter(clist_d) is NULL"); + + if (!p_info->completed) { + char count[PH_TEXT_SHORT_LEN]; + char percent[PH_TEXT_SHORT_LEN]; + double value = (double)p_info->cnt / (double)p_info->cnt_checked_total; + + if (!p_info->alive) { + p_info->result = FALSE; + p_info->completed = true; + return ECORE_CALLBACK_RENEW; + } + + elm_progressbar_value_set(p_info->progressbar, value); + snprintf(percent, sizeof(percent), "%d%%", (int)(100.0 * (double)p_info->cnt/(double)p_info->cnt_checked_total)); + snprintf(count, sizeof(count), "%d/%d", p_info->cnt, p_info->cnt_checked_total); + edje_object_part_text_set(elm_layout_edje_get(p_info->layout), "elm.text.subtext1", percent); + edje_object_part_text_set(elm_layout_edje_get(p_info->layout), "elm.text.subtext2", count); + + if (p_info->cnt == p_info->cnt_checked_total) + p_info->completed = true; + + return ECORE_CALLBACK_RENEW; + } + else { + int ret; + + pthread_join(p_info->thread, NULL); + + if (clist_d->popup) { + evas_object_del(clist_d->popup); + clist_d->popup = NULL; + } + + if (TRUE == p_info->result) { + ret = contacts_svc_end_trans(true); + phone_show_tickernoti(S_(PH_SYS_POP_DELETED)); + } + else { + ret = contacts_svc_end_trans(false); + phone_show_tickernoti(S_(PH_SYS_POP_FAILED)); + } + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); + list_edit_process_end(clist_d); + + return ECORE_CALLBACK_CANCEL; + } +} + +static void list_edit_del_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + ct_list_data *clist_d = data; + ph_progress_info *p_info; + + p_info = calloc(1, sizeof(ph_progress_info)); + p_retm_if(NULL == p_info, "calloc return NULL"); + + clist_d->p_info = p_info; + p_info->cnt_checked_total = clist_d->cnt_checked; + p_info->alive = true; + p_info->result = TRUE; + + ret = contacts_svc_begin_trans(); + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_begin_trans() Failed(%d)", ret); + free(p_info); + clist_d->p_info = NULL; + return; + } + + ret = pthread_create(&p_info->thread, NULL, list_edit_del_contacts, clist_d); + if (0 != ret) { + ERR("Thread creation failed(%d)", ret); + free(p_info); + clist_d->p_info = NULL; + + ret = contacts_svc_end_trans(false); + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); + + return; + } + + p_info->timer = ecore_timer_add(TIMER_DURATION, list_edit_del_timer_cb, clist_d); + if (NULL == p_info->timer) { + ERR("ecore_timer_add() return NULL"); + + p_info->alive = false; + pthread_join(p_info->thread, NULL); + + free(p_info); + clist_d->p_info = NULL; + + ret = contacts_svc_end_trans(false); + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); + + return; + } + + clist_d->popup = phone_progressbar_popup(clist_d->win, p_info, T_(CT_GET_TEXT_BASIC, CTTEXT_DELETING_CONTACTS)); +} + +struct list_ginfo{ + int id_grp; + int id_ab; +}; + +static int list_edit_checked_cnt_get(Eina_List *list) { + int cnt = 0; + Eina_List *l; + ct_contact_list *contact; + + EINA_LIST_FOREACH(list, l, contact) { + if (NULL == contact) continue; + if (contact->checked) + cnt++; + } + return cnt; +} + +static void list_edit_check_done(void *data, Evas_Object *obj, void *event_info) +{ + int i = 0; + int cnt_checked; + int *list_result; + Eina_List *l; + ct_contact_list *contact; + ct_list_data *clist_d = data; + + // called by setting - import contacts (list - vcard contacts) + if (CT_GET_LIST_VCARD == clist_d->list_op) { + clist_d->select_result_cb(clist_d->select_result_cb_data, NULL, 0); + phone_hide_notify(clist_d->navi); + return; + } + cnt_checked = list_edit_checked_cnt_get(clist_d->list); + + list_result = calloc(cnt_checked, sizeof(int)); + EINA_LIST_FOREACH(clist_d->list, l, contact) { + if (NULL == contact || !contact->checked) continue; + + if (CT_UG_REQUEST_CHECK_FOR_NUMBER == clist_d->ug_request) + list_result[i++] = contact->id_ret; + else if (CT_UG_REQUEST_CHECK_FOR_EMAIL == clist_d->ug_request) + list_result[i++] = contact->id_ret; + else + list_result[i++] = contact->id; + } + + // setting - import,export + if (clist_d->select_result_cb) { // called by setting view - check contact + if (0 < cnt_checked) { + clist_d->select_result_cb(clist_d->select_result_cb_data, list_result, cnt_checked); + phone_hide_notify(clist_d->navi); + } + elm_naviframe_item_pop(clist_d->navi); + return; + } + + if (clist_d->contact_add_cb) { // called by favorite view - check contact + if (0 < cnt_checked) { + clist_d->contact_add_cb(clist_d->win, clist_d->navi, cnt_checked); + phone_hide_notify(clist_d->navi); + } + else + elm_naviframe_item_pop_to(evas_object_data_get(clist_d->navi, "navi_it_pop_to")); + return; + } + + if (CT_UG_REQUEST_CHECK_FOR_NUMBER == clist_d->ug_request) + phone_list_ug_return_ids(clist_d->ug, list_result, cnt_checked, CT_UG_BUNDLE_RESULT_NUMBER_ID_LIST); + else if (CT_UG_REQUEST_CHECK_FOR_EMAIL == clist_d->ug_request) + phone_list_ug_return_ids(clist_d->ug, list_result, cnt_checked, CT_UG_BUNDLE_RESULT_EMAIL_ID_LIST); + else + phone_list_ug_return_ids(clist_d->ug, list_result, cnt_checked, CT_UG_BUNDLE_RESULT_CONTACT_ID_LIST); + + free(list_result); + ug_destroy_me(clist_d->ug); +} + +static void list_gadd_view_cancel_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + evas_object_smart_callback_del(obj, "clicked", list_gadd_view_cancel_btn_cb); + phone_hide_notify(data); + elm_naviframe_item_pop_to(evas_object_data_get(data, "navi_it_pop_to")); +} + +void ct_list_edit_make_edit_cbar(ct_list_data *clist_d) +{ + Elm_Object_Item *delete_item = NULL; + Elm_Object_Item *done_item = NULL; + Evas_Object *l_btn; + + if (CT_UG_REQUEST_CHECK == clist_d->ug_request || + CT_UG_REQUEST_CHECK_FOR_NUMBER == clist_d->ug_request || + CT_UG_REQUEST_CHECK_FOR_EMAIL == clist_d->ug_request) { + done_item = elm_toolbar_item_append(clist_d->cbar, PH_IMG_ICON_DONE, NULL, list_edit_check_done, clist_d); + evas_object_data_set(clist_d->cbar, "done_item", done_item); + phone_toolbar_disabled_item_append(clist_d->cbar, 3); + + if (clist_d->navi_item != elm_naviframe_bottom_item_get(clist_d->navi)) { // setting view : CHECK MODE + if (clist_d->select_result_cb || clist_d->ug) { + l_btn = elm_button_add(clist_d->navi); + elm_object_style_set(l_btn, "naviframe/back_btn/default"); + evas_object_smart_callback_add(l_btn, "clicked", phone_view_back_btn_cb, clist_d->navi); + } + else { + l_btn = phone_create_navi_btn(clist_d->navi, S_(PH_SYS_SK_CANCEL)); + evas_object_smart_callback_add(l_btn, "clicked", list_gadd_view_cancel_btn_cb, clist_d->navi); + } + } + else { // check UG + l_btn = phone_create_navi_btn(clist_d->navi, S_(PH_SYS_SK_CANCEL)); + evas_object_smart_callback_add(l_btn, "clicked", phone_ug_destroy_me_cb, clist_d->ug); + } + elm_object_item_part_content_set(clist_d->navi_item, "prev_btn", l_btn); + } + else if (!clist_d->ug) { + // do not display del button + if (clist_d->navi_item == elm_naviframe_bottom_item_get(clist_d->navi) || clist_d->base_grp) { + delete_item = elm_toolbar_item_append(clist_d->cbar, PH_IMG_ICON_DELETE, NULL, list_edit_del_cb, clist_d); + evas_object_data_set(clist_d->cbar, "delete_item", delete_item); + phone_toolbar_disabled_item_append(clist_d->cbar, 1); + } + + if (delete_item) + phone_toolbar_disabled_item_append(clist_d->cbar, 2); + else + phone_toolbar_disabled_item_append(clist_d->cbar, 3); + + l_btn = phone_create_navi_btn(clist_d->navi, S_(PH_SYS_SK_CANCEL)); + evas_object_smart_callback_add(l_btn, "clicked", list_edit_cancel_cb, clist_d); + elm_object_item_part_content_set(clist_d->navi_item, "prev_btn", l_btn); + } +} + +void ct_list_edit_update_selection_info(void *data) +{ + ct_list_data *clist_d = data; + int checked_cnt = 0; + char buf[PH_TEXT_SHORT_LEN]; + + if (clist_d->ug_request && NULL == clist_d->select_all_layout) { + checked_cnt = list_edit_checked_cnt_get(clist_d->list); + } + else { + Evas_Object *check = elm_object_part_content_get(clist_d->select_all_layout, "elm.icon"); + p_retm_if(NULL == check, "elm_object_part_content_get() return NULL"); + + if (0 != clist_d->cnt_total && clist_d->cnt_checked == clist_d->cnt_total) + elm_check_state_set(check, EINA_TRUE); + else if (0 == clist_d->cnt_total || clist_d->cnt_checked != clist_d->cnt_total) + elm_check_state_set(check, EINA_FALSE); + checked_cnt = clist_d->cnt_checked; + } + + if (0 == checked_cnt) { + phone_show_notify(clist_d->navi, T_(CT_GET_TEXT_BASIC, CTTEXT_SELECT_CONTACTS)); + if (!clist_d->gadd_mode) + ctui_cbar_btn_disabled_set(clist_d->cbar, EINA_TRUE); + } + else { + ctui_cbar_btn_disabled_set(clist_d->cbar, EINA_FALSE); + if (clist_d->cnt_max) + snprintf(buf, sizeof(buf), "%s (%d/%d)", S_(PH_SYS_POP_SELECTED), clist_d->cnt_checked, clist_d->cnt_max); + else + snprintf(buf, sizeof(buf), "%s (%d)", S_(PH_SYS_POP_SELECTED), clist_d->cnt_checked); + phone_show_notify(clist_d->navi, buf); + } +} + +static void list_edit_select_all(void *data, Eina_Bool checked) +{ + ct_list_data *clist_d = data; + + list_edit_realized_items_checked_set(clist_d->genlist, checked); + elm_genlist_realized_items_update(clist_d->genlist); + + if (checked) + clist_d->cnt_checked = clist_d->cnt_total; + else + clist_d->cnt_checked = 0; + + ct_list_edit_update_selection_info(clist_d); +} + +void ct_list_item_checked_set(Elm_Object_Item *item, ct_list_data *clist_d) +{ + ct_contact_list *contact = elm_object_item_data_get(item); + p_retm_if(NULL == contact, "elm_object_item_data_get() returns NULL"); + + if (contact->checked) { + if (clist_d->cnt_max) { + if (clist_d->cnt_max <= clist_d->cnt_checked) { + phone_show_popup(clist_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_EXCEED_LIMIT), 2.0); + contact->checked = EINA_FALSE; + return; + } + } + clist_d->cnt_checked++; + } + else + clist_d->cnt_checked--; + elm_genlist_item_fields_update(item, "elm.edit.icon.1", ELM_GENLIST_ITEM_FIELD_CONTENT); +} + +static void list_edit_item_check_cb(void *data, Evas_Object *obj, + void *event_info) +{ + Elm_Object_Item *item; + ct_contact_list *ct_info; + ct_list_data *clist_d = data; + + ct_info = evas_object_data_get(obj, "ct_info"); + p_retm_if(NULL == ct_info, "evas_object_data_get() return NULL"); + + item = ct_info->item; + p_retm_if(NULL == item, "ct_info->item is NULL"); + + ct_list_item_checked_set(ct_info->item, clist_d); + if (!ct_info->checked) { + ct_list_edit_update_selection_info(clist_d); + return; + } + if (CT_UG_REQUEST_CHECK_FOR_NUMBER == clist_d->ug_request) + ct_list_ug_handle_check_for_number(item, clist_d); + else if (CT_UG_REQUEST_CHECK_FOR_EMAIL == clist_d->ug_request) + ct_list_ug_handle_check_for_email(item, clist_d); + else + ct_list_edit_update_selection_info(clist_d); +} + +Evas_Object* ct_list_edit_add_check(Evas_Object *parent, Eina_Bool *checked, + ct_list_data *clist_d) +{ + Evas_Object *check = elm_check_add(parent); + elm_check_state_pointer_set(check, checked); + evas_object_propagate_events_set(check, EINA_FALSE); + evas_object_smart_callback_add(check, "changed", list_edit_item_check_cb, clist_d); + return check; +} + +API void ctui_list_edit_mode_start(ct_list_data *clist_d) +{ + //Sweep Off in Edit mode + if (clist_d->last_sweep_item) { + elm_genlist_item_decorate_mode_set(clist_d->last_sweep_item, "slide", EINA_FALSE); + elm_genlist_item_select_mode_set(clist_d->last_sweep_item, ELM_OBJECT_SELECT_MODE_DEFAULT); + clist_d->last_sweep_item = NULL; + } + + clist_d->list_mode = CT_LIST_MODE_EDIT; + + // Append 'Select All' layout + if((CT_UG_REQUEST_CHECK_FOR_NUMBER != clist_d->ug_request) && (CT_UG_REQUEST_CHECK_FOR_EMAIL != clist_d->ug_request)) + if (((!clist_d->ug_request || clist_d->select_result_cb) || (clist_d->base_grp > 0 && clist_d->contact_add_cb)) && + (0 == clist_d->cnt_max || clist_d->cnt_total <= clist_d->cnt_max)) { + clist_d->select_all_layout = phone_create_select_all(clist_d->box, S_(PH_SYS_BODY_SELECT_ALL), list_edit_select_all, clist_d); + elm_box_pack_start(clist_d->box, clist_d->select_all_layout); + } + + if (clist_d->count_item) { + elm_object_item_del(clist_d->count_item); + clist_d->count_item = NULL; + } + elm_genlist_decorate_mode_set(clist_d->genlist, EINA_TRUE); + + if (CT_LIST_IN_MULTI_TAB != clist_d->tab_mode && !clist_d->title + && CT_UG_REQUEST_SELECT_CONTACT <= clist_d->ug_request) { + elm_object_item_text_set(clist_d->navi_item, T_(CT_GET_TEXT_BASIC, CTTEXT_SELECT_CONTACTS)); + } + phone_show_notify(clist_d->navi, T_(CT_GET_TEXT_BASIC, CTTEXT_SELECT_CONTACTS)); + + ctui_list_navi_set(CT_LIST_MODE_EDIT, clist_d); +} + +void ct_list_edit_button_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_list_data *clist_d = data; + + p_retm_if(NULL == clist_d->navi_item, "parameter(navi_item) is NULL"); + + if(!clist_d->ug) + ctui_list_edit_mode_start(clist_d); + +} + +API void ctui_list_set_selectall(ct_list_data *clist_d) +{ + PH_DBG("ctui_list_set_selectall"); + if(NULL!=clist_d->select_all_layout + || CT_LIST_MODE_DEFAULT== clist_d->list_mode) + return; + // Append 'Select All' layout + if((CT_UG_REQUEST_CHECK_FOR_NUMBER != clist_d->ug_request) && (CT_UG_REQUEST_CHECK_FOR_EMAIL != clist_d->ug_request)) + if (((!clist_d->ug_request || clist_d->select_result_cb) || (clist_d->base_grp > 0 && clist_d->contact_add_cb)) && + (0 == clist_d->cnt_max || clist_d->cnt_total <= clist_d->cnt_max)) { + clist_d->select_all_layout = phone_create_select_all(clist_d->box, S_(PH_SYS_BODY_SELECT_ALL), list_edit_select_all, clist_d); + elm_box_pack_start(clist_d->box, clist_d->select_all_layout); + } + +} + diff --git a/lib/list/ct-list-edit-view.h b/lib/list/ct-list-edit-view.h new file mode 100755 index 0000000..86259a7 --- /dev/null +++ b/lib/list/ct-list-edit-view.h @@ -0,0 +1,28 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CONTACTS_LIST_EDIT_VIEW_H__ +#define __CONTACTS_LIST_EDIT_VIEW_H__ + +void ct_list_edit_mode_end(ct_list_data *clist_d); +void ct_list_edit_button_cb(void *data, Evas_Object *obj, void *event_info); +void ct_list_edit_make_edit_cbar(ct_list_data *clist_d); +void ct_list_edit_update_selection_info(void *data); +Evas_Object* ct_list_edit_add_check(Evas_Object *parent, Eina_Bool *checked, ct_list_data *clist_d); +void ct_list_item_checked_set(Elm_Object_Item *item, ct_list_data *clist_d); + +#endif //__CONTACTS_LIST_EDIT_VIEW_H__ + diff --git a/lib/list/ct-list-main.c b/lib/list/ct-list-main.c new file mode 100755 index 0000000..e20cc68 --- /dev/null +++ b/lib/list/ct-list-main.c @@ -0,0 +1,514 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <ui-gadget-module.h> +#include "phone.h" +#include "ct-list.h" +#include "ct-detail.h" +#include "ct-list-utils.h" +#include "ct-list-view-ug.h" +#include "ct-list-contact-view.h" +#include "ct-list-edit-view.h" + +API void ctui_list_view_reset(ct_list_data *clist_d) +{ + Evas_Object *cbar; + evas_object_data_del(clist_d->cbar, "done_item"); + evas_object_data_del(clist_d->cbar, "edit_item"); + evas_object_data_del(clist_d->cbar, "new_item"); + + cbar = clist_d->cbar; + clist_d->cbar = elm_toolbar_add(clist_d->navi); + elm_toolbar_shrink_mode_set(cbar, ELM_TOOLBAR_SHRINK_EXPAND); + + if (CT_UG_REQUEST_CHECK != clist_d->ug_request && + CT_UG_REQUEST_CHECK_FOR_NUMBER != clist_d->ug_request && + CT_UG_REQUEST_CHECK_FOR_EMAIL != clist_d->ug_request) + if (CT_LIST_MODE_EDIT == clist_d->list_mode) + ct_list_edit_mode_end(clist_d); + + if (!clist_d->ug && CT_GET_LIST_ALL_CONTACTS != clist_d->list_op) { + clist_d->base_ab = -1; + clist_d->base_ab_mode = CTS_ADDRESSBOOK_MODE_NONE; + clist_d->base_grp = 0; + clist_d->list_op = CT_GET_LIST_ALL_CONTACTS; + + ctui_list_genlist_update(clist_d); + } + + if (elm_naviframe_top_item_get(clist_d->navi) != clist_d->navi_item) + elm_naviframe_item_pop_to(clist_d->navi_item); + else if(clist_d->last_sweep_item) { + elm_genlist_item_decorate_mode_set(clist_d->last_sweep_item, "slide", EINA_FALSE); + elm_genlist_item_select_mode_set(clist_d->last_sweep_item, ELM_OBJECT_SELECT_MODE_DEFAULT); + clist_d->last_sweep_item = NULL; + } + + if (clist_d->child_ug) { + ug_destroy(clist_d->child_ug); + clist_d->child_ug = NULL; + } + + evas_object_del(clist_d->cbar); + clist_d->cbar = cbar; +} + +static int create_list_view(Evas_Object *base, ct_list_data *clist_d) +{ + char buf[PH_TEXT_SHORT_LEN]; + + if (NULL == clist_d->navi) { + p_retvm_if(NULL == base, FALSE, "base is NULL"); + clist_d->navi = elm_naviframe_add(base); + p_retvm_if(NULL == clist_d->navi, FALSE, "navi is NULL"); + elm_naviframe_prev_btn_auto_pushed_set(clist_d->navi, EINA_FALSE); + elm_object_part_content_set(base, "elm.swallow.content", clist_d->navi); + evas_object_show(clist_d->navi); + } + if (CT_GET_LIST_VCARD != clist_d->list_op) + ct_list_get_contacts(clist_d, &clist_d->list); + clist_d->content = ct_list_create_contact_view(clist_d); + + FREEandSTRDUP(clist_d->title, T_(CT_GET_TEXT_BASIC, CTTEXT_ALL_CONTACTS)); + snprintf(buf, sizeof(buf), "%s (%d)", clist_d->title, clist_d->cnt_list); + clist_d->navi_item = elm_naviframe_item_push(clist_d->navi, buf, NULL, NULL, clist_d->content, NULL); + + return TRUE; +} + +static int list_create_vcard_list_view(Evas_Object *base, ct_list_data *clist_d) +{ + char buf[PH_TEXT_SHORT_LEN]; + + p_retvm_if(NULL == base, FALSE, "base is NULL"); + + clist_d->navi = elm_naviframe_add(base); + p_retvm_if(NULL == clist_d->navi, FALSE, "navi is NULL"); + elm_naviframe_prev_btn_auto_pushed_set(clist_d->navi, EINA_FALSE); + evas_object_show(clist_d->navi); + + clist_d->content = ct_list_create_contact_view(clist_d); + + clist_d->title = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_VCARD_CONTACTS)); + snprintf(buf, sizeof(buf), "%s (%d)", clist_d->title, clist_d->cnt_list); + clist_d->navi_item = elm_naviframe_item_push(clist_d->navi, buf, NULL, NULL, clist_d->content, NULL); + if (clist_d->select_result_cb) + ctui_list_edit_mode_start(clist_d); + else + ctui_list_navi_set(CT_LIST_MODE_DEFAULT, clist_d); + + elm_object_part_content_set(base, "elm.swallow.content", clist_d->navi); + + return TRUE; +} + +static void *list_on_create(ui_gadget_h ug, enum ug_mode mode, + service_h service, void *priv) +{ + int ret; + Evas_Object *bg, *base; + Evas_Object *parent; + ct_list_data *clist_d = priv; + + p_retvm_if(NULL == ug || NULL == priv, NULL, + "The parameter is invalid(ug=%p, priv=%p)", ug, priv); + + clist_d->win = ug_get_window(); + parent = ug_get_parent_layout(ug); + p_retvm_if(NULL == parent, NULL, "ug_get_parent_layout() return NULL"); + clist_d->ug = ug; + + bindtextdomain(PACKAGE, LOCALEDIR); + + ret = contacts_svc_connect(); + p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_connect() Failed(%d)", ret); + + if (UG_MODE_FULLVIEW == mode) + base = phone_create_base_layout(parent, true); + else + base = phone_create_base_layout(parent, false); + + ret = ct_list_parse_bundle(service, clist_d); + if (-2 == ret) { + Evas_Object *popup; + popup = elm_popup_add(base); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(popup, S_(CT_SYS_POP_FILE_NOT_FOUND)); + elm_popup_timeout_set(popup, 1.5); + evas_object_show(popup); + evas_object_smart_callback_add(popup, "timeout", ctui_list_ug_hide_cb, clist_d->ug); + return base; + } + p_retvm_if(-1 == ret, NULL, "ct_list_parse_bundle() Failed"); + clist_d->base_ab = -1; + + bg = phone_create_bg(base); + if (NULL == bg) { + ERR("phone_create_bg() return NULL"); + evas_object_del(base); + ret = contacts_svc_disconnect(); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_disconnect() Failed(%d)", ret); + return NULL; + } + + if (FALSE == create_list_view(base, clist_d)) { + evas_object_del(base); + ret = contacts_svc_disconnect(); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_disconnect() Failed(%d)", ret); + } + else { + if (CT_UG_REQUEST_CHECK == clist_d->ug_request || + CT_UG_REQUEST_CHECK_FOR_NUMBER == clist_d->ug_request || + CT_UG_REQUEST_CHECK_FOR_EMAIL == clist_d->ug_request) + ctui_list_edit_mode_start(clist_d); + else + ctui_list_navi_set(CT_LIST_MODE_DEFAULT, clist_d); + } + + return base; +} + +static void list_on_message(ui_gadget_h ug, service_h msg, service_h service, void *priv) +{ +} + +static void list_on_pause(ui_gadget_h ug, service_h service, void *priv) +{ + PH_FN_CALL; + ct_list_data *clist_d = priv; + clist_d->order_sorting = contacts_svc_get_order(CTS_ORDER_OF_SORTING); + clist_d->order_display = contacts_svc_get_order(CTS_ORDER_OF_DISPLAY); + clist_d->is_background = true; +} + +static void list_on_resume(ui_gadget_h ug, service_h service, void *priv) +{ + ct_list_data *clist_d = priv; + ct_detail_data *cdetail_d; + + clist_d->is_background = false; + + if (clist_d->order_display != contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) { + ctui_list_genlist_update(clist_d); + cdetail_d = evas_object_data_get(clist_d->navi, "cdetail_d"); + if (cdetail_d) + ctui_detail_genlist_update(cdetail_d); + } + else if (clist_d->order_sorting != contacts_svc_get_order(CTS_ORDER_OF_SORTING)) { + ctui_list_genlist_update(clist_d); + } + + if (clist_d->update_timer) { + ecore_timer_del(clist_d->update_timer); + clist_d->update_timer = NULL; + ctui_list_genlist_update(clist_d); + } +} + +static void list_on_event(ui_gadget_h ug, enum ug_event event, service_h service, void *priv) +{ + ct_list_data *clist_d = priv; + Evas_Object *notify; + switch (event) { + case UG_EVENT_ROTATE_PORTRAIT: + case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN: + phone_resize_notify(clist_d->navi, 0); + evas_object_data_set(clist_d->navi, "phone_rotate", (void *)0); + notify = phone_get_notify(clist_d->navi); + elm_layout_theme_set(elm_object_content_get(notify), "standard", "selectioninfo", "vertical/bottom_64"); + break; + case UG_EVENT_ROTATE_LANDSCAPE: + case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN: + phone_resize_notify(clist_d->navi, 90); + evas_object_data_set(clist_d->navi, "phone_rotate", (void *)90); + notify = phone_get_notify(clist_d->navi); + elm_layout_theme_set(elm_object_content_get(notify), "standard", "selectioninfo", "horizontal/bottom_64"); + break; + default: + break; + } +} + +static void list_on_destroy(ui_gadget_h ug, service_h service, void *priv) +{ + int ret; + ct_list_data *clist_d = priv; + p_retm_if(NULL == ug, "The parameter is invalid(ug=%p)", ug); + + free(clist_d->ug_data); + if (clist_d && !clist_d->navi) + free(clist_d); + + evas_object_del(ug_get_layout(ug)); + ret = contacts_svc_disconnect(); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_disconnect() Failed(%d)", ret); +} + +API int UG_MODULE_INIT(struct ug_module_ops *ops) +{ + ct_list_data *clist_d; + + p_retvm_if(!ops, -1, "ops is NULL"); + + clist_d = calloc(1, sizeof(ct_list_data)); + p_retvm_if(!clist_d, -1, "UG data is NULL, Not enough memory"); + + ops->create = list_on_create; + ops->start = NULL; + ops->pause = list_on_pause; + ops->resume = list_on_resume; + ops->destroy = list_on_destroy; + ops->message = list_on_message; + ops->event = list_on_event; + ops->key_event = NULL; + ops->priv = clist_d; + ops->opt = UG_OPT_INDICATOR_ENABLE; + + return 0; +} + +API void UG_MODULE_EXIT(struct ug_module_ops *ops) +{ + p_retm_if(!ops, "ops is NULL"); + + ops->priv = NULL; +} + +// Setting - export,import +API Evas_Object* ctui_create_list_select_view(Evas_Object *navi, + ct_select_result_cb result_cb, void *result_cb_data, int list_op, int id_ab, int id_grp) +{ + PH_DBG("list_op = %d, id_ab = %d, id_grp = %d", list_op, id_ab, id_grp); + + ct_list_data *clist_d; + + clist_d = calloc(1, sizeof(ct_list_data)); + p_retvm_if(!clist_d, NULL, "clist_d is NULL, Not enough memory"); + + clist_d->navi = navi; + clist_d->select_result_cb = result_cb; + clist_d->select_result_cb_data = result_cb_data; + clist_d->list_op = list_op; + clist_d->base_ab = id_ab; + clist_d->base_grp = id_grp; + + switch(list_op) { + case CT_GET_LIST_ALL_CONTACT_HAD_NUMBER: + clist_d->ug_request = CT_UG_REQUEST_CHECK_FOR_NUMBER; + break; + case CT_GET_LIST_ALL_CONTACT_HAD_EMAIL: + clist_d->ug_request = CT_UG_REQUEST_CHECK_FOR_EMAIL; + break; + default: + clist_d->ug_request = CT_UG_REQUEST_CHECK; + break; + } + + ct_list_get_contacts(clist_d, &clist_d->list); + clist_d->content = ct_list_create_contact_view(clist_d); + + ct_list_get_title(clist_d, list_op, id_ab, id_grp); + + if (clist_d->sub_title) { + clist_d->navi_item = elm_naviframe_item_push(clist_d->navi, clist_d->title, NULL, + NULL, clist_d->content, "2line"); + elm_object_item_part_text_set(clist_d->navi_item, "subtitle", clist_d->sub_title); + } + else + clist_d->navi_item = elm_naviframe_item_push(clist_d->navi, clist_d->title, NULL, + NULL, clist_d->content, NULL); + ctui_list_edit_mode_start(clist_d); + + return clist_d->navi; +} + +API void ctui_create_favorite_list_select_view(Evas_Object *win, Evas_Object *navi, Eina_List *list) +{ + ct_list_data *clist_d; + char buf[PH_TEXT_SHORT_LEN]; + clist_d = calloc(1, sizeof(ct_list_data)); + p_retm_if(!clist_d, "clist_d is NULL, Not enough memory"); + + clist_d->win = win; + clist_d->navi = navi; + clist_d->contact_add_cb = ct_list_add_contacts_to_favorite; + clist_d->ug_request = CT_UG_REQUEST_CHECK; + clist_d->list = list; + clist_d->content = ct_list_create_contact_view(clist_d); + clist_d->title = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_SELECT_CONTACTS)); // TODO: Add favorite + clist_d->cnt_list = eina_list_count(list); + snprintf(buf, sizeof(buf), "%s (%d)", clist_d->title, clist_d->cnt_list); + + clist_d->navi_item = elm_naviframe_item_push(clist_d->navi, buf, NULL, NULL, clist_d->content, NULL); + ctui_list_edit_mode_start(clist_d); + evas_object_data_set(clist_d->navi, "favor_list_d", clist_d); +} + +// Show vcard contact list check view to importing contacts from vcf file +API Evas_Object* ctui_create_vcard_list_select_view(Evas_Object *navi, Eina_List *list, const char *path, + ct_select_result_cb result_cb, void *result_cb_data) +{ + ct_list_data *clist_d; + char buf[PH_TEXT_SHORT_LEN]; + + clist_d = calloc(1, sizeof(ct_list_data)); + p_retvm_if(!clist_d, NULL, "clist_d is NULL, Not enough memory"); + + clist_d->navi = navi; + clist_d->list = list; + clist_d->cnt_list = eina_list_count(list); + clist_d->vcard_path = path; + clist_d->select_result_cb = result_cb; + clist_d->select_result_cb_data = result_cb_data; + clist_d->list_op = CT_GET_LIST_VCARD; + clist_d->ug_request = CT_UG_REQUEST_CHECK; + clist_d->base_ab = -1; + + clist_d->content = ct_list_create_contact_view(clist_d); + clist_d->title = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_VCARD_CONTACTS)); + snprintf(buf, sizeof(buf), "%s (%d)", clist_d->title, clist_d->cnt_list); + + clist_d->navi_item = elm_naviframe_item_push(clist_d->navi, buf, NULL, NULL, clist_d->content, NULL); + ctui_list_edit_mode_start(clist_d); + + evas_object_data_set(clist_d->navi, "clist_d", clist_d); + return clist_d->navi; +} + +// Show contact list view from vcf file +API Evas_Object* ctui_create_vcard_list_view(Evas_Object *win, Eina_List *list, const char *path) +{ + ct_list_data *clist_d; + Evas_Object *bg, *base; + + clist_d = calloc(1, sizeof(ct_list_data)); + p_retvm_if(!clist_d, NULL, "clist_d is NULL, Not enough memory"); + + clist_d->win = win; + clist_d->list = list; + clist_d->cnt_list = eina_list_count(list); + clist_d->vcard_path = path; + clist_d->base_ab = -1; + + base = phone_create_base_layout(win, true); + if (base) { + clist_d->list_op = CT_GET_LIST_VCARD; + list_create_vcard_list_view(base, clist_d); + + bg = phone_create_bg(base); + if (NULL == bg) { + ERR("phone_create_bg() return NULL"); + evas_object_del(base); + free(clist_d); + return NULL; + } + + evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, base); + evas_object_show(base); + evas_object_data_set(clist_d->navi, "clist_d", clist_d); + + return base; + } + else { + free(clist_d); + return NULL; + } +} + +API Evas_Object* ctui_create_phone_list_view(ph_view_info *view_info) +{ + ct_list_data *clist_d; + + clist_d = calloc(1, sizeof(ct_list_data)); + p_retvm_if(!clist_d, NULL, "clist_d is NULL, Not enough memory"); + + clist_d->ug = view_info->ug; + clist_d->win = view_info->win; + clist_d->navi = view_info->navi; + clist_d->tab_mode = CT_LIST_IN_MULTI_TAB; + clist_d->navi_item = elm_naviframe_bottom_item_get(view_info->navi); + clist_d->cbar = elm_object_item_part_content_get(clist_d->navi_item, + "controlbar"); + + switch (view_info->ug_request) { + case PH_UG_REQUEST_CHECK_FOR_EMAIL: + clist_d->list_op = CT_GET_LIST_ALL_CONTACT_HAD_EMAIL; + break; + case PH_UG_REQUEST_SELECT_EMAIL: + clist_d->list_op = CT_GET_LIST_ALL_CONTACT_HAD_EMAIL; + break; + case PH_UG_REQUEST_CHECK_FOR_NUMBER: + clist_d->list_op = CT_GET_LIST_ALL_CONTACT_HAD_NUMBER; + break; + case PH_UG_REQUEST_SELECT_NUMBER: + clist_d->list_op = CT_GET_LIST_ALL_CONTACT_HAD_NUMBER; + break; + default: + clist_d->list_op = CT_GET_LIST_ALL_CONTACTS; + break; + } + clist_d->base_ab = -1; + + clist_d->ug_request = view_info->ug_request; + clist_d->ug_data = view_info->ug_data; + clist_d->cnt_max = view_info->ug_cnt_max; + + ct_list_get_contacts(clist_d, &clist_d->list); + clist_d->content = ct_list_create_contact_view(clist_d); + evas_object_data_set(clist_d->navi, "clist_d", clist_d); + + return clist_d->content; +} + +API void ctui_list_view_resume(Evas_Object *navi) +{ + PH_FN_CALL; + ct_list_data *clist_d; + ct_detail_data *cdetail_d; + + clist_d = evas_object_data_get(navi, "clist_d"); + p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL"); + + clist_d->is_background = false; + + if (clist_d->order_sorting != contacts_svc_get_order(CTS_ORDER_OF_SORTING) || + clist_d->order_display != contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) + ctui_list_genlist_update(clist_d); + + cdetail_d = evas_object_data_get(navi, "cdetail_d"); + if (cdetail_d) + ctui_detail_genlist_update(cdetail_d); + + if (clist_d->update_timer) { + ecore_timer_del(clist_d->update_timer); + clist_d->update_timer = NULL; + ctui_list_genlist_update(clist_d); + } +} + +API void ctui_list_view_pause(Evas_Object *navi) +{ + PH_FN_CALL; + + ct_list_data *clist_d; + clist_d = evas_object_data_get(navi, "clist_d"); + p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL"); + clist_d->order_sorting = contacts_svc_get_order(CTS_ORDER_OF_SORTING); + clist_d->order_display = contacts_svc_get_order(CTS_ORDER_OF_DISPLAY); + clist_d->is_background = true; +} + diff --git a/lib/list/ct-list-utils.c b/lib/list/ct-list-utils.c new file mode 100755 index 0000000..de6eb07 --- /dev/null +++ b/lib/list/ct-list-utils.c @@ -0,0 +1,514 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include <errno.h> +#include <fcntl.h> +#include <ui-gadget-module.h> +#include "phone.h" +#include "ct-detail.h" +#include "ct-list.h" +#include "ct-list-contact-view.h" +#include "ct-list-utils.h" + +int ct_list_parse_bundle(service_h service, ct_list_data* clist_d) +{ + char* val = NULL; + + if (service) { + service_get_extra_data(service, CT_UG_BUNDLE_TYPE, &val); + if (val) clist_d->ug_request = atoi(val); + PH_DBG("type = %d", clist_d->ug_request); + free(val); + + switch (clist_d->ug_request) { + case CT_UG_REQUEST_LIST: + case CT_UG_REQUEST_LIST_WITH_BACK: + case CT_UG_REQUEST_SELECT_CONTACT: + case CT_UG_REQUEST_SELECT_VCARD: + break; + case CT_UG_REQUEST_SELECT_NUMBER: + clist_d->list_op = CT_GET_LIST_ALL_CONTACT_HAD_NUMBER; + break; + case CT_UG_REQUEST_SELECT_EMAIL: + clist_d->list_op = CT_GET_LIST_ALL_CONTACT_HAD_EMAIL; + break; + case CT_UG_REQUEST_UPDATE_CONTACT: + service_get_extra_data(service, CT_UG_BUNDLE_NUM, &clist_d->ug_data); + if(clist_d->ug_data) + break; + service_get_extra_data(service, CT_UG_BUNDLE_EMAIL, &clist_d->ug_data); + if(clist_d->ug_data) + break; + service_get_extra_data(service, CT_UG_BUNDLE_WEB, &clist_d->ug_data); + if(clist_d->ug_data) + break; + break; + case CT_UG_REQUEST_UPDATE_WITH_NUM: + service_get_extra_data(service, CT_UG_BUNDLE_NUM, &clist_d->ug_data); + break; + case CT_UG_REQUEST_UPDATE_WITH_EMAIL: + service_get_extra_data(service, CT_UG_BUNDLE_EMAIL, &clist_d->ug_data); + break; + case CT_UG_REQUEST_UPDATE_WITH_WEB: + service_get_extra_data(service, CT_UG_BUNDLE_WEB, &clist_d->ug_data); + break; + case CT_UG_REQUEST_CHECK: + val = NULL; + service_get_extra_data(service, CT_UG_BUNDLE_MAX, &val); + if (val) clist_d->cnt_max = atoi(val); + free(val); + break; + case CT_UG_REQUEST_CHECK_FOR_NUMBER: + val = NULL; + clist_d->list_op = CT_GET_LIST_ALL_CONTACT_HAD_NUMBER; + service_get_extra_data(service, CT_UG_BUNDLE_MAX, &val); + if (val) clist_d->cnt_max = atoi(val); + free(val); + break; + case CT_UG_REQUEST_CHECK_FOR_EMAIL: + val = NULL; + clist_d->list_op = CT_GET_LIST_ALL_CONTACT_HAD_EMAIL; + service_get_extra_data(service, CT_UG_BUNDLE_MAX, &val); + if (val) clist_d->cnt_max = atoi(val); + free(val); + break; + case PH_UG_REQUEST_SET_WITH_IMG: + case PH_UG_REQUEST_SET_WITH_RINGTONE: + case CT_UG_REQUEST_SAVE_IMG: + case CT_UG_REQUEST_SAVE_RINGTONE: + service_get_extra_data(service, CT_UG_BUNDLE_PATH, &clist_d->ug_data); + if (-1 == access(clist_d->ug_data, R_OK)) { + ERR("Invalid filepath(%s)", clist_d->ug_data); + return -2; + } + break; + default: + ERR("Invalid request(%d)", clist_d->ug_request); + return -1; + } + } + return 0; +} + +static void list_img_crop_result_for_add(ui_gadget_h ug,service_h service, void *data) +{ + CTSvalue *ct_val; + ct_detail_data *cdetail_d = data; + + p_retm_if(NULL == ug || NULL == data, "ug or data is NULL"); + + if (service) { + char *normal = NULL; + char *full = NULL; + + service_get_extra_data(service, "crop_image_path", &normal); + p_retm_if(!normal, "return value is NULL.\n"); + + service_get_extra_data(service, "image_path", &full); + + contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_BASE_INFO_VALUE, &ct_val); + if (NULL == ct_val) + ct_val = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO); + contacts_svc_value_set_str(ct_val, CTS_BASE_VAL_IMG_PATH_STR, normal); + contacts_svc_value_set_str(ct_val, CTS_BASE_VAL_FULL_IMG_PATH_STR, full); + contacts_svc_struct_store_value(cdetail_d->contact, CTS_CF_BASE_INFO_VALUE, ct_val); + + free(normal); + free(full); + } + + ug_destroy(ug); + cdetail_d->child_ug = NULL; + ctui_create_input_view(cdetail_d); +} + +static void list_destory_detail_child_ug(ui_gadget_h ug, void *priv) +{ + ct_detail_data *cdetail_d = priv; + p_retm_if(NULL == ug, "ug is NULL"); + ug_destroy(ug); + + p_retm_if(NULL == priv, "priv is NULL"); + cdetail_d->child_ug = NULL; +} + +void ct_list_destroy_child_ug(void *data) +{ + ct_list_data *clist_d = (ct_list_data*)data; + clist_d->child_ug = NULL; +} + +API void ctui_list_update_with_data(ph_view_info *view_info, void *data, + int ct_id, int grp_id, int ab_id) +{ + int ret; + ct_detail_data *cdetail_d; + GSList *ct_list; + CTSvalue *ct_val; + struct ug_cbs cbs = {0}; + + cdetail_d = calloc(1, sizeof(ct_detail_data)); + p_retm_if(!cdetail_d, "cdetail_d is NULL, Not enough memory"); + + cdetail_d->win = view_info->win; + cdetail_d->navi = view_info->navi; + cdetail_d->ug = view_info->ug; + cdetail_d->prev_navi_item = elm_naviframe_top_item_get(view_info->navi); + cdetail_d->prev_view_data = data; + cdetail_d->contact_id = ct_id; + cdetail_d->base_grp = grp_id; + cdetail_d->base_ab = ab_id; + cdetail_d->ug_request = view_info->ug_request; + + if (ct_id) + ret = contacts_svc_get_contact(ct_id, &(cdetail_d->contact)); + else + ret = -1; + + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_get_contact() Failed(%d)", ret); + cdetail_d->contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT); + } + + switch (view_info->ug_request) { + //case PH_UG_REQUEST_SET_WITH_NUM: + case CT_UG_REQUEST_UPDATE_WITH_NUM: + ct_list = NULL; + ct_val = contacts_svc_value_new(CTS_VALUE_NUMBER); + contacts_svc_value_set_str(ct_val, CTS_NUM_VAL_NUMBER_STR, view_info->ug_data); + ct_list = g_slist_append(ct_list, ct_val); + contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_NUMBER_LIST, ct_list); + g_slist_free(ct_list); + break; + //case PH_UG_REQUEST_SET_WITH_EMAIL: + case CT_UG_REQUEST_UPDATE_WITH_EMAIL: + ct_list = NULL; + ct_val = contacts_svc_value_new(CTS_VALUE_EMAIL); + contacts_svc_value_set_str(ct_val, CTS_EMAIL_VAL_ADDR_STR, view_info->ug_data); + ct_list = g_slist_append(ct_list, ct_val); + contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_EMAIL_LIST, ct_list); + g_slist_free(ct_list); + break; + //case PH_UG_REQUEST_SET_WITH_WEB: + case CT_UG_REQUEST_UPDATE_WITH_WEB: + ct_list = NULL; + ct_val = contacts_svc_value_new(CTS_VALUE_WEB); + contacts_svc_value_set_str(ct_val, CTS_WEB_VAL_ADDR_STR, view_info->ug_data); + ct_list = g_slist_append(ct_list, ct_val); + contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_WEB_ADDR_LIST, ct_list); + g_slist_free(ct_list); + break; + case CT_UG_REQUEST_UPDATE_CONTACT: + break; + case PH_UG_REQUEST_SET_WITH_IMG: + case CT_UG_REQUEST_SAVE_IMG: //only handle for add + cbs.result_cb = list_img_crop_result_for_add; + cbs.destroy_cb = list_destory_detail_child_ug; + cbs.priv = cdetail_d; + + cdetail_d->child_ug = phone_image_crop_ug(cdetail_d->ug, view_info->ug_data, &cbs); + return; + case PH_UG_REQUEST_SET_WITH_RINGTONE: + case CT_UG_REQUEST_SAVE_RINGTONE: //only handle for add + contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_BASE_INFO_VALUE, &ct_val); + if (NULL == ct_val) + ct_val = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO); + contacts_svc_value_set_str(ct_val, CTS_BASE_VAL_RINGTONE_PATH_STR, view_info->ug_data); + contacts_svc_struct_store_value(cdetail_d->contact, CTS_CF_BASE_INFO_VALUE, ct_val); + break; + default: + ERR("Invalid type(%d)", view_info->ug_request); + break; + } + ctui_create_input_view(cdetail_d); +} + +void ct_list_call(void *data, Evas_Object *obj, void *event_info) +{ + ct_contact_list *item = data; + p_retm_if(NULL == item, "parameter(item) is NULL"); + p_retm_if(NULL == item->number || '\0' == *item->number, "number is NULL"); + phone_launch_voice_call(item->id, item->number); +} + +void ct_list_msg(void *data, Evas_Object *obj, void *event_info) +{ + ct_list_data *clist_d; + ct_contact_list *item = data; + + p_retm_if(NULL == data, "parameter(item) is NULL"); + p_retm_if(NULL == item->number || '\0' == *item->number, "number is NULL"); + + clist_d = (ct_list_data *)evas_object_data_get(obj, "clist_d"); + p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL"); + + clist_d->child_ug = ctui_msg_ug(clist_d->ug, item->number, item->id, NULL, + ct_list_destroy_child_ug, clist_d); +} + +void ct_list_popup_hide_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_list_data *clist_d; + Elm_Object_Item *item; + ct_contact_list *contact; + + clist_d = evas_object_data_get(data, "clist_d"); + p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL"); + evas_object_del(clist_d->popup); + clist_d->popup = NULL; + + if (NULL != obj) { // Click "Close" + item = evas_object_data_get(data, "item"); + p_retm_if(NULL == item, "evas_object_data_get() return NULL"); + + contact = elm_object_item_data_get(item); + p_retm_if(NULL == contact, "elm_object_item_data_get() return NULL"); + + contact->checked = EINA_FALSE; + clist_d->cnt_checked--; + elm_genlist_item_update(item); + } +} + +static void list_sweep_delete_contact(void *data, Evas_Object *obj, void *event_info) +{ + int person_id; + int ret; + ct_list_data *clist_d; + + clist_d = evas_object_data_get(obj, "clist_d"); + p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL"); + evas_object_del(clist_d->popup); + clist_d->popup = NULL; + + person_id = ctui_get_person_id((int)data); + evas_object_data_set(clist_d->navi, "ct_list_update_ui", (void *)1); + + ret = contacts_svc_delete_person(person_id); + + if (CTS_SUCCESS == ret) + phone_show_tickernoti(S_(CT_SYS_POP_SUCCESS)); + else + phone_show_tickernoti(S_(PH_SYS_POP_FAILED)); +} + + +void ct_list_sweep_del_cb(void *data, Evas_Object *obj, void *event_info) +{ + int id; + ct_list_data *clist_d; + Evas_Object *btn; + + clist_d = evas_object_data_get(obj, "clist_d"); + p_retm_if(NULL == clist_d, "evas_object_data_get() return NULL"); + + id = (int)data; + btn = phone_create_confirm_popup(&clist_d->popup, clist_d->win, T_(CT_GET_TEXT_BASE_OP, + CTTEXT_CONFIRM_DELETE_CONTACT), list_sweep_delete_contact, (void *)id); + evas_object_data_set(btn,"clist_d", clist_d); +} + +void ct_list_get_title(ct_list_data *clist_d, int list_op, int id_ab, int id_grp) +{ + switch(list_op) { + case CT_GET_LIST_ALL_CONTACTS: + case CT_GET_LIST_ALL_CONTACT_HAD_EMAIL: + case CT_GET_LIST_ALL_CONTACT_HAD_NUMBER: + { + char buf[PH_TEXT_SHORT_LEN]; + snprintf(buf, sizeof(buf), "%s (%d)", T_(CT_GET_TEXT_BASIC, CTTEXT_ALL_CONTACTS), clist_d->cnt_list); + clist_d->title = strdup(buf); + } + break; + } +} + +static PTHREAD_FN list_add_contacts_to_favorite(void *data) +{ + int ret; + ct_list_data *clist_d = data; + ph_progress_info *p_info = clist_d->p_info; + Eina_List *l; + ct_contact_list *contact; + + EINA_LIST_FOREACH(clist_d->list, l, contact) { + if (!p_info->alive) { + p_info->result = FALSE; + break; + } + if (contact && contact->checked) { + ret = contacts_svc_set_favorite(CTS_FAVOR_CONTACT, contact->id); + if (ret < CTS_SUCCESS) { + p_info->result = FALSE; + p_info->completed = true; + break; + } + p_info->cnt++; + } + } + pthread_exit(NULL); +} + +static Eina_Bool list_add_contacts_timer_cb(void *data) +{ + ct_list_data *clist_d = data; + ph_progress_info *p_info = clist_d->p_info; + + p_retvm_if(NULL == p_info, ECORE_CALLBACK_CANCEL, "parameter(clist_d) is NULL"); + + if (!p_info->completed) { + char count[PH_TEXT_SHORT_LEN]; + char percent[PH_TEXT_SHORT_LEN]; + double value = (double)p_info->cnt / (double)p_info->cnt_checked_total; + + if (!p_info->alive) { + p_info->result = FALSE; + p_info->completed = true; + return ECORE_CALLBACK_RENEW; + } + + elm_progressbar_value_set(p_info->progressbar, value); + snprintf(percent, sizeof(percent), "%d%%", (int)(100.0 * (double)p_info->cnt/(double)p_info->cnt_checked_total)); + snprintf(count, sizeof(count), "%d/%d", p_info->cnt, p_info->cnt_checked_total); + edje_object_part_text_set(elm_layout_edje_get(p_info->layout), "elm.text.subtext1", percent); + edje_object_part_text_set(elm_layout_edje_get(p_info->layout), "elm.text.subtext2", count); + + if (p_info->cnt == p_info->cnt_checked_total) + p_info->completed = true; + + return ECORE_CALLBACK_RENEW; + } + else { + int ret; + const char *message; + + pthread_join(p_info->thread, NULL); + + if (TRUE == p_info->result) { + message = S_(CT_SYS_POP_SUCCESS); + ret = contacts_svc_end_trans(true); + } + else { + message = S_(PH_SYS_POP_FAILED); + ret = contacts_svc_end_trans(false); + } + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); + + evas_object_del(clist_d->popup); + clist_d->popup = NULL; + + phone_show_tickernoti(message); + elm_naviframe_item_pop_to(evas_object_data_get(clist_d->navi, "navi_it_pop_to")); + return ECORE_CALLBACK_CANCEL; + } +} + +void ct_list_add_contacts_to_favorite(Evas_Object *win, Evas_Object *navi, int cnt) +{ + int ret; + ct_list_data *clist_d; + ph_progress_info *p_info; + + clist_d = evas_object_data_get(navi, "favor_list_d"); + p_retm_if(NULL == clist_d, "evas_object_data_get return NULL"); + + p_retm_if(clist_d->p_info, "thread is running"); + + p_info = calloc(1, sizeof(ph_progress_info)); + p_retm_if(NULL == p_info, "calloc return NULL"); + + clist_d->p_info = p_info; + p_info->cnt_checked_total = cnt; + p_info->alive = true; + p_info->result = TRUE; + + ret = contacts_svc_begin_trans(); + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_begin_trans() Failed(%d)", ret); + free(p_info); + clist_d->p_info = NULL; + return; + } + + ret = pthread_create(&p_info->thread, NULL, list_add_contacts_to_favorite, clist_d); + if (0 != ret) { + ERR("Thread creation failed(%d)", ret); + free(p_info); + clist_d->p_info = NULL; + ret = contacts_svc_end_trans(false); + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); + return; + } + + p_info->timer = ecore_timer_add(0.2, list_add_contacts_timer_cb, clist_d); + if (NULL == p_info->timer) { + p_info->alive = false; + pthread_join(p_info->thread, NULL); + free(p_info); + clist_d->p_info = NULL; + ret = contacts_svc_end_trans(false); + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); + return; + } + clist_d->popup = phone_progressbar_popup(win, p_info, T_(CT_GET_TEXT_BASIC, CTTEXT_ADDING_ING)); +} + +bool ct_list_make_vcard(int contactid, char *path, int path_length) +{ + int ret, fd; + char display[PH_TEXT_MAX_LEN]; + char *vcard = NULL; + CTSvalue *name; + CTSstruct *contact; + ret = contacts_svc_get_contact(contactid, &contact); + if (ret < CTS_SUCCESS) { + ERR("contacts_svc_get_contact() Failed(%d)", ret); + return false; + } + + ret = contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &name); + if (ret < CTS_SUCCESS) { + ERR("contacts_svc_struct_get_value() Failed(%d)", ret); + return false; + } + //display = contacts_svc_value_get_str(name, CTS_NAME_VAL_DISPLAY_STR); + + ctui_get_display_name(name, display, sizeof(display)); + + if (display && '\0' == display[0]) { + snprintf(display, sizeof(display), "%s", T_(CT_GET_TEXT_ERR, CTTEXT_NONAME)); + } + snprintf(path, path_length, "%s/%s.vcf", UGDATAIDR, display); + + ret = contacts_svc_get_vcard_from_contact(contact, &vcard); + if (ret < CTS_SUCCESS) { + ERR("contacts_svc_get_vcard_from_contact() Failed(%d)", ret); + return false; + } + contacts_svc_struct_free(contact); + + fd = open(path, O_WRONLY|O_CREAT|O_TRUNC, 0644); + + if (-1 == write(fd, vcard, strlen(vcard))) { + ERR("write()... Failed(%s)", strerror(errno)); + free(vcard); + return false; + } + free(vcard); + return true; + + +} + diff --git a/lib/list/ct-list-utils.h b/lib/list/ct-list-utils.h new file mode 100755 index 0000000..cf5c002 --- /dev/null +++ b/lib/list/ct-list-utils.h @@ -0,0 +1,31 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CONTACTS_LIST_UTILS_H__ +#define __CONTACTS_LIST_UTILS_H__ + +int ct_list_parse_bundle(service_h service, ct_list_data* clist_d); +void ct_list_call(void *data, Evas_Object *obj, void *event_info); +void ct_list_msg(void *data, Evas_Object *obj, void *event_info); +void ct_list_popup_hide_cb(void *data, Evas_Object *obj, void *event_info); +void ct_list_sweep_del_cb(void *data, Evas_Object *obj, void *event_info); +void ct_list_get_title(ct_list_data *data, int list_op, int id_ab, int id_grp); +void ct_list_add_contacts_to_favorite(Evas_Object *win, Evas_Object *navi, int cnt); +void ct_list_destroy_child_ug(void *data); +bool ct_list_make_vcard(int contactid, char *path, int path_length); + + +#endif //__CONTACTS_LIST_UTILS_H__ diff --git a/lib/list/ct-list-view-ug.c b/lib/list/ct-list-view-ug.c new file mode 100755 index 0000000..cee8ac4 --- /dev/null +++ b/lib/list/ct-list-view-ug.c @@ -0,0 +1,505 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <ui-gadget-module.h> + +#include "phone.h" +#include "ct-list.h" +#include "ct-detail.h" +#include "ct-list-utils.h" +#include "ct-list-edit-view.h" +#include "ct-list-contact-view.h" +#include "phone-common.h" + +static void list_ug_nums_popup_sel(void *data, Evas_Object *obj, void *event_info) +{ + ct_list_data *clist_d = evas_object_data_get(obj, "clist_d"); + int contact_id = (int)evas_object_data_get(obj, "ct_id"); + + if (CT_UG_REQUEST_CHECK_FOR_NUMBER == clist_d->ug_request) { + Elm_Object_Item *item; + ct_contact_list *contact; + + item = evas_object_data_get(obj, "item"); + p_retm_if(NULL == item, "evas_object_data_get() return NULL"); + + contact = elm_object_item_data_get(item); + p_retm_if(NULL == contact, "elm_object_item_data_get() return NULL"); + + contact->id_ret = (int)data; + ct_list_edit_update_selection_info(clist_d); + ct_list_popup_hide_cb(obj, NULL, NULL); + } + else if (PH_UG_REQUEST_LAUNCH_VOICECALL == clist_d->ug_request) { + char *num_info = (char*)elm_object_item_text_get(event_info); + char *number; + strtok(num_info, " "); + number = strtok(NULL, " "); + PH_DBG("%s", number); + ct_list_popup_hide_cb(obj, NULL, NULL); + phone_launch_voice_call(contact_id, number); + } + else { + phone_ug_return_id(clist_d->ug, contact_id, (int)data, 0); + ug_destroy_me(clist_d->ug); + } +} + +static void list_ug_emails_popup_sel(void *data, Evas_Object *obj, void *event_info) +{ + ct_list_data *clist_d = evas_object_data_get(obj, "clist_d"); + int contact_id = (int)evas_object_data_get(obj, "ct_id"); + + if (CT_UG_REQUEST_CHECK_FOR_EMAIL == clist_d->ug_request) { + Elm_Object_Item *item; + ct_contact_list *contact; + + item = evas_object_data_get(obj, "item"); + p_retm_if(NULL == item, "evas_object_data_get() return NULL"); + + contact = elm_object_item_data_get(item); + p_retm_if(NULL == contact, "elm_object_item_data_get() return NULL"); + + contact->id_ret = (int)data; + ct_list_edit_update_selection_info(clist_d); + ct_list_popup_hide_cb(obj, NULL, NULL); + } + else { + phone_ug_return_id(clist_d->ug, contact_id, 0, (int)data); + ug_destroy_me(clist_d->ug); + } +} + +API Evas_Object* ctui_list_create_values_list(int type, Evas_Object *popup, + GSList *values, void(*cb)(void *, Evas_Object *, void *)) +{ + GSList *cursor; + Evas_Object *list; + + list = elm_list_add(popup); + evas_object_size_hint_max_set(list, -1, 600 * elm_config_scale_get()); // TODO : should be revise + + for (cursor=values;cursor;cursor=cursor->next) { + int id, val_type; + const char *value, *type_str; + char buf[PH_TEXT_MAX_LEN]; + if (CTS_VALUE_EMAIL == type) { + id = contacts_svc_value_get_int(cursor->data, CTS_EMAIL_VAL_ID_INT); + val_type = contacts_svc_value_get_int(cursor->data, CTS_EMAIL_VAL_TYPE_INT); + type_str = T_(CT_GET_TEXT_EMAIL_TYPE, val_type); + value = contacts_svc_value_get_str(cursor->data, CTS_EMAIL_VAL_ADDR_STR); + + snprintf(buf, sizeof(buf), "%s %s", type_str, value); + } + else{ + char num_type_str[PH_TEXT_SHORT_LEN]; + id = contacts_svc_value_get_int(cursor->data, CTS_NUM_VAL_ID_INT); + val_type = contacts_svc_value_get_int(cursor->data, CTS_NUM_VAL_TYPE_INT); + ctui_get_number_type_str(val_type, num_type_str, sizeof(num_type_str)); + value = contacts_svc_value_get_str(cursor->data, CTS_NUM_VAL_NUMBER_STR); + + snprintf(buf, sizeof(buf), "%s %s", num_type_str, value); + } + elm_list_item_append(list, buf, NULL, NULL, cb, (void *)id); + } + + elm_list_mode_set(list, ELM_LIST_EXPAND); + + return list; +} + +static Evas_Object* list_ug_create_popup_values_list(int type, ct_list_data *clist_d, + int contact_id, GSList *values) +{ + Evas_Object *popup; + Evas_Object *list; + Evas_Object *btn; + + popup = elm_popup_add(clist_d->navi); + elm_object_style_set(popup, "min_liststyle"); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + if (CTS_VALUE_EMAIL == type) + list = ctui_list_create_values_list(type, popup, values, list_ug_emails_popup_sel); + else + list = ctui_list_create_values_list(type, popup, values, list_ug_nums_popup_sel); + + elm_object_content_set(popup, list); + evas_object_data_set(list, "clist_d", clist_d); + evas_object_data_set(list, "ct_id", (void *)contact_id); + + btn = elm_button_add(popup); + elm_object_text_set(btn, S_(PH_SYS_POP_CLOSE)); + elm_object_part_content_set(popup, "button1", btn); + elm_object_style_set(btn, "popup_button/default"); + evas_object_smart_callback_add(btn, "clicked", ct_list_popup_hide_cb, list); + + clist_d->popup = popup; + evas_object_show(popup); + return list; +} + +static inline void list_ug_handle_select_number(ct_list_data *clist_d, int contact_id) +{ + GSList *list=NULL; + CTSstruct *contact = NULL; + int ret = contacts_svc_get_contact(contact_id, &contact); + p_retm_if(ret<CTS_SUCCESS, "contacts_svc_get_contact() Failed(%d)", ret); + + contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &list); + + if (list) { + if (1 == g_slist_length(list)) { + if (PH_UG_REQUEST_LAUNCH_VOICECALL == clist_d->ug_request) + phone_launch_voice_call(contact_id, contacts_svc_value_get_str(list->data, CTS_NUM_VAL_NUMBER_STR)); + else { + int num_id = contacts_svc_value_get_int(list->data, CTS_NUM_VAL_ID_INT); + phone_ug_return_id(clist_d->ug, contact_id, num_id, 0); + ug_destroy_me(clist_d->ug); + } + } + else + list_ug_create_popup_values_list(CTS_VALUE_NUMBER, clist_d, contact_id, list); + } + else { + phone_show_popup(clist_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_NO_NUMBER), 1.5); + } + contacts_svc_struct_free(contact); +} + +static inline void list_ug_handle_select_email(ct_list_data *clist_d, int contact_id) +{ + GSList *list=NULL; + CTSstruct *contact = NULL; + int ret = contacts_svc_get_contact(contact_id, &contact); + p_retm_if(ret<CTS_SUCCESS, "contacts_svc_get_contact() Failed(%d)", ret); + + contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &list); + + if (list) { + if (1 == g_slist_length(list)) { + int email_id = contacts_svc_value_get_int(list->data, CTS_EMAIL_VAL_ID_INT); + phone_ug_return_id(clist_d->ug, contact_id, 0, email_id); + ug_destroy_me(clist_d->ug); + } + else + list_ug_create_popup_values_list(CTS_VALUE_EMAIL, clist_d, contact_id, list); + } + else { + phone_show_popup(clist_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_NO_EMAIL), 1.5); + } + contacts_svc_struct_free(contact); +} + +static inline void ct_list_ug_handle_select_vcard(ct_list_data *clist_d, int contact_id) +{ + bool result = false; + char vcard_path[PH_TEXT_SHORT_LEN]; + + result = ct_list_make_vcard(contact_id, vcard_path, sizeof(vcard_path)); + PH_DBG("%d, %s", contact_id, vcard_path); + if(result == true) { + phone_ug_return_vcard(clist_d->ug, contact_id, vcard_path); + ug_destroy_me(clist_d->ug); + } + else { + phone_show_popup(clist_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_NO_CONTACTS), 1.5); + } +} + +static void list_ug_img_crop_result(ui_gadget_h ug, service_h service, void *data) +{ + ct_list_data *clist_d = data; + + p_retm_if(NULL == ug || NULL == data, "ug or data is NULL"); + + if (service) { + char *normal = NULL; + char *full = NULL; + + service_get_extra_data(service, "crop_image_path", &normal); + p_retm_if(!normal, "return value is NULL.\n"); + contacts_svc_save_image(CTS_IMG_NORMAL, clist_d->selected_contact, (char *)normal); + + service_get_extra_data(service, "image_path", &full); + contacts_svc_save_image(CTS_IMG_FULL, clist_d->selected_contact, (char *)full); + + free(normal); + free(full); + } + + ug_destroy(ug); + clist_d->child_ug = NULL; + ug_destroy_me(clist_d->ug); +} + +void ct_list_ug_handle_check_for_number(Elm_Object_Item *item, ct_list_data *clist_d) +{ + int ret; + GSList *list =NULL; + ct_contact_list *ct_info; + CTSstruct* contact; + Evas_Object *list_nums; + Eina_Bool all_check; + + ct_info = elm_object_item_data_get(item); + p_retm_if(NULL == ct_info, "elm_object_item_data_get() return NULL"); + + ret = contacts_svc_get_contact(ct_info->id, &contact); + p_retm_if(ret<CTS_SUCCESS, "contacts_svc_get_contact() Failed(%d)", ret); + + contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &list); + + if (NULL == list) { + Evas_Object *check; + ERR("contacts_svc_struct_get_list() return NULL"); + contacts_svc_struct_free(contact); + phone_show_popup(clist_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_NO_NUMBER), 1.5); + + ct_info->checked = EINA_FALSE; + clist_d->cnt_checked--; + + check = elm_object_part_content_get(clist_d->select_all_layout, "elm.icon"); + p_retm_if(NULL == check, "elm_object_part_content_get() return NULL"); + + if (clist_d->cnt_total == clist_d->cnt_checked) + all_check = EINA_TRUE; + else + all_check = EINA_FALSE; + + elm_check_state_set(check, all_check); + elm_genlist_item_update(item); + return; + } + + if (1 == g_slist_length(list)) { + ct_info->id_ret = contacts_svc_value_get_int(list->data, CTS_NUM_VAL_ID_INT); + ct_list_edit_update_selection_info(clist_d); + } + else { + list_nums = list_ug_create_popup_values_list(CTS_VALUE_NUMBER, clist_d, ct_info->id, list); + p_retm_if(NULL == list, "list_ug_create_popup_values_list() return NULL"); + evas_object_data_set(list_nums, "item", item); + } + + contacts_svc_struct_free(contact); +} + +void ct_list_ug_handle_check_for_email(Elm_Object_Item *item, ct_list_data *clist_d) +{ + int ret; + GSList *list = NULL; + CTSstruct *contact; + Evas_Object *list_emails; + ct_contact_list *ct_info; + Eina_Bool all_check; + + ct_info = elm_object_item_data_get(item); + p_retm_if(NULL == ct_info, "elm_object_item_data_get() return NULL"); + + ret = contacts_svc_get_contact(ct_info->id, &contact); + p_retm_if(ret<CTS_SUCCESS, "contacts_svc_get_contact() Failed(%d)", ret); + + contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &list); + + if (NULL == list) { + Evas_Object *check; + ERR("contacts_svc_struct_get_list() return NULL"); + contacts_svc_struct_free(contact); + phone_show_popup(clist_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_NO_EMAIL), 1.5); + ct_info->checked = EINA_FALSE; + clist_d->cnt_checked--; + + check = elm_object_part_content_get(clist_d->select_all_layout, "elm.icon"); + p_retm_if(NULL == check, "elm_object_part_content_get() return NULL"); + + if (clist_d->cnt_total == clist_d->cnt_checked) + all_check = EINA_TRUE; + else + all_check = EINA_FALSE; + + elm_check_state_set(check, all_check); + elm_genlist_item_update(item); + return; + } + + if (1 == g_slist_length(list)) { + ct_info->id_ret = contacts_svc_value_get_int(list->data, CTS_EMAIL_VAL_ID_INT); + ct_list_edit_update_selection_info(clist_d); + } + else { + list_emails = list_ug_create_popup_values_list(CTS_VALUE_EMAIL, clist_d, ct_info->id, list); + p_retm_if(NULL == list_emails, "list_ug_create_popup_values_list() return NULL"); + evas_object_data_set(list_emails, "item", item); + } + + contacts_svc_struct_free(contact); + +} + +static int idx_temp; +static int list_sel_vcard(const char *vcard_stream, void *data) +{ + Evas_Object *content; + ct_list_data *clist_d = data; + + if (++idx_temp != clist_d->idx_vcard) + return CTS_SUCCESS; + + content = ctui_contacts_viewer(clist_d->win, clist_d->navi, 0, vcard_stream); + if (NULL == content) { + ERR("ctui_contacts_viewer() return NULL"); + elm_exit(); + } + return CTS_ERR_FAIL; +} + +static void list_destory_child_ug(ui_gadget_h ug, void *priv) +{ + ct_list_data *clist_d = priv; + p_retm_if(NULL == ug, "ug is NULL"); + ug_destroy(ug); + + p_retm_if(NULL == priv, "priv is NULL"); + clist_d->child_ug = NULL; +} + +void ct_list_ug_gl_sel(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + const char *err_msg; + struct ug_cbs cbs = {0}; + CTSvalue *value; + ct_list_data *clist_d = data; + ct_contact_list *contact; + ph_view_info *view_info; + Elm_Object_Item *item = event_info; + Evas_Object *popup; + + elm_genlist_item_selected_set(item, EINA_FALSE); + + if (CT_GET_LIST_VCARD == clist_d->list_op && CT_UG_REQUEST_CHECK != clist_d->ug_request) { + p_retm_if(NULL == clist_d->vcard_path, "vcard_path is NULL"); + + contact = elm_object_item_data_get(item); + p_retm_if(NULL == contact, "elm_object_item_data_get() returns NULL"); + + idx_temp = 0; + clist_d->idx_vcard = contact->id; + + contacts_svc_vcard_foreach(clist_d->vcard_path, list_sel_vcard, clist_d); + return; + } + + PH_DBG("%d", clist_d->ug_request); + + if (CT_LIST_MODE_EDIT == clist_d->list_mode) { + contact = elm_object_item_data_get(item); + p_retm_if(NULL == contact, "elm_object_item_data_get() returns NULL"); + + contact->checked = !contact->checked; + ct_list_item_checked_set(item, clist_d); + if (!contact->checked) { + ct_list_edit_update_selection_info(clist_d); + return; + } + + if (CT_UG_REQUEST_CHECK_FOR_NUMBER == clist_d->ug_request) + ct_list_ug_handle_check_for_number(item, clist_d); + else if (CT_UG_REQUEST_CHECK_FOR_EMAIL == clist_d->ug_request) + ct_list_ug_handle_check_for_email(item, clist_d); + else + ct_list_edit_update_selection_info(clist_d); + + return; + } + + contact = elm_object_item_data_get(item); + p_retm_if(NULL == contact, "elm_object_item_data_get() returns NULL"); + + switch (clist_d->ug_request) { + case CT_UG_REQUEST_LIST: + case CT_UG_REQUEST_LIST_WITH_BACK: + ret = ctui_create_detail_view(clist_d, contact); + p_warn_if(ret < 0, "ctui_create_detail_view() Failed"); + break; + case CT_UG_REQUEST_SELECT_CONTACT: + if (clist_d->ug) { + phone_ug_return_id(clist_d->ug, contact->id, 0, 0); + ug_destroy_me(clist_d->ug); + clist_d->ug = NULL; + } + break; + case CT_UG_REQUEST_SELECT_NUMBER: + case PH_UG_REQUEST_LAUNCH_VOICECALL: + list_ug_handle_select_number(clist_d, contact->id); + break; + case CT_UG_REQUEST_SELECT_EMAIL: + list_ug_handle_select_email(clist_d, contact->id); + break; + case CT_UG_REQUEST_SELECT_VCARD: + ct_list_ug_handle_select_vcard(clist_d, contact->id); + break; + case CT_UG_REQUEST_UPDATE_CONTACT: + case CT_UG_REQUEST_UPDATE_WITH_NUM: + case CT_UG_REQUEST_UPDATE_WITH_EMAIL: + case CT_UG_REQUEST_UPDATE_WITH_WEB: + view_info = calloc(1, sizeof(ph_view_info)); + phone_set_view_info(view_info, clist_d->win, clist_d->navi, clist_d->ug, clist_d->ug_request, clist_d->cnt_max, clist_d->ug_data); + ctui_list_update_with_data(view_info, clist_d, contact->id, clist_d->base_grp, clist_d->base_ab); + free(view_info); + break; + case PH_UG_REQUEST_SET_WITH_IMG: + case CT_UG_REQUEST_SAVE_IMG: + clist_d->selected_contact = contact->id; + + cbs.result_cb = list_ug_img_crop_result; + cbs.destroy_cb = list_destory_child_ug; + cbs.priv = clist_d; + clist_d->child_ug = phone_image_crop_ug(clist_d->ug, clist_d->ug_data, &cbs); + break; + case PH_UG_REQUEST_SET_WITH_RINGTONE: + case CT_UG_REQUEST_SAVE_RINGTONE: + value = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO); + + err_msg = S_(CT_SYS_POP_SUCCESS); + if (value) { + contacts_svc_value_set_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR, clist_d->ug_data); + ret = contacts_svc_put_contact_value(CTS_PUT_VAL_REPLACE_RINGTONE, contact->id, value); + contacts_svc_value_free(value); + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_put_contact_value() Failed(%d)", ret); + if (CTS_ERR_DB_LOCK == ret) + err_msg = T_(CT_GET_TEXT_ERR, CTTEXT_ERR_DB_LOCKED); + else if (CTS_ERR_NO_SPACE == ret) + err_msg = S_(CT_SYS_POP_NOT_ENOUGH_MEMORY); + else + err_msg = S_(PH_SYS_POP_FAILED); + break; + } + } + else + err_msg = S_(PH_SYS_POP_FAILED); + + popup = phone_show_popup(clist_d->navi, err_msg, 1.5); + evas_object_smart_callback_add(popup, "timeout", ctui_list_ug_hide_cb, clist_d->ug); + break; + default: + ERR("Invalid ug_request(%d)", clist_d->ug_request); + break; + } +} + diff --git a/lib/list/ct-list-view-ug.h b/lib/list/ct-list-view-ug.h new file mode 100644 index 0000000..572be7e --- /dev/null +++ b/lib/list/ct-list-view-ug.h @@ -0,0 +1,25 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CONTACTS_LIST_VIEW_UG_H__ +#define __CONTACTS_LIST_VIEW_UG_H__ + +void ct_list_ug_gl_sel(void *data, Evas_Object *obj, void *event_info); +void ct_list_ug_handle_check_for_email(Elm_Object_Item *item, ct_list_data *clist_d); +void ct_list_ug_handle_check_for_number(Elm_Object_Item *item, ct_list_data *clist_d); + +#endif //__CONTACTS_LIST_VIEW_UG_H__ + diff --git a/lib/log/CMakeLists.txt b/lib/log/CMakeLists.txt index 202901f..575f3db 100755 --- a/lib/log/CMakeLists.txt +++ b/lib/log/CMakeLists.txt @@ -1,11 +1,11 @@ LINK_DIRECTORIES(${CMAKE_BINARY_DIR}) -SET(TARGET ${PHONELOG}) +SET(TARGET ${PH_LOG}) FILE(GLOB SRCS *.c) INCLUDE(FindPkgConfig) -pkg_check_modules(log_pkgs REQUIRED notification icu-i18n heynoti) +pkg_check_modules(log_pkgs REQUIRED phone-misc notification icu-i18n heynoti) FOREACH(flag ${log_pkgs_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") @@ -14,7 +14,7 @@ ENDFOREACH(flag) ADD_LIBRARY(${TARGET} SHARED ${SRCS}) 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} ${log_pkgs_LDFLAGS}) +TARGET_LINK_LIBRARIES(${TARGET} ${COMMON_LIB} ${ug_pkgs_LDFLAGS} ${log_pkgs_LDFLAGS} ${CT_DETAILS}) ADD_DEPENDENCIES(${TARGET} progress_edj_build) INSTALL(TARGETS ${TARGET} DESTINATION ${UGLIBDIR}) diff --git a/lib/log/ph-log-check-view.c b/lib/log/ph-log-check-view.c index f1ab546..66d053e 100755 --- a/lib/log/ph-log-check-view.c +++ b/lib/log/ph-log-check-view.c @@ -22,9 +22,27 @@ #include "ph-log-utils.h" #include "ph-log-main-view.h" + +int ph_log_get_genlist_items_count(Evas_Object *genlist) +{ + Elm_Object_Item *item; + int count=0; + + item = elm_genlist_first_item_get(genlist); + while (item) { + Elm_Genlist_Item_Type type = elm_genlist_item_type_get(item); + item = elm_genlist_item_next_get(item); + if (ELM_GENLIST_ITEM_GROUP != type) + count++; + } + return count; +} + void ph_log_check_update_button_status(ph_log_data *log_d) { Eina_Bool disabled; + p_retm_if(NULL == log_d, "parameter is NULL"); + p_retm_if(NULL == log_d->ctrl_item, "ctrl_item is NULL"); if (0 == log_d->log_list_count) disabled = EINA_TRUE; @@ -42,90 +60,50 @@ void ph_log_check_update_button_status(ph_log_data *log_d) void ph_log_check_update_selection_info(ph_log_data *log_d) { - if (log_d->cnt_checked == 0) { - Evas_Object *notify = phone_get_notify(log_d->navi); - if (notify) - evas_object_hide(notify); - } + if (log_d->cnt_checked == 0) + phone_hide_notify(log_d->navi); else { char info_text[PH_TEXT_SHORT_LEN]={0}; snprintf(info_text, sizeof(info_text), "%s (%d)", S_(PH_SYS_POP_SELECTED), log_d->cnt_checked); - phone_show_notify(log_d->navi, info_text, 0.0); + phone_show_notify(log_d->navi, info_text); } } -static void log_check_select_all(ph_log_data *log_d) +static void log_check_select_all(void *data, Eina_Bool checked) { Eina_List *l; ph_log_info *l_info; + ph_log_data *log_d = data; - if (log_d->select_all_checked) - log_d->cnt_checked = log_d->log_list_count; + if (checked) + log_d->cnt_checked = ph_log_get_genlist_items_count(log_d->genlist); else log_d->cnt_checked = 0; EINA_LIST_FOREACH(log_d->log_list, l, l_info) { if (!l_info) continue; - l_info->checked = log_d->select_all_checked; + l_info->checked = checked; } elm_genlist_realized_items_update(log_d->genlist); - ph_log_check_update_selection_info(log_d); ph_log_check_update_button_status(log_d); } - -static void log_check_select_all_changed_cb(void *data, Evas_Object *obj, void *event_info) -{ - log_check_select_all(data); -} - -static void log_check_select_all_mouse_up_cb(void *data, Evas *e, - Evas_Object *obj, void *event_info) +API void phone_log_check_mode_start(ph_log_data *log_d) { - int x, y, w, h; - ph_log_data *log_d = data; - Evas_Event_Mouse_Up *ev = event_info; - - if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) - return; + Elm_Object_Item *item; + p_retm_if(NULL == log_d, "log data is NULL"); - evas_object_geometry_get(obj, &x, &y, &w, &h); - if (ev->output.y < y || y + h < ev->output.y) - return; - - elm_check_state_set(log_d->select_all_check, !log_d->select_all_checked); - log_check_select_all(log_d); -} + if (log_d->item_last_sweep) { + elm_genlist_item_decorate_mode_set(log_d->item_last_sweep, "slide", EINA_FALSE); + elm_genlist_item_select_mode_set(log_d->item_last_sweep, ELM_OBJECT_SELECT_MODE_DEFAULT); + log_d->item_last_sweep = NULL; + } -void ph_log_check_mode_start(ph_log_data *log_d) -{ - Evas_Object *layout; - - if (0 < log_d->log_list_count) { - layout = elm_layout_add(log_d->box); - p_retm_if(NULL == layout, "elm_layout_add() return NULL"); - elm_layout_theme_set(layout, "genlist", "item", "select_all/default"); - evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, 0.0); - evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_data_set(log_d->box, "select_all_layout", layout); - - log_d->select_all_check = elm_check_add(layout); - p_retm_if(NULL == log_d->select_all_check, "elm_check_add() return NULL"); - elm_check_state_pointer_set(log_d->select_all_check, &log_d->select_all_checked); - evas_object_propagate_events_set(log_d->select_all_check, EINA_FALSE); - elm_object_part_content_set(layout, "elm.icon", log_d->select_all_check); - - evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_UP, - log_check_select_all_mouse_up_cb, log_d); - - evas_object_smart_callback_add(log_d->select_all_check, "changed", - log_check_select_all_changed_cb, log_d); - - elm_object_part_text_set(layout, "elm.text", S_(PH_SYS_BODY_SELECT_ALL)); - evas_object_show(layout); - elm_box_pack_start(log_d->box, layout); + if (0 < log_d->log_list_count && !log_d->select_all_layout) { + log_d->select_all_layout = phone_create_select_all(log_d->box, S_(PH_SYS_BODY_SELECT_ALL), log_check_select_all, log_d); + elm_box_pack_start(log_d->box, log_d->select_all_layout); } if (LOG_VIEW_TYPE_NORMAL == log_d->view_type) @@ -133,23 +111,27 @@ void ph_log_check_mode_start(ph_log_data *log_d) elm_genlist_decorate_mode_set(log_d->genlist, EINA_TRUE); phone_log_set_navi(log_d->navi); + + item = elm_genlist_first_item_get(log_d->genlist); + while (item) { + elm_genlist_item_fields_update(item, "elm.icon.3", ELM_GENLIST_ITEM_FIELD_CONTENT); + item = elm_genlist_item_next_get(item); + } } void ph_log_check_mode_end(ph_log_data *log_d, bool redraw) { - Evas_Object *layout; - Evas_Object *back_btn; - - layout = evas_object_data_get(log_d->box, "select_all_layout"); - elm_box_unpack(log_d->box, layout); - evas_object_del(layout); - evas_object_data_del(log_d->box, "select_all_layout"); - - if (log_d->cnt_checked) { - log_d->select_all_checked = EINA_FALSE; - log_check_select_all(log_d); - log_d->select_all_check= NULL; - } + Elm_Object_Item *item; + + phone_hide_notify(log_d->navi); + + elm_box_unpack(log_d->box, log_d->select_all_layout); + evas_object_del(log_d->select_all_layout); + log_d->select_all_layout = NULL; + + if (log_d->cnt_checked) + log_check_select_all(log_d, EINA_FALSE); + if (LOG_VIEW_TYPE_NORMAL_CHECK == log_d->view_type) { log_d->view_type = LOG_VIEW_TYPE_NORMAL; if (log_d->timer) @@ -158,32 +140,37 @@ void ph_log_check_mode_end(ph_log_data *log_d, bool redraw) } elm_genlist_decorate_mode_set(log_d->genlist, EINA_FALSE); - back_btn = elm_button_add(log_d->navi); - elm_object_item_part_content_set(log_d->navi_item, "prev_btn", back_btn); - - evas_object_smart_callback_add(back_btn, "clicked", phone_back_btn_clicked_cb, log_d->win); - elm_object_style_set(back_btn, "naviframe/end_btn/default"); - if (redraw) phone_log_set_navi(log_d->navi); + + item = elm_genlist_first_item_get(log_d->genlist); + while (item) { + elm_genlist_item_fields_update(item, "elm.icon.3", ELM_GENLIST_ITEM_FIELD_CONTENT); + item = elm_genlist_item_next_get(item); + } } void ph_log_check_update_select_all(ph_log_data *log_d) { - if (log_d->log_list_count == log_d->cnt_checked) - log_d->select_all_checked = EINA_TRUE; - else - log_d->select_all_checked = EINA_FALSE; + Eina_Bool all_check; + Evas_Object *check; + + p_retm_if(NULL == log_d->select_all_layout, "select_all_layout is NULL"); - elm_check_state_set(log_d->select_all_check, log_d->select_all_checked); + check = elm_object_part_content_get(log_d->select_all_layout, "elm.icon"); + p_retm_if(NULL == check, "elm_object_part_content_get() return NULL"); + + if (ph_log_get_genlist_items_count(log_d->genlist) == log_d->cnt_checked) + all_check = EINA_TRUE; + else + all_check = EINA_FALSE; + elm_check_state_set(check, all_check); } void ph_log_check_done_btn_cb(void *data, Evas_Object *obj, void *event_info) { int i = 0; int *result_list; - gchar *encoded_str; - bundle *bd; Eina_List *l; ph_log_info *l_info; ph_log_data *log_d = data; @@ -194,16 +181,8 @@ void ph_log_check_done_btn_cb(void *data, Evas_Object *obj, void *event_info) if (l_info->checked) result_list[i++] = l_info->id; } + phone_list_ug_return_ids(log_d->ug, result_list, log_d->cnt_checked, PH_UG_BUNDLE_RESULT_PLOG_ID_LIST); - bd = bundle_create(); - if (result_list) { - encoded_str = g_base64_encode((guchar *)result_list, log_d->cnt_checked*sizeof(int)); - bundle_add(bd, PH_UG_BUNDLE_RESULT_PLOG_ID_LIST, encoded_str); - g_free(encoded_str); - } - - ug_send_result(log_d->ug, bd); - bundle_free(bd); free(result_list); ug_destroy_me(log_d->ug); } @@ -223,7 +202,7 @@ static PTHREAD_FN log_check_del(void *data) if (!l_info) continue; if (TRUE == l_info->checked) { - if (CTS_SUCCESS != ph_log_util_del_log_by_number(l_info->plog_number)) { + if (CTS_SUCCESS != ph_log_util_del_log_by_id(log_d->log_list, l_info)) { p_info->completed = true; break; } @@ -262,22 +241,21 @@ static Eina_Bool log_check_del_timer(void *data) } else { int ret; - const char *message; + bool deleted = false; 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); + deleted = 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); + deleted = false; } evas_object_del(log_d->popup); @@ -289,7 +267,11 @@ static Eina_Bool log_check_del_timer(void *data) } ph_log_check_mode_end(log_d, true); - phone_show_notify(log_d->navi, message, 2.0); + + if (deleted) + phone_show_tickernoti(S_(PH_SYS_POP_DELETED)); + else + phone_show_tickernoti(S_(PH_SYS_POP_FAILED)); return ECORE_CALLBACK_CANCEL; } @@ -343,7 +325,6 @@ void ph_log_check_del_btn_cb(void *data, Evas_Object *obj, void *event_info) } log_d->popup = phone_progressbar_popup(log_d->win, p_info, T_(PH_GET_TEXT_BASIC, PHTEXT_DELETING_LOGS)); - phone_create_popup_button(log_d->popup, 1, S_(PH_SYS_SK_CANCEL), phone_progress_popup_del, p_info); } diff --git a/lib/log/ph-log-check-view.h b/lib/log/ph-log-check-view.h index eb24bfc..c28a84a 100755 --- a/lib/log/ph-log-check-view.h +++ b/lib/log/ph-log-check-view.h @@ -17,7 +17,6 @@ #ifndef __PH_LOG_CHECK_VIEW_H_ #define __PH_LOG_CHECK_VIEW_H_ -void ph_log_check_mode_start(ph_log_data *log_d); void ph_log_check_mode_end(ph_log_data *log_d, bool redraw); void ph_log_check_update_select_all(ph_log_data *log_d); void ph_log_check_update_selection_info(ph_log_data *log_d); diff --git a/lib/log/ph-log-detail-view.c b/lib/log/ph-log-detail-view.c index 379bd27..2db01bc 100755 --- a/lib/log/ph-log-detail-view.c +++ b/lib/log/ph-log-detail-view.c @@ -14,6 +14,9 @@ * limitations under the License. */ +#include <phone-misc.h> +#include <vconf.h> +#include <vconf-keys.h> #include <ui-gadget-module.h> #include "phone.h" @@ -27,15 +30,13 @@ enum LOG_DETAIL_ITC_TYPE { LOG_DETAIL_ITC_TOP_INFO = 0, LOG_DETAIL_ITC_TOP_BTNS, LOG_DETAIL_ITC_DETAIL, - LOG_DETAIL_ITC_BOTTOM_BTN, LOG_DETAIL_ITC_MAX, }; static Elm_Genlist_Item_Class log_detail_itcs[LOG_DETAIL_ITC_MAX] = { {.item_style="dialogue/bg/2text.2icon"}, {.item_style="dialogue/bg/2icon"}, - {.item_style="2text.2icon"}, - {.item_style="dialogue/bg/1icon"}, + {.item_style="dialogue/2text.2icon.4"}, }; typedef struct @@ -44,6 +45,8 @@ typedef struct int plog_type; int plog_time; int plog_duration; + int plog_msgid; + char *plog_shortmsg; }ph_log_detail_info; static void log_detail_destroy_child_ug(void *data) @@ -55,16 +58,19 @@ static void log_detail_destroy_child_ug(void *data) static void log_detail_msg_btn_cb(void *data, Evas_Object *obj, void *event_info) { ph_log_detail_data *logdetail_d = data; - logdetail_d->child_ug = phone_launch_msg_composer_ug(logdetail_d->ug, logdetail_d->log_number, + logdetail_d->child_ug = phone_launch_msg_composer_ug(logdetail_d->ug, logdetail_d->log_number, 0, log_detail_destroy_child_ug, logdetail_d); } static void log_detail_call_btn_cb(void *data, Evas_Object *obj, void *event_info) { ph_log_detail_data *logdetail_d = data; - phone_launch_voice_call(logdetail_d->log_number, logdetail_d->contact_id); + p_retm_if(NULL == logdetail_d, "log_info is NULL"); + phone_launch_voice_call(logdetail_d->contact_id, logdetail_d->log_number); } + + static int log_detail_is_msg_type(int type) { switch (type) { @@ -82,11 +88,21 @@ static int log_detail_is_msg_type(int type) static void log_detail_gl_sel(void *data, Evas_Object *obj, void *event_info) { + ph_log_detail_info * d_info = data; Elm_Object_Item *gli = event_info; + int msgid; ph_log_detail_data *logdetail_d; p_retm_if(NULL == data, "Data is null"); logdetail_d = evas_object_data_get(obj, KEY_LOG_DETAIL_DATA); elm_genlist_item_selected_set(gli, EINA_FALSE); + + msgid = d_info->plog_msgid; + if (TRUE == log_detail_is_msg_type(d_info->plog_type)) { + logdetail_d->child_ug = phone_launch_msg_composer_ug(logdetail_d->ug, NULL, msgid, + log_detail_destroy_child_ug, logdetail_d); + if (NULL == logdetail_d->child_ug) + phone_show_popup(logdetail_d->navi, T_(PH_GET_TEXT_BASIC, PHTEXT_NOT_EXIST_MESSAGE), 2.0); + } } static void log_detail_append_separator(Evas_Object *genlist) @@ -118,14 +134,9 @@ static void log_detail_fill_genlist(ph_log_detail_data *logdetail_d) if (!l_detail_info) continue; it = elm_genlist_item_append(logdetail_d->genlist, &log_detail_itcs[LOG_DETAIL_ITC_DETAIL], l_detail_info, NULL, ELM_GENLIST_ITEM_NONE, log_detail_gl_sel, l_detail_info); - } - if (logdetail_d->log_number) { - log_detail_append_separator(logdetail_d->genlist); - if (logdetail_d->contact_id <= 0) - logdetail_d->bottom_item = elm_genlist_item_append(logdetail_d->genlist, &log_detail_itcs[LOG_DETAIL_ITC_BOTTOM_BTN], logdetail_d, - NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); - log_detail_append_separator(logdetail_d->genlist); + if (FALSE == log_detail_is_msg_type(l_detail_info->plog_type)) + elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); } } @@ -137,72 +148,12 @@ static void log_detail_free_log_data(Eina_List *list) EINA_LIST_FOREACH(list, l, l_detail_info) { if (!l_detail_info) continue; + free(l_detail_info->plog_shortmsg); free(l_detail_info); } eina_list_free(list); } -static Eina_List *log_detail_load_log_data(char *req_number, int *ref_count) -{ - int count = 0; - CTSiter *iter; - Eina_List *list = NULL; - - contacts_svc_get_list_with_str(CTS_LIST_PLOGS_OF_NUMBER, req_number, &iter); - - while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { - CTSvalue *plog = NULL; - int type; - ph_log_detail_info *l_detail_info; - plog = contacts_svc_iter_get_info(iter); - type = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_LOG_TYPE_INT); - if (log_detail_is_msg_type(type)) { - contacts_svc_value_free(plog); - continue; - } - l_detail_info = calloc(1, sizeof(ph_log_detail_info)); - l_detail_info->plog_id = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_ID_INT); - l_detail_info->plog_type = type; - l_detail_info->plog_time = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_LOG_TIME_INT); - l_detail_info->plog_duration = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_DURATION_INT); - - list = eina_list_append(list, (void*)l_detail_info); - count++; - contacts_svc_value_free(plog); - } - contacts_svc_iter_remove(iter); - - *ref_count = count; - return list; -} - -static void log_detail_load_list(ph_log_detail_data * logdetail_d) -{ - log_detail_free_log_data(logdetail_d->log_list); - logdetail_d->log_list_count = 0; - logdetail_d->log_list = log_detail_load_log_data(logdetail_d->log_number, &(logdetail_d->log_list_count)); -} - -static Eina_Bool log_detail_refresh_view(void *data) -{ - ph_log_detail_data *logdetail_d = data; - log_detail_load_list(logdetail_d); - elm_genlist_clear(logdetail_d->genlist); - log_detail_fill_genlist(logdetail_d); - logdetail_d->idler = NULL; - return ECORE_CALLBACK_CANCEL; -} - -static void log_detail_list_changed_cb(void *data) -{ - ph_log_detail_data *detail_data = data; - if (detail_data->idler) { - ecore_idler_del(detail_data->idler); - detail_data->idler = NULL; - } - detail_data->idler = ecore_idler_add(log_detail_refresh_view, detail_data); -} - static void log_detail_get_contact_info(char *req_number, ph_log_detail_data *logdetail_d) { int index; @@ -267,21 +218,14 @@ static void log_detail_get_contact_info(char *req_number, ph_log_detail_data *lo logdetail_d->contact_id = 0; } -static void log_detail_update_view_with_contact(void *data) +static void log_detail_view_clicked_cb(void *data, Evas_Object *obj, void *event_info) { ph_log_detail_data *logdetail_d = data; - log_detail_get_contact_info(logdetail_d->log_number, logdetail_d); - - if (logdetail_d->top_item) - elm_genlist_item_update(logdetail_d->top_item); + p_retm_if(NULL == logdetail_d, "detail data is null"); - if (0 < logdetail_d->contact_id && logdetail_d->bottom_item) { - elm_object_item_del(logdetail_d->bottom_item); - logdetail_d->bottom_item = NULL; - } - else if (logdetail_d->contact_id <= 0 && !logdetail_d->bottom_item) - logdetail_d->bottom_item = elm_genlist_item_append(logdetail_d->genlist, &log_detail_itcs[LOG_DETAIL_ITC_BOTTOM_BTN], logdetail_d, - NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + if (0 < logdetail_d->contact_id) + logdetail_d->child_ug = phone_launch_contact_detail_ug(logdetail_d->ug, logdetail_d->contact_id, + log_detail_destroy_child_ug, logdetail_d); } static void log_detail_add_contact_btn_cb(void *data, Evas_Object *obj, void *event_info) @@ -291,36 +235,51 @@ static void log_detail_add_contact_btn_cb(void *data, Evas_Object *obj, void *ev log_detail_destroy_child_ug, logdetail_d); } -static void log_detail_img_clicked_cb(void *data, Evas_Object *obj, void *event_info) +static void log_detail_update_view_with_contact(void *data) { ph_log_detail_data *logdetail_d = data; - p_retm_if(NULL == logdetail_d, "detail data is null"); + log_detail_get_contact_info(logdetail_d->log_number, logdetail_d); - if (0 < logdetail_d->contact_id) - logdetail_d->child_ug = phone_launch_contact_detail_ug(logdetail_d->ug, logdetail_d->contact_id, - log_detail_destroy_child_ug, logdetail_d); -} + if (logdetail_d->top_item) + elm_genlist_item_update(logdetail_d->top_item); -static void log_detail_popup_hide_cb(void *data, Evas_Object *obj, void *event_info) -{ - ph_log_detail_data *logdetail_d = data; - evas_object_del(logdetail_d->popup); - logdetail_d->popup = NULL; + if (logdetail_d->first_item) { + elm_object_item_del(logdetail_d->first_item); + if (0 < logdetail_d->contact_id) + logdetail_d->first_item = elm_toolbar_item_prepend(logdetail_d->toolbar, CTUI_IMG_ICON_VIEW, NULL, log_detail_view_clicked_cb, logdetail_d); + else if (logdetail_d->log_number) + logdetail_d->first_item = elm_toolbar_item_prepend(logdetail_d->toolbar, CTUI_IMG_ICON_ADD_TO_CONTACTS, NULL, log_detail_add_contact_btn_cb, logdetail_d); + } } static void log_detail_delete_confirm_cb(void *data, Evas_Object *obj, void *event_info) { - int ret; - ph_log_detail_data *logdetail_d = data ; + PH_FN_CALL; + int ret = CTS_SUCCESS; + ph_log_detail_data *logdetail_d = data; + Eina_List *l; + ph_log_detail_info *l_info; + evas_object_del(logdetail_d->popup); logdetail_d->popup = NULL; - ret = ph_log_util_del_log_by_number(logdetail_d->log_number); - if (CTS_SUCCESS != ret) - phone_show_notify(logdetail_d->navi, S_(PH_SYS_POP_FAILED), 2.0); + contacts_svc_begin_trans(); + l = logdetail_d->log_list; + EINA_LIST_FOREACH(l, l, l_info) { + ret = contacts_svc_delete_phonelog(CTS_PLOG_DEL_BY_ID, l_info->plog_id); + if (CTS_SUCCESS != ret) + break; + } + + if (CTS_SUCCESS != ret) { + contacts_svc_end_trans(false); + phone_show_tickernoti(S_(PH_SYS_POP_FAILED)); + } else { - phone_show_notify(logdetail_d->navi, S_(PH_SYS_POP_DELETED), 2.0); + evas_object_data_del(logdetail_d->navi, KEY_LOG_DETAIL_DATA); elm_naviframe_item_pop(logdetail_d->navi); + contacts_svc_end_trans(true); + phone_show_tickernoti(S_(PH_SYS_POP_DELETED)); } } @@ -329,9 +288,8 @@ static void log_detail_del_btn_cb(void *data, Evas_Object *obj, void *event_info ph_log_detail_data *logdetail_d = data ; char buf[PH_TEXT_MAX_LEN] = {0}; snprintf(buf, sizeof(buf), "%s?", S_(PH_SYS_SK_DELETE)); - logdetail_d->popup = phone_create_confirm_popup(logdetail_d->win, buf); - phone_create_popup_button(logdetail_d->popup, 1, S_(PH_SYS_SK_OK), log_detail_delete_confirm_cb, logdetail_d); - phone_create_popup_button(logdetail_d->popup, 2, S_(PH_SYS_SK_CANCEL), log_detail_popup_hide_cb, logdetail_d); + phone_create_confirm_popup(&logdetail_d->popup, logdetail_d->win, buf, + log_detail_delete_confirm_cb, logdetail_d); } static Evas_Object *log_detail_gl_top_info_icon_get(void *data, Evas_Object *obj, const char *part) @@ -344,7 +302,7 @@ static Evas_Object *log_detail_gl_top_info_icon_get(void *data, Evas_Object *obj else detail_img = phone_create_icon_with_img(obj, IMG_DEFAULT); if (detail_img) - evas_object_smart_callback_add(detail_img, "clicked", log_detail_img_clicked_cb, logdetail_d); + evas_object_size_hint_aspect_set(detail_img, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); return detail_img; } return NULL; @@ -352,28 +310,39 @@ static Evas_Object *log_detail_gl_top_info_icon_get(void *data, Evas_Object *obj static Evas_Object *log_detail_gl_top_btns_icon_get(void *data, Evas_Object *obj, const char *part) { + char *fullpath; + Evas_Object *btn; + Evas_Object *icon; + Evas_Smart_Cb clicked_fn; ph_log_detail_data *logdetail_d = data; + + p_retv_if(NULL == data, NULL); + if (0 == strcmp(part, "elm.icon.1")) { - Evas_Object *btn = elm_button_add(logdetail_d->layout); - p_retvm_if(NULL == btn, NULL, "elm_button_add() return NULL"); - elm_object_style_set(btn, "style2"); - elm_object_text_set(btn, S_(PH_SYS_BODY_CALL)); - evas_object_smart_callback_add(btn, "clicked", log_detail_call_btn_cb, logdetail_d); - if (!logdetail_d->log_number || !*logdetail_d->log_number) - elm_object_disabled_set(btn, EINA_TRUE); - return btn; + fullpath = PH_IMG_ICON_CALL; + clicked_fn = log_detail_call_btn_cb; } else if (0 == strcmp(part, "elm.icon.2")) { - Evas_Object *btn = elm_button_add(logdetail_d->layout); - p_retvm_if(NULL == btn, NULL, "elm_button_add() return NULL"); - elm_object_style_set(btn, "style2"); - elm_object_text_set(btn, S_(PH_SYS_BODY_MESSAGE)); - evas_object_smart_callback_add(btn, "clicked", log_detail_msg_btn_cb, logdetail_d); - if (!logdetail_d->log_number || !*logdetail_d->log_number) - elm_object_disabled_set(btn, EINA_TRUE); - return btn; + fullpath = PH_IMG_ICON_MESSAGE; + clicked_fn = log_detail_msg_btn_cb; } - return NULL; + else + return NULL; + + 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_smart_callback_add(btn, "clicked", clicked_fn, logdetail_d); + + if (!logdetail_d->log_number || !*logdetail_d->log_number) + elm_object_disabled_set(btn, EINA_TRUE); + return btn; } @@ -403,25 +372,6 @@ static char *log_detail_gl_top_info_label_get(void *data, Evas_Object *obj, cons return NULL; } -static Evas_Object *log_detail_gl_bottom_btns_icon_get(void *data, Evas_Object *obj, const char *part) -{ - ph_log_detail_data *logdetail_d = data; - Evas_Object *btn; - - if (0 == strcmp(part, "elm.icon.1") || 0 == strcmp(part, "elm.icon")) { - if (0 < logdetail_d->contact_id) - return NULL; - - btn = elm_button_add(logdetail_d->layout); - p_retvm_if(NULL == btn, NULL, "elm_button_add() return NULL"); - elm_object_style_set(btn, "style2"); - elm_object_text_set(btn, S_(PH_SYS_OPT_ADD_TO_CONTACTS)); - evas_object_smart_callback_add(btn, "clicked", log_detail_add_contact_btn_cb, logdetail_d); - return btn; - } - return NULL; -} - static Evas_Object *log_detail_gl_icon_get(void *data, Evas_Object *obj, const char *part) { ph_log_detail_info * l_detail_info = data; @@ -429,12 +379,12 @@ static Evas_Object *log_detail_gl_icon_get(void *data, Evas_Object *obj, const c Evas_Object *ic; if (0 == strcmp(part, "elm.icon.2")) { - char *made_data = ph_log_util_get_icon_type(l_detail_info->plog_type); + 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 = ph_log_util_get_icon_path_with_action(l_detail_info->plog_type); + 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); } @@ -447,55 +397,78 @@ static Evas_Object *log_detail_gl_icon_get(void *data, Evas_Object *obj, const c return ic; } -static char *log_detail_get_duration_from_number(int number) +static char* log_detail_get_type_name(int type) { - int sec, min, hour, day; - struct tm tmp={0}; - char buf[PATH_MAX]={0}; - char buf_t[PATH_MAX]={0}; - - sec = number; - day = sec/(60*60*24); - sec %= (60*60*24); - hour = sec/(60*60); - sec %= (60*60); - min = sec/(60); - sec %= (60); - tmp.tm_mday = day; - tmp.tm_hour = hour; - tmp.tm_min = min; - tmp.tm_sec = sec; - strftime(buf_t, sizeof(buf_t), "%H:%M:%S", &tmp); - snprintf(buf, sizeof(buf), "%s", buf_t); - - return strdup(buf_t); -} - -static int log_detail_is_call_ing_type(int type) -{ - switch (type) { + switch(type) + { case CTS_PLOG_TYPE_VOICE_INCOMMING: - case CTS_PLOG_TYPE_VOICE_OUTGOING: case CTS_PLOG_TYPE_VIDEO_INCOMMING: + return strdup("Incoming call"); + break; + case CTS_PLOG_TYPE_VOICE_OUTGOING: case CTS_PLOG_TYPE_VIDEO_OUTGOING: - return TRUE; + return strdup("Outgoing call"); + break; + case CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN: + case CTS_PLOG_TYPE_VOICE_INCOMMING_SEEN: + case CTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN: + case CTS_PLOG_TYPE_VIDEO_INCOMMING_SEEN: + return strdup("Missed call"); + break; + case CTS_PLOG_TYPE_MMS_OUTGOING: + case CTS_PLOG_TYPE_SMS_OUTGOING: + case CTS_PLOG_TYPE_EMAIL_SENT: + return strdup("Sent message"); + break; + case CTS_PLOG_TYPE_MMS_INCOMMING : + case CTS_PLOG_TYPE_SMS_INCOMMING: + case CTS_PLOG_TYPE_EMAIL_RECEIVED: + return strdup("Received message"); + break; + case CTS_PLOG_TYPE_VOICE_REJECT: + case CTS_PLOG_TYPE_VIDEO_REJECT: + case CTS_PLOG_TYPE_VOICE_BLOCKED: + case CTS_PLOG_TYPE_VIDEO_BLOCKED: + case CTS_PLOG_TYPE_SMS_BLOCKED: + case CTS_PLOG_TYPE_MMS_BLOCKED: default: - return FALSE; + break; } + return NULL; } static char* log_detail_gl_label_get(void *data, Evas_Object *obj, const char *part) { ph_log_detail_info * l_detail_info = data; + char buf[PATH_MAX]={0}; + char* typename = NULL; if (0 == strcmp(part, "elm.text.1")) { ph_log_detail_data *logdetail_d; logdetail_d = evas_object_data_get(obj, KEY_LOG_DETAIL_DATA); - return ph_log_util_get_time_date(logdetail_d->log_d->formatter, l_detail_info->plog_time, l_detail_info->plog_duration, TRUE); + return phone_detail_log_get_time(logdetail_d->log_d->formatter, l_detail_info->plog_time); } else if (0 == strcmp(part, "elm.text.2")) { - if (TRUE == log_detail_is_call_ing_type(l_detail_info->plog_type)) - return log_detail_get_duration_from_number(l_detail_info->plog_duration); + typename = log_detail_get_type_name(l_detail_info->plog_type); + if (typename) + { + if (TRUE == phone_detail_log_is_call_ing_type(l_detail_info->plog_type)) + { + sprintf(buf, "%s\t\t\t%s", typename, phone_detail_log_get_duration_from_number(l_detail_info->plog_duration)); + return strdup(buf); + } + else + return strdup(typename); + } + else + { + if (TRUE == phone_detail_log_is_call_ing_type(l_detail_info->plog_type)) + return phone_detail_log_get_duration_from_number(l_detail_info->plog_duration); + } + } + else if (0 == strcmp(part, "elm.text.3")) { + if (TRUE == phone_detail_log_is_call_ing_type(l_detail_info->plog_type)) + return phone_detail_log_get_duration_from_number(l_detail_info->plog_duration); } return NULL; @@ -510,8 +483,6 @@ static inline void log_detail_create_itcs() log_detail_itcs[LOG_DETAIL_ITC_TOP_INFO].func.content_get = log_detail_gl_top_info_icon_get; log_detail_itcs[LOG_DETAIL_ITC_TOP_BTNS].func.content_get = log_detail_gl_top_btns_icon_get; - - log_detail_itcs[LOG_DETAIL_ITC_BOTTOM_BTN].func.content_get = log_detail_gl_bottom_btns_icon_get; } static Evas_Object* log_detail_create_genlist(ph_log_detail_data *logdetail_d, Evas_Object *parent) @@ -523,7 +494,8 @@ static Evas_Object* log_detail_create_genlist(ph_log_detail_data *logdetail_d, E 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, KEY_LOG_DETAIL_DATA, logdetail_d); - + elm_object_style_set(genlist,"dialogue"); + log_detail_create_itcs(); return genlist; } @@ -535,8 +507,6 @@ static void log_detail_view_delete_cb(void *data, Evas *e, Evas_Object *obj, voi p_retm_if(NULL == logdetail_d, "log detail data is null"); - contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_PLOG_CHANGE, - log_detail_list_changed_cb, logdetail_d); contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_CONTACT_CHANGE, log_detail_update_view_with_contact, logdetail_d); @@ -574,15 +544,146 @@ static void log_detail_back_btn_cb(void *data, Evas_Object *obj, void *event_inf phone_log_missed_info_update(logdetail_d->navi); } +static int touch_x; +static int touch_y; +void log_detail_gl_mousedown_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Down *ev = event_info; + touch_x = ev->canvas.x; + touch_y = ev->canvas.y; +} + +static void log_detail_ctxpopup_dismissed_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_log_detail_data *logdetail_d = data; + evas_object_del(obj); + logdetail_d->popup = NULL; +} + +static void log_detail_ctxpopup_copy_cb(void *data, Evas_Object *obj, void *event_info) +{ + char buf[PH_TEXT_MAX_LEN]; + + ph_log_detail_data *logdetail_d = data; + evas_object_del(obj); + logdetail_d->popup = NULL; + + if (logdetail_d->log_display && *logdetail_d->log_display) + if (logdetail_d->log_number && *logdetail_d->log_number) + snprintf(buf, sizeof(buf), "%s\n%s", logdetail_d->log_display, logdetail_d->log_number); + else + snprintf(buf, sizeof(buf), "%s", logdetail_d->log_display); + else if (logdetail_d->log_number && *logdetail_d->log_number) + snprintf(buf, sizeof(buf), "%s", logdetail_d->log_number); + else + snprintf(buf, sizeof(buf), "%s", S_(PH_SYS_BODY_UNKNOWN)); + elm_cnp_selection_set(logdetail_d->layout, ELM_SEL_TYPE_CLIPBOARD, ELM_SEL_FORMAT_TEXT, buf, strlen(buf)); +} + +static void log_detail_gl_longpressed_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_log_detail_data *logdetail_d = data; + + logdetail_d->popup = elm_ctxpopup_add(logdetail_d->navi); + p_retm_if(NULL == logdetail_d->popup, "elm_ctxpopup_add() return NULL"); + elm_ctxpopup_direction_priority_set(logdetail_d->popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT); + + evas_object_smart_callback_add(logdetail_d->popup, "dismissed", log_detail_ctxpopup_dismissed_cb, logdetail_d); + elm_ctxpopup_item_append(logdetail_d->popup, S_(CT_SYS_BODY_COPY), NULL, log_detail_ctxpopup_copy_cb, logdetail_d); + + evas_object_move(logdetail_d->popup, 720/2, 50+142/2); + evas_object_show(logdetail_d->popup); +} + +static Evas_Object *log_detail_set_toolbar(ph_log_detail_data *logdetail_d) +{ + Evas_Object *toolbar; + toolbar = elm_toolbar_add(logdetail_d->navi); + elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND); + + if (logdetail_d->contact_id) // view button + logdetail_d->first_item = elm_toolbar_item_append(toolbar, CTUI_IMG_ICON_VIEW, NULL, log_detail_view_clicked_cb, logdetail_d); + else if (logdetail_d->log_number) // save button + logdetail_d->first_item = elm_toolbar_item_append(toolbar, CTUI_IMG_ICON_ADD_TO_CONTACTS, NULL, log_detail_add_contact_btn_cb, logdetail_d); + + elm_toolbar_item_append(toolbar, PH_IMG_ICON_DELETE, NULL, log_detail_del_btn_cb, logdetail_d); + + if (!logdetail_d->first_item) + phone_toolbar_disabled_item_append(toolbar, 3); + return toolbar; +} + +void ph_log_detail_update(ph_log_data *log_d) +{ + PH_FN_CALL; + ph_log_detail_data *logdetail_d; + logdetail_d = evas_object_data_get(log_d->navi, KEY_LOG_DETAIL_DATA); + + if (logdetail_d) { + ph_log_info *l_info = NULL; + ph_log_info *find_info = NULL; + ph_log_detail_info *l_detail_info = NULL; + Eina_List *l_detail = logdetail_d->log_list; + Eina_List *l; + Elm_Object_Item *pre_item = NULL; + + EINA_LIST_FOREACH(l_detail, l_detail, l_detail_info) { + l = log_d->log_list; + EINA_LIST_FOREACH(l, l, l_info) { + if (l_detail_info->plog_id == l_info->id) { + find_info = elm_object_item_data_get(l_info->item); + break; + } + } + } + + if (find_info) { + log_detail_free_log_data(logdetail_d->log_list); + logdetail_d->log_list = NULL; + if (logdetail_d->genlist) + elm_genlist_clear(logdetail_d->genlist); + + l = eina_list_data_find_list(log_d->log_list, find_info); + EINA_LIST_FOREACH(l, l, l_info) { + ph_log_detail_info *l_detail_info = calloc(1, sizeof(ph_log_detail_info)); + l_detail_info->plog_id = l_info->id; + l_detail_info->plog_type = l_info->plog_log_type; + l_detail_info->plog_time = l_info->plog_log_time; + l_detail_info->plog_duration = l_info->plog_duration; + + if (NULL == pre_item) { + logdetail_d->log_list = eina_list_append(logdetail_d->log_list, (void*)l_detail_info); + pre_item = l_info->item; + } + else if (l_info->item == pre_item) + logdetail_d->log_list = eina_list_append(logdetail_d->log_list, (void*)l_detail_info); + else { + free(l_detail_info); + break; + } + } + logdetail_d->log_list_count = eina_list_count(logdetail_d->log_list); + log_detail_fill_genlist(logdetail_d); + } + else { + elm_naviframe_item_pop(logdetail_d->navi); + phone_log_missed_info_update(logdetail_d->navi); + } + } +} + Evas_Object *ph_create_log_detail_view(ph_log_data *log_d, ph_log_info *l_info) { Evas_Object *back_btn; Evas_Object *layout; Evas_Object *bg; Evas_Object *genlist; - Evas_Object *cbar; + Evas_Object *toolbar; Elm_Object_Item *navi_it; ph_log_detail_data *logdetail_d; + Eina_List *l; + Elm_Object_Item *pre_item = NULL; + ph_log_info *log_info; p_retvm_if(NULL == l_info, NULL, "Log information is null"); logdetail_d = calloc(1, sizeof(ph_log_detail_data)); @@ -591,6 +692,7 @@ Evas_Object *ph_create_log_detail_view(ph_log_data *log_d, ph_log_info *l_info) logdetail_d->win = log_d->win; logdetail_d->navi = log_d->navi; logdetail_d->log_d = log_d; + logdetail_d->start_plog_id = l_info->id; layout = elm_layout_add(logdetail_d->navi); if (NULL == layout) { @@ -610,6 +712,9 @@ Evas_Object *ph_create_log_detail_view(ph_log_data *log_d, ph_log_info *l_info) logdetail_d->genlist = genlist; elm_object_part_content_set(logdetail_d->layout, "elm.swallow.content", genlist); + evas_object_event_callback_add(genlist, EVAS_CALLBACK_MOUSE_DOWN, log_detail_gl_mousedown_cb, NULL); + evas_object_smart_callback_add(genlist, "longpressed", log_detail_gl_longpressed_cb, logdetail_d); + logdetail_d->contact_id = l_info->plog_ct_id; logdetail_d->log_number = SAFE_STRDUP(l_info->plog_number); if (l_info->plog_img_path) @@ -617,27 +722,43 @@ Evas_Object *ph_create_log_detail_view(ph_log_data *log_d, ph_log_info *l_info) if (l_info->plog_display && *l_info->plog_display) logdetail_d->log_display = strdup(l_info->plog_display); - log_detail_load_list(logdetail_d); + l = eina_list_data_find_list(log_d->log_list, l_info); + EINA_LIST_FOREACH(l,l,log_info) { + ph_log_detail_info *l_detail_info = calloc(1, sizeof(ph_log_detail_info)); + l_detail_info->plog_id = log_info->id; + l_detail_info->plog_type = log_info->plog_log_type; + l_detail_info->plog_time = log_info->plog_log_time; + l_detail_info->plog_duration = log_info->plog_duration; + + if (NULL == pre_item) { + logdetail_d->log_list = eina_list_append(logdetail_d->log_list, (void*)l_detail_info); + pre_item = log_info->item; + } + else if (log_info->item == pre_item) + logdetail_d->log_list = eina_list_append(logdetail_d->log_list, (void*)l_detail_info); + else { + free(l_detail_info); + break; + } + } + logdetail_d->log_list_count = eina_list_count(logdetail_d->log_list); log_detail_fill_genlist(logdetail_d); evas_object_event_callback_add(logdetail_d->layout, EVAS_CALLBACK_DEL, log_detail_view_delete_cb, logdetail_d); - contacts_svc_subscribe_change(CTS_SUBSCRIBE_PLOG_CHANGE, log_detail_list_changed_cb, logdetail_d); contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE, log_detail_update_view_with_contact, logdetail_d); back_btn = elm_button_add(layout); evas_object_smart_callback_add(back_btn, "clicked", log_detail_back_btn_cb, logdetail_d); elm_object_style_set(back_btn, "naviframe/back_btn/default"); navi_it = elm_naviframe_item_push(logdetail_d->navi, S_(PH_SYS_BODY_DETAILS), back_btn, NULL, layout, NULL); + elm_naviframe_item_title_visible_set(navi_it, EINA_FALSE); - cbar = elm_toolbar_add(logdetail_d->navi); - elm_toolbar_shrink_mode_set(cbar, ELM_TOOLBAR_SHRINK_EXPAND); - - elm_toolbar_item_append(cbar, IMG_DELETE_ICON, NULL, log_detail_del_btn_cb, logdetail_d); - phone_toolbar_disalbed_item_append(cbar, 3); + toolbar = log_detail_set_toolbar(logdetail_d); + elm_object_item_part_content_set(navi_it, "controlbar", toolbar); + logdetail_d->toolbar = toolbar; - elm_object_item_part_content_set(navi_it, "controlbar", cbar); evas_object_data_set(logdetail_d->navi, KEY_LOG_DETAIL_DATA, logdetail_d); bg = phone_create_bg(logdetail_d->layout); diff --git a/lib/log/ph-log-detail-view.h b/lib/log/ph-log-detail-view.h index 85ec092..26ecc04 100755 --- a/lib/log/ph-log-detail-view.h +++ b/lib/log/ph-log-detail-view.h @@ -24,12 +24,15 @@ typedef struct Evas_Object *layout; Evas_Object *genlist; Evas_Object *popup; + Evas_Object *toolbar; Elm_Object_Item *top_item; - Elm_Object_Item *bottom_item; + Elm_Object_Item *first_item; + Elm_Object_Item *block_item; char *log_display; char *log_number; char *log_img_path; int contact_id; + int start_plog_id; int log_list_count; Eina_List *log_list; Ecore_Idler *idler; @@ -39,6 +42,7 @@ typedef struct }ph_log_detail_data; Evas_Object *ph_create_log_detail_view(ph_log_data *log_d, ph_log_info *l_info); - +void ph_log_detail_get_block_info(ph_log_detail_data *logdetail_d); +void ph_log_detail_update(ph_log_data *log_d); #endif /* __PH_LOG_DETAIL_VIEW_H_ */ diff --git a/lib/log/ph-log-main-view.c b/lib/log/ph-log-main-view.c index c94d4c7..28cb754 100755 --- a/lib/log/ph-log-main-view.c +++ b/lib/log/ph-log-main-view.c @@ -24,14 +24,30 @@ #include "ph-log-main-view.h" #include "ph-log-detail-view.h" #include "ph-log-check-view.h" +#include "ct-detail.h" #define KEY_LOG_DATA "log_data" static Elm_Genlist_Item_Class itc, itc_one, itc_date; -// 0: today, 1: yesterday, 2: previous -static int log_get_date_type(int log_time, int log_duration) +static void log_destroy_child_ug(void *data) { + ph_log_data *log_d = data; + log_d->child_ug = NULL; +} + +static void log_gl_msg_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_log_data *log_d = evas_object_data_get(obj, KEY_LOG_DATA); + log_d->child_ug = phone_launch_msg_composer_ug(log_d->ug, data, 0, + log_destroy_child_ug, log_d); +} + + +// today: -1, yesterday : -2, previous : positive value +static void log_append_separate_all_date_index(ph_log_data *log_d, void *data, int index) +{ + ph_log_info *l_info = data; time_t stime; struct timeval timeval; struct tm *tmp; @@ -39,31 +55,21 @@ static int log_get_date_type(int log_time, int log_duration) gettimeofday(&timeval, 0); tmp = localtime(&timeval.tv_sec); - p_retvm_if(NULL == tmp, 2, "localtime is null"); cur_yday = tmp->tm_yday; - stime = log_time - log_duration; + stime = l_info->plog_log_time - l_info->plog_duration; tmp = localtime(&stime); - p_retvm_if(NULL == tmp, 2, "localtime is null"); yday = tmp->tm_yday; if (yday == cur_yday) - return 0; - else if (yday == cur_yday-1) - return 1; + l_info->group_index = -1; + else if (yday == (cur_yday-1)) + l_info->group_index = -2; else - return 2; -} - -static void log_append_separate_date_index(ph_log_data *log_d, void *data, int index) -{ - ph_log_info *l_info = data; - int type = log_get_date_type(l_info->plog_log_time, l_info->plog_duration); - - if (0 == index || log_d->pre_date_type != type) { - log_d->pre_date_type = type; - l_info->group_index = type; + l_info->group_index = yday; + if (yday != log_d->pre_date_type) { + log_d->pre_date_type = yday; log_d->git = elm_genlist_item_append(log_d->genlist, &itc_date, data, NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL); } @@ -71,7 +77,8 @@ static void log_append_separate_date_index(ph_log_data *log_d, void *data, int i static void log_gl_item_sel(void *data, Evas_Object *obj, void *event_info) { - bundle *bd; + PH_FN_CALL; + service_h service; char buf[16]; Elm_Object_Item *item = event_info; ph_log_info *l_info = data; @@ -92,19 +99,20 @@ static void log_gl_item_sel(void *data, Evas_Object *obj, void *event_info) return; } + PH_DBG("view_type : %d", log_d->view_type); switch (log_d->view_type) { - case LOG_VIEW_TYPE_VOICE_CALL: + case LOG_VIEW_TYPE_UG_LAUNCH_CALL: if (l_info->plog_number && *l_info->plog_number) - phone_launch_voice_call(l_info->plog_number, l_info->plog_ct_id); + phone_launch_voice_call(l_info->plog_ct_id, l_info->plog_number); break; - case LOG_VIEW_TYPE_SELECT: - bd = bundle_create(); - p_retm_if(NULL == bd, "bundle_create() Failed"); + case LOG_VIEW_TYPE_UG_NUMBER_SELECT: + case LOG_VIEW_TYPE_UG_EMAIL_SELECT: + service_create(&service); snprintf(buf, sizeof(buf), "%d", l_info->id); - bundle_add(bd, PH_UG_BUNDLE_RESULT_PLOG_ID, buf); + service_add_extra_data(service, PH_UG_BUNDLE_RESULT_PLOG_ID, buf); PH_DBG("plog_id : %d %s", l_info->id, buf); - ug_send_result(log_d->ug, bd); - bundle_free(bd); + ug_send_result(log_d->ug, service); + service_destroy(service); ug_destroy_me(log_d->ug); break; case LOG_VIEW_TYPE_NORMAL: @@ -117,25 +125,157 @@ static void log_gl_item_sel(void *data, Evas_Object *obj, void *event_info) } #define N 20 -static Eina_Bool log_append_item_part(void *data) +static bool log_compare_type(int type, int pre_type) +{ + switch (pre_type) { + case CTS_PLOG_TYPE_VOICE_INCOMMING: + case CTS_PLOG_TYPE_VIDEO_INCOMMING: + case CTS_PLOG_TYPE_MMS_INCOMMING: + case CTS_PLOG_TYPE_SMS_INCOMMING: + case CTS_PLOG_TYPE_VOICE_OUTGOING: + case CTS_PLOG_TYPE_VIDEO_OUTGOING: + case CTS_PLOG_TYPE_MMS_OUTGOING: + case CTS_PLOG_TYPE_SMS_OUTGOING: + switch (type) { + case CTS_PLOG_TYPE_VOICE_INCOMMING: + case CTS_PLOG_TYPE_VIDEO_INCOMMING: + case CTS_PLOG_TYPE_MMS_INCOMMING: + case CTS_PLOG_TYPE_SMS_INCOMMING: + case CTS_PLOG_TYPE_VOICE_OUTGOING: + case CTS_PLOG_TYPE_VIDEO_OUTGOING: + case CTS_PLOG_TYPE_MMS_OUTGOING: + case CTS_PLOG_TYPE_SMS_OUTGOING: + return true; + default : + return false; + } + case CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN: + case CTS_PLOG_TYPE_VOICE_INCOMMING_SEEN: + case CTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN: + case CTS_PLOG_TYPE_VIDEO_INCOMMING_SEEN: + switch (type) { + case CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN: + case CTS_PLOG_TYPE_VOICE_INCOMMING_SEEN: + case CTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN: + case CTS_PLOG_TYPE_VIDEO_INCOMMING_SEEN: + return true; + default : + return false; + } + case CTS_PLOG_TYPE_VOICE_REJECT: + case CTS_PLOG_TYPE_VIDEO_REJECT: + switch (type) { + case CTS_PLOG_TYPE_VOICE_REJECT: + case CTS_PLOG_TYPE_VIDEO_REJECT: + return true; + default : + return false; + } + case CTS_PLOG_TYPE_VOICE_BLOCKED: + case CTS_PLOG_TYPE_VIDEO_BLOCKED: + case CTS_PLOG_TYPE_SMS_BLOCKED: + switch (type) { + case CTS_PLOG_TYPE_VOICE_BLOCKED: + case CTS_PLOG_TYPE_VIDEO_BLOCKED: + case CTS_PLOG_TYPE_SMS_BLOCKED: + return true; + default : + return false; + } + default: + return false; + } +} + +static int log_fill_genlist_sub(ph_log_data * log_d, Eina_List *l, ph_log_info *pre_info) { - int count; - Eina_List *l; ph_log_info *l_info; - ph_log_data * log_d = data; + int count; + int cnt_append; + int pre_type; + int pre_date; + int pre_ct_id; + bool diff; + char *pre_num; + Elm_Object_Item *item; + Elm_Object_Item *pre_item; + + if (pre_info) { + pre_date = pre_info->group_index; + pre_ct_id = pre_info->plog_ct_id; + pre_type = pre_info->plog_log_type; + pre_item = pre_info->item; + pre_num = SAFE_STRDUP(pre_info->plog_number); + } + else { + pre_date = -3; + pre_ct_id = -1; + pre_type = CTS_PLOG_TYPE_NONE; + pre_item = NULL; + pre_num = NULL; + } + cnt_append = 0; count = 0; - l = eina_list_nth_list(log_d->log_list, log_d->readed_n); EINA_LIST_FOREACH(l, l, l_info) { - if (N == count) break; - log_append_separate_date_index(log_d, l_info, count + log_d->readed_n); + if (N == cnt_append) break; + diff = false; + log_append_separate_all_date_index(log_d, l_info, cnt_append + log_d->readed_n); + + if (l_info->group_index != pre_date) + diff = true; + else if (!log_compare_type(l_info->plog_log_type, pre_type)) + diff = true; + else if (0 < l_info->plog_ct_id && 0 < pre_ct_id && l_info->plog_ct_id != pre_ct_id) + diff = true; + else if (l_info->plog_number && *l_info->plog_number) { + if (!pre_num) + diff = true; + else if (strcmp(l_info->plog_number, pre_num)) + diff = true; + } - elm_genlist_item_append(log_d->genlist, &itc, l_info, - log_d->git, ELM_GENLIST_ITEM_NONE, log_gl_item_sel, l_info); + if (diff) { + if (pre_num) + free(pre_num); + if (l_info->plog_number && *l_info->plog_number) { + item = elm_genlist_item_append(log_d->genlist, &itc, l_info, + log_d->git, ELM_GENLIST_ITEM_NONE, log_gl_item_sel, l_info); + pre_num = strdup(l_info->plog_number); + } + else { + item = elm_genlist_item_append(log_d->genlist, &itc, l_info, + log_d->git, ELM_GENLIST_ITEM_NONE, log_gl_item_sel, l_info); + pre_num = NULL; + } + pre_date = l_info->group_index; + pre_type = l_info->plog_log_type; + pre_ct_id = l_info->plog_ct_id; + pre_item = item; + l_info->grouped_count = 1; + pre_info = l_info; + cnt_append++; + } + else + pre_info->grouped_count++; + l_info->item = pre_item; count++; } + return count; +} + +static Eina_Bool log_append_item_part(void *data) +{ + int count; + Eina_List *l; + ph_log_info *l_info; + ph_log_data * log_d = data; + + l = eina_list_nth_list(log_d->log_list, log_d->readed_n-1); + l_info = l->data; + count = log_fill_genlist_sub(log_d, l->next, l_info); if (N <= count) { - log_d->readed_n += N; + log_d->readed_n += count; return ECORE_CALLBACK_RENEW; } else { @@ -147,8 +287,6 @@ static Eina_Bool log_append_item_part(void *data) static void log_fill_genlist(ph_log_data * log_d) { int count; - Eina_List *l; - ph_log_info *l_info; p_retm_if(NULL == log_d || NULL == log_d->genlist, "Genlist is null"); @@ -158,21 +296,10 @@ static void log_fill_genlist(ph_log_data * log_d) } log_d->readed_n = 0; - count = 0; - EINA_LIST_FOREACH(log_d->log_list, l, l_info) { - if (N == count) break; - log_append_separate_date_index(log_d, l_info, count); + count = log_fill_genlist_sub(log_d, log_d->log_list, NULL); - if (l_info->plog_number && *l_info->plog_number) - elm_genlist_item_append(log_d->genlist, &itc, l_info, - log_d->git, ELM_GENLIST_ITEM_NONE, log_gl_item_sel, l_info); - else - elm_genlist_item_append(log_d->genlist, &itc_one, l_info, - log_d->git, ELM_GENLIST_ITEM_NONE, log_gl_item_sel, l_info); - count++; - } if (N <= count) { - log_d->readed_n += N; + log_d->readed_n += count; log_d->list_idler = ecore_idler_add(log_append_item_part, log_d); } } @@ -181,19 +308,26 @@ static void log_free_log_list(ph_log_data *log_d) { ph_log_info *l_info; - p_ret_if(NULL == log_d->log_list); + EINA_LIST_FREE(log_d->log_all_list, l_info) { + if (NULL == l_info) continue; + free(l_info->plog_display); + free(l_info->plog_img_path); + free(l_info->plog_number); + free(l_info); + } + log_d->log_all_list = NULL; - EINA_LIST_FREE(log_d->log_list, l_info) { + EINA_LIST_FREE(log_d->log_missed_list, l_info) { if (NULL == l_info) continue; free(l_info->plog_display); free(l_info->plog_img_path); free(l_info->plog_number); free(l_info); } - log_d->log_list = NULL; + log_d->log_missed_list = NULL; } -static Eina_List *log_load_data(int *ref_count, bool include_unknown) +static Eina_List *log_load_data(int type, int *ref_count, bool include_unknown) { PH_FN_CALL; int ret = CTS_SUCCESS; @@ -201,7 +335,7 @@ static Eina_List *log_load_data(int *ref_count, bool include_unknown) Eina_List *list = NULL; CTSiter *iter; - ret = contacts_svc_get_list(CTS_LIST_GROUPING_CALL_PLOG, &iter); + ret = contacts_svc_get_list(type, &iter); p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_get_list is failed"); while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { @@ -243,11 +377,40 @@ static Eina_List *log_load_data(int *ref_count, bool include_unknown) static void log_load_list(ph_log_data * log_d) { + int count, all_count, missed_count; p_retm_if(NULL == log_d, "Parameter is null"); log_free_log_list(log_d); - log_d->log_list_count = 0; - log_d->log_list = log_load_data(&(log_d->log_list_count), true); -} + + switch(log_d->view_type) + { + case LOG_VIEW_TYPE_UG_EMAIL_SELECT: + case LOG_VIEW_TYPE_UG_EMAIL_CHECK: + log_d->log_all_list = log_load_data(CTS_LIST_ALL_EMAIL_PLOG, &count, true); + log_d->log_list = log_d->log_all_list; + log_d->log_list_count = count; + break; + + case LOG_VIEW_TYPE_NORMAL: + log_d->log_all_list = log_load_data(CTS_LIST_ALL_PLOG, &all_count, true); + log_d->log_missed_list = log_load_data(CTS_LIST_ALL_MISSED_CALL, &missed_count, true); + if (LOG_SEGMENT_MISSED_VIEW == log_d->log_type) { + log_d->log_list = log_d->log_missed_list; + log_d->log_list_count = missed_count; + } else if (LOG_SEGMENT_ALL_VIEW == log_d->log_type) { + log_d->log_list = log_d->log_all_list; + log_d->log_list_count = all_count; + } + break; + + default: + log_d->log_all_list = log_load_data(CTS_LIST_ALL_PLOG, &count, true); + if(LOG_SEGMENT_ALL_VIEW == log_d->log_type) { + log_d->log_list_count = count; + log_d->log_list = log_d->log_all_list; + } + break; + } + } Eina_Bool ph_log_missed_call_count_reset(void *data) { @@ -294,44 +457,135 @@ API void phone_log_missed_info_update(void *layout) static void log_delete_btn_cb(void *data, Evas_Object *obj, void *event_info) { ph_log_data * log_d = data; - ph_log_check_mode_start(log_d); + phone_log_check_mode_start(log_d); +} + +static void log_sweep_delete_reponse_cb(void *data, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; + int ret; + ph_log_info *l_info = data; + ph_log_data *log_d = evas_object_data_get(obj, KEY_LOG_DATA); + p_retm_if(NULL == log_d, "log data is NULL"); + evas_object_del(log_d->popup); + log_d->popup = NULL; + + contacts_svc_begin_trans(); + ret = ph_log_util_del_log_by_id(log_d->log_list, l_info); + if (CTS_SUCCESS != ret) { + contacts_svc_end_trans(false); + phone_show_tickernoti(S_(PH_SYS_POP_FAILED)); + } + else { + contacts_svc_end_trans(true); + phone_show_tickernoti(S_(PH_SYS_POP_DELETED)); + } +} + +static void log_gl_sweep_del_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_log_info *l_info = data; + ph_log_data *log_d = evas_object_data_get(obj, KEY_LOG_DATA); + char buf[PH_TEXT_MAX_LEN] = {0}; + Evas_Object *btn; + snprintf(buf, sizeof(buf), "%s?", S_(PH_SYS_SK_DELETE)); + btn = phone_create_confirm_popup(&log_d->popup, log_d->win, buf, log_sweep_delete_reponse_cb, (void *)l_info); + evas_object_data_set(btn, KEY_LOG_DATA, log_d); +} + +static void log_gl_sweep_right(void *data, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; + ph_log_data *log_d = data; + if (!event_info) return; + elm_genlist_item_decorate_mode_set(event_info, "slide", EINA_TRUE); + elm_genlist_item_select_mode_set(log_d->item_last_sweep, ELM_OBJECT_SELECT_MODE_NONE); + log_d->item_last_sweep = event_info; +} + +static void log_gl_sweep_left(void *data, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; + ph_log_data *log_d = data; + if (!event_info) return; + elm_genlist_item_decorate_mode_set(event_info, "slide", EINA_FALSE); + elm_genlist_item_select_mode_set(event_info, ELM_OBJECT_SELECT_MODE_DEFAULT); + log_d->item_last_sweep = NULL; +} + +static void log_gl_sweep_up_down(void *data, Evas_Object *obj, void *event_info) +{ + ph_log_data *log_d = data; + Elm_Object_Item *item; + if (!obj) return; + item = (Elm_Object_Item *)elm_genlist_decorated_item_get(obj); + if (item) { + elm_genlist_item_decorate_mode_set(item, "slide", EINA_FALSE); + elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DEFAULT); + log_d->item_last_sweep = NULL; + } } static char* log_gl_label_get(void *data, Evas_Object *obj, const char *part) { char buf[PH_TEXT_MAX_LEN]={0}; ph_log_info *l_info = data; - if (0 == strcmp(part, "elm.text.1")) { + if (0 == strcmp(part, "elm.text.1") || 0 == strcmp(part, "elm.slide.text.1")) { if (NULL == l_info->plog_number || '\0' == l_info->plog_number[0]) { - snprintf(buf, sizeof(buf), S_(PH_SYS_BODY_UNKNOWN)); + snprintf(buf, sizeof(buf), "%s", S_(PH_SYS_BODY_UNKNOWN)); return strdup(buf); } - else if (l_info->plog_display && *l_info->plog_display) - snprintf(buf, sizeof(buf), "%s", l_info->plog_display); - else - snprintf(buf, sizeof(buf), "%s", l_info->plog_number); + else if (l_info->plog_display && *l_info->plog_display) { + if (1 < l_info->grouped_count) + snprintf(buf, sizeof(buf), "%s (%d)", l_info->plog_display, l_info->grouped_count); + else + snprintf(buf, sizeof(buf), "%s", l_info->plog_display); + } + else { + if (1 < l_info->grouped_count) + snprintf(buf, sizeof(buf), "%s (%d)", l_info->plog_number, l_info->grouped_count); + else + snprintf(buf, sizeof(buf), "%s", l_info->plog_number); + } return strdup(buf); } else if ((strcmp(part, "elm.text.2") == 0)) { ph_log_data * log_d; + char *time; log_d = evas_object_data_get(obj, KEY_LOG_DATA); - return ph_log_util_get_time_date(log_d->formatter, l_info->plog_log_time, l_info->plog_duration, FALSE); + time = ph_log_util_get_formatted_date(log_d->formatter, l_info->plog_log_time-l_info->plog_duration, PH_LOG_TIME_ONLY); + if (l_info->plog_display && *l_info->plog_display) + snprintf(buf, sizeof(buf), "%s\t\t\t%s", l_info->plog_number, time); + else + snprintf(buf, sizeof(buf), "%s", time); + free(time); + return strdup(buf); } else return NULL; } +static void log_gl_call_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; + ph_log_info * l_info = data; + p_retm_if(NULL == l_info, "parameter(l_info) is NULL"); + p_retm_if(NULL == l_info->plog_number|| '\0' == *l_info->plog_number, "number is NULL"); + phone_launch_voice_call(l_info->plog_ct_id, l_info->plog_number); +} + static Evas_Object *log_gl_icon_get(void *data, Evas_Object *obj, const char *part) { char buf[PATH_MAX]; ph_log_info * l_info = data; ph_log_data * log_d; + Evas_Object *btn; buf[0] = '\0'; log_d = evas_object_data_get(obj, KEY_LOG_DATA); - if (0 == strcmp(part, "elm.icon.1")) { - char *icon_type = ph_log_util_get_icon_type(l_info->plog_log_type); + if (0 == strcmp(part, "elm.icon.2")) { + char *icon_type = phone_detail_log_get_icon_type(l_info->plog_log_type); Evas_Object *ic; if (icon_type) { snprintf(buf, sizeof(buf), "%s", icon_type); @@ -344,8 +598,8 @@ static Evas_Object *log_gl_icon_get(void *data, Evas_Object *obj, const char *pa return ic; } } - else if (0 == strcmp(part, "elm.icon.2")) { - char *icon_path = ph_log_util_get_icon_path_with_action(l_info->plog_log_type); + else if (0 == strcmp(part, "elm.icon.1")) { + char *icon_path = phone_detail_log_get_icon_path_with_action(l_info->plog_log_type); if (icon_path) { Evas_Object *ic; snprintf(buf, sizeof(buf), "%s", icon_path); @@ -359,17 +613,66 @@ static Evas_Object *log_gl_icon_get(void *data, Evas_Object *obj, const char *pa } } else if (0 == strcmp(part, "elm.icon.3")) { - if (l_info->plog_img_path) { - Evas_Object *ic = elm_icon_add(obj); - p_retvm_if(NULL == ic, NULL, "elm_icon_add is failed"); - - snprintf(buf, sizeof(buf), "%s", l_info->plog_img_path); - - elm_icon_file_set(ic, buf, NULL); - evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); - return ic; + Evas_Object *ic; + if (LOG_VIEW_TYPE_NORMAL != log_d->view_type && LOG_VIEW_TYPE_UG_LAUNCH_CALL != log_d->view_type) + return NULL; + + if (NULL == l_info->plog_number || '\0' == l_info->plog_number[0]) + return NULL; + + btn = elm_button_add(obj); + ic = elm_icon_add(btn); + p_retvm_if(NULL == ic, NULL, "elm_icon_add is failed"); + elm_icon_file_set(ic, PH_IMG_ICON_PHONE, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_object_part_content_set(btn, "icon", ic); + evas_object_propagate_events_set(btn, EINA_FALSE); + evas_object_smart_callback_add(btn, "clicked", log_gl_call_btn_cb, l_info); + return btn; + } + else if (0 == strcmp(part, "elm.slide.swallow.1")) { + if (l_info->plog_number && *l_info->plog_number) { + btn = phone_create_list_sweep_btn(obj, PH_IMG_ICON_CALL); + p_retvm_if(NULL == btn, NULL, "phone_create_list_sweep_btn() return NULL"); + + evas_object_data_set(btn, KEY_LOG_DATA, log_d); + evas_object_smart_callback_add(btn, "clicked", log_gl_call_btn_cb, l_info); + return btn; + } + else { + btn = phone_create_list_sweep_btn(obj, PH_IMG_ICON_CALL_DIM); + p_retvm_if(NULL == btn, NULL, "phone_create_list_sweep_btn is failed"); + evas_object_data_set(btn, KEY_LOG_DATA, log_d); + elm_object_disabled_set(btn, true); + return btn; + + } + } + else if (0 == strcmp(part, "elm.slide.swallow.2")) { + if (l_info->plog_number && *l_info->plog_number) { + btn = phone_create_list_sweep_btn(obj, PH_IMG_ICON_MESSAGE); + p_retvm_if(NULL == btn, NULL, "phone_create_list_sweep_btn is failed"); + evas_object_data_set(btn, KEY_LOG_DATA, log_d); + evas_object_smart_callback_add(btn, "clicked", log_gl_msg_btn_cb, l_info->plog_number); + return btn; + } + else { + btn = phone_create_list_sweep_btn(obj, PH_IMG_ICON_MESSAGE_DIM); + p_retvm_if(NULL == btn, NULL, "phone_create_list_sweep_btn is failed"); + evas_object_data_set(btn, KEY_LOG_DATA, log_d); + elm_object_disabled_set(btn, true); + return btn; } + } + else if (0 == strcmp(part, "elm.slide.swallow.3")) { + btn = phone_create_list_sweep_btn(obj, PH_IMG_ICON_DELETE); + p_retvm_if(NULL == btn, NULL, "phone_create_list_sweep_btn() return NULL"); + + evas_object_data_set(btn, KEY_LOG_DATA, log_d); + evas_object_smart_callback_add(btn, "clicked", log_gl_sweep_del_btn_cb, l_info); + return btn; + } else if (0 == strcmp(part, "elm.edit.icon.1")) { Evas_Object *check; check = elm_check_add(obj); @@ -381,25 +684,52 @@ static Evas_Object *log_gl_icon_get(void *data, Evas_Object *obj, const char *pa return NULL; } +static const char *log_get_day_in_week(ph_log_info *l_info) +{ + time_t stime; + struct tm *tmp; + + stime = l_info->plog_log_time - l_info->plog_duration; + tmp = localtime(&stime); + + switch(tmp->tm_wday) { + case 0: + return T_(PH_GET_TEXT_DAY, PHTEXT_BODY_SUNDAY); + case 1: + return T_(PH_GET_TEXT_DAY, PHTEXT_BODY_MONDAY); + case 2: + return T_(PH_GET_TEXT_DAY, PHTEXT_BODY_TUESDAY); + case 3: + return T_(PH_GET_TEXT_DAY, PHTEXT_BODY_WEDNESDAY); + case 4: + return T_(PH_GET_TEXT_DAY, PHTEXT_BODY_THURSDAY); + case 5: + return T_(PH_GET_TEXT_DAY, PHTEXT_BODY_FRIDAY); + case 6: + return T_(PH_GET_TEXT_DAY, PHTEXT_BODY_SATURDAY); + } + return NULL; +} + static char* log_gl_sep_date_label_get(void *data, Evas_Object *obj, const char *part) { - ph_log_info *cd = data; + ph_log_info *l_info = data; const char *when; - int index = cd->group_index; + int index = l_info->group_index; if (0 == strcmp(part, "elm.text")) { char *date_temp; ph_log_data *log_d; - if (0 == index) + if (-1 == index) when = S_(PH_SYS_BODY_TODAY); - else if (1 == index) + else if (-2 == index) when = S_(PH_SYS_BODY_YESTERDAY); else - when = S_(PH_SYS_BODY_PREVIOUS); + when = log_get_day_in_week(l_info); log_d = evas_object_data_get(obj, KEY_LOG_DATA); - date_temp = ph_log_util_get_time_date(log_d->formatter, cd->plog_log_time, -1, FALSE); + date_temp = phone_detail_log_get_date(log_d->formatter, l_info->plog_log_time-l_info->plog_duration); if (date_temp) { char buf[PATH_MAX]={0}; snprintf(buf, sizeof(buf), " %s (%s)", when, date_temp); @@ -416,7 +746,6 @@ static char* log_gl_sep_date_label_get(void *data, Evas_Object *obj, const char static void log_cancel_clicked_cb(void *data, Evas_Object *obj, void *event_info) { ph_log_data *log_d = data; - phone_hide_notify(log_d->navi); ph_log_check_mode_end(log_d, true); } @@ -431,6 +760,13 @@ static Evas_Object* log_create_genlist(ph_log_data * log_d) elm_genlist_homogeneous_set(genlist, EINA_TRUE); evas_object_show(genlist); evas_object_data_set(genlist, KEY_LOG_DATA, log_d); + + if (!log_d->ug) { + evas_object_smart_callback_add(genlist, "drag,start,right", log_gl_sweep_right, log_d); + evas_object_smart_callback_add(genlist, "drag,start,left", log_gl_sweep_left, log_d); + evas_object_smart_callback_add(genlist, "drag,start,up", log_gl_sweep_up_down, log_d); + evas_object_smart_callback_add(genlist, "drag,start,down", log_gl_sweep_up_down, log_d); + } elm_genlist_block_count_set(genlist, 10); return genlist; } @@ -438,22 +774,24 @@ static Evas_Object* log_create_genlist(ph_log_data * log_d) static Evas_Object* log_fill_layout(void *data) { ph_log_data *log_d = data; - log_load_list(log_d); if (0 < log_d->log_list_count) { if (NULL == log_d->genlist) log_d->genlist = log_create_genlist(log_d); - else + else { elm_genlist_clear(log_d->genlist); + log_d->pre_date_type = 0; + } log_fill_genlist(log_d); return log_d->genlist; } else { Evas_Object *noc; noc = phone_create_nocontents(log_d->box, T_(PH_GET_TEXT_BASIC, PHTEXT_NO_LOGS)); + p_retvm_if(NULL == noc, NULL, "phone_create_nocontents() return NULL"); + evas_object_size_hint_weight_set(noc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(noc, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(noc); - log_d->genlist = NULL; return noc; } } @@ -468,21 +806,35 @@ Eina_Bool ph_log_data_changed_cb(void *data) ecore_timer_del(log_d->update_timer); log_d->update_timer = NULL; } - elm_box_clear(log_d->box); + if (log_d->list_idler) { + ecore_idler_del(log_d->list_idler); + log_d->list_idler = NULL; + } + log_load_list(log_d); + + elm_box_unpack(log_d->box, log_d->content); + evas_object_del(log_d->content); + log_d->content = NULL; if (log_d->genlist) { - evas_object_del(log_d->genlist); log_d->genlist = NULL; + log_d->pre_date_type = 0; } content = log_fill_layout(log_d); p_retvm_if(NULL == content, ECORE_CALLBACK_CANCEL, "log_fill_layout() return NULL"); + log_d->content = content; elm_box_pack_end(log_d->box, content); - if (LOG_VIEW_TYPE_CHECK == log_d->view_type - || LOG_VIEW_TYPE_NORMAL_CHECK == log_d->view_type) - ph_log_check_mode_start(log_d); + if (LOG_VIEW_TYPE_UG_NUMBER_CHECK == log_d->view_type + || LOG_VIEW_TYPE_NORMAL_CHECK == log_d->view_type + || LOG_VIEW_TYPE_UG_EMAIL_CHECK == log_d->view_type) + phone_log_check_mode_start(log_d); ph_log_check_update_button_status(log_d); + if (log_d->logdetail_update) { + ph_log_detail_update(log_d); + log_d->logdetail_update = false; + } return ECORE_CALLBACK_CANCEL; } @@ -500,6 +852,15 @@ static void log_data_lazy_update(void *data) log_d->update_timer = ecore_timer_add(3.0, ph_log_data_changed_cb, log_d); else ph_log_data_changed_cb(log_d); + PH_FN_END; +} + +static void log_data_updated(void *data) +{ + PH_FN_CALL; + ph_log_data *log_d = data; + log_d->logdetail_update = true; + log_data_lazy_update(log_d); } static void log_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) @@ -513,7 +874,7 @@ static void log_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *even contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_CONTACT_CHANGE, log_data_lazy_update, log_d); contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_PLOG_CHANGE, - log_data_lazy_update, log_d); + log_data_updated, log_d); if (0 < log_d->heynoti_fd) { heynoti_unsubscribe(log_d->heynoti_fd, "setting_time_changed", ph_log_timezone_changed); @@ -545,7 +906,7 @@ static void log_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *even if (log_d->update_timer) ecore_timer_del(log_d->update_timer); - ph_log_util_delete_date_format(log_d->formatter); + phone_detail_log_delete_date_format(log_d->formatter); free(log_d); PH_FN_END; @@ -553,13 +914,15 @@ static void log_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *even static void log_set_genlist_item_style() { - itc.item_style = "2text.3icon"; + itc.item_style = "2text.2icon"; + itc.decorate_item_style= "mode/slide3"; itc.decorate_all_item_style = "edit_default"; itc.func.text_get = log_gl_label_get; itc.func.content_get = log_gl_icon_get; itc.func.state_get = NULL; - itc_one.item_style = "2text.3icon"; + itc_one.item_style = "2text.2icon"; + itc_one.decorate_item_style = "mode/slide"; itc_one.decorate_all_item_style = "edit_default"; itc_one.func.text_get = log_gl_label_get; itc_one.func.content_get = log_gl_icon_get; @@ -589,7 +952,7 @@ API void phone_log_views_update(Evas_Object *navi) log_d = evas_object_data_get(navi, KEY_LOG_DATA); if (log_d) { - ph_log_util_generate_date_format(log_d->formatter); + phone_detail_log_generate_date_format(log_d->formatter); log_genlist_update(log_d->genlist); } @@ -604,6 +967,13 @@ void ph_log_timezone_changed(void *data) phone_log_views_update(data); } +API void phone_log_view_resume(Evas_Object *navi) +{ + ph_log_detail_data *logdetail_d; + + phone_log_missed_info_update(navi); +} + API void phone_log_view_reset(Evas_Object *layout) { PH_FN_CALL; @@ -623,68 +993,88 @@ API void phone_log_view_reset(Evas_Object *layout) elm_naviframe_item_pop_to(item); else if (LOG_VIEW_TYPE_NORMAL_CHECK == log_d->view_type) ph_log_check_mode_end(log_d, false); + else if (log_d->item_last_sweep) { + elm_genlist_item_decorate_mode_set(log_d->item_last_sweep, "slide", EINA_FALSE); + elm_genlist_item_select_mode_set(log_d->item_last_sweep, ELM_OBJECT_SELECT_MODE_DEFAULT); + log_d->item_last_sweep = NULL; + } log_d->ctrl_item = NULL; } +API void phone_log_seg_set(Evas_Object *layout, int log_seg_type) +{ + ph_log_data *log_d; + log_d = evas_object_data_get(layout, KEY_LOG_DATA); + p_retm_if(NULL == log_d, "log data is NULL"); + log_d->log_type = log_seg_type; +} + API void phone_log_set_navi(Evas_Object *layout) { PH_FN_CALL; ph_log_data *log_d; - Evas_Object *cbar; + Evas_Object *toolbar; + Evas_Object *box; Evas_Object *l_btn; + Evas_Object *segment; Elm_Object_Item *navi_it; + Elm_Object_Item *titem; + Elm_Object_Item *sitem1, *sitem2; + + double scale = elm_scale_get(); log_d = evas_object_data_get(layout, KEY_LOG_DATA); p_retm_if(NULL == log_d, "log data is NULL"); navi_it = elm_naviframe_bottom_item_get(log_d->navi); p_retm_if(NULL == navi_it, "navi item is NULL"); - cbar = elm_object_item_part_content_get(navi_it, "controlbar"); - if(cbar) - phone_cbar_item_clear(cbar); + toolbar = elm_object_item_part_content_get(navi_it, "controlbar"); + if(toolbar) + phone_cbar_item_clear(toolbar); else { - cbar = elm_toolbar_add(log_d->navi); - elm_toolbar_shrink_mode_set(cbar, ELM_TOOLBAR_SHRINK_EXPAND); - elm_object_item_part_content_set(navi_it, "controlbar", cbar); + toolbar = elm_toolbar_add(log_d->navi); + elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND); + elm_object_item_part_content_set(navi_it, "controlbar", toolbar); } + elm_toolbar_homogeneous_set(toolbar, EINA_FALSE); /* back button */ switch (log_d->view_type) { case LOG_VIEW_TYPE_NORMAL: - log_d->ctrl_item = elm_toolbar_item_append(cbar, IMG_DELETE_ICON, NULL, log_delete_btn_cb, log_d); - phone_toolbar_disalbed_item_append(cbar, 3); + log_d->ctrl_item = elm_toolbar_item_append(toolbar, PH_IMG_ICON_DELETE, NULL, log_delete_btn_cb, log_d); + elm_toolbar_homogeneous_set(toolbar, EINA_TRUE); l_btn = elm_button_add(log_d->navi); evas_object_smart_callback_add(l_btn, "clicked", phone_back_btn_clicked_cb, log_d->win); elm_object_style_set(l_btn, "naviframe/back_btn/default"); elm_object_item_part_content_set(log_d->navi_item, "prev_btn", l_btn); break; case LOG_VIEW_TYPE_NORMAL_CHECK: - log_d->ctrl_item = elm_toolbar_item_append(cbar, IMG_DELETE_ICON, NULL, ph_log_check_del_btn_cb, log_d); - phone_toolbar_disalbed_item_append(cbar, 3); - l_btn = phone_naviframe_btn(log_d->navi, S_(PH_SYS_SK_CANCEL)); + log_d->ctrl_item = elm_toolbar_item_append(toolbar, PH_IMG_ICON_DELETE, NULL, ph_log_check_del_btn_cb, log_d); + phone_toolbar_disabled_item_append(toolbar, 3); + l_btn = phone_create_navi_btn(log_d->navi, S_(PH_SYS_SK_CANCEL)); evas_object_smart_callback_add(l_btn, "clicked", log_cancel_clicked_cb, log_d); elm_object_item_part_content_set(log_d->navi_item, "prev_btn", l_btn); break; - case LOG_VIEW_TYPE_CHECK: - log_d->ctrl_item = elm_toolbar_item_append(cbar, IMG_DONE_ICON, NULL, ph_log_check_done_btn_cb, log_d); - phone_toolbar_disalbed_item_append(cbar, 3); - break; - case LOG_VIEW_TYPE_SELECT: - case LOG_VIEW_TYPE_VOICE_CALL: + case LOG_VIEW_TYPE_UG_NUMBER_CHECK: + case LOG_VIEW_TYPE_UG_EMAIL_CHECK: + log_d->ctrl_item = elm_toolbar_item_append(toolbar, PH_IMG_ICON_DONE, NULL, ph_log_check_done_btn_cb, log_d); + phone_toolbar_disabled_item_append(toolbar, 3); break; + case LOG_VIEW_TYPE_UG_NUMBER_SELECT: + case LOG_VIEW_TYPE_UG_EMAIL_SELECT: + case LOG_VIEW_TYPE_UG_LAUNCH_CALL: default: break; } if (log_d->ug) { - l_btn = phone_naviframe_btn(log_d->navi, S_(PH_SYS_SK_CANCEL)); + l_btn = phone_create_navi_btn(log_d->navi, S_(PH_SYS_SK_CANCEL)); evas_object_smart_callback_add(l_btn, "clicked", phone_ug_destroy_me_cb, log_d->ug); elm_object_item_part_content_set(log_d->navi_item, "prev_btn", l_btn); } - if(log_d->ctrl_item) { + if(log_d->ctrl_item) ph_log_check_update_button_status(log_d); - } } int ph_log_create_content(ph_log_data *log_d) @@ -698,15 +1088,17 @@ int ph_log_create_content(ph_log_data *log_d) log_d->box = box; log_set_genlist_item_style(); + log_load_list(log_d); content = log_fill_layout(log_d); p_retvm_if(NULL == content, -1, "log_fill_layout() return NULL"); elm_box_pack_end(box, content); + log_d->content = content; evas_object_event_callback_add(box, EVAS_CALLBACK_DEL, log_view_delete_cb, log_d); contacts_svc_subscribe_change(CTS_SUBSCRIBE_PLOG_CHANGE, - log_data_lazy_update, log_d); + log_data_updated, log_d); contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE, log_data_lazy_update, log_d); diff --git a/lib/log/ph-log-main.c b/lib/log/ph-log-main.c index 415bcf1..adf71f7 100755 --- a/lib/log/ph-log-main.c +++ b/lib/log/ph-log-main.c @@ -22,17 +22,11 @@ #include "ph-log-main-view.h" #include "ph-log-check-view.h" #include "ph-log-detail-view.h" +#include <bundle.h> -static inline void log_init_time_format(void) -{ - static int already_init = FALSE; - - if (!already_init) { - UErrorCode status = U_ZERO_ERROR; - uloc_setDefault(getenv("LC_TIME"), &status); - already_init = TRUE; - } -} +// for removing build warning //////////////////////////////////// +int service_export_as_bundle(service_h service, bundle **data); +//////////////////////////////////////////////////////// static bool log_create_ug_view(int request, ph_log_data *log_d, Evas_Object *base) { @@ -47,6 +41,13 @@ static bool log_create_ug_view(int request, ph_log_data *log_d, Evas_Object *bas evas_object_show(log_d->navi); } + if (PH_UG_REQUEST_LOG_SELECT == request) + log_d->view_type = LOG_VIEW_TYPE_UG_NUMBER_SELECT; + else if (PH_UG_REQUEST_LOG_CHECK == request) + log_d->view_type = LOG_VIEW_TYPE_UG_NUMBER_CHECK; + else + log_d->view_type = LOG_VIEW_TYPE_UG_LAUNCH_CALL; + ret = ph_log_create_content(log_d); if (ret < 0) { ERR("Fail to ph_log_create_content"); @@ -55,20 +56,15 @@ static bool log_create_ug_view(int request, ph_log_data *log_d, Evas_Object *bas log_d->navi_item = elm_naviframe_item_push(log_d->navi, T_(PH_GET_TEXT_BASE_OP, PHTEXT_SELECT_LOGS), NULL, NULL, log_d->box, NULL); - if (PH_UG_REQUEST_LOG_SELECT == request) - log_d->view_type = LOG_VIEW_TYPE_SELECT; - else if (PH_UG_REQUEST_LOG_CHECK == request) - log_d->view_type = LOG_VIEW_TYPE_CHECK; - - if (LOG_VIEW_TYPE_CHECK == log_d->view_type) - ph_log_check_mode_start(log_d); + if (LOG_VIEW_TYPE_UG_NUMBER_CHECK == log_d->view_type) + phone_log_check_mode_start(log_d); else phone_log_set_navi(log_d->navi); return true; } -static void *log_on_create(struct ui_gadget *ug, enum ug_mode mode, bundle *bd, void *priv) +static void *log_on_create(ui_gadget_h ug, enum ug_mode mode, service_h service, void *priv) { PH_FN_CALL; int ret; @@ -77,6 +73,7 @@ static void *log_on_create(struct ui_gadget *ug, enum ug_mode mode, bundle *bd, Evas_Object *base; ph_log_data *log_d; int request = PH_UG_REQUEST_LOG_CHECK; + char* val = NULL; if (!ug || !priv) return NULL; @@ -90,17 +87,17 @@ static void *log_on_create(struct ui_gadget *ug, enum ug_mode mode, bundle *bd, ret = contacts_svc_connect(); p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_connect() Failed(%d)", ret); - if (bd) { - const char* val = NULL; - val = bundle_get_val(bd, "type"); - if (val) request = atoi(val); + if (SERVICE_ERROR_NONE == service_get_extra_data(service, "type", &val)) { + if (val) + request = atoi(val); + free(val); PH_DBG("log request : %d", request); } if (mode==UG_MODE_FULLVIEW) - base = phone_create_layout(parent, true); + base = phone_create_base_layout(parent, true); else - base = phone_create_layout(parent, false); + base = phone_create_base_layout(parent, false); log_d = priv; log_d->win = ug_get_window(); @@ -115,11 +112,11 @@ static void *log_on_create(struct ui_gadget *ug, enum ug_mode mode, bundle *bd, return NULL; } - log_init_time_format(); - ph_log_util_generate_date_format(log_d->formatter); + phone_detail_log_init_time_format(); + phone_detail_log_generate_date_format(log_d->formatter); if (!log_create_ug_view(request, log_d, base)) { - ph_log_util_delete_date_format(log_d->formatter); + phone_detail_log_delete_date_format(log_d->formatter); evas_object_del(base); ret = contacts_svc_disconnect(); p_warn_if(CTS_SUCCESS != ret, "contacts_svc_disconnect() Failed(%d)", ret); @@ -129,11 +126,11 @@ static void *log_on_create(struct ui_gadget *ug, enum ug_mode mode, bundle *bd, return base; } -static void log_on_start(struct ui_gadget *ug, bundle *data, void *priv) +static void log_on_start(ui_gadget_h ug, service_h service, void *priv) { } -static void log_on_pause(struct ui_gadget *ug, bundle *data, void *priv) +static void log_on_pause(ui_gadget_h ug, service_h service, void *priv) { PH_FN_CALL; ph_log_data *log_d = priv; @@ -141,7 +138,7 @@ static void log_on_pause(struct ui_gadget *ug, bundle *data, void *priv) } -static void log_on_resume(struct ui_gadget *ug, bundle *data, void *priv) +static void log_on_resume(ui_gadget_h ug, service_h service, void *priv) { PH_FN_CALL; ph_log_data *log_d = priv; @@ -154,7 +151,7 @@ static void log_on_resume(struct ui_gadget *ug, bundle *data, void *priv) } } -static void log_on_destroy(struct ui_gadget *ug, bundle *data, void *priv) +static void log_on_destroy(ui_gadget_h ug, service_h service, void *priv) { PH_FN_CALL; @@ -166,25 +163,40 @@ static void log_on_destroy(struct ui_gadget *ug, bundle *data, void *priv) PH_FN_END; } -static void log_on_message(struct ui_gadget *ug, bundle *msg, bundle *data, void *priv) +static void log_on_message(ui_gadget_h ug, service_h msg, service_h service, void *priv) { } -static void log_on_event(struct ui_gadget *ug, enum ug_event event, bundle *data, void *priv) +static void log_on_event(ui_gadget_h ug, enum ug_event event, service_h service, void *priv) { ph_log_data *log_d = priv; + Evas_Object *notify; switch (event) { case UG_EVENT_REGION_CHANGE: if (log_d->navi) phone_log_views_update(log_d->navi); break; + case UG_EVENT_ROTATE_PORTRAIT: + case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN: + phone_resize_notify(log_d->navi, 0); + evas_object_data_set(log_d->navi, "phone_rotate", (void *)0); + notify = phone_get_notify(log_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(log_d->navi, 90); + evas_object_data_set(log_d->navi, "phone_rotate", (void *)90); + notify = phone_get_notify(log_d->navi); + elm_layout_theme_set(elm_object_content_get(notify), "standard", "selectioninfo", "horizontal/bottom_64"); + break; default: break; } } -static void log_on_key_event(struct ui_gadget *ug, enum ug_key_event event, bundle *data, void *priv) +static void log_on_key_event(ui_gadget_h ug, enum ug_key_event event, service_h service, void *priv) { PH_FN_CALL; if (!ug) @@ -234,23 +246,46 @@ API void UG_MODULE_EXIT(struct ug_module_ops *ops) PH_FN_END; } -API Evas_Object* phone_create_log_view(void *ug, Evas_Object *win, Evas_Object *parent) +API Evas_Object* phone_create_log_view(ph_view_info *view_info) { PH_FN_CALL; int ret; ph_log_data * log_d = calloc(1, sizeof(ph_log_data)); p_retvm_if(NULL == log_d, NULL, "Fail to calloc ph_log_data"); - log_d->ug = ug; - log_d->win = win; - log_d->navi = parent; + log_d->ug = view_info->ug; + log_d->win = view_info->win; + log_d->navi = view_info->navi; log_d->navi_item = elm_naviframe_bottom_item_get(log_d->navi); - if (log_d->ug) - log_d->view_type = LOG_VIEW_TYPE_VOICE_CALL; - else + log_d->is_background = true; + + if(!log_d->ug) log_d->view_type = LOG_VIEW_TYPE_NORMAL; + else + { + switch(view_info->ug_request) + { + case PH_UG_REQUEST_SELECT: + case PH_UG_REQUEST_SELECT_NUMBER: + log_d->view_type = LOG_VIEW_TYPE_UG_NUMBER_SELECT; + break; + case PH_UG_REQUEST_SELECT_EMAIL: + log_d->view_type = LOG_VIEW_TYPE_UG_EMAIL_SELECT; + break; + case PH_UG_REQUEST_CHECK: + case PH_UG_REQUEST_CHECK_FOR_NUMBER: + log_d->view_type = LOG_VIEW_TYPE_UG_NUMBER_CHECK; + break; + case PH_UG_REQUEST_CHECK_FOR_EMAIL: + log_d->view_type = LOG_VIEW_TYPE_UG_EMAIL_CHECK; + break; + + default: + log_d->view_type = LOG_VIEW_TYPE_UG_LAUNCH_CALL; + } + } - log_init_time_format(); - ph_log_util_generate_date_format(log_d->formatter); + phone_detail_log_init_time_format(); + phone_detail_log_generate_date_format(log_d->formatter); ret = ph_log_create_content(log_d); if (ret < 0) { diff --git a/lib/log/ph-log-utils.c b/lib/log/ph-log-utils.c index 544b080..cc1e0e4 100755 --- a/lib/log/ph-log-utils.c +++ b/lib/log/ph-log-utils.c @@ -14,292 +14,25 @@ * limitations under the License. */ -#include <stdlib.h> -#include <unicode/udatpg.h> -#include <Elementary.h> -#include <vconf.h> -#include <appcore-efl.h> - #include "phone.h" -#include "phone-log.h" #include "ph-log-utils.h" -static char *m_img_logtype_tbl[LOG_TYPE_MAX] = { - IMGDIR"/C01-4_icon_vt-call.png", -}; - -static char *m_img_logaction_tbl[LOG_ACTION_MAX] = { - IMGDIR"/C01-4_icon_dialed.png", - IMGDIR"/C01-4_icon_missed-call.png", - IMGDIR"/C01-4_icon_received.png", - IMGDIR"/C01-4_icon_rejected.png", - IMGDIR"/C01-4_icon_Blocked(Auto-rejected).png" -}; - -static const char *date_time_format[] = { - "hm", - "Hm", - "yMMMdd", - "yMMMddhm", - "yMMMddHm", -}; - -static enum appcore_time_format time_format = APPCORE_TIME_FORMAT_12; - -// for removing build warning //////////////////////////////////// -int32_t u_strlen(const UChar *s); -UChar* u_uastrncpy(UChar *dst, const char *src, int32_t n); -char* u_austrncpy(char *dst, const UChar *src, int32_t n); -////////////////////////////////////////////////////////////////// - -int ph_log_util_del_log_by_number(char *number) -{ - if (number) - return contacts_svc_delete_phonelog(CTS_PLOG_DEL_BY_NUMBER, number); - else - return contacts_svc_delete_phonelog(CTS_PLOG_DEL_NO_NUMBER); -} - -static int log_util_is_call_dial_type(int type) -{ - if (type == CTS_PLOG_TYPE_VOICE_OUTGOING - || type == CTS_PLOG_TYPE_VIDEO_OUTGOING) - return TRUE; - else - return FALSE; -} - -static int log_util_is_call_miss_type(int type) -{ - switch (type) { - case CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN: - case CTS_PLOG_TYPE_VOICE_INCOMMING_SEEN: - case CTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN: - case CTS_PLOG_TYPE_VIDEO_INCOMMING_SEEN: - return TRUE; - default: - return FALSE; - } -} - -static int log_util_is_call_receive_type(int type) -{ - if (type == CTS_PLOG_TYPE_VOICE_INCOMMING - || type == CTS_PLOG_TYPE_VIDEO_INCOMMING) - return TRUE; - else - return FALSE; -} - -static int log_util_is_call_rejected_type(int type) -{ - if (type == CTS_PLOG_TYPE_VOICE_REJECT - || type == CTS_PLOG_TYPE_VIDEO_REJECT) - return TRUE; - else - return FALSE; -} - -static int log_util_is_voice_call_type(int type) -{ - switch (type) { - case CTS_PLOG_TYPE_VOICE_INCOMMING: - case CTS_PLOG_TYPE_VOICE_OUTGOING: - case CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN: - case CTS_PLOG_TYPE_VOICE_INCOMMING_SEEN: - case CTS_PLOG_TYPE_VOICE_REJECT: - case CTS_PLOG_TYPE_VOICE_BLOCKED: - return TRUE; - default: - return FALSE; - } -} - -static int log_util_is_video_call_type(int type) -{ - switch (type) { - case CTS_PLOG_TYPE_VIDEO_INCOMMING: - case CTS_PLOG_TYPE_VIDEO_OUTGOING: - case CTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN: - case CTS_PLOG_TYPE_VIDEO_INCOMMING_SEEN: - case CTS_PLOG_TYPE_VIDEO_REJECT: - case CTS_PLOG_TYPE_VIDEO_BLOCKED: - return TRUE; - default: - return FALSE; - } -} - -static int log_util_is_blocked_type(int type) -{ - switch (type) { - case CTS_PLOG_TYPE_VOICE_BLOCKED: - case CTS_PLOG_TYPE_VIDEO_BLOCKED: - return TRUE; - default: - return FALSE; - } -} - -char *ph_log_util_get_icon_path_with_action(int log_type) -{ - char buf[PATH_MAX]={0}; - Log_Action action = -1; - - if (TRUE == log_util_is_call_dial_type(log_type)) - action = LOG_ACTION_DIALLED; - else if (TRUE == log_util_is_call_miss_type(log_type)) - action = LOG_ACTION_MISSED; - else if (TRUE == log_util_is_call_receive_type(log_type)) - action = LOG_ACTION_RECEIVED; - else if (TRUE == log_util_is_call_rejected_type(log_type)) - action = LOG_ACTION_REJECTED; - else if (TRUE == log_util_is_blocked_type(log_type)) - action = LOG_ACTION_BLOCKED; - else { - PH_DBG("error invalid type %d", log_type); - return NULL; - } - snprintf(buf, sizeof(buf), "%s", m_img_logaction_tbl[action]); - return strdup(buf); -} - -char *ph_log_util_get_icon_type(int log_type) -{ - Log_Type type = -1; - char buf[PATH_MAX]={0}; - - if (TRUE == log_util_is_voice_call_type(log_type)) - return NULL; - else if (TRUE == log_util_is_video_call_type(log_type)) - type = LOG_TYPE_VIDEO_CALL; - else { - PH_DBG("error invalid type"); - return NULL; - } - snprintf(buf, sizeof(buf), "%s", m_img_logtype_tbl[type]); - return strdup(buf); -} - -static char *log_util_get_formatted_date(UDateFormat **formatter, int log_time, - date_style style) -{ - time_t stime; - UErrorCode status = U_ZERO_ERROR; - UDate date; - UChar formatted[64] = {0}; - int32_t formatted_size; - int32_t formatted_len; - char formatted_str[PH_TEXT_SHORT_LEN] = {0}; - int type = LOG_FORMAT_DATE; - - stime = log_time; - date = (UDate)stime * 1000; - - formatted_size = (int32_t)(sizeof(formatted)/sizeof(UChar)); - if (PH_LOG_TIME_ONLY == style) { - if (APPCORE_TIME_FORMAT_24 == time_format) - type = LOG_FORMAT_TIME_24; - else - type = LOG_FORMAT_TIME_12; - } - else if (PH_LOG_TIME_DATE == style) { - if (APPCORE_TIME_FORMAT_24 == time_format) - type = LOG_FORMAT_DATE_TIME_24; - else - type = LOG_FORMAT_DATE_TIME_12; - } - else if (PH_LOG_DATE_ONLY == style) - type = LOG_FORMAT_DATE; - formatted_len = udat_format(formatter[type], date, formatted, formatted_size, NULL, &status); - u_austrncpy(formatted_str, formatted, PH_TEXT_SHORT_LEN); - return strdup(formatted_str); -} - -char *ph_log_util_get_time_date(UDateFormat ** formatter, int log_time, int log_duration, int display_yesterday) -{ - char buf[PATH_MAX] = {0}; - time_t stime; - struct timeval timeval; - struct tm *tmp; - int yday = -1, cur_yday = -1; - - if (-1 == log_duration) - return log_util_get_formatted_date(formatter, log_time, PH_LOG_DATE_ONLY); - - gettimeofday(&timeval, 0); - tmp = localtime(&timeval.tv_sec); - if (tmp) - cur_yday = tmp->tm_yday; - - stime = log_time - log_duration; - tmp = localtime(&stime); - if (tmp) - yday = tmp->tm_yday; - - if ((0 <= yday && 0 <= cur_yday) && (yday == cur_yday || yday == cur_yday-1)) { - char *time = log_util_get_formatted_date(formatter, log_time, PH_LOG_TIME_ONLY); - if (display_yesterday && (yday == cur_yday-1)) - snprintf(buf, sizeof(buf), "%s %s", S_(PH_SYS_BODY_YESTERDAY), time); - else - snprintf(buf, sizeof(buf), "%s", time); - free(time); - } - else { - char *date = log_util_get_formatted_date(formatter, log_time, PH_LOG_TIME_DATE); - snprintf(buf, sizeof(buf), "%s", date); - free(date); - } - return strdup(buf); -} - -void ph_log_util_generate_date_format(UDateFormat **formatter) +int ph_log_util_del_log_by_id(Eina_List *list, ph_log_info *l_info) { PH_FN_CALL; - UDateTimePatternGenerator *generator; - UErrorCode error = U_ZERO_ERROR; - UChar utimezone_id [256] = {0}; - char *timezone_id = NULL; - const char *locale; - int i; - int ret; + Eina_List *l; + Elm_Object_Item *item; + int ret = CTS_SUCCESS; - timezone_id = vconf_get_str(VCONFKEY_SETAPPL_TIMEZONE_ID); - if (timezone_id) { - u_uastrncpy(utimezone_id, timezone_id, strlen(timezone_id)); - ucal_setDefaultTimeZone(utimezone_id , &error); - free(timezone_id); + l = eina_list_data_find_list(list, l_info); + item = l_info->item; + EINA_LIST_FOREACH(l, l, l_info) { + if (item != l_info->item) + break; + ret = contacts_svc_delete_phonelog(CTS_PLOG_DEL_BY_ID, l_info->id); + if (CTS_SUCCESS != ret) + break; } - - ret = appcore_get_timeformat(&time_format); - if (ret < -1 || time_format < APPCORE_TIME_FORMAT_12) - time_format = APPCORE_TIME_FORMAT_12; - - locale = uloc_getDefault(); - ph_log_util_delete_date_format(formatter); - - generator = udatpg_open(locale, &error); - p_retm_if(NULL == generator, "udatpg_open is failed(%d)", error); - - for (i=LOG_FORMAT_TIME_12;i<LOG_FORMAT_MAX;i++) { - UChar skeleton[64]={'\0'}; - UChar best_pattern[64] = {0}; - - u_uastrncpy(skeleton, date_time_format[i], strlen(date_time_format[i])); - udatpg_getBestPattern(generator, skeleton, u_strlen(skeleton), best_pattern, - (int32_t)(sizeof(best_pattern)/sizeof(UChar)), &error); - formatter[i] = udat_open(UDAT_IGNORE, UDAT_IGNORE, locale, NULL, -1, best_pattern, -1, &error); - } - udatpg_close(generator); + return ret; } -void ph_log_util_delete_date_format(UDateFormat **formatter) -{ - int i; - for (i=LOG_FORMAT_TIME_12;i<LOG_FORMAT_MAX;i++) { - if (formatter[i]) { - udat_close(formatter[i]); - formatter[i] = NULL; - } - } -} diff --git a/lib/log/ph-log-utils.h b/lib/log/ph-log-utils.h index 49415f7..17ef555 100755 --- a/lib/log/ph-log-utils.h +++ b/lib/log/ph-log-utils.h @@ -17,21 +17,8 @@ #ifndef __PH_LOG_UTILS_H__ #define __PH_LOG_UTILS_H__ -#include <unicode/udat.h> +#include "phone-common.h" -typedef enum date_style{ - PH_LOG_TIME_ONLY, - PH_LOG_DATE_ONLY, - PH_LOG_TIME_DATE, -}date_style; - -char *ph_log_util_get_icon_path_with_action(int log_type); -char *ph_log_util_get_icon_type(int log_type); -char *ph_log_util_get_time_date(UDateFormat ** formatter, int log_time, int log_duration, int display_yesterday); - -void ph_log_util_generate_date_format(UDateFormat ** formatter); -void ph_log_util_delete_date_format(UDateFormat ** formatter); - -int ph_log_util_del_log_by_number(char *number); +int ph_log_util_del_log_by_id(Eina_List *list, ph_log_info *l_info); #endif /* __PH_LOG_UTILS_H__ */ diff --git a/lib/ph-front/CMakeLists.txt b/lib/ph-front/CMakeLists.txt new file mode 100755 index 0000000..bfe93d6 --- /dev/null +++ b/lib/ph-front/CMakeLists.txt @@ -0,0 +1,14 @@ +LINK_DIRECTORIES(${CMAKE_BINARY_DIR}) + +SET(TARGET ${PH_FRONT}) + +FILE(GLOB SRCS *.c) + +ADD_LIBRARY(${TARGET} SHARED ${SRCS}) +SET_TARGET_PROPERTIES(${TARGET} PROPERTIES VERSION ${VERSION}) +SET_TARGET_PROPERTIES(${TARGET} PROPERTIES COMPILE_FLAGS ${EXTRA_CFLAGS}) +TARGET_LINK_LIBRARIES(${TARGET} ${COMMON_LIB} ${FAVOR_LIB} ${ug_pkgs_LDFLAGS} ${SPEEDDIAL} ${PH_LOG} ${PH_DIALER} ${CT_DETAILS} ${CT_LIST}) + +INSTALL(TARGETS ${TARGET} DESTINATION ${UGLIBDIR}) + +INSTALL(FILES ${CMAKE_BINARY_DIR}/lib/ph-front/phone-tabui-efl.xml DESTINATION "/usr/share/packages") diff --git a/lib/phoneui/ph-front-main.c b/lib/ph-front/ph-front-main.c index cf9c1db..7da757f 100755 --- a/lib/phoneui/ph-front-main.c +++ b/lib/ph-front/ph-front-main.c @@ -15,14 +15,18 @@ */ #include <ui-gadget-module.h> -#include <vconf.h> #include "phone.h" #include "phone-ug.h" -#include "phone-ui.h" +#include "ph-front.h" #include "ph-front-view.h" +#include <bundle.h> -void *phoneui_on_create(struct ui_gadget *ug, enum ug_mode mode, bundle *data, void *priv) +// for removing build warning //////////////////////////////////// +int service_export_as_bundle(service_h service, bundle **data); +//////////////////////////////////////////////////////// + +void *phoneui_on_create(ui_gadget_h ug, enum ug_mode mode, service_h service, void *priv) { PH_FN_CALL; int ret; @@ -30,12 +34,30 @@ void *phoneui_on_create(struct ui_gadget *ug, enum ug_mode mode, bundle *data, v Evas_Object *parent; Evas_Object *layout; ph_phoneui_data *phoneui_d; + const char* val = NULL; + bundle *bd; if (!ug || !priv) return NULL; bindtextdomain(PACKAGE, LOCALEDIR); + service_export_as_bundle(service, &bd); + + phoneui_d = priv; + if (bd) { + val = bundle_get_val(bd, PH_UG_BUNDLE_TYPE); + if (val) phoneui_d->ug_request = atoi(val); + PH_DBG("type = %d", phoneui_d->ug_request); + } + p_retvm_if(PH_UG_REQUEST_LAUNCH_VOICECALL != phoneui_d->ug_request, + NULL, "Invalid ug request (%d)", phoneui_d->ug_request); + + phoneui_d->view_visible[PH_VIEW_DIALER] = true; + phoneui_d->view_visible[PH_VIEW_LOG] = true; + phoneui_d->view_visible[PH_VIEW_CONTACT] = true; + phoneui_d->view_visible[PH_VIEW_FAVORITE] = true; + ret = contacts_svc_connect(); p_retvm_if(ret < CTS_SUCCESS, NULL, "contacts_svc_connect() Failed(%d)", ret); @@ -61,60 +83,76 @@ void *phoneui_on_create(struct ui_gadget *ug, enum ug_mode mode, bundle *data, v return layout; } -void phoneui_on_start(struct ui_gadget *ug, bundle *data, void *priv) +void phoneui_on_start(ui_gadget_h ug, service_h service, void *priv) { PH_FN_CALL; + int i; ph_phoneui_data *phoneui_d = priv; - int index; - int ret; - ret = vconf_get_int(PH_START_VIEW, &index); - if (ret < 0 || PH_VIEW_MAX <= index || index <= PH_VIEW_NONE) { - ERR("vconf_get_int() Failed(%d)", ret); - index = PH_VIEW_DIALER; - } - elm_toolbar_item_selected_set(phoneui_d->item[index], EINA_TRUE); + for (i=PH_VIEW_DIALER;i<PH_VIEW_MAX;i++) { + if (phoneui_d->item[i]) { + elm_toolbar_item_selected_set(phoneui_d->item[i], EINA_TRUE); + break; + } + } phoneui_d->timer = ecore_timer_add(3.0, phone_front_view_load_timer, phoneui_d); PH_FN_END; } -void phoneui_on_pause(struct ui_gadget *ug, bundle *data, void *priv) +void phoneui_on_pause(ui_gadget_h ug, service_h service, void *priv) { } -void phoneui_on_resume(struct ui_gadget *ug, bundle *data, void *priv) +void phoneui_on_resume(ui_gadget_h ug, service_h service, void *priv) { } -void phoneui_on_destroy(struct ui_gadget *ug, bundle *data, void *priv) +void phoneui_on_destroy(ui_gadget_h ug, service_h service, void *priv) { PH_FN_CALL; + ph_phoneui_data *phoneui_d = priv; if (!ug) return; + free(phoneui_d->ug_data); evas_object_del(ug_get_layout(ug)); contacts_svc_disconnect(); PH_FN_END; } -void phoneui_on_message(struct ui_gadget *ug, bundle *msg, bundle *data, void *priv) +void phoneui_on_message(ui_gadget_h ug, service_h msg, service_h service, void *priv) { } -void phoneui_on_event(struct ui_gadget *ug, enum ug_event event, bundle *data, void *priv) +void phoneui_on_event(ui_gadget_h ug, enum ug_event event, service_h service, void *priv) { + Evas_Object *notify; ph_phoneui_data *phoneui_d = priv; switch (event) { case UG_EVENT_REGION_CHANGE: phone_front_view_region_changed(phoneui_d); break; + case UG_EVENT_ROTATE_PORTRAIT: + case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN: + phone_resize_notify(phoneui_d->navi, 0); + evas_object_data_set(phoneui_d->navi, "phone_rotate", (void *)0); + notify = phone_get_notify(phoneui_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(phoneui_d->navi, 90); + evas_object_data_set(phoneui_d->navi, "phone_rotate", (void *)90); + notify = phone_get_notify(phoneui_d->navi); + elm_layout_theme_set(elm_object_content_get(notify), "standard", "selectioninfo", "horizontal/bottom_64"); + break; default: break; } } -void phoneui_on_key_event(struct ui_gadget *ug, enum ug_key_event event, bundle *data, void *priv) +void phoneui_on_key_event(ui_gadget_h ug, enum ug_key_event event, service_h data, void *priv) { } @@ -151,30 +189,3 @@ API void UG_MODULE_EXIT(struct ug_module_ops *ops) ops->priv = NULL; } -API ph_phoneui_data* phone_create_phoneui(Evas_Object *win) -{ - PH_FN_CALL; - Evas_Object *bg; - Evas_Object *layout; - ph_phoneui_data *phoneui_d = calloc(1, sizeof(ph_phoneui_data)); - phoneui_d->win = win; - phoneui_d->select_tab = PH_VIEW_NONE; - - layout = ph_front_create_toolbar(phoneui_d); - - if (NULL == layout) { - PH_DBG("layout_main is null"); - free(phoneui_d); - return NULL; - } - - bg = phone_create_bg(layout); - if (NULL == bg) { - PH_DBG("phone_create_bg() return NULL"); - free(phoneui_d); - return NULL; - } - - return phoneui_d; -} - diff --git a/lib/ph-front/ph-front-view.c b/lib/ph-front/ph-front-view.c new file mode 100755 index 0000000..f1916e4 --- /dev/null +++ b/lib/ph-front/ph-front-view.c @@ -0,0 +1,473 @@ +/* + * 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 <bundle.h> +#include <aul.h> +#include <app.h> + +#include "phone.h" +#include "ph-front.h" +#include "phone-log.h" +#include "phone-dialer.h" +#include "ph-front-view.h" +#include "ct-list.h" +#include "ct-favor.h" + +static void front_view_reset_current_sub_view(ph_phoneui_data *phoneui_d) +{ + PH_FN_CALL; + p_ret_if(phoneui_d->select_tab <= PH_VIEW_NONE || PH_VIEW_MAX <= phoneui_d->select_tab); + if (phoneui_d->sub_view[phoneui_d->select_tab]) { + switch (phoneui_d->select_tab) { + case PH_VIEW_DIALER: + phone_dialer_view_reset(phoneui_d->sub_view[PH_VIEW_DIALER]); + phone_dialer_set_background(phoneui_d->sub_view[PH_VIEW_DIALER], true); + break; + case PH_VIEW_CONTACT : + ctui_list_view_reset(evas_object_data_get(phoneui_d->navi, "clist_d")); + break; + case PH_VIEW_LOG : + phone_log_view_reset(phoneui_d->navi); + phone_log_set_background(phoneui_d->navi, true); + break; + case PH_VIEW_FAVORITE : + phone_favor_view_reset(phoneui_d->sub_view[PH_VIEW_FAVORITE]); + phone_favor_set_background(phoneui_d->sub_view[PH_VIEW_FAVORITE], true); + break; + } + } +} + +static void front_view_load_sub_view(ph_phoneui_data *phoneui_d, int tab_index) +{ + PH_FN_CALL; + ph_view_info *view_info; + view_info = calloc(1, sizeof(ph_view_info)); + phone_set_view_info(view_info, phoneui_d->win, phoneui_d->navi, phoneui_d->ug, phoneui_d->ug_request, + phoneui_d->cnt_max, phoneui_d->ug_data); + switch (tab_index) { + case PH_VIEW_DIALER: + phoneui_d->sub_view[tab_index] = phone_create_dialer_view(view_info); + break; + case PH_VIEW_CONTACT: + phoneui_d->sub_view[tab_index] = ctui_create_phone_list_view(view_info); + return; + case PH_VIEW_LOG: + phoneui_d->sub_view[tab_index] = phone_create_log_view(view_info); + break; + case PH_VIEW_FAVORITE: + phoneui_d->sub_view[tab_index] = phone_favor_create_view(view_info); + break; + default: + return; + }; + free(view_info); +} + +static void front_view_show_sub_view(ph_phoneui_data *phoneui_d, int tab_index) +{ + PH_FN_CALL; + Evas_Object *view; + ph_view_info *view_info; + p_retm_if(tab_index <= PH_VIEW_NONE || PH_VIEW_MAX <= tab_index, "tab index is invalid"); + p_retm_if(phoneui_d->select_tab == tab_index, "The tab is already shown"); + + front_view_reset_current_sub_view(phoneui_d); + phone_hide_notify(phoneui_d->navi); + + view_info = calloc(1, sizeof(ph_view_info)); + phone_set_view_info(view_info, phoneui_d->win, phoneui_d->navi, phoneui_d->ug, phoneui_d->ug_request, + phoneui_d->cnt_max, phoneui_d->ug_data); + + switch (tab_index) { + case PH_VIEW_DIALER: + if (NULL == phoneui_d->sub_view[tab_index]) + phoneui_d->sub_view[tab_index] = phone_create_dialer_view(view_info); + phone_dialer_set_background(phoneui_d->sub_view[PH_VIEW_DIALER], false); + phone_dialer_set_navi(phoneui_d->sub_view[PH_VIEW_DIALER]); + phone_dialer_check_focus(phoneui_d->sub_view[PH_VIEW_DIALER]); + if(!phoneui_d->ug) + phone_front_view_show_call_app(phoneui_d); + break; + case PH_VIEW_CONTACT: + if (NULL == phoneui_d->sub_view[tab_index]) + phoneui_d->sub_view[tab_index] = ctui_create_phone_list_view(view_info); + + if (PH_UG_REQUEST_CHECK == phoneui_d->ug_request || + PH_UG_REQUEST_CHECK_FOR_NUMBER == phoneui_d->ug_request || + PH_UG_REQUEST_CHECK_FOR_EMAIL == phoneui_d->ug_request) { + ctui_list_edit_mode_start(evas_object_data_get(phoneui_d->navi, "clist_d")); + } + else + ctui_list_navi_set(CT_LIST_MODE_DEFAULT, evas_object_data_get(phoneui_d->navi, "clist_d")); + break; + case PH_VIEW_LOG: + if (NULL == phoneui_d->sub_view[tab_index]) + phoneui_d->sub_view[tab_index] = phone_create_log_view(view_info); + phone_log_set_background(phoneui_d->navi, false); + if (!phoneui_d->ug) + phone_log_missed_info_update(phoneui_d->navi); + + if (PH_UG_REQUEST_CHECK == phoneui_d->ug_request || + PH_UG_REQUEST_CHECK_FOR_NUMBER == phoneui_d->ug_request || + PH_UG_REQUEST_CHECK_FOR_EMAIL == phoneui_d->ug_request) + phone_log_check_mode_start(evas_object_data_get(phoneui_d->navi, "log_data")); + else + phone_log_set_navi(phoneui_d->navi); + break; + case PH_VIEW_FAVORITE: + if (NULL == phoneui_d->sub_view[tab_index]) + phoneui_d->sub_view[tab_index] = phone_favor_create_view(view_info); + phone_favor_set_background(phoneui_d->sub_view[PH_VIEW_FAVORITE], true); + if (phoneui_d->ug && + (PH_UG_REQUEST_CHECK == phoneui_d->ug_request || + PH_UG_REQUEST_CHECK_FOR_NUMBER == phoneui_d->ug_request || + PH_UG_REQUEST_CHECK_FOR_EMAIL == phoneui_d->ug_request)) { + phone_favor_edit_mode_start(evas_object_data_get(phoneui_d->sub_view[tab_index], "favor_d")); + } + else + phone_favor_set_navi(phoneui_d->sub_view[tab_index], PH_FAVOR_MODE_DEFAULT); + break; + default: + free(view_info); + return; + } + phoneui_d->select_tab = tab_index; + + view = elm_object_part_content_get(phoneui_d->layout, "elm.swallow.content"); + if (view) { + elm_object_part_content_unset(phoneui_d->layout, "elm.swallow.content"); + evas_object_hide(view); + } + elm_object_part_content_set(phoneui_d->layout, "elm.swallow.content", phoneui_d->sub_view[tab_index]); + evas_object_show(phoneui_d->sub_view[tab_index]); + free(view_info); +} + +static Eina_Bool front_view_load_all_sub_view(void *data) +{ + PH_FN_CALL; + ph_phoneui_data *phoneui_d = data; + int i; + + for (i=PH_VIEW_DIALER;i<PH_VIEW_MAX;i++) { + if (phoneui_d->view_visible[i] && NULL == phoneui_d->sub_view[i]) { + front_view_load_sub_view(phoneui_d, i); + return ECORE_CALLBACK_RENEW; + } + } + phoneui_d->idler = NULL; + return ECORE_CALLBACK_CANCEL; +} + +API Eina_Bool phone_front_view_load_timer(void *data) +{ + ph_phoneui_data *phoneui_d = data; + phoneui_d->idler = ecore_idler_add(front_view_load_all_sub_view, phoneui_d); + phoneui_d->timer = NULL; + return ECORE_CALLBACK_CANCEL; +} + +static void pfront_view_change_cb(void *data, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; + int i; + Elm_Object_Item *selected_it; + ph_phoneui_data *phoneui_d = data; + + selected_it = elm_toolbar_selected_item_get(obj); + + for (i=PH_VIEW_DIALER;i<PH_VIEW_MAX;i++) { + if (phoneui_d->item[i]) + if (selected_it == phoneui_d->item[i]) break; + } + PH_DBG("cur sel : %d, sel index : %d", phoneui_d->select_tab, i); + front_view_show_sub_view(phoneui_d, i); +} + +static void pfront_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; + ph_phoneui_data *phoneui_d = data; + int i; + + p_retm_if(NULL == phoneui_d, "phoneui_d is null"); + + for (i=0;i<PH_VIEW_MAX;i++) { + if (phoneui_d->sub_view[i]) + evas_object_del(phoneui_d->sub_view[i]); + } + + if (phoneui_d->idler) + ecore_idler_del(phoneui_d->idler); + + if (phoneui_d->timer) + ecore_timer_del(phoneui_d->timer); + + free(phoneui_d); + PH_FN_END; +} + +Evas_Object* ph_front_create_toolbar(ph_phoneui_data *phoneui_d) +{ + Evas_Object *base; + Evas_Object *layout; + Evas_Object *naviframe; + Evas_Object *toolbar; + Elm_Object_Item *navi_it; + + base = elm_layout_add(phoneui_d->win); + p_retvm_if(NULL == base, NULL, "elm_layout_add() Failed"); + evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_layout_theme_set(base, "layout", "application", "default"); + elm_win_resize_object_add(phoneui_d->win, base); + evas_object_show(base); + + naviframe = elm_naviframe_add(base); + elm_naviframe_prev_btn_auto_pushed_set(naviframe, EINA_FALSE); + elm_object_part_content_set(base, "elm.swallow.content", naviframe); + phoneui_d->navi = naviframe; + + layout = elm_layout_add(naviframe); + p_retvm_if(NULL == layout, NULL, "elm_layout_add() Failed"); + elm_layout_theme_set(layout, "layout", "tabbar", "default"); + phoneui_d->layout = layout; + + toolbar = elm_toolbar_add(naviframe); + p_retvm_if(NULL == toolbar, NULL, "elm_toolbar_add() Failed"); + elm_object_style_set(toolbar, "tabbar"); + elm_object_part_content_set(layout, "elm.swallow.tabbar", toolbar); + phoneui_d->tabbar = toolbar; + + elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND); + + if (phoneui_d->view_visible[PH_VIEW_DIALER]) + phoneui_d->item[PH_VIEW_DIALER] = elm_toolbar_item_append(toolbar, + PH_IMG_ICON_DIALER, T_(PH_GET_TEXT_BASIC, PHTEXT_KEYPAD), pfront_view_change_cb, phoneui_d); + if (phoneui_d->view_visible[PH_VIEW_CONTACT]) + phoneui_d->item[PH_VIEW_CONTACT] = elm_toolbar_item_append(toolbar, + PH_IMG_ICON_CONTACTS, S_(PH_SYS_BODY_CONTACTS), pfront_view_change_cb, phoneui_d); + if (phoneui_d->view_visible[PH_VIEW_LOG]) + phoneui_d->item[PH_VIEW_LOG] = elm_toolbar_item_append(toolbar, + PH_IMG_ICON_LOGS, T_(PH_GET_TEXT_BASIC, PHTEXT_LOGS), pfront_view_change_cb, phoneui_d); + if (phoneui_d->view_visible[PH_VIEW_FAVORITE]) + phoneui_d->item[PH_VIEW_FAVORITE] = elm_toolbar_item_append(toolbar, + PH_IMG_ICON_FAVORITE, T_(PH_GET_TEXT_BASIC, PHTEXT_FAVORITES), pfront_view_change_cb, phoneui_d); + + navi_it = elm_naviframe_item_push(naviframe, NULL, NULL, NULL, layout, NULL); + elm_naviframe_item_title_visible_set(navi_it, EINA_FALSE); + evas_object_event_callback_add(base, EVAS_CALLBACK_DEL, pfront_view_delete_cb, phoneui_d); + + elm_toolbar_select_mode_set(phoneui_d->tabbar, ELM_OBJECT_SELECT_MODE_ALWAYS); + + return base; +} + +API ph_phoneui_data* phone_front_view_create(Evas_Object *win) +{ + PH_FN_CALL; + Evas_Object *bg; + Evas_Object *layout; + ph_phoneui_data *phoneui_d = calloc(1, sizeof(ph_phoneui_data)); + phoneui_d->win = win; + phoneui_d->select_tab = PH_VIEW_NONE; + + phoneui_d->view_visible[PH_VIEW_DIALER] = true; + phoneui_d->view_visible[PH_VIEW_CONTACT] = true; + phoneui_d->view_visible[PH_VIEW_LOG] = true; + phoneui_d->view_visible[PH_VIEW_FAVORITE] = true; + + layout = ph_front_create_toolbar(phoneui_d); + if (NULL == layout) { + PH_DBG("layout_main is null"); + free(phoneui_d); + return NULL; + } + + bg = phone_create_bg(layout); + if (NULL == bg) { + PH_DBG("phone_create_bg() return NULL"); + free(phoneui_d); + return NULL; + } + + return phoneui_d; +} + +API void phone_front_view_region_changed(ph_phoneui_data *phoneui_d) +{ + if (phoneui_d && phoneui_d->sub_view[PH_VIEW_LOG]) + phone_log_views_update(phoneui_d->navi); +} + +API void phone_front_view_pause(ph_phoneui_data *phoneui_d) +{ + if (phoneui_d && phoneui_d->sub_view[PH_VIEW_LOG]) + phone_log_set_background(phoneui_d->navi, true); + if (phoneui_d && phoneui_d->sub_view[PH_VIEW_CONTACT]) + ctui_list_view_pause(phoneui_d->navi); + if (phoneui_d && phoneui_d->sub_view[PH_VIEW_DIALER]) + phone_dialer_set_background(phoneui_d->sub_view[PH_VIEW_DIALER], true); + if (phoneui_d && phoneui_d->sub_view[PH_VIEW_FAVORITE]) + phone_favor_set_background(phoneui_d->sub_view[PH_VIEW_FAVORITE], true); +} + +API void phone_front_view_resume(ph_phoneui_data *phoneui_d) +{ + if (phoneui_d && phoneui_d->sub_view[PH_VIEW_LOG]) { + if (PH_VIEW_LOG == phoneui_d->select_tab) { + phone_log_set_background(phoneui_d->navi, false); + phone_log_view_resume(phoneui_d->navi); + } + } + if (phoneui_d && phoneui_d->sub_view[PH_VIEW_CONTACT]) + ctui_list_view_resume(phoneui_d->navi); + + if (phoneui_d && phoneui_d->sub_view[PH_VIEW_DIALER]) { + if (PH_VIEW_DIALER == phoneui_d->select_tab) { + phone_dialer_set_background(phoneui_d->sub_view[PH_VIEW_DIALER], false); + phone_dialer_view_resume(phoneui_d->sub_view[PH_VIEW_DIALER]); + } + } + if (phoneui_d && phoneui_d->sub_view[PH_VIEW_FAVORITE] && PH_VIEW_FAVORITE == phoneui_d->select_tab) + phone_favor_set_background(phoneui_d->sub_view[PH_VIEW_FAVORITE], false); +} + +static void front_view_win_activate(void *data, Evas *e, void *even_info) +{ + elm_win_activate(data); + evas_event_callback_del(e, EVAS_CALLBACK_RENDER_FLUSH_POST, front_view_win_activate); +} + +API void phone_front_view_reset(ph_phoneui_data *phoneui_d, int select_index, int op, service_h service) +{ + PH_FN_CALL; + int call_launched = FALSE; + ph_view_info *view_info; + Evas_Object *view; + int ret; + + front_view_reset_current_sub_view(phoneui_d); + if (phoneui_d->sub_view[PH_VIEW_CONTACT]) + ctui_list_view_resume(phoneui_d->navi); + view = elm_object_part_content_get(phoneui_d->layout, "elm.swallow.content"); + if (view) { + elm_object_part_content_unset(phoneui_d->layout, "elm.swallow.content"); + evas_object_hide(view); + } + + view_info = calloc(1, sizeof(ph_view_info)); + phone_set_view_info(view_info, phoneui_d->win, phoneui_d->navi, phoneui_d->ug, phoneui_d->ug_request, + phoneui_d->cnt_max, phoneui_d->ug_data); + + switch (select_index) { + case PH_VIEW_DIALER: + if (NULL == phoneui_d->sub_view[select_index]) + phoneui_d->sub_view[select_index] = phone_create_dialer_view(view_info); + + if (PH_FRONT_DIALER_WITH_NUM == op) { + char *num = NULL; + ret = service_get_uri(service, &num); + p_warn_if(SERVICE_ERROR_NONE != ret, "service_get_uri is failed(%d)", ret); + phone_dialer_view_set_num(phoneui_d->sub_view[PH_VIEW_DIALER], num+4); + free(num); + } + else + phone_dialer_view_resume(phoneui_d->sub_view[PH_VIEW_DIALER]); + + phone_dialer_set_navi(phoneui_d->sub_view[PH_VIEW_DIALER]); + phone_dialer_check_focus(phoneui_d->sub_view[PH_VIEW_DIALER]); + + if(!phoneui_d->ug) + call_launched = phone_front_view_show_call_app(phoneui_d); + break; + case PH_VIEW_CONTACT: + if (NULL == phoneui_d->sub_view[select_index]) { + phoneui_d->sub_view[PH_VIEW_CONTACT] = ctui_create_phone_list_view(view_info); + } + ctui_list_navi_set(CT_LIST_MODE_DEFAULT, evas_object_data_get(phoneui_d->navi, "clist_d")); + break; + case PH_VIEW_LOG: + if (NULL == phoneui_d->sub_view[select_index]) + phoneui_d->sub_view[select_index] = phone_create_log_view(view_info); + if (!phoneui_d->ug) + phone_log_missed_info_update(phoneui_d->navi); + if (PH_FRONT_LOG_MISSED == op) + phone_log_seg_set(phoneui_d->navi, LOG_SEGMENT_MISSED_VIEW); + phone_log_set_navi(phoneui_d->navi); + break; + case PH_VIEW_FAVORITE: + if (NULL == phoneui_d->sub_view[select_index]) + phoneui_d->sub_view[select_index] = phone_favor_create_view(view_info); + phone_favor_set_navi(phoneui_d->sub_view[select_index], PH_FAVOR_MODE_DEFAULT); + break; + default: + break; + } + + phoneui_d->select_tab = select_index; + + if (PH_VIEW_NONE < select_index && select_index < PH_VIEW_MAX) { + elm_object_part_content_set(phoneui_d->layout, "elm.swallow.content", phoneui_d->sub_view[select_index]); + evas_object_show(phoneui_d->sub_view[select_index]); + elm_toolbar_item_selected_set(phoneui_d->item[select_index], EINA_TRUE); + } + + if (phoneui_d->win && FALSE == call_launched && PH_VIEW_NONE != select_index) { + evas_event_callback_add(evas_object_evas_get(phoneui_d->navi), + EVAS_CALLBACK_RENDER_FLUSH_POST, front_view_win_activate, phoneui_d->win); + } + else + elm_win_lower(phoneui_d->win); + phoneui_d->timer = ecore_timer_add(3.0, phone_front_view_load_timer, phoneui_d); + + free(view_info); + PH_FN_END; +} + +static bool front_view_call_app_check(service_h service, const char *pkg_name, void *data) +{ + int *call_app_launched = data; + + // premise : Only one Call app can be running at a time + if (1 == aul_app_is_running(pkg_name)) { + aul_open_app(pkg_name); + *call_app_launched = TRUE; + return true; + } + return true; +} + +API int phone_front_view_show_call_app(ph_phoneui_data *phoneui_d) +{ + PH_FN_CALL; + service_h service; + int call_app_launched = FALSE; + + service_create(&service); + service_set_operation(service, SERVICE_OPERATION_CALL); + service_set_uri(service, "tel:"); + service_foreach_app_matched(service, front_view_call_app_check, (void *)&call_app_launched); + + if (call_app_launched) + return 1; + if (1 == aul_app_is_running(VIDEOCALL_PKG)) { + aul_open_app(VIDEOCALL_PKG); + return 1; + } + return 0; +} + diff --git a/lib/phoneui/ph-front-view.h b/lib/ph-front/ph-front-view.h index 883d432..883d432 100755 --- a/lib/phoneui/ph-front-view.h +++ b/lib/ph-front/ph-front-view.h diff --git a/lib/ph-front/phone-tabui-efl.xml b/lib/ph-front/phone-tabui-efl.xml new file mode 100644 index 0000000..f88775f --- /dev/null +++ b/lib/ph-front/phone-tabui-efl.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns="http://tizen.org/ns/packages" package="phone-tabui-efl" version="0.1.0-0" install-location="internal-only"> + <label>phone-tabui-efl</label> + <author email="ensung.park@samsung.com" href="www.samsung.com">ensung park</author> + <description>phone-tabui-efl Application</description> + <ui-application appid="phone-tabui-efl" exec="/opt/ug/bin/phone-tabui-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/phoneui/ph-favorite-edit-view.c b/lib/phoneui/ph-favorite-edit-view.c deleted file mode 100755 index eb788fd..0000000 --- a/lib/phoneui/ph-favorite-edit-view.c +++ /dev/null @@ -1,343 +0,0 @@ -/* - * 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 "phone-ui.h" -#include "ph-favorite-view.h" -#include "ph-favorite-edit-view.h" - -static inline void favor_edit_all_item_check_set(Evas_Object *genlist, - Eina_Bool checked) -{ - Elm_Object_Item *item; - - item = elm_genlist_first_item_get(genlist); - while (NULL != item) { - ph_favor_info *f_info = elm_object_item_data_get(item); - f_info->is_checked = checked; - item = elm_genlist_item_next_get(item); - } - elm_genlist_realized_items_update(genlist); -} - -static Eina_Bool favor_edit_del_timer(void *data) -{ - PH_FN_CALL; - ph_favorite_data *favor_d = data; - ph_progress_info *p_info = favor_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); - ph_favor_edit_mode_end(favor_d, 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(favor_d->popup); - favor_d->popup = NULL; - - if (NULL != p_info) { - favor_d->p_info = NULL; - free(p_info); - } - phone_show_notify(favor_d->navi, message, 2.0); - return ECORE_CALLBACK_CANCEL; - } -} - -static PTHREAD_FN favor_edit_del(void *data) -{ - PH_FN_CALL; - Eina_List *l; - ph_favor_info*f_info; - ph_favorite_data *favor_d = data; - ph_progress_info *p_info = favor_d->p_info; - - EINA_LIST_FOREACH(favor_d->favorite_list, l, f_info) { - if (!p_info->alive) { - p_info->completed = true; - break; - } - if (!f_info) continue; - - if (TRUE == f_info->is_checked) { - if (CTS_SUCCESS != contacts_svc_delete_favorite(f_info->id)) { - p_info->completed = true; - break; - } - p_info->cnt++; - } - if (p_info->cnt == p_info->cnt_checked_total) - break; - } - pthread_exit(NULL); - -} - -void ph_favor_edit_del_btn_cb(void *data, Evas_Object *obj, void *event_info) -{ - PH_FN_CALL; - int ret; - ph_favorite_data *favor_d = data; - ph_progress_info *p_info; - - p_info = calloc(1, sizeof(ph_progress_info)); - p_retm_if(NULL == p_info, "calloc return NULL"); - - favor_d->p_info = p_info; - p_info->cnt_checked_total = favor_d->checked_cnt; - p_info->alive = true; - - ret = contacts_svc_begin_trans(); - if (ret < CTS_SUCCESS) { - ERR("contacts_svc_begin_trans() Failed(%d)", ret); - free(p_info); - favor_d->p_info = NULL; - return; - } - ret = pthread_create(&p_info->thread, NULL, favor_edit_del, favor_d); - if (0 != ret) { - ERR("Thread creation failed(%d)", ret); - free(p_info); - favor_d->p_info = NULL; - - ret = contacts_svc_end_trans(false); - p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); - return; - } - - p_info->timer = ecore_timer_add(0.2, favor_edit_del_timer, favor_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); - favor_d->p_info = NULL; - - ret = contacts_svc_end_trans(false); - p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); - return; - } - favor_d->popup = phone_progressbar_popup(favor_d->win, p_info, T_(PH_GET_TEXT_BASIC, PHTEXT_DELETING_FAVORITES)); - phone_create_popup_button(favor_d->popup, 1, S_(PH_SYS_SK_CANCEL), phone_progress_popup_del, p_info); -} - -static void favor_edit_select_all_changed_cb(ph_favorite_data * favor_d) -{ - Eina_List *l; - ph_favor_info *f_info; - - p_retm_if(NULL == favor_d, "Parameter is null"); - - if (favor_d->is_all_check) - favor_d->checked_cnt = favor_d->favorite_list_count; - else - favor_d->checked_cnt = 0; - - EINA_LIST_FOREACH(favor_d->favorite_list, l, f_info) { - if (!f_info) continue; - f_info->is_checked = favor_d->is_all_check; - } - - elm_genlist_realized_items_update(favor_d->genlist); - ph_favor_edit_set_selection_info(favor_d); - ph_favor_update_button_status(favor_d); -} - -static void favor_edit_select_all_mouse_up_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) -{ - int x, y, w, h; - ph_favorite_data *favor_d = data; - Evas_Event_Mouse_Up *ev = event_info; - - if (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; - - favor_d->is_all_check = !favor_d->is_all_check; - elm_check_state_set(favor_d->select_all_checkbox, favor_d->is_all_check); - favor_edit_select_all_changed_cb(favor_d); -} - -static void favor_edit_select_all_check_cb(void *data, Evas_Object *obj, void *event_info) -{ - ph_favorite_data *favor_d = data; - favor_edit_select_all_changed_cb(favor_d); -} - -static void favor_edit_create_select_all(ph_favorite_data *favor_d) -{ - Evas_Object *layout; - Evas_Object *check; - layout = elm_layout_add(favor_d->box); - elm_layout_theme_set(layout, "genlist", "item", "select_all/default"); - evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, 0.0); - evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_UP, - favor_edit_select_all_mouse_up_cb, favor_d); - - check = elm_check_add(layout); - elm_check_state_pointer_set(check, &(favor_d->is_all_check)); - evas_object_smart_callback_add(check, "changed", favor_edit_select_all_check_cb, favor_d); - evas_object_propagate_events_set(check, EINA_FALSE); - elm_object_part_content_set(layout, "elm.icon", check); - favor_d->select_all_checkbox = check; - evas_object_data_set(favor_d->select_all_checkbox, "layout", layout); - - elm_object_part_text_set(layout, "elm.text", S_(PH_SYS_BODY_SELECT_ALL)); - elm_box_pack_start(favor_d->box, layout); - evas_object_show(layout); -} - -void ph_favor_edit_check_changed_cb(void *data, Evas_Object *obj, void *event_info) -{ - PH_FN_CALL; - ph_favorite_data * favor_d = data; - if (elm_check_state_get(obj)) - favor_d->checked_cnt++; - else - favor_d->checked_cnt--; - - if (favor_d->favorite_list_count == favor_d->checked_cnt) - favor_d->is_all_check = EINA_TRUE; - else - favor_d->is_all_check = EINA_FALSE; - elm_check_state_set(favor_d->select_all_checkbox, favor_d->is_all_check); - - elm_genlist_realized_items_update(favor_d->genlist); - - ph_favor_edit_set_selection_info(favor_d); - ph_favor_update_button_status(favor_d); -} - -void ph_favor_edit_set_selection_info(const void *data) -{ - ph_favorite_data * favor_d = (ph_favorite_data*)data; - p_retm_if(NULL == favor_d, "Selection info is null"); - - if (0 == favor_d->checked_cnt) { - Evas_Object *notify = phone_get_notify(favor_d->navi); - if (notify) - evas_object_hide(notify); - } - else { - char info_text[PH_TEXT_SHORT_LEN]={0}; - snprintf(info_text, sizeof(info_text), "%s (%d)", S_(PH_SYS_POP_SELECTED), - favor_d->checked_cnt); - phone_show_notify(favor_d->navi, info_text, 0.0); - } -} - -void ph_favor_edit_mode_start(ph_favorite_data *favor_d) -{ - PH_FN_CALL; - Evas_Object *bg; - p_retm_if(NULL == favor_d, "Favorite data is null"); - - bg = phone_create_bg(favor_d->base); - elm_object_style_set(bg, "edit_mode"); - - elm_genlist_reorder_mode_set(favor_d->genlist, EINA_TRUE); - elm_genlist_decorate_mode_set(favor_d->genlist, EINA_TRUE); - elm_genlist_select_mode_set(favor_d->genlist, ELM_OBJECT_SELECT_MODE_ALWAYS); - favor_edit_create_select_all(favor_d); - - phone_favor_set_navi(favor_d->layout, PH_FAVOR_MODE_EDIT); -} - -void ph_favor_edit_mode_end(ph_favorite_data *favor_d, bool redraw) -{ - PH_FN_CALL; - Evas_Object *bg; - Evas_Object *layout; - Evas_Object *back_btn; - - bg = elm_object_part_content_unset(favor_d->base, "elm.swallow.bg"); - if (bg) - evas_object_del(bg); - - layout = evas_object_data_get(favor_d->select_all_checkbox, "layout"); - elm_box_unpack(favor_d->box, layout); - evas_object_del(layout); - favor_d->select_all_checkbox = NULL; - - if (favor_d->checked_cnt) { - favor_d->checked_cnt = 0; - favor_d->is_all_check = EINA_FALSE; - favor_edit_all_item_check_set(favor_d->genlist, EINA_FALSE); - } - - elm_genlist_decorate_mode_set(favor_d->genlist, EINA_FALSE); - elm_genlist_reorder_mode_set(favor_d->genlist, EINA_FALSE); - elm_genlist_select_mode_set(favor_d->genlist, ELM_OBJECT_SELECT_MODE_ALWAYS); - - back_btn = elm_button_add(favor_d->navi); - elm_object_item_part_content_set(favor_d->navi_item, "prev_btn", back_btn); - if (favor_d->ug) { - evas_object_smart_callback_add(back_btn, "clicked", phone_ug_destroy_me_cb, favor_d->ug); - elm_object_style_set(back_btn, "naviframe/back_btn/default"); - } - else { - evas_object_smart_callback_add(back_btn, "clicked", phone_back_btn_clicked_cb, favor_d->win); - elm_object_style_set(back_btn, "naviframe/end_btn/default"); - } - if (redraw) - phone_favor_set_navi(favor_d->layout, PH_FAVOR_MODE_DEFAULT); -} - -void ph_favor_edit_cancel_cb(void *data, Evas_Object *obj, void *event_info) -{ - ph_favorite_data *favor_d = data; - phone_hide_notify(favor_d->navi); - ph_favor_edit_mode_end(favor_d, true); -} diff --git a/lib/phoneui/ph-favorite-view.c b/lib/phoneui/ph-favorite-view.c deleted file mode 100755 index ef12b89..0000000 --- a/lib/phoneui/ph-favorite-view.c +++ /dev/null @@ -1,698 +0,0 @@ -/* - * 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 <contacts-svc.h> -#include <contacts-ug.h> -#include <ui-gadget-module.h> - -#include "phone.h" -#include "phone-common.h" -#include "phone-ui.h" -#include "ph-favorite-view.h" -#include "ph-favorite-edit-view.h" - -#define KEY_FAVOR_DATA "favor_d" -#define PH_FAVOR_LIST_ICON_SIZE 70 - -static Elm_Genlist_Item_Class itc_favor, itc_favor_one; - -/* for removing build warning */ -int ctui_detail_create_view_without_del(Evas_Object *win, Evas_Object *navi, struct ui_gadget *ug, int id); - -static char* favor_get_contact_number(int contact_id) -{ - int ret; - char *number; - CTSvalue *value; - - ret = contacts_svc_get_contact_value(CTS_GET_DEFAULT_NUMBER_VALUE, contact_id, &value); - p_retvm_if(ret != CTS_SUCCESS, NULL, "contacts_svc_get_contact_value() Failed(%d)", ret); - - number = contacts_svc_value_steal_str(value, CTS_NUM_VAL_NUMBER_STR); - contacts_svc_value_free(value); - - return number; -} - -static void favor_load_favorite_data(ph_favorite_data *favor_d) -{ - int count = 0; - int ret = 0; - Eina_List *list = NULL; - CTSiter *iter; - - ret = contacts_svc_get_list(CTS_LIST_ALL_CONTACT_FAVORITE, &iter); - if (CTS_SUCCESS != ret) { - ERR("contacts_svc_get_list is failed"); - favor_d->favorite_list_count = 0; - return; - } - - ret = contacts_svc_iter_next(iter); - contacts_svc_begin_trans(); - favor_d->version = contacts_svc_end_trans(true); - - while (CTS_SUCCESS == ret) { - CTSvalue *pfav = NULL; - ph_favor_info *f_info; - pfav = contacts_svc_iter_get_info(iter); - - f_info = calloc(1, sizeof(ph_favor_info)); - f_info->id = contacts_svc_value_get_int(pfav, CTS_LIST_SHORTCUT_ID_INT); - f_info->contact_id = contacts_svc_value_get_int(pfav, CTS_LIST_SHORTCUT_CONTACT_ID_INT); - f_info->display = phone_get_display_name_from_value(pfav, CTS_LIST_SHORTCUT_DISPLAY_NAME_STR, - CTS_LIST_SHORTCUT_FIRST_NAME_STR, CTS_LIST_SHORTCUT_LAST_NAME_STR); - f_info->img_path = contacts_svc_value_steal_str(pfav, CTS_LIST_SHORTCUT_IMG_PATH_STR); - - list = eina_list_append(list, (void*)f_info); - count++; - contacts_svc_value_free(pfav); - ret = contacts_svc_iter_next(iter); - } - contacts_svc_iter_remove(iter); - - favor_d->favorite_list_count = count; - favor_d->favorite_list = list; -} - -static void favor_free_data(Eina_List *list) -{ - Eina_List *l; - ph_favor_info *f_info; - p_retm_if(NULL == list, "List is null"); - - EINA_LIST_FOREACH(list, l, f_info) { - if (NULL == f_info) - continue; - free(f_info->display); - free(f_info->img_path); - free(f_info->number); - free(f_info); - } - eina_list_free(list); -} - -static void favor_destroy_child_ug(void *data) -{ - ph_favorite_data *favor_d = data; - favor_d->child_ug = NULL; -} -static void favor_load_list(ph_favorite_data *favor_d) -{ - p_retm_if(NULL == favor_d, "Parameter is null"); - - favor_free_data(favor_d->favorite_list); - favor_d->favorite_list = NULL; - favor_load_favorite_data(favor_d); -} - -static void favor_gl_item_sel(void *data, Evas_Object *obj, void *event_info) -{ - ph_favor_info *f_info; - ph_favorite_data *favor_d = data; - Elm_Object_Item *item = event_info; - - elm_genlist_item_selected_set(item, EINA_FALSE); - - f_info = elm_object_item_data_get(item); - p_retm_if(NULL == f_info, "elm_object_item_data_get() return NULL"); - - if (elm_genlist_decorate_mode_get(favor_d->genlist)) { - f_info->is_checked = !f_info->is_checked; - - if (f_info->is_checked) - favor_d->checked_cnt++; - else - favor_d->checked_cnt--; - - if (favor_d->favorite_list_count == favor_d->checked_cnt) - favor_d->is_all_check = TRUE; - else - favor_d->is_all_check = FALSE; - elm_check_state_set(favor_d->select_all_checkbox, favor_d->is_all_check); - - elm_genlist_item_fields_update(item, "elm.edit.icon.1", ELM_GENLIST_ITEM_FIELD_CONTENT); - - ph_favor_edit_set_selection_info(favor_d); - ph_favor_update_button_status(favor_d); - } - else { - bindtextdomain("contacts", "/opt/ug/res/locale"); // TODO : should be revised - ctui_detail_create_view_without_del(favor_d->win, favor_d->navi, favor_d->ug, f_info->contact_id); - } -} - -#define N 20 - -static Eina_Bool favor_append_item_part(void *data) -{ - int count; - Eina_List *l; - ph_favor_info *fd; - ph_favorite_data *favor_d = data; - - count = 0; - l = eina_list_nth_list(favor_d->favorite_list, favor_d->readed_n); - EINA_LIST_FOREACH(l, l, fd) { - if (N == count) break; - if (!fd) continue; - fd->item = elm_genlist_item_append(favor_d->genlist, &itc_favor, fd, - NULL, ELM_GENLIST_ITEM_NONE, favor_gl_item_sel, favor_d); - count++; - } - if (N <= count) { - favor_d->readed_n += N; - return ECORE_CALLBACK_RENEW; - } - else { - favor_d->list_idler = NULL; - return ECORE_CALLBACK_CANCEL; - } -} - -static void favor_fill_genlist(ph_favorite_data *favor_d) -{ - int count; - Eina_List *l; - ph_favor_info *fd; - p_retm_if(NULL == favor_d->genlist, "Parameter is null"); - - PH_DBG("favorite_data_list_count = %d", favor_d->favorite_list_count); - - if (favor_d->list_idler) { - ecore_idler_del(favor_d->list_idler); - favor_d->list_idler = NULL; - } - - favor_d->readed_n = 0; - count = 0; - EINA_LIST_FOREACH(favor_d->favorite_list, l, fd) { - if (N == count) break; - if (!fd) continue; - fd->item = elm_genlist_item_append(favor_d->genlist, &itc_favor, fd, - NULL, ELM_GENLIST_ITEM_NONE, favor_gl_item_sel, favor_d); - count++; - } - - if (N <= count) { - favor_d->readed_n = N; - favor_d->list_idler = ecore_idler_add(favor_append_item_part, favor_d); - } -} - -void ph_favor_update_button_status(ph_favorite_data *favor_d) -{ - p_retm_if(NULL == favor_d || NULL == favor_d->navi_btn, "Navi button is null"); - if (!favor_d->genlist || (0 == favor_d->favorite_list_count && EINA_FALSE == elm_genlist_decorate_mode_get(favor_d->genlist)) - || (0 == favor_d->checked_cnt && EINA_TRUE == elm_genlist_decorate_mode_get(favor_d->genlist))) - elm_object_item_disabled_set(favor_d->navi_btn, EINA_TRUE); - else - elm_object_item_disabled_set(favor_d->navi_btn, EINA_FALSE); -} - -static char *favor_gl_label_get(void *data, Evas_Object *obj, const char *part) -{ - char buf[PATH_MAX] = {0}; - ph_favor_info * f_info =data; - - if (0 == strcmp(part, "elm.text")) { - if (f_info->display && *f_info->display) - snprintf(buf, sizeof(buf), "%s", f_info->display); - else { - if (!f_info->number_loaded) { - f_info->number = SAFE_STRDUP(favor_get_contact_number(f_info->contact_id)); - f_info->number_loaded = true; - } - - if (!f_info->number || !*f_info->number) - return strdup(S_(PH_SYS_BODY_NONAME)); - else - snprintf(buf, sizeof(buf), "%s", f_info->number); - } - return strdup(buf); - } - else - return NULL; -} - -static Evas_Object *favor_gl_icon_get(void *data, Evas_Object *obj, const char *part) -{ - ph_favor_info * f_info = data; - ph_favorite_data *favor_d = evas_object_data_get(obj, KEY_FAVOR_DATA); - - if (0 == strcmp(part, "elm.icon")) { - Evas_Object *ic; - char buf[PATH_MAX]={0}; - if (f_info->img_path) { - snprintf(buf, sizeof(buf), "%s", f_info->img_path); - - ic = elm_icon_add(obj); - p_retvm_if(NULL == ic, NULL, "elm_icon_add is failed"); - elm_icon_prescale_set(ic, PH_FAVOR_LIST_ICON_SIZE); - elm_icon_file_set(ic, buf, NULL); - evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); - return ic; - } - else return NULL; - } - else if (0 == strcmp(part, "elm.edit.icon.1")) { - Evas_Object *check = elm_check_add(obj); - elm_check_state_pointer_set(check, &(f_info->is_checked)); - evas_object_smart_callback_add(check, "changed", ph_favor_edit_check_changed_cb, favor_d); - return check; - } - else - return NULL; -} - -static void favor_gl_move(void *data, Evas_Object *obj, void *event_info) -{ - int ori_favor_id = -1; - int front_favor_id = -1; - int back_favor_id = -1; - ph_favor_info *f_info; - Elm_Object_Item *prev_item; - Elm_Object_Item *next_item; - Elm_Object_Item *it = event_info; - - f_info = elm_object_item_data_get(it); - p_retm_if(NULL == f_info, "elm_object_item_data_get() return NULL"); - ori_favor_id = f_info->id; - - prev_item = elm_genlist_item_prev_get(it); - if (prev_item) { - f_info = elm_object_item_data_get(prev_item); - if (f_info) - front_favor_id = f_info->id; - } - - next_item = elm_genlist_item_next_get(it); - if (next_item) { - f_info = elm_object_item_data_get(next_item); - if (f_info) - back_favor_id = f_info->id; - } - - PH_DBG("ori %d front %d back %d", ori_favor_id, front_favor_id, back_favor_id); - if (-1 != ori_favor_id && -1 != front_favor_id && -1 != back_favor_id) - contacts_svc_favorite_order(ori_favor_id, front_favor_id, back_favor_id); -} - -static void favor_edit_btn_cb(void *data, Evas_Object *obj, void *event_info) -{ - ph_favorite_data *favor_d = data; - p_retm_if(NULL == favor_d, "parameter(favor_d) is NULL"); - - ph_favor_edit_mode_start(favor_d); -} - -static void favor_popup_response_cb(void *data, Evas_Object *obj, void *event_info) -{ - ph_favorite_data *favor_d = data; - evas_object_del(favor_d->popup); - favor_d->popup = NULL; -} - -static void favor_add_start_cb(void *data, void *data2) -{ - ph_favorite_data *favor_d = data; - int *contact_id = data2; - int ret; - PH_DBG("%d", *contact_id); - ret = contacts_svc_set_favorite(CTS_FAVOR_CONTACT, *contact_id); - if (ret < CTS_SUCCESS) { - favor_d->popup = phone_create_popup(favor_d->win, S_(PH_SYS_POP_ALREDY_EXISTS), 1.5); - evas_object_smart_callback_add(favor_d->popup, "timeout", favor_popup_response_cb, favor_d); - } -} - -static void favor_add_btn_cb(void *data, Evas_Object *obj, void *event_info) -{ - ph_favorite_data *favor_d = data; - favor_d->child_ug = phone_launch_contact_list_ug(favor_d->ug, CT_UG_REQUEST_SELECT_CONTACT, - favor_add_start_cb, favor_destroy_child_ug, data); -} - -static Evas_Object* favor_create_genlist(ph_favorite_data * favor_d) -{ - Evas_Object *genlist = elm_genlist_add(favor_d->box); - p_retvm_if(NULL == genlist, NULL, "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); - elm_genlist_homogeneous_set(genlist, EINA_TRUE); - - evas_object_data_set(genlist, KEY_FAVOR_DATA, favor_d); - elm_genlist_block_count_set(genlist, 10); - - if (!favor_d->ug) - evas_object_smart_callback_add(genlist, "moved", favor_gl_move, NULL); - - return genlist; -} - -static void favor_fill_layout(ph_favorite_data *favor_d) -{ - if (0 < favor_d->favorite_list_count) { - if (favor_d->select_all_checkbox) - elm_check_state_set(favor_d->select_all_checkbox, EINA_FALSE); - favor_d->checked_cnt = 0; - - if (NULL == favor_d->genlist) { - favor_d->box = elm_box_add(favor_d->layout); - evas_object_size_hint_weight_set(favor_d->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_show(favor_d->box); - elm_object_part_content_set(favor_d->layout, "elm.swallow.content", favor_d->box); - - favor_d->genlist = favor_create_genlist(favor_d); - evas_object_show(favor_d->genlist); - elm_box_pack_end(favor_d->box, favor_d->genlist); - favor_fill_genlist(favor_d); - } - else { - elm_genlist_clear(favor_d->genlist); - favor_fill_genlist(favor_d); - } - } - else { - Evas_Object *noc; - noc = phone_create_nocontents(favor_d->layout, T_(PH_GET_TEXT_BASIC, PHTEXT_NO_FAVORITES)); - elm_object_part_content_set(favor_d->layout, "elm.swallow.content", noc); - favor_d->genlist = NULL; - favor_d->box = NULL; - } -} - -static void favor_data_changed_cb(void *data) -{ - ph_favorite_data *favor_d = data; - p_retm_if(NULL == favor_d, "favor_d is null"); - - favor_load_list(favor_d); - favor_fill_layout(favor_d); - ph_favor_update_button_status(favor_d); -} - -static ph_favor_info* favor_find_info_by_contact_id (ph_favorite_data *favor_d, int contact_id) -{ - ph_favor_info *f_info; - Eina_List *l; - EINA_LIST_FOREACH(favor_d->favorite_list, l, f_info) { - if (!f_info) continue; - if (f_info->contact_id == contact_id) - return f_info; - } - return NULL; -} - -static int favor_set_updated_data(ph_favorite_data *favor_d, int ab_id) -{ - CTSiter *iter; - int contact_id; - int ret; - - ret = contacts_svc_get_updated_contacts(ab_id, favor_d->version, &iter); - if (CTS_SUCCESS != ret) { - if (CTS_ERR_DB_RECORD_NOT_FOUND == ret) - return TRUE; - ERR("contacts_svc_get_updated_contacts is failed(%d)", ret); - return FALSE; - } - - while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { - CTSvalue *value = NULL; - CTSvalue *row_info = NULL; - CTSstruct *contact = NULL; - ph_favor_info *f_info; - int type; - int ver; - - row_info = contacts_svc_iter_get_info(iter); - contact_id = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_ID_INT); - type = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_TYPE_INT); - ver = contacts_svc_value_get_int(row_info, CTS_LIST_CHANGE_VER_INT); - if (favor_d->version < ver) - favor_d->version = ver; - - switch (type) { - case CTS_OPERATION_UPDATED : - contacts_svc_get_contact(contact_id, &contact); - f_info = favor_find_info_by_contact_id(favor_d, contact_id); - if (f_info) { - ret = contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &value); - if (ret < CTS_SUCCESS) { - ERR("contacts_svc_struct_get_value is failed"); - contacts_svc_struct_free(contact); - break; - } - else { - free(f_info->display); - f_info->display = phone_get_display_name_from_value(value, CTS_NAME_VAL_DISPLAY_STR, - CTS_NAME_VAL_FIRST_STR, CTS_NAME_VAL_LAST_STR); - f_info->number_loaded = false; - free(f_info->number); - f_info->number = NULL; - free(f_info->img_path); - ret = contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &value); - if (ret < CTS_SUCCESS) { - ERR("contacts_svc_struct_get_value is failed"); - contacts_svc_struct_free(contact); - f_info->img_path = NULL; - break; - } - f_info->img_path = contacts_svc_value_steal_str(value, CTS_BASE_VAL_IMG_PATH_STR); - } - elm_genlist_item_update(f_info->item); - } - contacts_svc_struct_free(contact); - break; - case CTS_OPERATION_DELETED : - f_info = favor_find_info_by_contact_id(favor_d, contact_id); - if (!f_info) break; - favor_d->favorite_list = eina_list_remove(favor_d->favorite_list, f_info); - favor_d->favorite_list_count--; - elm_object_item_del(f_info->item); - free(f_info->display); - free(f_info->img_path); - free(f_info->number); - free(f_info); - break; - case CTS_OPERATION_INSERTED : - default : - break; - } - contacts_svc_value_free(row_info); - } - contacts_svc_iter_remove(iter); - return TRUE; -} - -static void favor_contact_data_changed_cb(void *data) -{ - PH_FN_CALL; - ph_favorite_data *favor_d = data; - CTSiter *ab_iter; - int ab_id; - int ret; - p_retm_if(NULL == favor_d, "favor_d is null"); - - ret = favor_set_updated_data(favor_d, 0); - if (!ret) { - ERR("favor_set_updated_data is failed(%d)", ret); - return; - } - - ret = contacts_svc_get_list(CTS_LIST_ALL_ADDRESSBOOK, &ab_iter); - if (CTS_SUCCESS != ret) { - ERR("contacts_svc_get_list is failed(%d)", ret); - return; - } - - while (CTS_SUCCESS == contacts_svc_iter_next(ab_iter)) { - CTSvalue *info; - info = contacts_svc_iter_get_info(ab_iter); - ab_id = contacts_svc_value_get_int(info, CTS_LIST_ADDRESSBOOK_ID_INT); - ret = favor_set_updated_data(favor_d, ab_id); - if (!ret) { - ERR("favor_set_updated_data is failed"); - contacts_svc_iter_remove(ab_iter); - return; - } - } - contacts_svc_iter_remove(ab_iter); - - if (favor_d->favorite_list_count <= 0) - favor_fill_layout(favor_d); - - ph_favor_update_button_status(favor_d); -} - -static void favor_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - ph_favorite_data *favor_d = data; - int ret; - p_retm_if(NULL == favor_d, "favor_d is null"); - - if (favor_d->p_info) { - favor_d->p_info->alive = false; - pthread_join(favor_d->p_info->thread, NULL); - ret = contacts_svc_end_trans(false); - p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); - ecore_timer_del(favor_d->p_info->timer); - free(favor_d->p_info); - } - contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_CONTACT_CHANGE, - favor_contact_data_changed_cb, favor_d); - contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_FAVORITE_CHANGE, - favor_data_changed_cb, favor_d); - - if (favor_d->favorite_list) - favor_free_data(favor_d->favorite_list); - - if (favor_d->list_idler) - ecore_idler_del(favor_d->list_idler); - - if (favor_d->popup) - evas_object_del(favor_d->popup); - - free(favor_d); -} - -static void favor_set_genlist_item_style() -{ - itc_favor.item_style = "1text.1icon.5"; - itc_favor.func.text_get = favor_gl_label_get; - itc_favor.func.content_get = favor_gl_icon_get; - itc_favor.func.state_get = NULL; - itc_favor.func.del = NULL; - itc_favor.decorate_all_item_style = "edit_default"; - - itc_favor_one.item_style = "1text.1icon.5"; - itc_favor_one.func.text_get = favor_gl_label_get; - itc_favor_one.func.content_get = favor_gl_icon_get; - itc_favor_one.func.state_get = NULL; - itc_favor_one.func.del = NULL; - itc_favor_one.decorate_all_item_style = "edit_default"; -} - -static int favor_create_layout(ph_favorite_data *favor_d, Evas_Object *parent) -{ - Evas_Object *layout; - - favor_d->navi = parent; - layout = phone_create_layout(favor_d->navi, false); - p_retvm_if(NULL == layout, -1, "phone_create_layout is failed"); - favor_d->layout = layout; - - favor_set_genlist_item_style(); - favor_load_list(favor_d); - favor_fill_layout(favor_d); - - evas_object_event_callback_add(favor_d->layout, EVAS_CALLBACK_DEL, - favor_view_delete_cb, favor_d); - - contacts_svc_subscribe_change(CTS_SUBSCRIBE_FAVORITE_CHANGE, - favor_data_changed_cb, favor_d); - contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE, - favor_contact_data_changed_cb, favor_d); - return 0; -} - -API void phone_favor_set_navi(Evas_Object *layout, int mode) -{ - PH_FN_CALL; - ph_favorite_data *favor_d = evas_object_data_get(layout, KEY_FAVOR_DATA); - Elm_Object_Item *navi_it; - Evas_Object *cbar; - Evas_Object *l_btn; - navi_it = elm_naviframe_bottom_item_get(favor_d->navi); - p_retm_if(NULL == navi_it, "navi item is NULL"); - cbar = elm_object_item_part_content_get(navi_it, "controlbar"); - if (cbar) - phone_cbar_item_clear(cbar); - else { - cbar = elm_toolbar_add(favor_d->navi); - elm_toolbar_shrink_mode_set(cbar, ELM_TOOLBAR_SHRINK_EXPAND); - elm_object_item_part_content_set(navi_it, "controlbar", cbar); - } - - if (favor_d->ug) { - l_btn = phone_naviframe_btn(favor_d->navi, S_(PH_SYS_SK_CANCEL)); - evas_object_smart_callback_add(l_btn, "clicked", ph_favor_edit_cancel_cb, favor_d); - elm_object_item_part_content_set(favor_d->navi_item, "prev_btn", l_btn); - } - else { - if (mode == PH_FAVOR_MODE_DEFAULT) { - favor_d->navi_btn = elm_toolbar_item_append(cbar, IMG_EDIT_ICON, NULL, favor_edit_btn_cb, favor_d); - phone_toolbar_disalbed_item_append(cbar, 1); - elm_toolbar_item_append(cbar, IMG_ADD_ICON, NULL, favor_add_btn_cb, favor_d); - phone_toolbar_disalbed_item_append(cbar, 1); - - l_btn = elm_button_add(favor_d->navi); - evas_object_smart_callback_add(l_btn, "clicked", phone_back_btn_clicked_cb, favor_d->win); - elm_object_style_set(l_btn, "naviframe/back_btn/default"); - elm_object_item_part_content_set(favor_d->navi_item, "prev_btn", l_btn); - } - else if (mode == PH_FAVOR_MODE_EDIT) { - favor_d->navi_btn = elm_toolbar_item_append(cbar, IMG_DELETE_ICON, NULL, ph_favor_edit_del_btn_cb, favor_d); - phone_toolbar_disalbed_item_append(cbar, 3); - l_btn = phone_naviframe_btn(favor_d->navi, S_(PH_SYS_SK_CANCEL)); - evas_object_smart_callback_add(l_btn, "clicked", ph_favor_edit_cancel_cb, favor_d); - elm_object_item_part_content_set(favor_d->navi_item, "prev_btn", l_btn); - } - ph_favor_update_button_status(favor_d); - } -} - -Evas_Object* phone_create_favorite_view(void *ug, Evas_Object *win, Evas_Object *navi) -{ - int ret; - ph_favorite_data *favor_d = calloc(1, sizeof(ph_favorite_data)); - p_retvm_if(NULL == favor_d, NULL, "Fail to calloc ph_favorite_data"); - favor_d->ug = ug; - favor_d->win = win; - favor_d->navi_item = elm_naviframe_bottom_item_get(navi); - ret = favor_create_layout(favor_d, navi); - if (ret < 0) { - free(favor_d); - return NULL; - } - - evas_object_data_set(favor_d->layout, KEY_FAVOR_DATA, favor_d); - return favor_d->layout; -} - -void phone_favor_view_reset(Evas_Object *base) -{ - PH_FN_CALL; - ph_favorite_data *favor_d; - Elm_Object_Item *item; - - favor_d = evas_object_data_get(base, KEY_FAVOR_DATA); - p_retm_if(NULL == favor_d, "favor_d is null"); - - if (favor_d->child_ug) { - ug_destroy(favor_d->child_ug); - favor_d->child_ug = NULL; - } - - item = elm_naviframe_bottom_item_get(favor_d->navi); - if (elm_naviframe_top_item_get(favor_d->navi) != item) - elm_naviframe_item_pop_to(item); - else if (favor_d->genlist && elm_genlist_decorate_mode_get(favor_d->genlist)) - ph_favor_edit_mode_end(favor_d, false); - favor_d->navi_btn = NULL; -} diff --git a/lib/phoneui/ph-front-view.c b/lib/phoneui/ph-front-view.c deleted file mode 100755 index 2babe0b..0000000 --- a/lib/phoneui/ph-front-view.c +++ /dev/null @@ -1,382 +0,0 @@ -/* - * 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 <bundle.h> -#include <vconf.h> -#include <aul.h> -#include <appsvc.h> - -#include "phone.h" -#include "phone-ui.h" -#include "phone-log.h" -#include "phone-dialer.h" -#include "ph-front-view.h" - -// for removing build warning //////////////////////////////////// -void ctui_change_background(void *data, bool is_background); -void ctui_list_view_reset(void *clist_d); -Evas_Object* ctui_create_phone_list_view(void *ug, Evas_Object *win, Evas_Object *navi); -void ct_list_navi_set(int mode, void *clist_d); -//////////////////////////////////////////////////////// - -static void front_view_reset_current_sub_view(ph_phoneui_data *phoneui_d) -{ - PH_FN_CALL; - p_ret_if(phoneui_d->select_tab <= PH_VIEW_NONE || PH_VIEW_MAX <= phoneui_d->select_tab); - if (phoneui_d->sub_view[phoneui_d->select_tab]) { - switch (phoneui_d->select_tab) { - case PH_VIEW_DIALER: - phone_dialer_view_reset(phoneui_d->sub_view[PH_VIEW_DIALER]); - break; - case PH_VIEW_CONTACT : - ctui_list_view_reset(evas_object_data_get(phoneui_d->navi, "clist_d")); - break; - case PH_VIEW_LOG : - phone_log_view_reset(phoneui_d->navi); - break; - case PH_VIEW_FAVORITE : - phone_favor_view_reset(phoneui_d->sub_view[PH_VIEW_FAVORITE]); - break; - } - } -} - -static void front_view_load_sub_view(ph_phoneui_data *phoneui_d, int tab_index) -{ - PH_FN_CALL; - switch (tab_index) { - case PH_VIEW_CONTACT: - phoneui_d->sub_view[PH_VIEW_CONTACT] = ctui_create_phone_list_view(phoneui_d->ug, - phoneui_d->win, phoneui_d->navi); - return; - case PH_VIEW_DIALER: - phoneui_d->sub_view[tab_index] = phone_create_dialer_view(phoneui_d->ug, - phoneui_d->win, phoneui_d->navi); - break; - case PH_VIEW_LOG: - phoneui_d->sub_view[tab_index] = phone_create_log_view(phoneui_d->ug, - phoneui_d->win, phoneui_d->navi); - break; - case PH_VIEW_FAVORITE: - phoneui_d->sub_view[tab_index] = phone_create_favorite_view(phoneui_d->ug, - phoneui_d->win, phoneui_d->navi); - break; - default: - return; - }; -} - -static void front_view_show_sub_view(ph_phoneui_data *phoneui_d, int tab_index) -{ - PH_FN_CALL; - Evas_Object *view; - p_retm_if(tab_index <= PH_VIEW_NONE || PH_VIEW_MAX <= tab_index, "tab index is invalid"); - p_retm_if(phoneui_d->select_tab == tab_index, "The tab is already shown"); - - front_view_reset_current_sub_view(phoneui_d); - phone_hide_notify(phoneui_d->navi); - - switch (tab_index) { - case PH_VIEW_DIALER: - if (NULL == phoneui_d->sub_view[tab_index]) - phoneui_d->sub_view[tab_index] = phone_create_dialer_view(phoneui_d->ug, - phoneui_d->win, phoneui_d->navi); - phone_dialer_set_navi(phoneui_d->sub_view[PH_VIEW_DIALER]); - phone_dialer_check_focus(phoneui_d->sub_view[PH_VIEW_DIALER]); - if(!phoneui_d->ug) - phone_front_view_show_call_app(phoneui_d); - break; - case PH_VIEW_CONTACT: - if (NULL == phoneui_d->sub_view[tab_index]) { - phoneui_d->sub_view[PH_VIEW_CONTACT] = ctui_create_phone_list_view(phoneui_d->ug, - phoneui_d->win, phoneui_d->navi); - } - ct_list_navi_set(0, evas_object_data_get(phoneui_d->navi, "clist_d")); - break; - case PH_VIEW_LOG: - if (NULL == phoneui_d->sub_view[tab_index]) - phoneui_d->sub_view[tab_index] = phone_create_log_view(phoneui_d->ug, - phoneui_d->win, phoneui_d->navi); - if (!phoneui_d->ug) - phone_log_missed_info_update(phoneui_d->navi); - phone_log_set_navi(phoneui_d->navi); - break; - case PH_VIEW_FAVORITE: - if (NULL == phoneui_d->sub_view[tab_index]) - phoneui_d->sub_view[tab_index] = phone_create_favorite_view(phoneui_d->ug, - phoneui_d->win, phoneui_d->navi); - phone_favor_set_navi(phoneui_d->sub_view[tab_index], PH_FAVOR_MODE_DEFAULT); - break; - default: - return; - } - phoneui_d->select_tab = tab_index; - view = elm_object_part_content_get(phoneui_d->layout, "elm.swallow.content"); - if (view) { - elm_object_part_content_unset(phoneui_d->layout, "elm.swallow.content"); - evas_object_hide(view); - } - elm_object_part_content_set(phoneui_d->layout, "elm.swallow.content", phoneui_d->sub_view[tab_index]); - evas_object_show(phoneui_d->sub_view[tab_index]); -} - -static Eina_Bool front_view_load_all_sub_view(void *data) -{ - PH_FN_CALL; - ph_phoneui_data *phoneui_d = data; - int i; - - for (i=PH_VIEW_DIALER;i<PH_VIEW_MAX;i++) { - if (NULL == phoneui_d->sub_view[i]) { - front_view_load_sub_view(phoneui_d, i); - return ECORE_CALLBACK_RENEW; - } - } - phoneui_d->idler = NULL; - return ECORE_CALLBACK_CANCEL; -} - -API Eina_Bool phone_front_view_load_timer(void *data) -{ - ph_phoneui_data *phoneui_d = data; - phoneui_d->idler = ecore_idler_add(front_view_load_all_sub_view, phoneui_d); - phoneui_d->timer = NULL; - return ECORE_CALLBACK_CANCEL; -} - -static void front_view_change_cb(void *data, Evas_Object *obj, void *event_info) -{ - PH_FN_CALL; - int i; - Elm_Object_Item *selected_it; - ph_phoneui_data *phoneui_d = data; - - selected_it = elm_toolbar_selected_item_get(obj); - - for (i=PH_VIEW_DIALER;i<PH_VIEW_MAX;i++) { - if (phoneui_d->item[i]) - if (selected_it == phoneui_d->item[i]) break; - } - PH_DBG("cur sel : %d, sel index : %d", phoneui_d->select_tab, i); - front_view_show_sub_view(phoneui_d, i); -} - -static void front_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - PH_FN_CALL; - ph_phoneui_data *phoneui_d = data; - int i; - - p_retm_if(NULL == phoneui_d, "phoneui_d is null"); - - if (PH_VIEW_NONE != phoneui_d->select_tab) { - int ret = vconf_set_int(PH_START_VIEW, phoneui_d->select_tab); - p_warn_if(0 != ret, "vconf_set_int() Failed(%d)", ret); - } - - if (phoneui_d->contact_ug) { - ug_destroy(phoneui_d->contact_ug); - phoneui_d->sub_view[PH_VIEW_CONTACT] = NULL; - } - - for (i=0;i<PH_VIEW_MAX;i++) { - if (phoneui_d->sub_view[i]) { - evas_object_del(phoneui_d->sub_view[i]); - } - } - - if (phoneui_d->idler) - ecore_idler_del(phoneui_d->idler); - - if (phoneui_d->timer) - ecore_timer_del(phoneui_d->timer); - - free(phoneui_d); - PH_FN_END; -} - -Evas_Object* ph_front_create_toolbar(ph_phoneui_data *phoneui_d) -{ - Evas_Object *base; - Evas_Object *layout; - Evas_Object *naviframe; - Evas_Object *toolbar; - Elm_Object_Item *navi_it; - - base = elm_layout_add(phoneui_d->win); - p_retvm_if(NULL == base, NULL, "elm_layout_add() Failed"); - evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_layout_theme_set(base, "layout", "application", "default"); - elm_win_resize_object_add(phoneui_d->win, base); - evas_object_show(base); - - naviframe = elm_naviframe_add(base); - elm_naviframe_prev_btn_auto_pushed_set(naviframe, EINA_FALSE); - elm_object_part_content_set(base, "elm.swallow.content", naviframe); - phoneui_d->navi = naviframe; - - layout = elm_layout_add(naviframe); - p_retvm_if(NULL == layout, NULL, "elm_layout_add() Failed"); - elm_layout_theme_set(layout, "layout", "tabbar", "default"); - phoneui_d->layout = layout; - - toolbar = elm_toolbar_add(naviframe); - p_retvm_if(NULL == toolbar, NULL, "elm_toolbar_add() Failed"); - elm_object_style_set(toolbar, "tabbar"); - elm_object_part_content_set(layout, "elm.swallow.tabbar", toolbar); - phoneui_d->tabbar = toolbar; - - elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND); - - phoneui_d->item[PH_VIEW_DIALER] = elm_toolbar_item_append(toolbar, - IMG_DIALER_ICON, T_(PH_GET_TEXT_BASIC, PHTEXT_DIALER), front_view_change_cb, phoneui_d); - phoneui_d->item[PH_VIEW_CONTACT] = elm_toolbar_item_append(toolbar, - IMG_CONTACTS_ICON, S_(PH_SYS_BODY_CONTACTS), front_view_change_cb, phoneui_d); - phoneui_d->item[PH_VIEW_LOG] = elm_toolbar_item_append(toolbar, - IMG_LOGS_ICON, T_(PH_GET_TEXT_BASIC, PHTEXT_LOGS), front_view_change_cb, phoneui_d); - phoneui_d->item[PH_VIEW_FAVORITE] = elm_toolbar_item_append(toolbar, - IMG_FAVORITE_ICON, T_(PH_GET_TEXT_BASIC, PHTEXT_FAVORITES), front_view_change_cb, phoneui_d); - - navi_it = elm_naviframe_item_push(naviframe, NULL, NULL, NULL, layout, NULL); - elm_naviframe_item_title_visible_set(navi_it, EINA_FALSE); - evas_object_event_callback_add(phoneui_d->layout, EVAS_CALLBACK_DEL, - front_view_delete_cb, phoneui_d); - - elm_toolbar_select_mode_set(toolbar, ELM_OBJECT_SELECT_MODE_ALWAYS); - PH_FN_END; - return base; -} - -API void phone_front_view_region_changed(ph_phoneui_data *phoneui_d) -{ - if (phoneui_d && phoneui_d->sub_view[PH_VIEW_LOG]) - phone_log_views_update(phoneui_d->navi); -} - -API void phone_front_view_pause(ph_phoneui_data *phoneui_d) -{ - if (phoneui_d && phoneui_d->sub_view[PH_VIEW_LOG]) - phone_log_set_background(phoneui_d->navi, true); - if (phoneui_d && phoneui_d->sub_view[PH_VIEW_CONTACT]) - ctui_change_background(phoneui_d->navi, true); -} - -API void phone_front_view_resume(ph_phoneui_data *phoneui_d) -{ - if (phoneui_d && phoneui_d->sub_view[PH_VIEW_LOG]) { - phone_log_set_background(phoneui_d->navi, false); - if (PH_VIEW_LOG == phoneui_d->select_tab) - phone_log_missed_info_update(phoneui_d->navi); - } - if(phoneui_d && phoneui_d->sub_view[PH_VIEW_CONTACT]) - ctui_change_background(phoneui_d->navi, false); - if (phoneui_d && phoneui_d->sub_view[PH_VIEW_DIALER]) { - if (PH_VIEW_DIALER == phoneui_d->select_tab) - phone_dialer_view_resume(phoneui_d->sub_view[PH_VIEW_DIALER]); - } -} - -API void phone_front_view_reset(ph_phoneui_data *phoneui_d, int tab_index, char *val) -{ - PH_FN_CALL; - int call_launched = FALSE; - Evas_Object *view; - - front_view_reset_current_sub_view(phoneui_d); - if (phoneui_d->sub_view[PH_VIEW_LOG]) - phone_log_set_background(phoneui_d->navi, false); - if (phoneui_d->sub_view[PH_VIEW_CONTACT]) - ctui_change_background(phoneui_d->navi, false); - - if(PH_VIEW_NONE != tab_index) { - switch (tab_index) { - case PH_VIEW_DIALER: - if (NULL == phoneui_d->sub_view[tab_index]) - phoneui_d->sub_view[tab_index] = phone_create_dialer_view(phoneui_d->ug, phoneui_d->win, phoneui_d->navi); - if (val) - phone_dialer_view_set_num(phoneui_d->sub_view[PH_VIEW_DIALER], val+4); - else - phone_dialer_view_resume(phoneui_d->sub_view[PH_VIEW_DIALER]); - - phone_dialer_set_navi(phoneui_d->sub_view[PH_VIEW_DIALER]); - phone_dialer_check_focus(phoneui_d->sub_view[PH_VIEW_DIALER]); - - if(!phoneui_d->ug) - call_launched = phone_front_view_show_call_app(phoneui_d); - break; - case PH_VIEW_LOG: - if (NULL == phoneui_d->sub_view[tab_index]) - phoneui_d->sub_view[tab_index] = phone_create_log_view(phoneui_d->ug, phoneui_d->win, phoneui_d->navi); - if (!phoneui_d->ug) - phone_log_missed_info_update(phoneui_d->navi); - phone_log_set_navi(phoneui_d->navi); - break; - case PH_VIEW_FAVORITE: - if (NULL == phoneui_d->sub_view[tab_index]) - phoneui_d->sub_view[tab_index] = phone_create_favorite_view(phoneui_d->ug, phoneui_d->win, phoneui_d->navi); - phone_favor_set_navi(phoneui_d->sub_view[tab_index], PH_FAVOR_MODE_DEFAULT); - break; - default: - break; - } - - view = elm_object_part_content_get(phoneui_d->layout, "elm.swallow.content"); - if (view) { - elm_object_part_content_unset(phoneui_d->layout, "elm.swallow.content"); - evas_object_hide(view); - } - elm_object_part_content_set(phoneui_d->layout, "elm.swallow.content", phoneui_d->sub_view[tab_index]); - evas_object_show(phoneui_d->sub_view[tab_index]); - phoneui_d->select_tab = tab_index; - elm_toolbar_item_selected_set(phoneui_d->item[tab_index], EINA_TRUE); - if (!phoneui_d->ug) - vconf_set_int(PH_START_VIEW, tab_index); - } - - if (phoneui_d->win && FALSE == call_launched) - elm_win_activate(phoneui_d->win); - phoneui_d->timer = ecore_timer_add(3.0, phone_front_view_load_timer, phoneui_d); -} - -static int front_view_call_app_check(const char *pkg_name, void *data) -{ - int *call_app_launched = data; - - // premise : Only one Call app can be running at a time - if (1 == aul_app_is_running(pkg_name)) { - aul_open_app(pkg_name); - *call_app_launched = TRUE; - return 0; - } - return 1; -} - -API int phone_front_view_show_call_app(ph_phoneui_data *phoneui_d) -{ - PH_FN_CALL; - bundle * bd; - int call_app_launched = FALSE; - bd = bundle_create(); - appsvc_set_operation(bd, APPSVC_OPERATION_CALL); - appsvc_set_uri(bd, "tel:"); - appsvc_get_list(bd, front_view_call_app_check, (void *)&call_app_launched); - - if (call_app_launched) - return 1; - return 0; -} - diff --git a/lib/settings/CMakeLists.txt b/lib/settings/CMakeLists.txt new file mode 100755 index 0000000..dc4ff9d --- /dev/null +++ b/lib/settings/CMakeLists.txt @@ -0,0 +1,13 @@ +LINK_DIRECTORIES(${CMAKE_BINARY_DIR}) + +SET(TARGET ${CT_SETTING}) + +FILE(GLOB SRCS *.c) + +ADD_LIBRARY(${TARGET} SHARED ${SRCS}) +SET_TARGET_PROPERTIES(${TARGET} PROPERTIES COMPILE_FLAGS ${EXTRA_CFLAGS}) +TARGET_LINK_LIBRARIES(${TARGET} ${COMMON_LIB} ${ug_pkgs_LDFLAGS} ${CT_LIST}) +ADD_DEPENDENCIES(${TARGET} contacts_edj_build) +INSTALL(TARGETS ${TARGET} DESTINATION ${UGLIBDIR}) + +INSTALL(FILES ${CMAKE_BINARY_DIR}/lib/settings/contacts-settings-efl.xml DESTINATION "/usr/share/packages") diff --git a/lib/settings/contacts-settings-efl.xml b/lib/settings/contacts-settings-efl.xml new file mode 100644 index 0000000..49772e6 --- /dev/null +++ b/lib/settings/contacts-settings-efl.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns="http://tizen.org/ns/packages" package="contacts-settings-efl" version="0.1.0-0" install-location="internal-only"> + <label>contacts-settings-efl</label> + <author email="ensung.park@samsung.com" href="www.samsung.com">ensung park</author> + <description>contacts-settings-efl Application</description> + <ui-application appid="contacts-settings-efl" exec="/opt/ug/bin/contacts-settings-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/settings/ct-setting-main.c b/lib/settings/ct-setting-main.c new file mode 100755 index 0000000..dc35cb4 --- /dev/null +++ b/lib/settings/ct-setting-main.c @@ -0,0 +1,156 @@ +/* + * 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 "phone-common.h" +#include "ct-setting-view.h" + +static int create_setting_view(Evas_Object *parent, ct_setting_data *csetting_d) +{ + Evas_Object *l_btn; + Evas_Object *content; + Elm_Object_Item *navi_item; + + p_retvm_if(NULL == parent, FALSE, "parameter(parent) is NULL"); + + csetting_d->navi = elm_naviframe_add(parent); + evas_object_show(csetting_d->navi); + p_retvm_if(NULL == csetting_d->navi, FALSE, "navi is NULL"); + + content = ct_setting_create_layout(csetting_d); + navi_item = elm_naviframe_item_push(csetting_d->navi, S_(PH_SYS_BODY_CONTACTS), NULL, NULL, content, NULL); + csetting_d->navi_item_main = navi_item; + + l_btn = elm_button_add(csetting_d->navi); + p_retvm_if(NULL == l_btn, -1, "elm_button_add() return NULL"); + + elm_object_item_part_content_set(navi_item, "prev_btn", l_btn); + elm_object_style_set(l_btn, "naviframe/back_btn/default"); + evas_object_smart_callback_add(l_btn, "clicked", phone_ug_destroy_me_cb, csetting_d->ug); + + return TRUE; +} + +static void* settings_on_create(ui_gadget_h ug, enum ug_mode mode, + service_h service, void *priv) +{ + int ret; + Evas_Object *bg; + Evas_Object *parent; + Evas_Object *base; + ct_setting_data *csetting_d = priv; + + p_retvm_if(NULL == ug || NULL == priv, NULL, + "The parameter is invalid(ug=%p, priv=%p)", ug, priv); + + parent = ug_get_parent_layout(ug); + p_retvm_if(NULL == parent, NULL, "ug_get_parent_layout() return NULL"); + csetting_d->ug = ug; + + bindtextdomain(PACKAGE, "/usr/ug/res/locale"); + + 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 { + ret = contacts_svc_disconnect(); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_disconnect() Failed(%d)", ret); + return NULL; + } + + 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_setting_view(base, csetting_d )) + elm_object_part_content_set(base, "elm.swallow.content", csetting_d->navi); + else { + evas_object_del(base); + base = NULL; + ret = contacts_svc_disconnect(); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_disconnect() Failed(%d)", ret); + } + + return base; +} + +static void settings_on_key_event(ui_gadget_h ug, enum ug_key_event event, service_h service, void *priv) +{ + if (!ug) + return; + + switch (event) { + case UG_KEY_EVENT_END: + ug_destroy_me(ug); + break; + default: + break; + } +} + +static void settings_on_destroy(ui_gadget_h ug, service_h service, void *priv) +{ + int ret; + p_retm_if(NULL == ug, "The ug is NULL(ug = %p)", ug); + evas_object_del(ug_get_layout(ug)); + + ret = contacts_svc_disconnect(); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_disconnect() Failed(%d)", ret); +} + +API int UG_MODULE_INIT(struct ug_module_ops *ops) +{ + ct_setting_data *csetting_d; + + p_retvm_if(!ops, -1, "ops is NULL"); + + csetting_d = calloc(1, sizeof(ct_setting_data)); + p_retvm_if(NULL == csetting_d , -1, "calloc() return NULL"); + + ops->create = settings_on_create; + ops->start = NULL; + ops->pause = NULL; + ops->resume = NULL; + ops->destroy = settings_on_destroy; + ops->message = NULL; + ops->event = NULL; + ops->key_event = settings_on_key_event; + ops->priv = csetting_d ; + ops->opt = UG_OPT_INDICATOR_PORTRAIT_ONLY; + + return 0; +} + +API void UG_MODULE_EXIT(struct ug_module_ops *ops) +{ + if (!ops) + return; + + ops->priv = NULL; +} + +API int setting_plugin_reset(service_h service, void *priv) +{ + return 0; +} diff --git a/lib/settings/ct-setting-view.c b/lib/settings/ct-setting-view.c new file mode 100755 index 0000000..e90a737 --- /dev/null +++ b/lib/settings/ct-setting-view.c @@ -0,0 +1,1140 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <errno.h> +#include <fcntl.h> +#include <vconf.h> +#include <vconf-keys.h> +#include <unistd.h> +#include <pthread.h> +#include "phone.h" +#include "phone-common.h" +#include "ct-list.h" +#include "ct-setting-view.h" + +#define SETTING_VCARD_PATH "/opt/media/Backup/Contacts" +#define SETTING_TIMER_DURATION 0.2 + +enum SETTING_ITC_TYPE{ + SETTING_ITC_MY_NUM = 0, + SETTING_ITC_TEXT = 1, + SETTING_ITC_IMPORT = SETTING_ITC_TEXT, + SETTING_ITC_EXPORT = SETTING_ITC_TEXT, + SETTING_ITC_IMPORT_EXPORT = SETTING_ITC_TEXT, + SETTING_ITC_ORDER = 2, + SETTING_ITC_RADIO = 3, + SETTING_ITC_FIRSTLAST = SETTING_ITC_RADIO, + SETTING_ITC_LASTFIRST = SETTING_ITC_RADIO, + SETTING_ITC_SDN, + SETTING_ITC_MAX, +}; + +static Elm_Genlist_Item_Class setting_itcs[] = { + {.item_style="dialogue/2text.2"}, + {.item_style="dialogue.1text"}, + {.item_style="dialogue/2text.3/expandable"}, + {.item_style="dialogue/1text.1icon/expandable2"}, + {.item_style="dialogue/2text.2"}, +}; + +typedef enum { + CT_SETTING_IMPORT, + CT_SETTING_EXPORT, +} ct_setting_op; + +static void setting_order(int order_type) +{ + int ret; + + /* set ORDER_OF_DISPLAY */ + ret = contacts_svc_set_order(CTS_ORDER_OF_DISPLAY, order_type); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_set_order() Failed(%d)", ret); + + ret = contacts_svc_set_order(CTS_ORDER_OF_SORTING, order_type); + p_warn_if(CTS_SUCCESS != ret, "contacts_svc_set_order() Failed(%d)", ret); +} + +static void setting_order_ui(Evas_Object *genlist) +{ + int order; + ct_setting_data *csetting_d; + Elm_Object_Item *item_order; + + p_retm_if(NULL == genlist, "parameter(genlist) is NULL"); + + csetting_d = evas_object_data_get(genlist, "csetting_d"); + p_retm_if(NULL == csetting_d, "evas_object_data_get() return NULL"); + + order = contacts_svc_get_order(CTS_ORDER_OF_DISPLAY); + elm_radio_value_set(csetting_d->radio_grp, order); + + item_order = evas_object_data_get(genlist, "order"); + p_retm_if(NULL == item_order, "evas_object_data_get() return NULL"); + + elm_genlist_item_update(item_order); +} + +static void setting_handle_order(void *data, Evas_Object *obj, void *event_info) +{ + Elm_Object_Item *it = event_info; + elm_genlist_item_selected_set(it, EINA_FALSE); + + setting_order((int)data); + setting_order_ui(obj); +} + +static PTHREAD_FN setting_import_sim_contacts(void *data) +{ + ct_setting_data *csetting_d = data; + ph_progress_info *p_info = csetting_d->p_info; + p_info->result = contacts_svc_import_sim(); + p_info->completed = true; + pthread_exit(NULL); +} + +static Eina_Bool setting_import_sim_timer_cb(void *data) +{ + const char *message; + ct_setting_data *csetting_d = data; + ph_progress_info *p_info; + + p_retvm_if(NULL == csetting_d , ECORE_CALLBACK_CANCEL, "parameter(ct_setting_data) is NULL"); + p_info = csetting_d->p_info; + + if (!p_info->completed) + return ECORE_CALLBACK_RENEW; + + pthread_join(p_info->thread, NULL); + + if (CTS_SUCCESS == p_info->result) + message = T_(CT_GET_TEXT_BASIC, CTTEXT_IMPORTED); + else if (CTS_ERR_NO_DATA == p_info->result) + message = T_(CT_GET_TEXT_ERR, CTTEXT_IMPORT_SIM_NO_DATA); + else + message = S_(PH_SYS_POP_FAILED); + + evas_object_del(csetting_d->popup); + csetting_d->popup = NULL; + + free(p_info); + csetting_d->p_info = NULL; + + phone_show_tickernoti(message); + return ECORE_CALLBACK_CANCEL; +} + +static void setting_import_sim(ct_setting_data *csetting_d) +{ + int ret; + ph_progress_info *p_info; + + p_retm_if(csetting_d->p_info, "thread is running"); + + p_info = calloc(1, sizeof(ph_progress_info)); + p_retm_if(NULL == p_info, "calloc() return NULL"); + csetting_d->p_info = p_info; + p_info->alive = true; + p_info->result = TRUE; + p_info->without_cancel_btn = true; + ret = pthread_create(&p_info->thread, NULL, setting_import_sim_contacts, csetting_d ); + if (0 != ret) { + ERR("Thread creation failed(%d)", ret); + free(p_info); + csetting_d->p_info = NULL; + return; + } + + p_info->timer = ecore_timer_add(SETTING_TIMER_DURATION, setting_import_sim_timer_cb, csetting_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); + csetting_d->p_info = NULL; + return; + } + csetting_d->popup = phone_progressbar_popup(csetting_d->navi, p_info, T_(CT_GET_TEXT_BASIC, CTTEXT_IMPORTING_SIM_CONTACTS)); +} + +static inline Eina_List* setting_get_contact_list(Eina_List *list_ab) +{ + int ret; + CTSiter *iter; + Eina_List *result; + Eina_List *l; + int id_ab; + void *data; + + result = NULL; + EINA_LIST_FOREACH(list_ab, l, data) { + id_ab = (int)data; + ret = contacts_svc_get_list_with_int(CTS_LIST_MEMBERS_OF_ADDRESSBOOK_ID, id_ab, &iter); + p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_get_list...() Failed(%d)", ret); + + while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { + CTSvalue *info = contacts_svc_iter_get_info(iter); + int id = contacts_svc_value_get_int(info, CTS_LIST_CONTACT_ID_INT); + result = eina_list_append(result, (void *)id); + contacts_svc_value_free(info); + } + contacts_svc_iter_remove(iter); + } + return result; +} + +static inline void setting_progress_fail(ph_progress_info *p_info) +{ + p_info->completed = true; + p_info->result = FALSE; + pthread_exit(NULL); +} + +static Eina_Bool setting_export_timer_cb(void *data) +{ + ct_setting_data *csetting_d = data; + ph_progress_info *p_info; + + p_retvm_if(NULL == csetting_d, ECORE_CALLBACK_CANCEL, "parameter(ct_setting_data) is NULL"); + p_info = csetting_d->p_info; + + if (!p_info->completed) { + char count[PH_TEXT_SHORT_LEN]; + char percent[PH_TEXT_SHORT_LEN]; + double value = (double)p_info->cnt/(double)p_info->cnt_checked_total; + + if (!p_info->alive) { + p_info->result = FALSE; + p_info->completed = true; + return ECORE_CALLBACK_RENEW; + } + + elm_progressbar_value_set(p_info->progressbar, value); + snprintf(percent, sizeof(percent), "%d%%", (int)(100.0*value)); + 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->result) { + message = T_(CT_GET_TEXT_BASIC, CTTEXT_EXPORTED); + ret = contacts_svc_end_trans(true); + } + else { + message = S_(PH_SYS_POP_FAILED); + ret = contacts_svc_end_trans(false); + } + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); + + free(p_info); + csetting_d->p_info = NULL; + + if (csetting_d->list_export_ct) { + free(csetting_d->list_export_ct); + csetting_d->list_export_ct = NULL; + } + + evas_object_del(csetting_d->popup); + csetting_d->popup = NULL; + phone_show_tickernoti(message); + elm_naviframe_item_pop_to(csetting_d->navi_item_main); + return ECORE_CALLBACK_CANCEL; + } +} + +static Eina_Bool setting_import_timer_cb(void *data) +{ + ct_setting_data *csetting_d = data; + ph_progress_info *p_info; + + p_retvm_if(NULL == csetting_d, ECORE_CALLBACK_CANCEL, "parameter(ct_setting_data) is NULL"); + p_info = csetting_d->p_info; + + if (!p_info->completed) { + return ECORE_CALLBACK_RENEW; + } + else { + int ret; + const char *message; + + pthread_join(p_info->thread, NULL); + + if (p_info->result) { + message = T_(CT_GET_TEXT_BASIC, CTTEXT_IMPORTED); + ret = contacts_svc_end_trans(true); + } + else { + message = S_(PH_SYS_POP_FAILED); + ret = contacts_svc_end_trans(false); + } + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); + + evas_object_del(csetting_d->popup); + csetting_d->popup = NULL; + phone_show_tickernoti(message); + + free(p_info); + csetting_d->p_info = NULL; + + elm_naviframe_item_pop_to(csetting_d->navi_item_main); + return ECORE_CALLBACK_CANCEL; + } +} + + +static PTHREAD_FN setting_export_contacts(void *data) +{ + int i; + int ret; + int fd; + ct_setting_data *csetting_d = data; + ph_progress_info *p_info = csetting_d->p_info; + + fd = open(csetting_d->path, O_WRONLY|O_CREAT|O_TRUNC, 0644); + if (fd < 0) { + ERR("open(%s) Failed", csetting_d->path); + setting_progress_fail(p_info); + } + + for (i=0;i<csetting_d->list_export_ct_cnt;i++) { + char* vcard; + CTSstruct *contact; + + if (!p_info->alive) { + p_info->result = FALSE; + p_info->completed = true; + break; + } + + ret = contacts_svc_get_contact(csetting_d->list_export_ct[i], &contact); + if (ret < CTS_SUCCESS) { + ERR("contacts_svc_get_contact() Failed(%d)", ret); + p_info->result = FALSE; + continue; + } + + ret = contacts_svc_get_vcard_from_contact(contact, &vcard); + contacts_svc_struct_free(contact); + if (ret < CTS_SUCCESS) { + ERR("contacts_svc_struct_free() Failed(%d)", ret); + p_info->result = FALSE; + continue; + } + + if (-1 == write(fd, vcard, strlen(vcard))) + ERR("write()... Failed(%s)", strerror(errno)); + p_info->cnt++; + free(vcard); + } + + ret = fsync(fd); + if (0 != ret) + ERR("fsync() failed(%d)", ret); + + close(fd); + if (!p_info->result) { + ret = unlink(csetting_d->path); + if (0 != ret) + ERR("unlink(%s) failed(%d)", csetting_d->path, ret); + } + + pthread_exit(NULL); +} + +static void setting_get_filename(char *fullpath, char *dest, int size_dest) +{ + char* index; + index = strrchr(fullpath, '/'); + snprintf(dest, size_dest, "%s", index + 1); +} + +static inline char* setting_export_get_filename(char *path) +{ + time_t timer; + struct tm *stime; + char buf[PH_TEXT_SHORT_LEN]; + + timer = time(NULL); + stime = localtime(&timer); + p_retvm_if(NULL == stime, NULL, "localtime() Failed(%d)", errno); + + snprintf(buf, sizeof(buf), "%s/contacts_%02d%02d%02d%02d%02d%02d.vcf", path, + stime->tm_year-100, stime->tm_mon+1, stime->tm_mday, + stime->tm_hour, stime->tm_min, stime->tm_sec); + + return strdup(buf); +} + +static void setting_export_myfile_ug_result(ui_gadget_h ug, service_h service, void *data) +{ + int ret; + char *val = NULL; + char title[PH_TEXT_MAX_LEN]; + char filepath[PH_TEXT_SHORT_LEN]; + ph_progress_info *p_info; + ct_setting_data *csetting_d = data; + + p_retm_if(csetting_d->p_info, "thread is running"); + p_retm_if(NULL == ug, "parameter(ug) is NULL"); + ug_destroy(ug); + + p_retm_if(NULL == data, "parameter(ct_setting_data) is NULL"); + csetting_d->child_ug = NULL; + + p_retm_if(NULL == service, "parameter(service) is NULL"); + + service_get_extra_data(service, "result", &val); + p_retm_if(NULL == val, "service_get_extra_data() return NULL"); + + p_info = calloc(1, sizeof(ph_progress_info)); + p_retm_if(NULL == p_info, "calloc() return NULL"); + csetting_d->p_info = p_info; + + p_info->cnt_checked_total = csetting_d->list_export_ct_cnt; + if (p_info->cnt_checked_total <= 0) { + char err[PH_TEXT_SHORT_LEN]; + ERR("cnt_checked_total is %d", p_info->cnt_checked_total); + free(p_info); + free(csetting_d->list_export_ct); + csetting_d->p_info = NULL; + csetting_d->list_export_ct = NULL; + snprintf(err, sizeof(err), "Fail (%s)", T_(CT_GET_TEXT_ERR, CTTEXT_NO_CONTACTS)); + phone_show_tickernoti(err); + return; + } + free(csetting_d->path); + csetting_d->path = setting_export_get_filename((char *)val); + free(val); + + p_info->alive = true; + p_info->result = TRUE; + setting_get_filename(csetting_d->path, filepath, sizeof(filepath)); + snprintf(title, sizeof(title), T_(CT_GET_TEXT_BASIC, CTTEXT_EXPORTING_CONTACTS_TO), filepath); + + ret = pthread_create(&p_info->thread, NULL, setting_export_contacts, csetting_d ); + if (0 != ret) { + ERR("Thread creation failed(%d)", ret); + free(p_info); + free(csetting_d->list_export_ct); + csetting_d->p_info = NULL; + csetting_d->list_export_ct = NULL; + return; + } + + p_info->timer = ecore_timer_add(SETTING_TIMER_DURATION, setting_export_timer_cb, csetting_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); + free(csetting_d->list_export_ct); + csetting_d->p_info = NULL; + csetting_d->list_export_ct = NULL; + return; + } + + csetting_d->popup = phone_progressbar_popup(csetting_d->navi, p_info, title); +} + +static void setting_ug_destroy_cb(ui_gadget_h ug, void *priv) +{ + ct_setting_data *csetting_d = priv; + p_retm_if(NULL == ug, "parameter(ug) is NULL"); + ug_destroy(ug); + + p_retm_if(NULL == priv, "parameter(ct_setting_data) is NULL"); + csetting_d->child_ug = NULL; +} + +static void setting_export_contacts_myfile_ug(void *data) +{ + service_h service; + ui_gadget_h ug; + struct ug_cbs cbs = {0}; + ct_setting_data *csetting_d = data; + p_retm_if(NULL == csetting_d, "parameter(csetting_d) is NULL"); + + service_create(&service); + service_add_extra_data(service, "path", SETTING_VCARD_PATH); + service_add_extra_data(service, "select_type", "EXPORT"); + + cbs.result_cb = setting_export_myfile_ug_result; + cbs.layout_cb = ug_common_layout_cb; + cbs.destroy_cb = setting_ug_destroy_cb; + cbs.priv = csetting_d; + + ug = ug_create(csetting_d->ug, MYFILES_UG, UG_MODE_FULLVIEW, service, &cbs); + p_warn_if(NULL == ug, "ug_create() Failed"); + csetting_d->child_ug = ug; + + service_destroy(service); +} + +static int setting_import_vcard_foreach_cb(const char *a_vcard_stream, void *data) +{ + int ret; + ph_progress_info *p_info; + ct_setting_data *csetting_d = data; + + p_retvm_if(NULL == csetting_d, -1, "parameter(csetting_d) is NULL"); + + p_info = csetting_d->p_info; + p_retvm_if(NULL == p_info, -1, "csetting_d->p_info is NULL"); + + if (!p_info->alive) { + p_info->result = FALSE; + p_info->completed = true; + return -1; + } + + ret = contacts_svc_insert_vcard(0, a_vcard_stream); + if (ret <= 0) { + ERR("contacts_svc_insert_contact() Failed(%d)", ret); + return ret; + } + return CTS_SUCCESS; +} + +static PTHREAD_FN setting_import_vcard_contacts(void *data) +{ + int ret; + const char *path = NULL; + char *last = NULL; + ct_setting_data *csetting_d = data; + ph_progress_info *p_info = csetting_d->p_info; + + path = strtok_r(csetting_d->path, "?", &last); + while (path) { + PH_DBG("import vcard path = %s", path); + ret = contacts_svc_vcard_foreach(path, setting_import_vcard_foreach_cb, csetting_d); + if (CTS_SUCCESS != ret) { + p_info->result = FALSE; + ERR("contacts_svc_vcard_foreach() Failed(%d)", p_info->result); + break; + } + path = strtok_r(NULL, "?", &last); + } + p_info->completed = true; + pthread_exit(NULL); +} + + +static void setting_import_vcard_myfile_ug_result(ui_gadget_h ug, service_h service, void *data) +{ + int ret; + char *val = NULL; + ct_setting_data *csetting_d = data; + ph_progress_info *p_info; + + p_retm_if(NULL == ug, "parameter(ug) is NULL"); + ug_destroy(ug); + + p_retm_if(NULL == data, "parameter(ct_setting_data) is NULL"); + csetting_d->child_ug = NULL; + + p_retm_if(NULL == service, "parameter(result) is NULL"); + + service_get_extra_data(service, "result", &val); + p_retm_if(NULL == val, "service_get_extra_data() return NULL"); + + FREEandSTRDUP(csetting_d->path, val); + p_retm_if(NULL == csetting_d->path, "strdup() return NULL"); + + free(val); + + p_retm_if(csetting_d->p_info, "thread is running"); + + p_info = calloc(1, sizeof(ph_progress_info)); + p_retm_if(NULL == p_info, "calloc() return NULL"); + csetting_d->p_info = p_info; + p_info->alive = true; + p_info->result = TRUE; + + ret = contacts_svc_begin_trans(); + if (CTS_SUCCESS != ret) { + ERR("contacts_svc_begin_trans() Failed(%d)", ret); + free(p_info); + phone_show_tickernoti(S_(PH_SYS_POP_FAILED)); + elm_naviframe_item_pop(csetting_d->navi); + return; + } + + ret = pthread_create(&p_info->thread, NULL, setting_import_vcard_contacts, csetting_d); + if (0 != ret) { + ERR("Thread creation failed(%d)", ret); + contacts_svc_end_trans(false); + free(p_info); + csetting_d->p_info = NULL; + return; + } + + p_info->timer = ecore_timer_add(SETTING_TIMER_DURATION, setting_import_timer_cb, csetting_d ); + if (NULL == p_info->timer) { + ERR("ecore_timer_add() return NULL"); + contacts_svc_end_trans(false); + p_info->alive = false; + pthread_join(p_info->thread, NULL); + free(p_info); + csetting_d->p_info = NULL; + return; + } + csetting_d->popup = phone_progressbar_popup(csetting_d->navi, p_info, T_(CT_GET_TEXT_BASIC, CTTEXT_IMPORTING_SD_CONTACTS)); +} + +static void setting_import_vcard_myfile_ug(ct_setting_data *csetting_d) +{ + ui_gadget_h ug; + struct ug_cbs cbs = {0}; + service_h service; + + service_create(&service); + + service_add_extra_data(service, "path", SETTING_VCARD_PATH); + service_add_extra_data(service, "select_type", "IMPORT"); + service_add_extra_data(service, "file_type", "vcf"); + + cbs.result_cb = setting_import_vcard_myfile_ug_result; + cbs.destroy_cb = setting_ug_destroy_cb; + cbs.layout_cb = ug_common_layout_cb; + cbs.priv = csetting_d; + + ug = ug_create(csetting_d->ug, MYFILES_UG, UG_MODE_FULLVIEW, service, &cbs); + p_warn_if(NULL == ug, "ug_create() Failed"); + csetting_d->child_ug = ug; + + service_destroy(service); +} + +static PTHREAD_FN setting_export_sim_contacts(void *data) +{ + PH_FN_CALL; + int i; + ct_setting_data *csetting_d = data; + + csetting_d->p_info->result = CTS_SUCCESS; + for(i =0; i < csetting_d->list_export_ct_cnt ; i++) + { + if(1)//contacts_svc_export_sim(csetting_d->list_export_ct[i]) == CTS_SUCCESS) + { + sleep(1);//have to remove + csetting_d->p_info->cnt++; + } + else + { + csetting_d->p_info->result = CTS_ERR_FAIL; + ERR("contacts_svc_export_sim is Fail"); + } + } + pthread_exit(NULL); +} +static Eina_Bool setting_export_sim_timer_cb(void *data) +{ + PH_FN_CALL; + const char *message; + ct_setting_data *csetting_d = data; + ph_progress_info *p_info; + p_info = csetting_d->p_info; + + double value = (double)p_info->cnt/(double)p_info->cnt_checked_total; + p_retvm_if(NULL == csetting_d , ECORE_CALLBACK_CANCEL, "parameter(ct_setting_data) is NULL"); + p_info = csetting_d->p_info; + + if (!p_info->completed) + { + char count[PH_TEXT_SHORT_LEN]; + char percent[PH_TEXT_SHORT_LEN]; + if (!p_info->alive) + { + p_info->result = FALSE; + p_info->completed = true; + return ECORE_CALLBACK_RENEW; + } + elm_progressbar_value_set(p_info->progressbar, value); + snprintf(percent, sizeof(percent), "%d%%", (int)(100.0*value)); + 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; + } + pthread_join(p_info->thread, NULL); + + if (CTS_SUCCESS == p_info->result) + message = T_(CT_GET_TEXT_BASIC, CTTEXT_EXPORTED); + else + message = S_(PH_SYS_POP_FAILED); + + + evas_object_del(csetting_d->popup); + csetting_d->popup = NULL; + + free(p_info); + csetting_d->p_info = NULL; + + phone_show_tickernoti(message); + return ECORE_CALLBACK_CANCEL; +} +static void setting_export_sim(void *data, int *list, int cnt) +{ + PH_FN_CALL; + int ret; + ct_setting_data *csetting_d = data; + ph_progress_info *p_info; + char title[PH_TEXT_MAX_LEN]; + + if (NULL == csetting_d) { + ERR("parameter(csetting_d) is NULL"); + free(list); + return; + } + + if (cnt <= 0) { + ERR("evas_object_data_get() return NULL"); + free(list); + return; + } + + p_retm_if(csetting_d->p_info, "thread is running"); + p_info = calloc(1, sizeof(ph_progress_info)); + p_retm_if(NULL == p_info, "calloc() return NULL"); + + csetting_d->p_info = p_info; + p_info->cnt_checked_total = csetting_d->list_export_ct_cnt = cnt; + csetting_d->list_export_ct = list; + p_info->alive = true; + p_info->result = TRUE; + p_info->without_cancel_btn = true; + + ret = pthread_create(&p_info->thread, NULL, setting_export_sim_contacts, csetting_d ); + if (0 != ret) { + ERR("Thread creation failed(%d)", ret); + free(p_info); + csetting_d->p_info = NULL; + return; + } + + p_info->timer = ecore_timer_add(SETTING_TIMER_DURATION, setting_export_sim_timer_cb, csetting_d ); + if (NULL == p_info->timer) { + ERR("ecore_timer_add() return NULL"); + p_info->alive = false; + free(p_info); + csetting_d->p_info = NULL; + return; + } + snprintf(title, sizeof(title), T_(CT_GET_TEXT_BASIC, CTTEXT_EXPORTING_CONTACTS_TO), "SIM"); + csetting_d->popup = phone_progressbar_popup(csetting_d->navi, p_info, title); + + return; + +} +static void setting_import_export_sim_sel(void *data, Evas_Object *obj, void *event_info) +{ + ct_setting_data *csetting_d = data; + elm_genlist_item_selected_set(event_info, EINA_FALSE); + + if (CT_SETTING_IMPORT == csetting_d->mode) + setting_import_sim(csetting_d); + else {// CT_SETTING_EXPORT + ctui_create_list_select_view(csetting_d->navi, setting_export_sim, csetting_d,CT_GET_LIST_ALL_CONTACTS, 0, 0); + } +} + +static void setting_export_vcard_contacts(void *data, int *list, int cnt) +{ + ct_setting_data *csetting_d = data; + + if (NULL == csetting_d) { + ERR("parameter(csetting_d) is NULL"); + free(list); + return; + } + + if (cnt <= 0) { + ERR("evas_object_data_get() return NULL"); + free(list); + return; + } + + csetting_d->list_export_ct = list; + csetting_d->list_export_ct_cnt = cnt; + + setting_export_contacts_myfile_ug(data); +} + +static void setting_import_export_vcard_sel(void *data, Evas_Object *obj, void *event_info) +{ + ct_setting_data *csetting_d = data; + elm_genlist_item_selected_set(event_info, EINA_FALSE); + + if (CT_SETTING_IMPORT == csetting_d->mode) + setting_import_vcard_myfile_ug(csetting_d); + else {// CT_SETTING_EXPORT + ctui_create_list_select_view(csetting_d->navi, setting_export_vcard_contacts, csetting_d, + CT_GET_LIST_ALL_CONTACTS, 0, 0); + } +} + +static void setting_import_export(ct_setting_data *csetting_d) +{ + int sim_state; + char buf[PH_TEXT_SHORT_LEN]; + Evas_Object *genlist; + Evas_Object *l_btn; + Elm_Object_Item *item; + + genlist = elm_genlist_add(csetting_d->navi); + elm_object_style_set(genlist,"dialogue"); + vconf_get_int(VCONFKEY_TELEPHONY_SIM_PB_INIT, &sim_state); + + ctui_genlist_append_separator_20px_with_line(genlist); + + item = elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_IMPORT_EXPORT], + S_(CT_SYS_BODY_SIM), NULL, ELM_GENLIST_ITEM_NONE, setting_import_export_sim_sel, csetting_d); + + item = elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_IMPORT_EXPORT], + S_(CT_SYS_BODY_MEMORYCARD), NULL, ELM_GENLIST_ITEM_NONE, setting_import_export_vcard_sel, csetting_d); + + if (CT_SETTING_IMPORT == csetting_d->mode) + snprintf(buf, sizeof(buf), "%s", T_(CT_GET_TEXT_BASE_OP, CTTEXT_IMPORT_CONTACTS)); + else + snprintf(buf, sizeof(buf), "%s", T_(CT_GET_TEXT_BASE_OP, CTTEXT_EXPORT_CONTACTS)); + + l_btn = elm_button_add(csetting_d->navi); + evas_object_smart_callback_add(l_btn, "clicked", phone_view_back_btn_cb, csetting_d->navi); + elm_object_style_set(l_btn, "naviframe/back_btn/default"); + + elm_naviframe_item_push(csetting_d->navi, buf, l_btn, NULL, genlist, NULL); +} + +static void setting_export_contacts_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_setting_data *csetting_d = data; + elm_genlist_item_selected_set(event_info, EINA_FALSE); + + csetting_d->mode = CT_SETTING_EXPORT; + setting_import_export(csetting_d); +} + +static void setting_import_contacts_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_setting_data *csetting_d = data; + elm_genlist_item_selected_set(event_info, EINA_FALSE); + + csetting_d->mode = CT_SETTING_IMPORT; + setting_import_export(csetting_d); +} + +static void setting_order_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); +} + +static void setting_mynum_cb(void *data, Evas_Object *obj, void *event_info) +{ + Elm_Object_Item *it = event_info; + elm_genlist_item_selected_set(it, EINA_FALSE); +} + +static void setting_gl_exp(void *data, Evas_Object *obj, void *event_info) +{ + int order; + Evas_Object *genlist = obj; + Elm_Object_Item *it = event_info; + ct_setting_data *csetting_d = data; + + csetting_d->radio_grp = elm_radio_add(genlist); + + elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_FIRSTLAST], + (void *)CTS_ORDER_NAME_FIRSTLAST, it, ELM_GENLIST_ITEM_NONE, + setting_handle_order, (void *)CTS_ORDER_NAME_FIRSTLAST); + elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_LASTFIRST], + (void *)CTS_ORDER_NAME_LASTFIRST, it, ELM_GENLIST_ITEM_NONE, + setting_handle_order, (void *)CTS_ORDER_NAME_LASTFIRST); + + order = contacts_svc_get_order(CTS_ORDER_OF_DISPLAY); + elm_radio_value_set(csetting_d->radio_grp, order); +} + +static void setting_gl_con(void *data, Evas_Object *obj, void *event_info) +{ + ct_setting_data *csetting_d = data; + Elm_Object_Item *item = event_info; + elm_genlist_item_subitems_clear(item); + + p_retm_if(NULL == csetting_d, "parameter(csetting_d) is NUL"); + if(csetting_d->radio_grp) { + evas_object_del(csetting_d->radio_grp); + csetting_d->radio_grp = NULL; + } +} + +static char *setting_gl_text_label_get(void *data, Evas_Object *obj, const char *part) +{ + if (0 == strcmp(part, "elm.text")) + return strdup(data); + return NULL; +} + +static char *setting_gl_order_label_get(void *data, Evas_Object *obj, const char *part) +{ + if (0 == strcmp(part, "elm.text.1")) + return strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_ORDER_DISPLAY_NAME)); + else if (0 == strcmp(part, "elm.text.2")) { + if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY)) + return strdup(T_(CT_GET_TEXT_BASE_OP, CTTEXT_FIRSTLAST)); + else + return strdup(T_(CT_GET_TEXT_BASE_OP, CTTEXT_LASTFIRST)); + } + return NULL; +} + +static char *setting_gl_radio_label_get(void *data, Evas_Object *obj, const char *part) +{ + int type = (int)data; + if (0 == strcmp(part, "elm.text")) { + if (CTS_ORDER_NAME_FIRSTLAST == type) + return strdup(T_(CT_GET_TEXT_BASE_OP, CTTEXT_FIRSTLAST)); + else if (CTS_ORDER_NAME_LASTFIRST == type) + return strdup(T_(CT_GET_TEXT_BASE_OP, CTTEXT_LASTFIRST)); + } + return NULL; +} + +static char *setting_gl_my_num_label_get(void *data, Evas_Object *obj, const char *part) +{ + if (0 == strcmp(part, "elm.text.2")) + return strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_OWN_NUMBER)); + else if (0 == strcmp(part, "elm.text.1")) { + char *number = vconf_get_str(VCONFKEY_TELEPHONY_SUBSCRIBER_NUMBER); + if (number && *number) + return strdup(number); + else + return strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_NA)); + } + return NULL; +} + +static Evas_Object *setting_gl_radio_icon_get(void *data, Evas_Object *obj, const char *part) +{ + int type = (int)data; + ct_setting_data *csetting_d; + + if (0 == strcmp(part, "elm.icon")) { + Evas_Object *radio; + + csetting_d = evas_object_data_get(obj, "csetting_d"); + p_retvm_if(NULL == csetting_d, NULL, "evas_object_data_get() return NULL"); + + radio = elm_radio_add(obj); + p_retvm_if(NULL == radio, NULL, "elm_radio_add() return NULL"); + + elm_radio_group_add(radio, csetting_d->radio_grp); + elm_radio_state_value_set(radio, type); + + return radio; + } + return NULL; +} + +static char* setting_gl_sdn_label_get(void *data, Evas_Object *obj, const char *part) +{ + ct_sdn_list *info = data; + p_retvm_if(NULL == data, NULL, "The parameter(data) is NULL"); + + if (0 == strcmp(part, "elm.text.2")) + return SAFE_STRDUP(info->name); + else if (0 == strcmp(part, "elm.text.1")) + return SAFE_STRDUP(info->number); + return NULL; +} + +static void setting_gl_sdn_del(void *data, Evas_Object *obj) +{ + ct_sdn_list *info = data; + p_retm_if(NULL == info, "parameter(info) is NULL"); + + free(info->name); + free(info->number); + free(info); +} + + +static inline void setting_create_itcs() +{ + setting_itcs[SETTING_ITC_TEXT].func.text_get = setting_gl_text_label_get; + + setting_itcs[SETTING_ITC_ORDER].func.text_get = setting_gl_order_label_get; + + setting_itcs[SETTING_ITC_RADIO].func.text_get = setting_gl_radio_label_get; + setting_itcs[SETTING_ITC_RADIO].func.content_get = setting_gl_radio_icon_get; + + setting_itcs[SETTING_ITC_MY_NUM].func.text_get = setting_gl_my_num_label_get; + + setting_itcs[SETTING_ITC_SDN].func.text_get = setting_gl_sdn_label_get; + setting_itcs[SETTING_ITC_SDN].func.del = setting_gl_sdn_del; +} + +static void setting_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + int ret; + ct_setting_data *csetting_d = data; + p_retm_if(NULL == csetting_d, "parameter(csetting_d) is NULL"); + + if (csetting_d->popup) + evas_object_del(csetting_d->popup); + + if (csetting_d->p_info) { + csetting_d->p_info->alive = false; + pthread_join(csetting_d->p_info->thread, NULL); + + ret = contacts_svc_end_trans(false); + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); + + ecore_timer_del(csetting_d->p_info->timer); + free(csetting_d->p_info); + csetting_d->p_info = NULL; + } + + if (csetting_d->child_ug); + ug_destroy(csetting_d->child_ug); + + free(csetting_d->path); + free(csetting_d); +} + +static void setting_gl_sdn_sel(void *data, Evas_Object *obj, void *event_info) +{ + Elm_Object_Item *item = event_info; + ct_sdn_list *info = elm_object_item_data_get(item); + + elm_genlist_item_selected_set(item, EINA_FALSE); + phone_launch_voice_call(0, info->number); +} + + +static Evas_Object* setting_fill_sdn_view(Evas_Object *parent, ct_setting_data *csetting_d) +{ + int ret; + CTSiter *iter; + CTSvalue *info; + Evas_Object *genlist; + + genlist = elm_genlist_add(parent); + elm_object_style_set(genlist,"dialogue"); + p_retvm_if(NULL == genlist, NULL, "elm_genlist_add() return NULL"); + + ctui_genlist_append_separator_20px_with_line(genlist); + + ret = contacts_svc_get_list(CTS_LIST_ALL_SDN, &iter); + p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_get_list...() Failed(%d)", ret); + + csetting_d->cnt_sdn_list = 0; + while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { + ct_sdn_list *data; + info = contacts_svc_iter_get_info(iter); + data = calloc(1, sizeof(ct_sdn_list)); + if (NULL == data) { + ERR("calloc() return NULL"); + break; + } + data->name = contacts_svc_value_steal_str(info, CTS_LIST_SDN_NAME_STR); + data->number = contacts_svc_value_steal_str(info, CTS_LIST_SDN_NUMBER_STR); + csetting_d->cnt_sdn_list++; + contacts_svc_value_free(info); + elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_SDN], data, NULL, ELM_GENLIST_ITEM_NONE, setting_gl_sdn_sel, NULL); + } + contacts_svc_iter_remove(iter); + return genlist; +} + +static void setting_create_genlist_sdn(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *back_btn; + Evas_Object *genlist; + ct_setting_data *csetting_d = data; + char buf[PH_TEXT_SHORT_LEN]; + + elm_genlist_item_selected_set(event_info, EINA_FALSE); + + genlist = setting_fill_sdn_view(csetting_d->navi, csetting_d); + + back_btn = elm_button_add(csetting_d->navi); + evas_object_smart_callback_add(back_btn, "clicked", phone_view_back_btn_cb, csetting_d->navi); + elm_object_style_set(back_btn, "naviframe/back_btn/default"); + + snprintf(buf, sizeof(buf), "%s (%d)", T_(CT_GET_TEXT_BASIC, CTTEXT_SDN), csetting_d->cnt_sdn_list); + + elm_naviframe_item_push(csetting_d->navi, buf, back_btn, NULL, genlist, NULL); +} + +Evas_Object* ct_setting_create_layout(ct_setting_data *csetting_d) +{ + Evas_Object *genlist; + Elm_Object_Item *item; + + setting_create_itcs(); + + genlist = elm_genlist_add(csetting_d->navi); + elm_object_style_set(genlist,"dialogue"); + evas_object_data_set(genlist, "csetting_d", csetting_d); + evas_object_event_callback_add(genlist, EVAS_CALLBACK_DEL, setting_view_delete_cb, csetting_d); + + ctui_genlist_append_separator_20px_with_line(genlist); + + elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_IMPORT], + T_(CT_GET_TEXT_BASE_OP, CTTEXT_IMPORT_CONTACTS), NULL, ELM_GENLIST_ITEM_NONE, + setting_import_contacts_cb, csetting_d); + + elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_EXPORT], + T_(CT_GET_TEXT_BASE_OP, CTTEXT_EXPORT_CONTACTS), NULL, ELM_GENLIST_ITEM_NONE, + setting_export_contacts_cb, csetting_d ); + + item = elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_ORDER], + NULL, NULL, ELM_GENLIST_ITEM_TREE, setting_order_item_sel, NULL); + evas_object_data_set(genlist, "order", item); + + item = elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_MY_NUM], + NULL, NULL, ELM_GENLIST_ITEM_NONE, setting_mynum_cb, NULL); + elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + + if (0 < contacts_svc_count(CTS_GET_COUNT_SDN)) + item = elm_genlist_item_append(genlist, &setting_itcs[SETTING_ITC_TEXT], + T_(CT_GET_TEXT_BASIC, CTTEXT_SDN), NULL, ELM_GENLIST_ITEM_NONE, setting_create_genlist_sdn, csetting_d); + + evas_object_smart_callback_add(genlist, "expanded", setting_gl_exp, csetting_d); + evas_object_smart_callback_add(genlist, "contracted", setting_gl_con, csetting_d); + + return genlist; +} + + diff --git a/lib/settings/ct-setting-view.h b/lib/settings/ct-setting-view.h new file mode 100755 index 0000000..b52c672 --- /dev/null +++ b/lib/settings/ct-setting-view.h @@ -0,0 +1,55 @@ +/* + * 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_SETTING_VIEW_H__ +#define __CONTACTS_SETTING_VIEW_H__ + +typedef struct { + Eina_Bool checked; + void *data; +} ct_setting_gl_data; + +typedef struct { + Evas_Object *navi; + Evas_Object *popup; + Evas_Object *notify; + Evas_Object *radio_grp; + Elm_Object_Item *navi_item_main; + + Evas_Object *genlist; + + int cnt_sdn_list; + int id_ab; + int mode; + char *path; + ui_gadget_h ug; + void *child_ug; + + int *list_export_ct; + int list_export_ct_cnt; + + ph_progress_info *p_info; +}ct_setting_data; + +typedef struct { + char *name; + char *number; +}ct_sdn_list; + + +Evas_Object* ct_setting_create_layout(ct_setting_data *csetting_d ); + +#endif //__CONTACTS_DETAIL_VIEW_H__ diff --git a/lib/phoneui/CMakeLists.txt b/lib/speed/CMakeLists.txt index 8203819..a0979cf 100755 --- a/lib/phoneui/CMakeLists.txt +++ b/lib/speed/CMakeLists.txt @@ -1,12 +1,16 @@ LINK_DIRECTORIES(${CMAKE_BINARY_DIR}) -SET(TARGET ${MAIN}) +SET(TARGET ${SPEEDDIAL}) FILE(GLOB SRCS *.c) ADD_LIBRARY(${TARGET} SHARED ${SRCS}) 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} ${SPEEDDIAL} ${PHONELOG} ${PH_VIEW_DIALER} -L/opt/ug/lib/ -lug-contacts-list-efl -lug-contacts-details-efl) +TARGET_LINK_LIBRARIES(${TARGET} ${COMMON_LIB} ${ug_pkgs_LDFLAGS}) + +ADD_DEPENDENCIES(${TARGET} speeddial_theme_build) INSTALL(TARGETS ${TARGET} DESTINATION ${UGLIBDIR}) + +INSTALL(FILES ${CMAKE_BINARY_DIR}/lib/speed/speeddial-efl.xml DESTINATION "/usr/share/packages") diff --git a/lib/speed/ph-speeddial-main.c b/lib/speed/ph-speeddial-main.c new file mode 100755 index 0000000..5837d37 --- /dev/null +++ b/lib/speed/ph-speeddial-main.c @@ -0,0 +1,206 @@ +/* + * 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 <bundle.h> + +#include "phone.h" +#include "phone-common.h" +#include "ph-speeddial-view.h" + +// for removing build warning //////////////////////////////////// +int service_export_as_bundle(service_h service, bundle **data); +//////////////////////////////////////////////////////// + +static bool speed_create_ug_view(ph_speeddial_data * speed_d, Evas_Object *base) +{ + p_retvm_if(NULL == speed_d, false, "Parameter is null"); + + if (NULL == speed_d->navi) { + speed_d->navi = elm_naviframe_add(base); + p_retvm_if(NULL == speed_d->navi, false, "elm_naviframe_add is failed"); + elm_object_part_content_set(base, "elm.swallow.content", speed_d->navi); + evas_object_show(speed_d->navi); + } + + speed_d->layout = ph_speed_create_content(speed_d->navi, speed_d); + p_retvm_if(NULL == speed_d->layout, false, "Fail to ph_speed_create_content"); + + return true; +} + +static void *speed_on_create(ui_gadget_h ug, enum ug_mode mode, service_h service, void *priv) +{ + PH_FN_CALL; + int ret; + Evas_Object *bg; + Evas_Object *base; + Evas_Object *parent; + ph_speeddial_data *speed_d; + + if (!ug || !priv) + return NULL; + + bindtextdomain(PACKAGE, LOCALEDIR); + + parent = ug_get_parent_layout(ug); + if (!parent) + return NULL; + + speed_d = priv; + speed_d->ug = ug; + speed_d->win = ug_get_window(); + speed_d->is_ug = true; + + contacts_svc_connect(); + + if (mode==UG_MODE_FULLVIEW) + base = phone_create_base_layout(parent, true); + else + base = phone_create_base_layout(parent, false); + + bg = phone_create_bg(base); + if (NULL == bg) { + PH_DBG("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 (!speed_create_ug_view(speed_d, base)) { + evas_object_del(base); + contacts_svc_disconnect(); + } + return base; +} + +static void speed_on_start(ui_gadget_h ug, service_h service, void *priv) +{ +} + +static void speed_on_pause(ui_gadget_h ug, service_h service, void *priv) +{ +} + +static void speed_on_resume(ui_gadget_h ug, service_h service, void *priv) +{ +} + +static void speed_on_destroy(ui_gadget_h ug, service_h service, void *priv) +{ + PH_FN_CALL; + if (!ug) + return; + + evas_object_del(ug_get_layout(ug)); + contacts_svc_disconnect(); +} + +static void speed_on_message(ui_gadget_h ug, service_h msg, service_h service, void *priv) +{ +} + +static void speed_on_event(ui_gadget_h ug, enum ug_event event, service_h service, void *priv) +{ + ph_speeddial_data *speed_d = priv; + Evas_Object *notify; + + switch (event) { + case UG_EVENT_ROTATE_PORTRAIT: + case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN: + phone_resize_notify(speed_d->navi, 0); + break; + evas_object_data_set(speed_d->navi, "phone_rotate", (void *)0); + case UG_EVENT_ROTATE_LANDSCAPE: + case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN: + phone_resize_notify(speed_d->navi, 90); + evas_object_data_set(speed_d->navi, "phone_rotate", (void *)90); + notify = phone_get_notify(speed_d->navi); + elm_layout_theme_set(elm_object_content_get(notify), "standard", "selectioninfo", "vertical/bottom_64"); + break; + default: + break; + } +} + +static void speed_on_key_event(ui_gadget_h ug, enum ug_key_event event, service_h data, void *priv) +{ + PH_FN_CALL; + if (!ug) + return; + + switch (event) { + case UG_KEY_EVENT_END: + ug_destroy_me(ug); + break; + default: + break; + } +} + +API int UG_MODULE_INIT(struct ug_module_ops *ops) +{ + ph_speeddial_data *speed_d; + + if (!ops) + return -1; + + speed_d = calloc(1, sizeof(ph_speeddial_data)); + if (!speed_d) + return -1; + + ops->create = speed_on_create; + ops->start = speed_on_start; + ops->pause = speed_on_pause; + ops->resume = speed_on_resume; + ops->destroy = speed_on_destroy; + ops->message = speed_on_message; + ops->event = speed_on_event; + ops->key_event = speed_on_key_event; + ops->priv = speed_d; + ops->opt = UG_OPT_INDICATOR_ENABLE; + + return 0; +} + +API void UG_MODULE_EXIT(struct ug_module_ops *ops) +{ + PH_FN_END; + if (!ops) + return; + + ops->priv = NULL; +} + +API Evas_Object *phone_create_speeddial_view(void *ug, Evas_Object *win, Evas_Object *navi) +{ + ph_speeddial_data * speed_d = calloc(1, sizeof(ph_speeddial_data)); + p_retvm_if(NULL == speed_d, NULL, "Faile to calloc ph_speeddial_data"); + + speed_d->ug = ug; + speed_d->is_ug = false; + speed_d->win = win; + speed_d->navi = navi; + speed_d->layout = ph_speed_create_content(navi, speed_d); + if (NULL == speed_d->layout) { + free(speed_d); + return NULL; + } + + return speed_d->layout; +} + diff --git a/lib/speed/ph-speeddial-view.c b/lib/speed/ph-speeddial-view.c new file mode 100755 index 0000000..256c236 --- /dev/null +++ b/lib/speed/ph-speeddial-view.c @@ -0,0 +1,555 @@ +/* + * 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 <Ecore_X.h> +#include <ui-gadget-module.h> + +#include "phone.h" +#include "phone-common.h" +#include "ph-speeddial-view.h" + +#define KEY_SPEED_DATA "speed_d" +#define SPEED_VOICE_MAIL_NUM 1 + +static Elm_Gengrid_Item_Class grid_itc, grid_itc_empty; + +enum{ + PH_SPEED_MODE_DEFAULT, + PH_SPEED_MODE_EDIT, +}; + +static void speed_edit_mode_start(ph_speeddial_data * speed_d); +static void speed_edit_mode_end(ph_speeddial_data * speed_d); + +static void speed_update_button_status(ph_speeddial_data *speed_d) +{ + p_retm_if(NULL == speed_d, "Parameter is null"); + p_retm_if(NULL == speed_d->ctrl_item, "Navi button is null"); + + if ((false == speed_d->is_edit_mode && 0 == speed_d->speeddial_list_count) + || (true == speed_d->is_edit_mode && 0 == speed_d->checked_cnt)) + elm_object_item_disabled_set(speed_d->ctrl_item, EINA_TRUE); + else + elm_object_item_disabled_set(speed_d->ctrl_item, EINA_FALSE); +} + +static void speed_load_list(ph_speeddial_data *speed_d) +{ + p_retm_if(NULL == speed_d, "Parameter is null"); + + phone_free_speeddial_data(speed_d->speeddial_list); + speed_d->speeddial_list_count = 0; + speed_d->speeddial_list = phone_load_speeddial_data(&(speed_d->speeddial_list_count)); +} + +static void speed_popup_response_cb(void *data, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; + ph_speeddial_data *speed_d = data; + evas_object_del(speed_d->popup); + speed_d->popup = NULL; +} + +static void speed_add_start_cb(void *data, void *data2) +{ + PH_FN_CALL; + ph_speeddial_data *speed_d = data; + int *number_id = data2; + int ret; + + p_retm_if(NULL == speed_d, "speed data is null"); + p_retm_if(*number_id <= 0, "returned number_id is less than 0"); + p_retm_if(20 < speed_d->cur_dial_num, "current dial num is higher than 20"); + + ret = contacts_svc_set_speeddial(speed_d->cur_dial_num, *number_id); + if (ret < 0) + phone_show_popup(speed_d->navi, S_(PH_SYS_POP_ALREDY_EXISTS), 2.0); +} + +static void speed_destroy_child_ug(void *data) +{ + ph_speeddial_data *speed_d = data; + speed_d->child_ug = NULL; +} + +static void speed_grid_empty_selected(void *data, Evas_Object *obj, void *event_info) +{ + ph_speeddial_data * speed_d = evas_object_data_get(obj, KEY_SPEED_DATA); + int index = (int)data; + p_retm_if(true == speed_d->is_edit_mode, "It is in Edit mode"); + elm_gengrid_item_selected_set(event_info, EINA_FALSE); + + speed_d->cur_dial_num = index; + speed_d->child_ug = phone_launch_contact_list_ug(speed_d->ug, CT_UG_REQUEST_SELECT_NUMBER, + speed_add_start_cb, speed_destroy_child_ug, speed_d); +} + +static void speed_change_start_cb(void *data, void *data2) +{ + PH_FN_CALL; + ph_speeddial_data *speed_d = data; + int *number_id = data2; + int ret; + p_retm_if(NULL == speed_d, "speed data is null"); + p_retm_if(*number_id <= 0, "returned number_id is less than 0"); + p_retm_if(20 < speed_d->cur_dial_num, "current dial num is higher than 20"); + + ret = contacts_svc_begin_trans(); + p_retm_if(CTS_SUCCESS != ret, "contacts_svc_begin_trans() Failed(%d)", ret); + contacts_svc_unset_speeddial(speed_d->cur_dial_num); + ret = contacts_svc_set_speeddial(speed_d->cur_dial_num, *number_id); + if (CTS_SUCCESS != ret) { + ret = contacts_svc_end_trans(false); + phone_show_popup(speed_d->navi, S_(PH_SYS_POP_ALREDY_EXISTS), 1.5); + } + else + ret = contacts_svc_end_trans(true); + p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans() Failed(%d)", ret); +} + +static void speed_grid_change_contact(void *data, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; + ph_speeddial_data *speed_d = data; + p_retm_if(NULL== speed_d, "Speeddial data is null"); + + speed_popup_response_cb(speed_d, NULL, NULL); + speed_d->child_ug = phone_launch_contact_list_ug(speed_d->ug, CT_UG_REQUEST_SELECT_NUMBER, + speed_change_start_cb, speed_destroy_child_ug, speed_d); +} + +static void speed_grid_remove_speeddial(void *data, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; + int ret; + ph_speeddial_data *speed_d = data; + speed_popup_response_cb(speed_d, NULL, NULL); + ret = contacts_svc_unset_speeddial(speed_d->cur_dial_num); + if (CTS_SUCCESS != ret) + phone_show_tickernoti(S_(PH_SYS_POP_FAILED)); + else + phone_show_tickernoti(S_(PH_SYS_POP_REMOVED)); +} + +static void speed_grid_item_sel(void *data, Evas_Object *obj, void *event_info) +{ + ph_speeddial_info *s_info = data; + ph_speeddial_data *speed_d = evas_object_data_get(obj, KEY_SPEED_DATA); + Evas_Object *popup; + Evas_Object *list; + Evas_Object *btn; + + p_retm_if(true == speed_d->is_edit_mode, "It is in Edit mode"); + elm_gengrid_item_selected_set(event_info, EINA_FALSE); + + p_retm_if(NULL == s_info, "speeddial info is null"); + if (SPEED_VOICE_MAIL_NUM == s_info->dial_number) + return; + + speed_d->cur_dial_num = s_info->dial_number; + popup = elm_popup_add(speed_d->win); + elm_object_style_set(popup, "min_liststyle"); + elm_object_part_text_set(popup, "title,text", S_(PH_SYS_SK_EDIT)); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + list = elm_list_add(popup); + elm_list_item_append(list, T_(PH_GET_TEXT_BASE_OP, PHTEXT_CHANGE_CONTACT), + NULL, NULL, speed_grid_change_contact, speed_d); + elm_list_item_append(list, S_(PH_SYS_BODY_REMOVE), + NULL, NULL, speed_grid_remove_speeddial, speed_d); + elm_list_mode_set(list, ELM_LIST_EXPAND); + elm_object_content_set(popup, list); + + btn = elm_button_add(popup); + elm_object_text_set(btn, S_(PH_SYS_POP_CLOSE)); + elm_object_part_content_set(popup, "button1", btn); + elm_object_style_set(btn, "popup_button/default"); + evas_object_smart_callback_add(btn, "clicked", speed_popup_response_cb, speed_d); + + speed_d->popup = popup; + evas_object_show(popup); +} + +static void speed_fill_gengrid(ph_speeddial_data *speed_d) +{ + int i; + p_retm_if(NULL == speed_d, "Parameter is null"); + + for(i = 1 ; i < 10; i++) { + Eina_List *l=NULL; + bool is_find = false; + ph_speeddial_info *cd = NULL; + + EINA_LIST_FOREACH(speed_d->speeddial_list, l, cd) { + if (!cd) continue; + if (cd->dial_number == i) { + is_find = true; + break; + } + } + if (is_find) + elm_gengrid_item_append(speed_d->gengrid, &grid_itc, cd, speed_grid_item_sel, cd); + else + elm_gengrid_item_append(speed_d->gengrid, &grid_itc_empty, (void*)i, speed_grid_empty_selected, (void*)i); + } + evas_object_show(speed_d->gengrid); +} + +static void speed_data_list_changed_cb(void *data) +{ + PH_FN_CALL; + ph_speeddial_data *speed_d = data; + p_retm_if(NULL == speed_d, "Parameter is null"); + if (speed_d->gengrid) { + speed_d->checked_cnt = 0; + speed_load_list(speed_d); + elm_gengrid_clear(speed_d->gengrid); + speed_fill_gengrid(speed_d); + speed_update_button_status(speed_d); + } + PH_FN_END; +} + +static char *speed_grid_empty_label_get(void *data, Evas_Object *obj, const char *part ) +{ + if (0 == strcmp(part, "elm.text.number")) { + int index = (int)data; + char buf[PATH_MAX]={0}; + snprintf(buf, sizeof(buf), "%d", index); + return strdup(buf); + } + return NULL; +} + +static char *speed_grid_label_get(void *data, Evas_Object *obj, const char *part ) +{ + char buf[PATH_MAX]={0}; + ph_speeddial_info * s_info = data; + + p_retvm_if(NULL == s_info, NULL, "speeddial info is null"); + + if (0 == strcmp(part, "elm.text.number")) { + if (SPEED_VOICE_MAIL_NUM == s_info->dial_number) + return NULL; + snprintf(buf, sizeof(buf), "%d", s_info->dial_number); + return strdup(buf); + } + else if (0 == strcmp(part, "elm.text")) { + if (s_info->display && *s_info->display) + snprintf(buf, sizeof(buf), "%s", s_info->display); + else if (s_info->ph_number && *s_info->ph_number) + snprintf(buf, sizeof(buf), "%s", s_info->ph_number); + else + return NULL; + return strdup(buf); + } + return NULL; +} + +static void speed_del_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_speeddial_data *speed_d = data; + ph_speeddial_info *s_info = NULL; + Eina_List *l; + bool deleted = false; + + EINA_LIST_FOREACH(speed_d->speeddial_list, l, s_info) { + if (!s_info) continue; + if (EINA_TRUE == s_info->is_checked) { + PH_DBG("%d", s_info->dial_number); + contacts_svc_unset_speeddial(s_info->dial_number); + deleted = true; + } + } + + if (deleted) + phone_show_tickernoti(S_(PH_SYS_POP_REMOVED)); + + speed_edit_mode_end(speed_d); +} + +static void speed_edit_set_selection_info(void *data) +{ + ph_speeddial_data *speed_d = data; + p_retm_if(NULL == speed_d, "Selection info is null"); + + if (0 == speed_d->checked_cnt) + phone_hide_notify(speed_d->navi); + else { + char info_text[PH_TEXT_SHORT_LEN]={0}; + snprintf(info_text, sizeof(info_text), "%s (%d)", S_(PH_SYS_POP_SELECTED), + speed_d->checked_cnt); + phone_show_tickernoti(info_text); + } +} + +static void speed_edit_check_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_speeddial_data *speed_d = data; + if (elm_check_state_get(obj)) + speed_d->checked_cnt++; + else + speed_d->checked_cnt--; + speed_edit_set_selection_info(speed_d); + speed_update_button_status(speed_d); +} + +static Evas_Object *speed_grid_content_get(void *data, Evas_Object *obj, const char *part ) +{ + ph_speeddial_info *s_info = data; + p_retvm_if(NULL == s_info, NULL, "parameter is null"); + ph_speeddial_data *speed_d = evas_object_data_get(obj, KEY_SPEED_DATA); + + if ((0 == strcmp(part, "elm.thumbnail")) || (0 == strcmp(part, "elm.swallow.icon"))) { + Evas_Object *ic; + if (s_info->img_path) + ic = phone_create_icon_with_img(obj, s_info->img_path); + else + ic = phone_create_icon_with_img(obj, IMG_DEFAULT); + return ic; + } + else if (0 == strcmp(part, "elm.swallow.check.icon") && speed_d->is_edit_mode) { + Evas_Object *btn; + if (SPEED_VOICE_MAIL_NUM == s_info->dial_number) + return NULL; + btn = elm_check_add(obj); + elm_object_style_set(btn, "grid"); + elm_check_state_pointer_set(btn, &(s_info->is_checked)); + evas_object_smart_callback_add(btn, "changed", speed_edit_check_changed_cb, speed_d); + evas_object_propagate_events_set(btn, EINA_FALSE); + return btn; + } + return NULL; +} + +static void speed_edit_back_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + Elm_Object_Item *item; + ph_speeddial_data *speed_d = data; + ph_speeddial_info *s_info; + Eina_List *l; + + EINA_LIST_FOREACH(speed_d->speeddial_list, l, s_info) { + if (!s_info) continue; + s_info->is_checked = EINA_FALSE; + } + speed_d->checked_cnt = 0; + phone_hide_notify(speed_d->navi); + speed_edit_mode_end(speed_d); + + item = elm_gengrid_first_item_get(speed_d->gengrid); + while (item) { + elm_gengrid_item_update(item); + item = elm_gengrid_item_next_get(item); + } +} + +static void speed_edit_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + ph_speeddial_data *speed_d = data; + speed_edit_mode_start(speed_d); +} + +static void speed_navi_set(int mode, ph_speeddial_data *speed_d) +{ + Elm_Object_Item *navi_it; + Evas_Object *toolbar; + Evas_Object *l_btn; + + p_retm_if(NULL == speed_d, "parameter(controlbar) is NULL"); + + navi_it = elm_naviframe_top_item_get(speed_d->navi); + p_retm_if(NULL == navi_it, "navi item is NULL"); + toolbar = elm_object_item_part_content_get(navi_it, "controlbar"); + if (toolbar) + phone_cbar_item_clear(toolbar); + else { + toolbar = elm_toolbar_add(speed_d->navi); + elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND); + elm_object_item_part_content_set(navi_it, "controlbar", toolbar); + } + + switch (mode) { + case PH_SPEED_MODE_DEFAULT: + speed_d->ctrl_item = elm_toolbar_item_append(toolbar, PH_IMG_ICON_DELETE, NULL, speed_edit_btn_cb, speed_d); + break; + case PH_SPEED_MODE_EDIT: + speed_d->ctrl_item = elm_toolbar_item_append(toolbar, PH_IMG_ICON_DELETE, NULL, speed_del_btn_cb, speed_d); + + l_btn = phone_create_navi_btn(speed_d->navi, S_(PH_SYS_SK_CANCEL)); + evas_object_smart_callback_add(l_btn, "clicked", speed_edit_back_btn_cb, speed_d); + elm_object_item_part_content_set(speed_d->navi_item, "prev_btn", l_btn); + break; + default: + return; + } + phone_toolbar_disabled_item_append(toolbar, 3); + speed_update_button_status(speed_d); +} + +static void speed_edit_mode_start(ph_speeddial_data *speed_d) +{ + Elm_Object_Item *item; + + speed_d->is_edit_mode = true; + + item = elm_gengrid_first_item_get(speed_d->gengrid); + while (item) { + elm_gengrid_item_update(item); + item = elm_gengrid_item_next_get(item); + } + elm_object_item_part_text_set(speed_d->navi_item, "elm.text.title", T_(PH_GET_TEXT_BASE_OP, PHTEXT_SELECT_SPEED_DIAL_CONTACTS)); + speed_navi_set(PH_SPEED_MODE_EDIT, speed_d); +} + +static void speed_edit_mode_end(ph_speeddial_data *speed_d) +{ + Evas_Object *back_btn; + + speed_d->is_edit_mode = false; + back_btn = elm_button_add(speed_d->layout); + if (speed_d->is_ug) + evas_object_smart_callback_add(back_btn, "clicked", phone_ug_destroy_me_cb, speed_d->ug); + else + evas_object_smart_callback_add(back_btn, "clicked", phone_view_back_btn_cb, speed_d->navi); + + elm_object_item_part_content_set(speed_d->navi_item, "prev_btn", back_btn); + elm_object_style_set(back_btn, "naviframe/back_btn/default"); + + elm_object_item_part_text_set(speed_d->navi_item, "elm.text.title", T_(PH_GET_TEXT_BASIC, PHTEXT_SPEEDDIAL)); + speed_navi_set(PH_SPEED_MODE_DEFAULT, speed_d); +} + +static Evas_Object* speed_create_gengrid(ph_speeddial_data *speed_d, Evas_Object *parent) +{ + Evas_Object *gengrid; + int wx = 0; + int hy = 0; + + p_retvm_if(NULL == speed_d, NULL, "Parameter is null"); + + gengrid = elm_gengrid_add(parent); + p_retvm_if(NULL == gengrid, NULL, "elm_gengrid_add is failed"); + elm_object_theme_set(gengrid, speed_d->th); + + ecore_x_window_size_get(ecore_x_window_root_get(ecore_x_window_focus_get()), &wx, &hy); + elm_gengrid_item_size_set(gengrid, wx/3, hy/5); + elm_gengrid_align_set(gengrid, 0.5, 0.0); + elm_gengrid_horizontal_set(gengrid, EINA_FALSE); + elm_gengrid_bounce_set(gengrid, EINA_FALSE, EINA_TRUE); + elm_gengrid_multi_select_set(gengrid, EINA_TRUE); + + evas_object_size_hint_weight_set(gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + grid_itc_empty.item_style = "gridtext_speeddial"; + grid_itc_empty.func.text_get = speed_grid_empty_label_get; + grid_itc_empty.func.content_get = NULL; + grid_itc_empty.func.state_get = NULL; + grid_itc_empty.func.del = NULL; + + grid_itc.item_style = "gridtext_speeddial"; + grid_itc.func.text_get = speed_grid_label_get; + grid_itc.func.content_get = speed_grid_content_get; + grid_itc.func.state_get = NULL; + grid_itc.func.del = NULL; + + evas_object_data_set(gengrid, KEY_SPEED_DATA, speed_d); + + return gengrid; +} + +static void speed_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; + ph_speeddial_data *speed_d = data; + + p_retm_if(NULL == speed_d, "speed data is null"); + + contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_CONTACT_CHANGE, + speed_data_list_changed_cb, speed_d); + contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_SPEEDDIAL_CHANGE, + speed_data_list_changed_cb, speed_d); + + if (speed_d->speeddial_list) + phone_free_speeddial_data(speed_d->speeddial_list); + + if (speed_d->th) { + elm_theme_extension_del(speed_d->th, SPEEDDIAL_THEME_EDJ); + elm_theme_free(speed_d->th); + } + + if (speed_d->popup) + evas_object_del(speed_d->popup); + + if (!speed_d->ug && speed_d->child_ug) + ug_destroy(speed_d->child_ug); + + free(speed_d); + PH_FN_END; +} + +static int speed_create_layout(ph_speeddial_data *speed_d) +{ + Evas_Object *layout; + Evas_Object *gengrid; + + layout = phone_create_base_layout(speed_d->navi, false); + p_retvm_if(NULL == layout, 0, "fail : phone_create_base_layout"); + speed_d->layout = layout; + + gengrid = speed_create_gengrid(speed_d, layout); + p_retvm_if(NULL == gengrid, 0, "fail : _create_check_gengrid"); + speed_d->gengrid = gengrid; + elm_object_part_content_set(layout, "elm.swallow.content", gengrid); + + speed_load_list(speed_d); + speed_fill_gengrid(speed_d); + + evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, + speed_view_delete_cb, speed_d); + return 1; +} + +Evas_Object *ph_speed_create_content(Evas_Object *parent, ph_speeddial_data *speed_d) +{ + Evas_Object *back_btn; + Elm_Theme *th; + int ret; + + th = elm_theme_new(); + elm_theme_ref_set(th, NULL); + elm_theme_extension_add(th, SPEEDDIAL_THEME_EDJ); + speed_d->th = th; + + ret = speed_create_layout(speed_d); + p_retvm_if(0 == ret, NULL, "speed_create_layout is failed"); + + back_btn = elm_button_add(speed_d->layout); + if (speed_d->is_ug) + evas_object_smart_callback_add(back_btn, "clicked", phone_ug_destroy_me_cb, speed_d->ug); + else + evas_object_smart_callback_add(back_btn, "clicked", phone_view_back_btn_cb, speed_d->navi); + + speed_d->navi_item = elm_naviframe_item_push(speed_d->navi, T_(PH_GET_TEXT_BASIC, PHTEXT_SPEEDDIAL), back_btn, + NULL, speed_d->layout, NULL); + elm_object_style_set(back_btn, "naviframe/back_btn/default"); + + speed_navi_set(PH_SPEED_MODE_DEFAULT, speed_d); + + contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE, speed_data_list_changed_cb, speed_d); + contacts_svc_subscribe_change(CTS_SUBSCRIBE_SPEEDDIAL_CHANGE, speed_data_list_changed_cb, speed_d); + return speed_d->layout; +} diff --git a/lib/phoneui/ph-favorite-view.h b/lib/speed/ph-speeddial-view.h index 879494e..491df11 100755 --- a/lib/phoneui/ph-favorite-view.h +++ b/lib/speed/ph-speeddial-view.h @@ -14,36 +14,29 @@ * limitations under the License. */ -#ifndef __PH_FAVORTIE_VIEW_H__ -#define __PH_FAVORTIE_VIEW_H__ +#ifndef __SPEEDDIAL_VIEW_H__ +#define __SPEEDDIAL_VIEW_H__ typedef struct { Evas_Object *win; - Evas_Object *base; Evas_Object *navi; - Elm_Object_Item *navi_item; Evas_Object *layout; - Evas_Object *cbar; - Elm_Object_Item *navi_btn; - Evas_Object *genlist; + Evas_Object *gengrid; Evas_Object *popup; - Evas_Object *box; - Evas_Object *select_all_checkbox; - Eina_List *favorite_list; - Eina_Bool is_all_check; + Elm_Object_Item *navi_item; + Elm_Object_Item *ctrl_item; + Eina_List *speeddial_list; + int cur_dial_num; int checked_cnt; - int favorite_list_count; - int readed_n; - int version; - Ecore_Idler *list_idler; + int speeddial_list_count; + Elm_Theme *th; void *ug; void *child_ug; - ph_progress_info *p_info; -}ph_favorite_data; - -void ph_favor_update_button_status(ph_favorite_data *favor_d); - + bool is_ug; + bool is_edit_mode; +}ph_speeddial_data; -#endif /* __PH_FAVORTIE_VIEW_H__ */ +Evas_Object *ph_speed_create_content(Evas_Object *parent, ph_speeddial_data *speed_d); +#endif /* __SPEEDDIAL_VIEW_H__ */ diff --git a/lib/speed/speeddial-efl.xml b/lib/speed/speeddial-efl.xml new file mode 100644 index 0000000..cd362ae --- /dev/null +++ b/lib/speed/speeddial-efl.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns="http://tizen.org/ns/packages" package="speeddial-efl" version="0.1.0-0" install-location="internal-only"> + <label>speeddial-efl</label> + <author email="ensung.park@samsung.com" href="www.samsung.com">ensung park</author> + <description>speeddial-efl Application</description> + <ui-application appid="speeddial-efl" exec="/opt/ug/bin/speeddial-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> |