summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rwxr-xr-xlib/CMakeLists.txt84
-rwxr-xr-xlib/common/ct-list-detail.c284
-rwxr-xr-xlib/common/ct-list-view-common.c1459
-rwxr-xr-xlib/common/ph-common.c578
-rwxr-xr-xlib/common/ph-detail-log.c404
-rwxr-xr-xlib/common/ph-dialer-speed.c122
-rwxr-xr-xlib/common/ph-text.c293
-rwxr-xr-xlib/ct-front/CMakeLists.txt14
-rw-r--r--lib/ct-front/contacts-tabui-efl.xml29
-rwxr-xr-xlib/ct-front/ct-front-main.c221
-rwxr-xr-xlib/ct-front/ct-front-view.c434
-rwxr-xr-xlib/ct-front/ct-front-view.h23
-rwxr-xr-xlib/details/CMakeLists.txt24
-rw-r--r--lib/details/contacts-details-efl.xml29
-rwxr-xr-xlib/details/ct-detail-history.c665
-rwxr-xr-xlib/details/ct-detail-history.h32
-rwxr-xr-xlib/details/ct-detail-main.c420
-rwxr-xr-xlib/details/ct-detail-utils.c1261
-rwxr-xr-xlib/details/ct-detail-utils.h69
-rwxr-xr-xlib/details/ct-detail-view.c1833
-rwxr-xr-xlib/details/ct-detail-view.h32
-rwxr-xr-xlib/details/ct-input-change-name.c147
-rwxr-xr-xlib/details/ct-input-change-name.h24
-rwxr-xr-xlib/details/ct-input-num-email.c1125
-rwxr-xr-xlib/details/ct-input-num-email.h24
-rwxr-xr-xlib/details/ct-input-utils.c997
-rwxr-xr-xlib/details/ct-input-utils.h53
-rwxr-xr-xlib/details/ct-input-view.c2634
-rwxr-xr-xlib/details/ct-input-view.h24
-rwxr-xr-xlib/dialer/CMakeLists.txt6
-rw-r--r--lib/dialer/dialer-efl.desktop.in10
-rw-r--r--lib/dialer/dialer-efl.xml29
-rwxr-xr-xlib/dialer/ph-dialer-cclist.h20
-rwxr-xr-xlib/dialer/ph-dialer-keystring.c18
-rwxr-xr-xlib/dialer/ph-dialer-keystring.h17
-rwxr-xr-xlib/dialer/ph-dialer-main.c77
-rwxr-xr-xlib/dialer/ph-dialer-search.c34
-rwxr-xr-xlib/dialer/ph-dialer-search.h30
-rwxr-xr-xlib/dialer/ph-dialer-tapi.c252
-rwxr-xr-xlib/dialer/ph-dialer-tapi.h8
-rwxr-xr-xlib/dialer/ph-dialer-utils.c305
-rwxr-xr-xlib/dialer/ph-dialer-utils.h37
-rwxr-xr-x[-rw-r--r--]lib/dialer/ph-dialer-view.c723
-rwxr-xr-xlib/dialer/ph-dialer-view.h19
-rw-r--r--lib/edc/contacts.edc19
-rw-r--r--lib/edc/detail_theme.edc1001
-rwxr-xr-x[-rw-r--r--]lib/edc/dialer.edc645
-rwxr-xr-xlib/edc/dialer_btn.edc99
-rw-r--r--lib/edc/dialer_theme.edc278
-rwxr-xr-xlib/edc/favorites.edc191
-rw-r--r--lib/edc/favorites_theme.edc263
-rw-r--r--lib/edc/gl_title.edc56
-rw-r--r--lib/edc/input_theme.edc1255
-rw-r--r--lib/edc/list.edc64
-rw-r--r--lib/edc/list_theme.edc579
-rw-r--r--lib/edc/progress.edc324
-rw-r--r--lib/edc/speeddial_theme.edc141
-rwxr-xr-xlib/favor/CMakeLists.txt9
-rwxr-xr-xlib/favor/ph-favorite-edit-view.c425
-rw-r--r--lib/favor/ph-favorite-edit-view.h (renamed from lib/phoneui/ph-favorite-edit-view.h)6
-rwxr-xr-xlib/favor/ph-favorite-view.c1636
-rwxr-xr-xlib/favor/ph-favorite-view.h27
-rwxr-xr-x[-rw-r--r--]lib/images/contact_images/00_check_checking.png (renamed from lib/images/dialer_images/C01-3_dialer_btn_01.png)bin3253 -> 3165 bytes
-rw-r--r--lib/images/contact_images/01_controlbar_icon_add-to-bookmarks.pngbin0 -> 1478 bytes
-rw-r--r--lib/images/contact_images/01_controlbar_icon_add_account.pngbin0 -> 3695 bytes
-rw-r--r--lib/images/contact_images/01_controlbar_icon_add_to_contact.pngbin0 -> 4210 bytes
-rw-r--r--lib/images/contact_images/01_controlbar_icon_bluetooth_preview.pngbin0 -> 1920 bytes
-rw-r--r--lib/images/contact_images/01_controlbar_icon_close.pngbin0 -> 1076 bytes
-rw-r--r--lib/images/contact_images/01_controlbar_icon_exchangs_register.pngbin0 -> 4517 bytes
-rw-r--r--lib/images/contact_images/01_controlbar_icon_groups.pngbin0 -> 1195 bytes
-rw-r--r--lib/images/contact_images/01_controlbar_icon_more.png (renamed from lib/images/dialer_images/C01-3_dialer_btn_03.png)bin3350 -> 3061 bytes
-rw-r--r--lib/images/contact_images/C02_account_00.pngbin0 -> 7878 bytes
-rw-r--r--lib/images/contact_images/C02_account_01.pngbin0 -> 5749 bytes
-rw-r--r--lib/images/contact_images/C02_account_02.pngbin0 -> 5217 bytes
-rw-r--r--lib/images/contact_images/C02_account_03.pngbin0 -> 239 bytes
-rw-r--r--lib/images/contact_images/C02_account_04.pngbin0 -> 2909 bytes
-rw-r--r--lib/images/contact_images/C02_account_default.pngbin0 -> 8289 bytes
-rw-r--r--lib/images/contact_images/C02_icon_add_group.pngbin0 -> 7328 bytes
-rw-r--r--lib/images/contact_images/C02_icon_favorite.pngbin0 -> 5068 bytes
-rw-r--r--lib/images/contact_images/C02_icon_favorite_on.pngbin0 -> 5584 bytes
-rw-r--r--lib/images/contact_images/C02_icon_reset.pngbin0 -> 3399 bytes
-rw-r--r--lib/images/contact_images/caller_ID_default_128x128.pngbin0 -> 5099 bytes
-rw-r--r--lib/images/contact_images/caller_ID_default_96x96.pngbin0 -> 4500 bytes
-rw-r--r--lib/images/contact_images/caller_ID_edit.pngbin0 -> 5162 bytes
-rw-r--r--lib/images/contact_images/email.pngbin0 -> 11669 bytes
-rw-r--r--lib/images/contact_images/message.pngbin0 -> 6073 bytes
-rw-r--r--lib/images/dialer_images/C01-3_dialer_btn.pngbin0 -> 3797 bytes
-rw-r--r--lib/images/dialer_images/C01-3_dialer_btn_cal.pngbin0 -> 3815 bytes
-rw-r--r--lib/images/dialer_images/C01-3_dialer_btn_call.pngbin0 -> 3521 bytes
-rw-r--r--lib/images/dialer_images/C01-3_dialer_btn_call_press.pngbin0 -> 6379 bytes
-rw-r--r--lib/images/dialer_images/C01-3_dialer_btn_option_bg.png (renamed from lib/images/dialer_images/C01-3_dialer_btn_02.png)bin3382 -> 3303 bytes
-rw-r--r--lib/images/dialer_images/C01-3_dialer_btn_option_press.pngbin0 -> 3063 bytes
-rw-r--r--lib/images/dialer_images/C01-3_dialer_btn_press.pngbin3484 -> 6379 bytes
-rw-r--r--lib/images/dialer_images/C01-3_dialer_icon_01.pngbin3702 -> 3715 bytes
-rwxr-xr-xlib/images/dialer_images/C01-3_dialer_icon_02(_press).pngbin0 -> 596 bytes
-rw-r--r--lib/images/dialer_images/C01-3_dialer_icon_02.pngbin0 -> 632 bytes
-rwxr-xr-xlib/images/dialer_images/C01-3_dialer_icon_02_press.pngbin0 -> 3404 bytes
-rw-r--r--lib/images/dialer_images/C01-3_dialer_icon_clear.pngbin3869 -> 4701 bytes
-rw-r--r--lib/images/dialer_images/C01-3_dialer_icon_option.pngbin0 -> 2983 bytes
-rw-r--r--lib/images/dialer_images/C01-3_dialer_icon_star.pngbin0 -> 3477 bytes
-rw-r--r--lib/images/dialer_images/C01-3_dialer_search_field_bg.pngbin0 -> 3162 bytes
-rw-r--r--lib/images/dialer_images/C01-3_icon_call.pngbin0 -> 3756 bytes
-rwxr-xr-xlib/images/dialer_images/C01-3_icon_clear.pngbin0 -> 4223 bytes
-rw-r--r--lib/images/dialer_images/C01-3_icon_message.pngbin0 -> 3860 bytes
-rw-r--r--lib/images/dialer_images/C01-3_icon_voicecall.png (renamed from lib/images/dialer_images/C01-3_dialer_icon_video_call_dim.png)bin5243 -> 5365 bytes
-rw-r--r--lib/images/dialer_images/C01_3_dialer_icon_option.pngbin0 -> 3019 bytes
-rw-r--r--lib/images/phoneug_images/00_button_icon_expand_closed.pngbin0 -> 3204 bytes
-rw-r--r--lib/images/phoneug_images/00_button_icon_expand_opened.pngbin0 -> 3250 bytes
-rw-r--r--lib/images/phoneug_images/00_index_list_bg.pngbin0 -> 2812 bytes
-rw-r--r--lib/images/phoneug_images/04_textinput_dialer_icon_voice_mail.pngbin0 -> 3702 bytes
-rw-r--r--lib/images/phoneug_images/C01-4_btn_icon_call_dim.pngbin0 -> 3253 bytes
-rw-r--r--lib/images/phoneug_images/C01-4_btn_icon_message_dim.pngbin0 -> 3341 bytes
-rw-r--r--lib/images/phoneug_images/C01-4_btn_icon_video_call_dim.pngbin0 -> 3173 bytes
-rwxr-xr-xlib/images/phoneug_images/C01-4_list_icon_call.pngbin0 -> 3218 bytes
-rw-r--r--lib/images/phoneug_images/C01-4_list_icon_mms.pngbin0 -> 3355 bytes
-rw-r--r--lib/images/phoneug_images/C01-4_list_icon_sms.pngbin0 -> 3212 bytes
-rw-r--r--lib/images/phoneug_images/C01-4_list_icon_vt-call.png (renamed from lib/images/phoneug_images/C01-4_icon_vt-call.png)bin3094 -> 3094 bytes
-rw-r--r--lib/images/phoneug_images/C02_icon_call.pngbin0 -> 3294 bytes
-rw-r--r--lib/images/phoneug_images/C02_icon_chat_on.pngbin0 -> 3392 bytes
-rw-r--r--lib/images/phoneug_images/C02_icon_filetransfer.pngbin0 -> 3382 bytes
-rw-r--r--lib/images/phoneug_images/C02_icon_message.pngbin0 -> 3330 bytes
-rw-r--r--lib/images/phoneug_images/C02_icon_video_call.pngbin0 -> 3159 bytes
-rw-r--r--[-rwxr-xr-x]lib/images/phoneug_images/caller_ID_default_70x70_man.pngbin2552 -> 5345 bytes
-rw-r--r--lib/images/phoneug_images/phone.pngbin0 -> 7878 bytes
-rwxr-xr-xlib/include/ct-detail.h33
-rw-r--r--lib/include/ct-favor.h74
-rwxr-xr-xlib/include/ct-front.h64
-rwxr-xr-xlib/include/ct-list.h69
-rwxr-xr-xlib/include/ph-front.h (renamed from lib/include/phone-ui.h)43
-rwxr-xr-xlib/include/phone-common.h444
-rwxr-xr-xlib/include/phone-dialer.h66
-rwxr-xr-xlib/include/phone-log.h32
-rwxr-xr-xlib/include/phone-path.h61
-rwxr-xr-xlib/include/phone-speed.h24
-rwxr-xr-xlib/include/phone-text.h198
-rwxr-xr-xlib/list/CMakeLists.txt18
-rw-r--r--lib/list/contacts-list-efl.xml29
-rwxr-xr-xlib/list/ct-list-contact-view.c359
-rwxr-xr-xlib/list/ct-list-contact-view.h22
-rwxr-xr-xlib/list/ct-list-edit-view.c562
-rwxr-xr-xlib/list/ct-list-edit-view.h28
-rwxr-xr-xlib/list/ct-list-main.c514
-rwxr-xr-xlib/list/ct-list-utils.c514
-rwxr-xr-xlib/list/ct-list-utils.h31
-rwxr-xr-xlib/list/ct-list-view-ug.c505
-rw-r--r--lib/list/ct-list-view-ug.h25
-rwxr-xr-xlib/log/CMakeLists.txt6
-rwxr-xr-xlib/log/ph-log-check-view.c183
-rwxr-xr-xlib/log/ph-log-check-view.h1
-rwxr-xr-xlib/log/ph-log-detail-view.c501
-rwxr-xr-xlib/log/ph-log-detail-view.h8
-rwxr-xr-xlib/log/ph-log-main-view.c640
-rwxr-xr-xlib/log/ph-log-main.c121
-rwxr-xr-xlib/log/ph-log-utils.c293
-rwxr-xr-xlib/log/ph-log-utils.h17
-rwxr-xr-xlib/ph-front/CMakeLists.txt14
-rwxr-xr-xlib/ph-front/ph-front-main.c (renamed from lib/phoneui/ph-front-main.c)101
-rwxr-xr-xlib/ph-front/ph-front-view.c473
-rwxr-xr-xlib/ph-front/ph-front-view.h (renamed from lib/phoneui/ph-front-view.h)0
-rw-r--r--lib/ph-front/phone-tabui-efl.xml29
-rwxr-xr-xlib/phoneui/ph-favorite-edit-view.c343
-rwxr-xr-xlib/phoneui/ph-favorite-view.c698
-rwxr-xr-xlib/phoneui/ph-front-view.c382
-rwxr-xr-xlib/settings/CMakeLists.txt13
-rw-r--r--lib/settings/contacts-settings-efl.xml29
-rwxr-xr-xlib/settings/ct-setting-main.c156
-rwxr-xr-xlib/settings/ct-setting-view.c1140
-rwxr-xr-xlib/settings/ct-setting-view.h55
-rwxr-xr-xlib/speed/CMakeLists.txt (renamed from lib/phoneui/CMakeLists.txt)8
-rwxr-xr-xlib/speed/ph-speeddial-main.c206
-rwxr-xr-xlib/speed/ph-speeddial-view.c555
-rwxr-xr-xlib/speed/ph-speeddial-view.h (renamed from lib/phoneui/ph-favorite-view.h)35
-rw-r--r--lib/speed/speeddial-efl.xml29
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>&#8203;</>"
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
index b809797..c6ce824 100644..100755
--- a/lib/images/dialer_images/C01-3_dialer_btn_01.png
+++ b/lib/images/contact_images/00_check_checking.png
Binary files differ
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
new file mode 100644
index 0000000..bc2e48b
--- /dev/null
+++ b/lib/images/contact_images/01_controlbar_icon_add-to-bookmarks.png
Binary files differ
diff --git a/lib/images/contact_images/01_controlbar_icon_add_account.png b/lib/images/contact_images/01_controlbar_icon_add_account.png
new file mode 100644
index 0000000..e5803cd
--- /dev/null
+++ b/lib/images/contact_images/01_controlbar_icon_add_account.png
Binary files differ
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
new file mode 100644
index 0000000..65d47e4
--- /dev/null
+++ b/lib/images/contact_images/01_controlbar_icon_add_to_contact.png
Binary files differ
diff --git a/lib/images/contact_images/01_controlbar_icon_bluetooth_preview.png b/lib/images/contact_images/01_controlbar_icon_bluetooth_preview.png
new file mode 100644
index 0000000..99946bb
--- /dev/null
+++ b/lib/images/contact_images/01_controlbar_icon_bluetooth_preview.png
Binary files differ
diff --git a/lib/images/contact_images/01_controlbar_icon_close.png b/lib/images/contact_images/01_controlbar_icon_close.png
new file mode 100644
index 0000000..91b04e5
--- /dev/null
+++ b/lib/images/contact_images/01_controlbar_icon_close.png
Binary files differ
diff --git a/lib/images/contact_images/01_controlbar_icon_exchangs_register.png b/lib/images/contact_images/01_controlbar_icon_exchangs_register.png
new file mode 100644
index 0000000..58c6e27
--- /dev/null
+++ b/lib/images/contact_images/01_controlbar_icon_exchangs_register.png
Binary files differ
diff --git a/lib/images/contact_images/01_controlbar_icon_groups.png b/lib/images/contact_images/01_controlbar_icon_groups.png
new file mode 100644
index 0000000..e793512
--- /dev/null
+++ b/lib/images/contact_images/01_controlbar_icon_groups.png
Binary files differ
diff --git a/lib/images/dialer_images/C01-3_dialer_btn_03.png b/lib/images/contact_images/01_controlbar_icon_more.png
index de780cf..651c8e1 100644
--- a/lib/images/dialer_images/C01-3_dialer_btn_03.png
+++ b/lib/images/contact_images/01_controlbar_icon_more.png
Binary files differ
diff --git a/lib/images/contact_images/C02_account_00.png b/lib/images/contact_images/C02_account_00.png
new file mode 100644
index 0000000..d66d58b
--- /dev/null
+++ b/lib/images/contact_images/C02_account_00.png
Binary files differ
diff --git a/lib/images/contact_images/C02_account_01.png b/lib/images/contact_images/C02_account_01.png
new file mode 100644
index 0000000..f5d015f
--- /dev/null
+++ b/lib/images/contact_images/C02_account_01.png
Binary files differ
diff --git a/lib/images/contact_images/C02_account_02.png b/lib/images/contact_images/C02_account_02.png
new file mode 100644
index 0000000..0c48c5d
--- /dev/null
+++ b/lib/images/contact_images/C02_account_02.png
Binary files differ
diff --git a/lib/images/contact_images/C02_account_03.png b/lib/images/contact_images/C02_account_03.png
new file mode 100644
index 0000000..4ba46fc
--- /dev/null
+++ b/lib/images/contact_images/C02_account_03.png
Binary files differ
diff --git a/lib/images/contact_images/C02_account_04.png b/lib/images/contact_images/C02_account_04.png
new file mode 100644
index 0000000..4b0bf0b
--- /dev/null
+++ b/lib/images/contact_images/C02_account_04.png
Binary files differ
diff --git a/lib/images/contact_images/C02_account_default.png b/lib/images/contact_images/C02_account_default.png
new file mode 100644
index 0000000..a6c579c
--- /dev/null
+++ b/lib/images/contact_images/C02_account_default.png
Binary files differ
diff --git a/lib/images/contact_images/C02_icon_add_group.png b/lib/images/contact_images/C02_icon_add_group.png
new file mode 100644
index 0000000..2e5e5b6
--- /dev/null
+++ b/lib/images/contact_images/C02_icon_add_group.png
Binary files differ
diff --git a/lib/images/contact_images/C02_icon_favorite.png b/lib/images/contact_images/C02_icon_favorite.png
new file mode 100644
index 0000000..3792de0
--- /dev/null
+++ b/lib/images/contact_images/C02_icon_favorite.png
Binary files differ
diff --git a/lib/images/contact_images/C02_icon_favorite_on.png b/lib/images/contact_images/C02_icon_favorite_on.png
new file mode 100644
index 0000000..69608a3
--- /dev/null
+++ b/lib/images/contact_images/C02_icon_favorite_on.png
Binary files differ
diff --git a/lib/images/contact_images/C02_icon_reset.png b/lib/images/contact_images/C02_icon_reset.png
new file mode 100644
index 0000000..af4e43a
--- /dev/null
+++ b/lib/images/contact_images/C02_icon_reset.png
Binary files differ
diff --git a/lib/images/contact_images/caller_ID_default_128x128.png b/lib/images/contact_images/caller_ID_default_128x128.png
new file mode 100644
index 0000000..40ebebb
--- /dev/null
+++ b/lib/images/contact_images/caller_ID_default_128x128.png
Binary files differ
diff --git a/lib/images/contact_images/caller_ID_default_96x96.png b/lib/images/contact_images/caller_ID_default_96x96.png
new file mode 100644
index 0000000..271c3bf
--- /dev/null
+++ b/lib/images/contact_images/caller_ID_default_96x96.png
Binary files differ
diff --git a/lib/images/contact_images/caller_ID_edit.png b/lib/images/contact_images/caller_ID_edit.png
new file mode 100644
index 0000000..90999b9
--- /dev/null
+++ b/lib/images/contact_images/caller_ID_edit.png
Binary files differ
diff --git a/lib/images/contact_images/email.png b/lib/images/contact_images/email.png
new file mode 100644
index 0000000..145a92f
--- /dev/null
+++ b/lib/images/contact_images/email.png
Binary files differ
diff --git a/lib/images/contact_images/message.png b/lib/images/contact_images/message.png
new file mode 100644
index 0000000..8bf4018
--- /dev/null
+++ b/lib/images/contact_images/message.png
Binary files differ
diff --git a/lib/images/dialer_images/C01-3_dialer_btn.png b/lib/images/dialer_images/C01-3_dialer_btn.png
new file mode 100644
index 0000000..ab42aa5
--- /dev/null
+++ b/lib/images/dialer_images/C01-3_dialer_btn.png
Binary files differ
diff --git a/lib/images/dialer_images/C01-3_dialer_btn_cal.png b/lib/images/dialer_images/C01-3_dialer_btn_cal.png
new file mode 100644
index 0000000..801dd90
--- /dev/null
+++ b/lib/images/dialer_images/C01-3_dialer_btn_cal.png
Binary files differ
diff --git a/lib/images/dialer_images/C01-3_dialer_btn_call.png b/lib/images/dialer_images/C01-3_dialer_btn_call.png
new file mode 100644
index 0000000..d427249
--- /dev/null
+++ b/lib/images/dialer_images/C01-3_dialer_btn_call.png
Binary files differ
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
new file mode 100644
index 0000000..90bdf97
--- /dev/null
+++ b/lib/images/dialer_images/C01-3_dialer_btn_call_press.png
Binary files differ
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
index 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
Binary files differ
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
new file mode 100644
index 0000000..76cbd46
--- /dev/null
+++ b/lib/images/dialer_images/C01-3_dialer_btn_option_press.png
Binary files differ
diff --git a/lib/images/dialer_images/C01-3_dialer_btn_press.png b/lib/images/dialer_images/C01-3_dialer_btn_press.png
index 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
Binary files differ
diff --git a/lib/images/dialer_images/C01-3_dialer_icon_01.png b/lib/images/dialer_images/C01-3_dialer_icon_01.png
index 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
Binary files differ
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
new file mode 100755
index 0000000..fdbe922
--- /dev/null
+++ b/lib/images/dialer_images/C01-3_dialer_icon_02(_press).png
Binary files differ
diff --git a/lib/images/dialer_images/C01-3_dialer_icon_02.png b/lib/images/dialer_images/C01-3_dialer_icon_02.png
new file mode 100644
index 0000000..4aba300
--- /dev/null
+++ b/lib/images/dialer_images/C01-3_dialer_icon_02.png
Binary files differ
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
new file mode 100755
index 0000000..0aeb324
--- /dev/null
+++ b/lib/images/dialer_images/C01-3_dialer_icon_02_press.png
Binary files differ
diff --git a/lib/images/dialer_images/C01-3_dialer_icon_clear.png b/lib/images/dialer_images/C01-3_dialer_icon_clear.png
index 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
Binary files differ
diff --git a/lib/images/dialer_images/C01-3_dialer_icon_option.png b/lib/images/dialer_images/C01-3_dialer_icon_option.png
new file mode 100644
index 0000000..b524878
--- /dev/null
+++ b/lib/images/dialer_images/C01-3_dialer_icon_option.png
Binary files differ
diff --git a/lib/images/dialer_images/C01-3_dialer_icon_star.png b/lib/images/dialer_images/C01-3_dialer_icon_star.png
new file mode 100644
index 0000000..d3893b4
--- /dev/null
+++ b/lib/images/dialer_images/C01-3_dialer_icon_star.png
Binary files differ
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
new file mode 100644
index 0000000..c80a019
--- /dev/null
+++ b/lib/images/dialer_images/C01-3_dialer_search_field_bg.png
Binary files differ
diff --git a/lib/images/dialer_images/C01-3_icon_call.png b/lib/images/dialer_images/C01-3_icon_call.png
new file mode 100644
index 0000000..767fd97
--- /dev/null
+++ b/lib/images/dialer_images/C01-3_icon_call.png
Binary files differ
diff --git a/lib/images/dialer_images/C01-3_icon_clear.png b/lib/images/dialer_images/C01-3_icon_clear.png
new file mode 100755
index 0000000..94fe6de
--- /dev/null
+++ b/lib/images/dialer_images/C01-3_icon_clear.png
Binary files differ
diff --git a/lib/images/dialer_images/C01-3_icon_message.png b/lib/images/dialer_images/C01-3_icon_message.png
new file mode 100644
index 0000000..e53f31a
--- /dev/null
+++ b/lib/images/dialer_images/C01-3_icon_message.png
Binary files differ
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
index 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
Binary files differ
diff --git a/lib/images/dialer_images/C01_3_dialer_icon_option.png b/lib/images/dialer_images/C01_3_dialer_icon_option.png
new file mode 100644
index 0000000..1d435fd
--- /dev/null
+++ b/lib/images/dialer_images/C01_3_dialer_icon_option.png
Binary files differ
diff --git a/lib/images/phoneug_images/00_button_icon_expand_closed.png b/lib/images/phoneug_images/00_button_icon_expand_closed.png
new file mode 100644
index 0000000..acca071
--- /dev/null
+++ b/lib/images/phoneug_images/00_button_icon_expand_closed.png
Binary files differ
diff --git a/lib/images/phoneug_images/00_button_icon_expand_opened.png b/lib/images/phoneug_images/00_button_icon_expand_opened.png
new file mode 100644
index 0000000..cd36ac1
--- /dev/null
+++ b/lib/images/phoneug_images/00_button_icon_expand_opened.png
Binary files differ
diff --git a/lib/images/phoneug_images/00_index_list_bg.png b/lib/images/phoneug_images/00_index_list_bg.png
new file mode 100644
index 0000000..f41ec7c
--- /dev/null
+++ b/lib/images/phoneug_images/00_index_list_bg.png
Binary files differ
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
new file mode 100644
index 0000000..6d7fbc3
--- /dev/null
+++ b/lib/images/phoneug_images/04_textinput_dialer_icon_voice_mail.png
Binary files differ
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
new file mode 100644
index 0000000..d2a68f6
--- /dev/null
+++ b/lib/images/phoneug_images/C01-4_btn_icon_call_dim.png
Binary files differ
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
new file mode 100644
index 0000000..485ff79
--- /dev/null
+++ b/lib/images/phoneug_images/C01-4_btn_icon_message_dim.png
Binary files differ
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
new file mode 100644
index 0000000..29ce012
--- /dev/null
+++ b/lib/images/phoneug_images/C01-4_btn_icon_video_call_dim.png
Binary files differ
diff --git a/lib/images/phoneug_images/C01-4_list_icon_call.png b/lib/images/phoneug_images/C01-4_list_icon_call.png
new file mode 100755
index 0000000..576ecab
--- /dev/null
+++ b/lib/images/phoneug_images/C01-4_list_icon_call.png
Binary files differ
diff --git a/lib/images/phoneug_images/C01-4_list_icon_mms.png b/lib/images/phoneug_images/C01-4_list_icon_mms.png
new file mode 100644
index 0000000..aef7f9c
--- /dev/null
+++ b/lib/images/phoneug_images/C01-4_list_icon_mms.png
Binary files differ
diff --git a/lib/images/phoneug_images/C01-4_list_icon_sms.png b/lib/images/phoneug_images/C01-4_list_icon_sms.png
new file mode 100644
index 0000000..399733d
--- /dev/null
+++ b/lib/images/phoneug_images/C01-4_list_icon_sms.png
Binary files differ
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
index 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
Binary files differ
diff --git a/lib/images/phoneug_images/C02_icon_call.png b/lib/images/phoneug_images/C02_icon_call.png
new file mode 100644
index 0000000..0b1038e
--- /dev/null
+++ b/lib/images/phoneug_images/C02_icon_call.png
Binary files differ
diff --git a/lib/images/phoneug_images/C02_icon_chat_on.png b/lib/images/phoneug_images/C02_icon_chat_on.png
new file mode 100644
index 0000000..290857a
--- /dev/null
+++ b/lib/images/phoneug_images/C02_icon_chat_on.png
Binary files differ
diff --git a/lib/images/phoneug_images/C02_icon_filetransfer.png b/lib/images/phoneug_images/C02_icon_filetransfer.png
new file mode 100644
index 0000000..ad235c7
--- /dev/null
+++ b/lib/images/phoneug_images/C02_icon_filetransfer.png
Binary files differ
diff --git a/lib/images/phoneug_images/C02_icon_message.png b/lib/images/phoneug_images/C02_icon_message.png
new file mode 100644
index 0000000..1eddabc
--- /dev/null
+++ b/lib/images/phoneug_images/C02_icon_message.png
Binary files differ
diff --git a/lib/images/phoneug_images/C02_icon_video_call.png b/lib/images/phoneug_images/C02_icon_video_call.png
new file mode 100644
index 0000000..6c928ce
--- /dev/null
+++ b/lib/images/phoneug_images/C02_icon_video_call.png
Binary files differ
diff --git a/lib/images/phoneug_images/caller_ID_default_70x70_man.png b/lib/images/phoneug_images/caller_ID_default_70x70_man.png
index 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
Binary files differ
diff --git a/lib/images/phoneug_images/phone.png b/lib/images/phoneug_images/phone.png
new file mode 100644
index 0000000..d66d58b
--- /dev/null
+++ b/lib/images/phoneug_images/phone.png
Binary files differ
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>