summaryrefslogtreecommitdiff
path: root/lib/log/ph-log-detail-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/log/ph-log-detail-view.c')
-rwxr-xr-xlib/log/ph-log-detail-view.c1153
1 files changed, 1153 insertions, 0 deletions
diff --git a/lib/log/ph-log-detail-view.c b/lib/log/ph-log-detail-view.c
new file mode 100755
index 0000000..387edae
--- /dev/null
+++ b/lib/log/ph-log-detail-view.c
@@ -0,0 +1,1153 @@
+/*
+* 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://floralicense.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 <vconf.h>
+#include <vconf-keys.h>
+#include <ui-gadget-module.h>
+
+#include "phone.h"
+#include "phone-log.h"
+#include "ph-log-utils.h"
+#include "ph-log-detail-view.h"
+
+#include <feedback.h>
+#include <msg.h>
+
+#define KEY_LOG_DETAIL_DATA "logdetail_d"
+
+enum LOG_DETAIL_ITC_TYPE {
+ LOG_DETAIL_ITC_TOP_INFO_NAMED = 0,
+ LOG_DETAIL_ITC_TOP_INFO_NONAMED,
+
+ LOG_DETAIL_ITC_TOP_BTNS,
+ LOG_DETAIL_ITC_DETAIL,
+ LOG_DETAIL_ITC_TITLE,
+ LOG_DETAIL_ITC_MAX,
+};
+
+static Elm_Genlist_Item_Class log_detail_itcs[LOG_DETAIL_ITC_MAX] = {
+ {.item_style="2text.2icon.1"},
+ {.item_style="1text.1icon.7"},
+ {.item_style="dialogue/bg/2icon"},
+ {.item_style="dialogue/3text.2icon"},
+ {.item_style="grouptitle"},
+};
+
+typedef struct
+{
+ int plog_id;
+ 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)
+{
+ ph_log_detail_data *logdetail_d = (ph_log_detail_data *)data;
+ logdetail_d->child_ug = NULL;
+ ph_log_detail_set_toolbar(logdetail_d);
+}
+
+static void log_detail_msg_btn_pressed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ p_retm_if(NULL == data, "data is NULL");
+ elm_icon_file_set(data, PH_IMG_ICON_SMS_PRESSED, NULL);
+}
+
+static void log_detail_msg_btn_unpressed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ p_retm_if(NULL == data, "data is NULL");
+ elm_icon_file_set(data, PH_IMG_ICON_SMS, NULL);
+}
+
+static void log_detail_msg_btn_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ph_log_detail_data *logdetail_d = (ph_log_detail_data *)data;
+ p_retm_if(NULL == logdetail_d, "log_info is NULL");
+ ph_log_util_svi_play(FEEDBACK_PATTERN_TOUCH_TAP , FEEDBACK_PATTERN_TOUCH_TAP);
+
+ p_retm_if(1 == aul_app_is_running(VIDEOCALL_PKG), "vtcall is running");
+ p_retm_if(1 == aul_app_is_running(VOICECALL_PKG), "voice call is running");
+
+ 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_pressed_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ p_retm_if(NULL == data, "data is NULL");
+ elm_icon_file_set(data, PH_IMG_ICON_CALL_PRESSED, NULL);
+}
+
+static void log_detail_call_btn_unpressed_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ p_retm_if(NULL == data, "data is NULL");
+ elm_icon_file_set(data, PH_IMG_CIRCLE_ICON_CALL, NULL);
+}
+
+static void log_detail_call_btn_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ph_log_detail_data *logdetail_d = (ph_log_detail_data *)data;
+ p_retm_if(NULL == logdetail_d, "log_info is NULL");
+ ph_log_util_svi_play(FEEDBACK_PATTERN_TOUCH_TAP , FEEDBACK_PATTERN_TOUCH_TAP);
+ phone_launch_voice_call(logdetail_d->contact_id, logdetail_d->log_number);
+}
+
+
+
+
+static int log_detail_is_msg_type(int type)
+{
+ switch (type) {
+ case CONTACTS_PLOG_TYPE_SMS_INCOMMING:
+ case CONTACTS_PLOG_TYPE_SMS_OUTGOING:
+ case CONTACTS_PLOG_TYPE_SMS_BLOCKED:
+ case CONTACTS_PLOG_TYPE_MMS_INCOMMING:
+ case CONTACTS_PLOG_TYPE_MMS_OUTGOING:
+ case CONTACTS_PLOG_TYPE_MMS_BLOCKED:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+static void log_detail_gl_realized(void *data, Evas_Object *obj, void *ei)
+{
+ p_retm_if(obj == NULL, "obj is null");
+ p_retm_if(ei == NULL, "ei is null");
+
+ ph_log_detail_data *logdetail_d;
+ logdetail_d = evas_object_data_get(obj, KEY_LOG_DETAIL_DATA);
+
+ int first = 0;
+
+ if (logdetail_d->log_number && *logdetail_d->log_number)
+ first = 5;
+ else
+ first = 3;
+ int last = (int)elm_genlist_items_count(obj) - 1;
+ int index = elm_genlist_item_index_get(ei);
+
+ if (last == first)
+ return;
+
+ if (index == first)
+ elm_object_item_signal_emit(ei, "elm,state,top", "");
+ else if (index == last)
+ elm_object_item_signal_emit(ei, "elm,state,bottom", "");
+ else if (index > first && index < last)
+ elm_object_item_signal_emit(ei, "elm,state,center", "");
+
+ return;
+}
+
+static void log_detail_append_separator(Evas_Object *genlist, bool isEnd)
+{
+ static Elm_Genlist_Item_Class itc[2] = {
+ {.item_style="dialogue/separator/end"},
+ {.item_style="dialogue/separator/10"}
+ };
+
+ Elm_Object_Item *item;
+ if (isEnd)
+ item = elm_genlist_item_append(genlist, &itc[0], NULL, NULL,ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ else
+ item = elm_genlist_item_append(genlist, &itc[1], NULL, NULL,ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+}
+
+static void log_detail_fill_genlist(ph_log_detail_data *logdetail_d)
+{
+ PH_FN_CALL;
+ Eina_List *l;
+ ph_log_detail_info * l_detail_info;
+ Elm_Object_Item *git;
+
+ p_retm_if(NULL == logdetail_d->genlist, "Genlist is null");
+ if (logdetail_d->log_display)
+ logdetail_d->top_item = elm_genlist_item_append(logdetail_d->genlist, &log_detail_itcs[LOG_DETAIL_ITC_TOP_INFO_NAMED], logdetail_d,
+ NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ else
+ logdetail_d->top_item = elm_genlist_item_append(logdetail_d->genlist, &log_detail_itcs[LOG_DETAIL_ITC_TOP_INFO_NONAMED], logdetail_d,
+ NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+ if (logdetail_d->log_number) {
+ elm_genlist_item_append(logdetail_d->genlist, &log_detail_itcs[LOG_DETAIL_ITC_TOP_BTNS], logdetail_d, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ log_detail_append_separator(logdetail_d->genlist, false);
+ }
+ l_detail_info = (ph_log_detail_info*)eina_list_data_get(eina_list_last (logdetail_d->log_list));
+ git = elm_genlist_item_append(logdetail_d->genlist, &log_detail_itcs[LOG_DETAIL_ITC_TITLE], l_detail_info,
+ NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL);
+ elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_NONE);
+ EINA_LIST_FOREACH(logdetail_d->log_list, l, l_detail_info) {
+ Elm_Object_Item * it;
+ if (!l_detail_info) continue;
+ it = elm_genlist_item_append(logdetail_d->genlist, &log_detail_itcs[LOG_DETAIL_ITC_DETAIL], l_detail_info,
+ git, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ }
+ log_detail_append_separator(logdetail_d->genlist, true);
+}
+
+static void log_detail_free_log_data(Eina_List *list)
+{
+ Eina_List *l;
+ ph_log_detail_info *l_detail_info;
+ p_retm_if(NULL == list, "data is null");
+
+ 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);
+}
+
+contacts_error_e log_detail_get_list(const char *view_uri, int property_id, const char* match_value, contacts_list_h *out_list)
+{
+ contacts_error_e err = CONTACTS_ERROR_NONE;
+ contacts_filter_h filter = NULL;
+ contacts_query_h query = NULL;
+
+ p_retvm_if(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER, "parameter(out_list) is NULL");
+
+ err = contacts_filter_create(view_uri, &filter);
+ p_retvm_if(CONTACTS_ERROR_NONE != err, err, "contactcs_filter_create() Failed(%d)", err);
+
+ do {
+ if (CONTACTS_ERROR_NONE != (err = contacts_filter_add_str(filter, property_id, CONTACTS_MATCH_FULLSTRING, match_value))) break;
+ if (CONTACTS_ERROR_NONE != (err = contacts_query_create(view_uri, &query))) break;
+ if (CONTACTS_ERROR_NONE != (err = contacts_query_set_filter(query, filter))) break;
+ if (CONTACTS_ERROR_NONE != (err = contacts_db_get_records_with_query(query, 0, 0, out_list))) break;
+
+ contacts_filter_destroy(filter);
+ contacts_query_destroy(query);
+
+ return CONTACTS_ERROR_NONE;
+ } while (0);
+
+ contacts_filter_destroy(filter);
+ contacts_query_destroy(query);
+
+ return err;
+}
+
+static char* log_detail_get_custom_number_type(int contact_id, const char* req_number)
+{
+ contacts_error_e err = CONTACTS_ERROR_NONE;
+ contacts_list_h num_list = NULL;
+ char *out_num = NULL;
+ char *out_label = NULL;
+
+ if (contact_id > 0) {
+ err = phone_cts_get_list(_contacts_person_number._uri, _contacts_person_number.person_id, contact_id, &num_list);
+ if (CONTACTS_ERROR_NONE == err) {
+ while(CONTACTS_ERROR_NONE == err) {
+ err = phone_cts_get_str_from_list(num_list, _contacts_person_number.number, &out_num);
+ if (err == CONTACTS_ERROR_NONE && strcmp(req_number, out_num) == 0) {
+ err = phone_cts_get_str_from_list(num_list, _contacts_person_number.label, &out_label);
+ break;
+ }
+ err = contacts_list_next(num_list);
+ }
+ }
+ contacts_list_destroy(num_list, true);
+ }
+
+ if (err == CONTACTS_ERROR_NONE && out_label && *out_label)
+ return strdup(out_label);
+ else
+ return T_(CT_GET_TEXT_NUM_TYPE, CTTEXT_TYPE_OTHER);
+
+}
+
+static void log_detail_get_contact_info(char *req_number, ph_log_detail_data *logdetail_d)
+{
+ int index;
+ contacts_error_e err = CONTACTS_ERROR_NONE;
+ contacts_record_h out_contact = NULL;
+ contacts_list_h num_list = NULL;
+ char *out_num;
+
+ p_retm_if(NULL == req_number, "Parameter is null");
+ free(logdetail_d->log_display);
+ logdetail_d->log_display = NULL;
+ free(logdetail_d->log_img_path);
+ logdetail_d->log_img_path = NULL;
+
+ index = 0;
+ if (logdetail_d->contact_id > 0) {
+ err = phone_cts_get_list(_contacts_person_number._uri, _contacts_person_number.person_id, logdetail_d->contact_id, &num_list);
+ if (CONTACTS_ERROR_NONE == err) {
+ while(CONTACTS_ERROR_NONE == err) {
+ err = phone_cts_get_str_from_list(num_list, _contacts_person_number.number, &out_num);
+ if (err == CONTACTS_ERROR_NONE && strcmp(req_number, out_num) == 0) {
+ index = logdetail_d->contact_id;
+ break;
+ }
+ err = contacts_list_next(num_list);
+ }
+ }
+ contacts_list_destroy(num_list, true);
+ }
+
+ if (index <= 0)
+ {
+ err = log_detail_get_list(_contacts_person_number._uri, _contacts_person_number.number, req_number, &num_list);
+ if (CONTACTS_ERROR_NONE == err) {
+ unsigned int count = 0;
+ contacts_list_get_count(num_list, &count);
+ if (count > 0)
+ {
+ phone_cts_get_int_from_list(num_list, _contacts_person_number.person_id, &index);
+ PH_DBG("FOUND ONE: %d", index);
+ }
+
+ }
+ contacts_list_destroy(num_list, true);
+ }
+
+ if (index > 0) {
+ err = contacts_db_get_record( _contacts_person._uri, index, &out_contact);
+ if (err < CONTACTS_ERROR_NONE)
+ ERR("contacts_db_get_record is failed");
+ else {
+ contacts_record_get_str(out_contact, _contacts_person.display_name, &logdetail_d->log_display);
+ logdetail_d->contact_id = index;
+ contacts_record_get_str(out_contact, _contacts_person.image_thumbnail_path, &logdetail_d->log_img_path);
+ contacts_record_destroy(out_contact, true);
+ PH_DBG("updated) name: %s, id: %d, imgpath: %s", logdetail_d->log_display, logdetail_d->contact_id, logdetail_d->log_img_path);
+ return;
+ }
+ }
+ logdetail_d->contact_id = 0;
+}
+
+static void log_detail_view_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ph_log_detail_data *logdetail_d = data;
+ p_retm_if(NULL == logdetail_d, "detail data is null");
+
+ if (0 < logdetail_d->contact_id)
+ {
+ PH_DBG("requested ID: %d", 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)
+{
+ ph_log_detail_data *logdetail_d = data;
+ logdetail_d->child_ug = phone_launch_contact_add_list_edit_ug(logdetail_d->ug, logdetail_d->log_number,
+ log_detail_destroy_child_ug, logdetail_d);
+}
+
+static void log_detail_update_view_with_contact_cb(const char* view_uri, void* data)
+{
+ PH_FN_CALL;
+ ph_log_detail_data *logdetail_d = data;
+ log_detail_get_contact_info(logdetail_d->log_number, logdetail_d);
+
+ if (logdetail_d->top_item)
+ elm_object_item_del(logdetail_d->top_item);
+ if (logdetail_d->log_display)
+ logdetail_d->top_item = elm_genlist_item_prepend(logdetail_d->genlist, &log_detail_itcs[LOG_DETAIL_ITC_TOP_INFO_NAMED], logdetail_d,
+ NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ else
+ logdetail_d->top_item = elm_genlist_item_prepend(logdetail_d->genlist, &log_detail_itcs[LOG_DETAIL_ITC_TOP_INFO_NONAMED], logdetail_d,
+ NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+ Elm_Object_Item *navi_it = elm_naviframe_top_item_get(logdetail_d->navi);
+ p_retm_if(NULL == navi_it, "navi item is NULL");
+
+ Evas_Object * contact_btn = elm_object_item_part_content_unset(navi_it, "toolbar_button2");
+ if (contact_btn)
+ evas_object_del(contact_btn);
+
+//contact button
+ if (logdetail_d->contact_id) // view button
+ contact_btn = phone_create_toolbar_btn(logdetail_d->navi, T_(CT_GET_TEXT_BASIC, CTTEXT_VIEW), log_detail_view_clicked_cb, logdetail_d);
+ else if (logdetail_d->log_number) // save button
+ contact_btn = phone_create_toolbar_btn(logdetail_d->navi, S_(PH_SYS_OPT_ADD_TO_CONTACTS), log_detail_add_contact_btn_cb, logdetail_d);
+ elm_object_item_part_content_set(navi_it, "toolbar_button2", contact_btn);
+ elm_object_style_set(contact_btn, "naviframe/toolbar/right");
+
+ return;
+}
+
+static void log_detail_delete_confirm_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ PH_FN_CALL;
+ int ret = CONTACTS_ERROR_NONE;
+ 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;
+
+ l = logdetail_d->log_list;
+ EINA_LIST_FOREACH(l, l, l_info) {
+ ret = contacts_db_delete_record( _contacts_phone_log._uri, l_info->plog_id);
+ if (CONTACTS_ERROR_NONE != ret)
+ break;
+ }
+
+ if (CONTACTS_ERROR_NONE != ret) {
+ phone_show_tickernoti(S_(PH_SYS_POP_FAILED));
+ }
+ else {
+ evas_object_data_del(logdetail_d->navi, KEY_LOG_DETAIL_DATA);
+ elm_naviframe_item_pop(logdetail_d->navi);
+ phone_show_tickernoti(S_(PH_SYS_POP_DELETED));
+ }
+}
+
+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));
+ 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)
+{
+ ph_log_detail_data *logdetail_d = data;
+ if (0 == strcmp(part, "elm.icon")) {
+ }
+ else if (0 == strcmp(part, "elm.icon.2")) {
+ Evas_Object *detail_img = NULL;
+ if (logdetail_d->log_img_path)
+ detail_img = phone_create_icon_with_img(obj, logdetail_d->log_img_path);
+ else
+ detail_img = phone_create_icon_with_img(obj, IMG_DEFAULT);
+ if (detail_img)
+ evas_object_size_hint_aspect_set(detail_img, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1);
+ return detail_img;
+ }
+ return NULL;
+}
+
+void log_detail_destroy_list_child_ug(void *data)
+{
+ ph_log_detail_data *logdetail_d = data;
+ logdetail_d->child_ug = NULL;
+
+}
+
+
+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;
+ Evas_Smart_Cb pressed_fn;
+ Evas_Smart_Cb unpressed_fn;
+ ph_log_detail_data *logdetail_d = data;
+
+ p_retv_if(NULL == data, NULL);
+
+ if (0 == strcmp(part, "elm.icon.1")) {
+ fullpath = PH_IMG_CIRCLE_ICON_CALL;
+ clicked_fn = log_detail_call_btn_cb;
+ pressed_fn = log_detail_call_btn_pressed_cb;
+ unpressed_fn = log_detail_call_btn_unpressed_cb;
+ }
+ else if (0 == strcmp(part, "elm.icon.2")) {
+ fullpath = PH_IMG_ICON_SMS;
+ clicked_fn = log_detail_msg_btn_cb;
+ pressed_fn = log_detail_msg_btn_pressed_cb;
+ unpressed_fn = log_detail_msg_btn_unpressed_cb;
+ }
+ else {
+ return NULL;
+ }
+
+ btn = elm_button_add(obj);
+ p_retvm_if(NULL == btn, NULL, "elm_button_add() return NULL");
+ elm_object_style_set(btn, "logdetail.circle/empty");
+
+ 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_TRUE, EINA_TRUE);
+ elm_object_part_content_set(btn, "elm.swallow.content", icon);
+ evas_object_smart_callback_add(btn, "clicked", clicked_fn, logdetail_d);
+ evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_DOWN, pressed_fn, icon);
+ evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_UP, unpressed_fn, icon);
+
+ if (!logdetail_d->log_number || !*logdetail_d->log_number)
+ elm_object_disabled_set(btn, EINA_TRUE);
+
+ return btn;
+}
+
+static char *log_detail_gl_top_info_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ PH_FN_CALL;
+ ph_log_detail_data *logdetail_d = data;
+ char buf[PATH_MAX] = {0};
+
+ if (0 == strcmp(part, "elm.text")) {
+ if (logdetail_d->log_number && *logdetail_d->log_number)
+ if (logdetail_d->log_list_count > 1)
+ snprintf(buf, sizeof(buf), "%s (%d)", logdetail_d->log_number, logdetail_d->log_list_count);
+ else
+ snprintf(buf, sizeof(buf), "%s",logdetail_d->log_number);
+ else
+ snprintf(buf, sizeof(buf), "%s (%d)", S_(PH_SYS_BODY_UNKNOWN), logdetail_d->log_list_count);
+ return strdup(buf);
+ }
+ else if (0 == strcmp(part, "elm.text.1")) {
+ if (logdetail_d->log_display && *logdetail_d->log_display)
+ if (logdetail_d->log_list_count > 1)
+ snprintf(buf, sizeof(buf), "%s (%d)",logdetail_d->log_display, logdetail_d->log_list_count);
+ else
+ snprintf(buf, sizeof(buf), "%s",logdetail_d->log_display);
+ else if (logdetail_d->log_number && *logdetail_d->log_number)
+ if (logdetail_d->log_list_count > 1)
+ snprintf(buf, sizeof(buf), "%s (%d)", logdetail_d->log_number, logdetail_d->log_list_count);
+ else
+ snprintf(buf, sizeof(buf), "%s",logdetail_d->log_number);
+ else
+ snprintf(buf, sizeof(buf), "%s (%d)", S_(PH_SYS_BODY_UNKNOWN), logdetail_d->log_list_count);
+ return strdup(buf);
+ }
+ else if (0 == strcmp(part, "elm.text.2")) {
+ if ((logdetail_d->log_display && *logdetail_d->log_display)
+ && (logdetail_d->log_number && *logdetail_d->log_number))
+ {
+ if (logdetail_d->log_num_type & CONTACTS_NUMBER_TYPE_CUSTOM)
+ snprintf(buf, sizeof(buf), "%s %s", log_detail_get_custom_number_type(logdetail_d->contact_id, logdetail_d->log_number), logdetail_d->log_number);
+ else
+ snprintf(buf, sizeof(buf), "%s %s",T_(CT_GET_TEXT_NUM_TYPE, phone_detail_log_get_phonenumber_type(logdetail_d->log_num_type)), logdetail_d->log_number);
+ return strdup(buf);
+ }
+ else
+ return NULL;
+ }
+ 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;
+ char buf[PATH_MAX]={0};
+ Evas_Object *ic;
+
+ if (0 == strcmp(part, "elm.icon.1")) {
+ 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.2")) {
+ 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
+ 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 const char* log_detail_get_type_name(int type)
+{
+ switch(type)
+ {
+ case CONTACTS_PLOG_TYPE_VOICE_INCOMMING:
+ case CONTACTS_PLOG_TYPE_VIDEO_INCOMMING:
+ return T_(PH_GET_TEXT_BASIC, PHTEXT_INCOMMING_CALL);
+ break;
+ case CONTACTS_PLOG_TYPE_VOICE_OUTGOING:
+ case CONTACTS_PLOG_TYPE_VIDEO_OUTGOING:
+ return T_(PH_GET_TEXT_BASIC, PHTEXT_OUTGOING_CALL);
+ break;
+ case CONTACTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN:
+ case CONTACTS_PLOG_TYPE_VOICE_INCOMMING_SEEN:
+ case CONTACTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN:
+ case CONTACTS_PLOG_TYPE_VIDEO_INCOMMING_SEEN:
+ return T_(PH_GET_TEXT_BASIC, PHTEXT_MISSED_CALL);
+ break;
+ case CONTACTS_PLOG_TYPE_MMS_OUTGOING:
+ case CONTACTS_PLOG_TYPE_SMS_OUTGOING:
+ case CONTACTS_PLOG_TYPE_EMAIL_SENT:
+ return T_(PH_GET_TEXT_BASIC, PHTEXT_SENT_MESSAGE);
+ break;
+ case CONTACTS_PLOG_TYPE_MMS_INCOMMING :
+ case CONTACTS_PLOG_TYPE_SMS_INCOMMING:
+ case CONTACTS_PLOG_TYPE_EMAIL_RECEIVED:
+ return T_(PH_GET_TEXT_BASIC, PHTEXT_RECEIVED_MESSAGE);
+ break;
+ case CONTACTS_PLOG_TYPE_VOICE_REJECT:
+ case CONTACTS_PLOG_TYPE_VIDEO_REJECT:
+ return T_(PH_GET_TEXT_BASIC, PHTEXT_REJECTED_CALL_ABB);
+ break;
+ case CONTACTS_PLOG_TYPE_VOICE_BLOCKED:
+ case CONTACTS_PLOG_TYPE_VIDEO_BLOCKED:
+ return T_(PH_GET_TEXT_BASIC, PHTEXT_BLOCKED_CALL_ABB);
+ break;
+ case CONTACTS_PLOG_TYPE_SMS_BLOCKED:
+ case CONTACTS_PLOG_TYPE_MMS_BLOCKED:
+ default:
+ 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};
+ const 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 phone_detail_log_get_time(logdetail_d->log_d->formatter, l_detail_info->plog_time);
+ }
+ else if (0 == strcmp(part, "elm.text.2")) {
+ 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 %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;
+}
+
+
+static const char *log_detail_get_day_in_week(ph_log_detail_info * l_detail_info )
+{
+ PH_FN_CALL;
+ time_t stime;
+ struct tm *tmp;
+
+ stime = l_detail_info->plog_time - l_detail_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 int log_detail_get_group_index(ph_log_detail_info* l_detail_info)
+{
+ time_t stime;
+ struct timeval timeval;
+ struct tm *tmp;
+ int yday, cur_yday;
+
+ gettimeofday(&timeval, 0);
+ tmp = localtime(&timeval.tv_sec);
+ cur_yday = tmp->tm_yday;
+
+ stime = l_detail_info->plog_time - l_detail_info->plog_duration;
+ tmp = localtime(&stime);
+
+ yday = tmp->tm_yday;
+
+ if (yday == cur_yday)
+ return -1;
+ else if (yday == (cur_yday-1))
+ return -2;
+ else
+ return 0;
+}
+
+static char* log_detail_gl_sep_date_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ PH_FN_CALL;
+ ph_log_detail_info * l_detail_info = (ph_log_detail_info*)data;
+ const char *when;
+
+
+ int index =log_detail_get_group_index(l_detail_info);
+
+ if (0 == strcmp(part, "elm.text")) {
+ char *date_temp;
+ ph_log_detail_data *logdetail_d;
+
+ if (-1 == index)
+ when = S_(PH_SYS_BODY_TODAY);
+ else if (-2 == index)
+ when = S_(PH_SYS_BODY_YESTERDAY);
+ else
+ when = log_detail_get_day_in_week(l_detail_info);
+
+ logdetail_d = evas_object_data_get(obj, KEY_LOG_DETAIL_DATA);
+ date_temp = phone_detail_log_get_date(logdetail_d->log_d->formatter, l_detail_info->plog_time-l_detail_info->plog_duration);
+ 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 inline void log_detail_create_itcs()
+{
+ PH_FN_CALL;
+ log_detail_itcs[LOG_DETAIL_ITC_DETAIL].func.text_get = log_detail_gl_label_get;
+ log_detail_itcs[LOG_DETAIL_ITC_DETAIL].func.content_get = log_detail_gl_icon_get;
+
+ log_detail_itcs[LOG_DETAIL_ITC_TOP_INFO_NAMED].func.text_get = log_detail_gl_top_info_label_get;
+ log_detail_itcs[LOG_DETAIL_ITC_TOP_INFO_NAMED].func.content_get = log_detail_gl_top_info_icon_get;
+
+ log_detail_itcs[LOG_DETAIL_ITC_TOP_INFO_NONAMED].func.text_get = log_detail_gl_top_info_label_get;
+ log_detail_itcs[LOG_DETAIL_ITC_TOP_INFO_NONAMED].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_TITLE].func.text_get = log_detail_gl_sep_date_label_get;
+}
+
+static Evas_Object* log_detail_create_genlist(ph_log_detail_data *logdetail_d, Evas_Object *parent)
+{
+ PH_FN_CALL;
+ Evas_Object *genlist;
+
+ genlist = elm_genlist_add(parent);
+ 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);
+ evas_object_data_set(genlist, KEY_LOG_DETAIL_DATA, logdetail_d);
+ elm_object_theme_set(genlist, logdetail_d->th);
+ evas_object_smart_callback_add(genlist, "realized", log_detail_gl_realized, NULL);
+
+ log_detail_create_itcs();
+ return genlist;
+}
+
+static void log_detail_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ PH_FN_CALL;
+ ph_log_detail_data *logdetail_d = data;
+ contacts_error_e err = CONTACTS_ERROR_NONE;
+
+ p_retm_if(NULL == logdetail_d, "log detail data is null");
+
+ err = contacts_db_remove_changed_cb(_contacts_person._uri, log_detail_update_view_with_contact_cb, logdetail_d);
+ p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_db_add_changed_cb() Failed(%d)", err);
+
+ evas_object_data_del(logdetail_d->navi, KEY_LOG_DETAIL_DATA);
+
+ elm_object_part_content_set(logdetail_d->layout, "elm.swallow.bg", NULL);
+
+ if (logdetail_d->th) {
+ elm_theme_extension_del(logdetail_d->th, DIALER_THEME_EDJ);
+ elm_theme_free(logdetail_d->th);
+ }
+
+ if (logdetail_d->log_list)
+ log_detail_free_log_data(logdetail_d->log_list);
+
+ if (logdetail_d->idler)
+ ecore_idler_del(logdetail_d->idler);
+
+ if (logdetail_d->popup)
+ evas_object_del(logdetail_d->popup);
+
+ if (logdetail_d->child_ug)
+ ug_destroy(logdetail_d->child_ug);
+
+ if (logdetail_d->log_display)
+ free(logdetail_d->log_display);
+
+ if (logdetail_d->log_number)
+ free(logdetail_d->log_number);
+
+ if (logdetail_d->log_img_path)
+ free(logdetail_d->log_img_path);
+
+
+ free(logdetail_d);
+}
+
+static void log_detail_back_btn_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ PH_FN_CALL;
+ ph_log_detail_data *logdetail_d = data;
+
+ /* TODO : remove evas_object_smart_callback_del, it will be controlled by WINSET */
+ evas_object_smart_callback_del(obj, "clicked", log_detail_back_btn_cb);
+
+ elm_naviframe_item_pop(logdetail_d->navi);
+ 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(logdetail_d->popup);
+ 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_ctxpopup_edit_number_before_call_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ PH_FN_CALL;
+ ph_log_detail_data *logdetail_d = data;
+ evas_object_del(obj);
+ logdetail_d->popup = NULL;
+
+ service_h service;
+ int num = STRLEN(logdetail_d->log_number) + STRLEN("tel:") + 1;
+ char *uri = (char*)malloc(sizeof(char)*num);
+ memset(uri, 0, sizeof(char)*num);
+
+ snprintf(uri, sizeof(char)*num, "%s%s", "tel:", logdetail_d->log_number);
+
+ service_create(&service);
+ service_set_package(service, "org.tizen.phone");
+ service_set_operation(service, "http://tizen.org/appcontrol/operation/dial");
+ service_set_uri(service, uri);
+ service_send_launch_request(service, NULL,NULL );
+ service_destroy(service);
+
+ free(uri);
+
+}
+
+static void log_detail_gl_selected_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Elm_Object_Item *it = (Elm_Object_Item *) event_info;
+ elm_genlist_item_selected_set(it, EINA_FALSE);
+}
+
+static void log_detail_gl_longpressed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ph_log_detail_data *logdetail_d = (ph_log_detail_data*)data;
+ Elm_Object_Item *it = (Elm_Object_Item *) event_info;
+
+ if(elm_genlist_item_index_get(it) > 1)
+ return;
+
+ 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, -1, -1);
+
+ 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);
+
+ elm_ctxpopup_item_append(logdetail_d->popup, T_(PH_GET_TEXT_BASIC, PHTEXT_EDIT_NUMBER_BEFORE_CALL), NULL, log_detail_ctxpopup_edit_number_before_call_cb, logdetail_d);
+
+ evas_object_move(logdetail_d->popup, 720/2, 50+142/2);
+ evas_object_show(logdetail_d->popup);
+}
+
+static void more_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ PH_FN_CALL;
+
+ ph_log_detail_data *logdetail_d = data;
+ p_retm_if(NULL == logdetail_d, "logdetail_d is NULL");
+
+ Evas_Object *popup = NULL;
+
+ popup = elm_ctxpopup_add(logdetail_d->navi);
+ p_retm_if(NULL == popup, "elm_ctxpopup_add() return NULL");
+
+ elm_ctxpopup_direction_priority_set(popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, -1, -1);
+ evas_object_smart_callback_add(popup, "dismissed", log_detail_ctxpopup_dismissed_cb, logdetail_d);
+
+ int x, y, w, h;
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+
+ evas_object_move(popup, x+(w/2), y+(h/2));
+ evas_object_show(popup);
+
+ logdetail_d->popup = popup;
+ return;
+}
+
+void ph_log_detail_set_toolbar(ph_log_detail_data *logdetail_d)
+{
+ Elm_Object_Item *navi_it;
+ Evas_Object *more_button = NULL;
+ Evas_Object * delete_button = NULL;
+ Evas_Object * contact_btn = NULL;
+ Evas_Object *back_btn = NULL;
+
+ navi_it = elm_naviframe_top_item_get(logdetail_d->navi);
+ p_retm_if(NULL == navi_it, "navi item is NULL");
+
+ if (logdetail_d->navi) {
+ phone_navi_item_clear(navi_it);
+ }
+
+//more button
+ more_button = ctui_create_more_btn(logdetail_d->navi, more_btn_clicked_cb, logdetail_d);
+ elm_object_item_part_content_set(navi_it, "toolbar_more_btn", more_button);
+
+//delete button
+ delete_button = phone_create_toolbar_btn(logdetail_d->navi, S_(PH_SYS_SK_DELETE), log_detail_del_btn_cb, logdetail_d);
+ elm_object_item_part_content_set(navi_it, "toolbar_button1", delete_button);
+ elm_object_style_set(delete_button, "naviframe/toolbar/left");
+
+//contact button
+ if (logdetail_d->contact_id) // view button
+ contact_btn = phone_create_toolbar_btn(logdetail_d->navi, T_(CT_GET_TEXT_BASIC, CTTEXT_VIEW), log_detail_view_clicked_cb, logdetail_d);
+ else if (logdetail_d->log_number) // save button
+ contact_btn = phone_create_toolbar_btn(logdetail_d->navi, S_(PH_SYS_OPT_ADD_TO_CONTACTS), log_detail_add_contact_btn_cb, logdetail_d);
+ elm_object_item_part_content_set(navi_it, "toolbar_button2", contact_btn);
+ elm_object_style_set(contact_btn, "naviframe/toolbar/right");
+
+//BACK button
+ back_btn = elm_button_add(logdetail_d->navi);
+ elm_object_style_set(back_btn, "naviframe/back_btn/default");
+ elm_object_item_part_content_set(navi_it, "prev_btn", back_btn);
+ evas_object_smart_callback_add(back_btn, "clicked", phone_view_back_btn_cb, logdetail_d->navi);
+
+ return;
+
+}
+
+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)
+{
+ PH_FN_CALL;
+ Evas_Object *back_btn;
+ Evas_Object *layout;
+ Evas_Object *bg;
+ Evas_Object *genlist;
+ Elm_Object_Item *navi_it;
+ ph_log_detail_data *logdetail_d;
+ Eina_List *l;
+ Elm_Object_Item *pre_item = NULL;
+ contacts_error_e err = CONTACTS_ERROR_NONE;
+ ph_log_info *log_info;
+ Elm_Theme *th;
+ p_retvm_if(NULL == l_info, NULL, "Log information is null");
+
+ logdetail_d = calloc(1, sizeof(ph_log_detail_data));
+ p_retvm_if(NULL == logdetail_d, NULL, "Fail to calloc ph_log_detail_data");
+ logdetail_d->ug = log_d->ug;
+ 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) {
+ ERR("elm_layout_add() return NULL");
+ free(logdetail_d);
+ return NULL;
+ }
+ elm_layout_theme_set(layout, "layout", "application", "noindicator");
+ logdetail_d->layout = layout;
+ elm_naviframe_prev_btn_auto_pushed_set(logdetail_d->navi, EINA_FALSE);
+
+ th = elm_theme_new();
+ elm_theme_ref_set(th, NULL);
+ elm_theme_extension_add(th, LOGDETAIL_THEME_EDJ);
+ logdetail_d->th = th;
+
+ genlist = log_detail_create_genlist(logdetail_d, layout);
+ if (NULL == genlist) {
+ ERR("log_detail_create_genlist() return NULL");
+ free(logdetail_d);
+ return NULL;
+ }
+ 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, "selected", log_detail_gl_selected_cb, logdetail_d);
+ 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)
+ logdetail_d->log_img_path = strdup(l_info->plog_img_path);
+ if (l_info->plog_display && *l_info->plog_display)
+ logdetail_d->log_display = strdup(l_info->plog_display);
+ logdetail_d->log_num_type = l_info->plog_num_type;
+
+ 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);
+
+ err = contacts_db_add_changed_cb(_contacts_person._uri, log_detail_update_view_with_contact_cb, logdetail_d);
+ p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_db_add_changed_cb() Failed(%d)", err);
+
+ navi_it = elm_naviframe_item_push(logdetail_d->navi, S_(PH_SYS_BODY_DETAILS), NULL, NULL, layout, NULL);
+ elm_naviframe_item_title_visible_set(navi_it, EINA_FALSE);
+ ph_log_detail_set_toolbar(logdetail_d);
+ evas_object_data_set(logdetail_d->navi, KEY_LOG_DETAIL_DATA, logdetail_d);
+
+ bg = phone_create_bg(logdetail_d->layout);
+ elm_object_style_set(bg, "group_list");
+
+ PH_FN_END;
+ return layout;
+}
+