diff options
Diffstat (limited to 'lib/log/ph-log-detail-view.c')
-rwxr-xr-x | lib/log/ph-log-detail-view.c | 1153 |
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; +} + |