diff options
Diffstat (limited to 'lib/details/ct-detail-main.c')
-rwxr-xr-x | lib/details/ct-detail-main.c | 420 |
1 files changed, 420 insertions, 0 deletions
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; +} |