diff options
Diffstat (limited to 'lib/list/ct-group-view.c')
-rwxr-xr-x | lib/list/ct-group-view.c | 1270 |
1 files changed, 1270 insertions, 0 deletions
diff --git a/lib/list/ct-group-view.c b/lib/list/ct-group-view.c new file mode 100755 index 0000000..c6abf9c --- /dev/null +++ b/lib/list/ct-group-view.c @@ -0,0 +1,1270 @@ +/* + * 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 <app.h> +#include <vconf.h> +#include <vconf-keys.h> +#include <fcntl.h> +#include <app_service.h> +#include <Ecore_X.h> +#include <ui-gadget-module.h> +#include <account.h> +#include "phone.h" +#include "ct-list.h" +#include "ct-group.h" +#include "ct-list-utils.h" +#include "ct-list-contact-view.h" + +#define KEY_GROUP_DATA "cgroup_d" + +enum { + GROUP_MODE_NORMAL, + GROUP_MODE_EDIT, +}; + +typedef struct { + Evas_Object *win; + Evas_Object *navi; + Evas_Object *layout; + Evas_Object *popup; + Evas_Object *gengrid; + Ecore_Timer *update_timer; + Ecore_Timer *waiting_timer; + Evas_Object *ctrl_button; + Evas_Object *delete_button; + Elm_Object_Item *navi_item; + Elm_Theme *th; + bool is_background; + int count; + int ug_request; + int ug_cnt_max; + int group_mode; + void *ug; + void *child_ug; + void *crop_ug; + void *src_ug; + char *ug_data; + bool need_update; +} ct_group_data; + +enum GROUP_ITC_TYPE{ + GROUP_ITC_1IMAGE, + GROUP_ITC_2IMAGE, + GROUP_ITC_3IMAGE, + GROUP_ITC_6IMAGE, + GROUP_ITC_GROUP_TITLE, + GROUP_ITC_MAX, +}; + +static Elm_Gengrid_Item_Class group_itcs[] = { + {.item_style="groupitem.1image"}, + {.item_style="groupitem.2image"}, + {.item_style="groupitem.3image"}, + {.item_style="groupitem.6image"}, + {.item_style="group_index"}, +}; + + +static Eina_Bool group_changed(void *user_data); + +static void group_gl_del(void *data, Evas_Object *obj) +{ + int i; + ct_group_list *info = data; + p_retm_if(NULL == info, "data is NULL"); + + for (i=0;i<6;i++) + free(info->img_list[i]); + free(info->img); + free(info->name); + free(info); +} + +static char* group_gl_label_get(void *data, Evas_Object *obj, const char *part) +{ + char buf[PH_TEXT_MAX_LEN]; + ct_group_list *info = data; + ct_group_data *cgroup_d; + + p_retvm_if(NULL == data, NULL, "The parameter(data) is NULL"); + + cgroup_d = evas_object_data_get(obj, KEY_GROUP_DATA); + p_retvm_if(NULL == cgroup_d, NULL, "evas_object_data_get() return NULL"); + + if ((0 == strcmp(part, "text.name") && cgroup_d->group_mode == GROUP_MODE_NORMAL) || + (0 == strcmp(part, "text.edit.name") && cgroup_d->group_mode == GROUP_MODE_EDIT)) { + if (info->name) + return strdup(info->name); + else + return strdup("Noname"); + } + else if ((0 == strcmp(part, "text.count") && cgroup_d->group_mode == GROUP_MODE_NORMAL) || + (0 == strcmp(part, "text.edit.count") && cgroup_d->group_mode == GROUP_MODE_EDIT)) { + snprintf(buf, sizeof(buf), "%d", info->count); + return strdup(buf); + } + return NULL; +} + +static char* group_gl_index_label_get(void *data, Evas_Object *obj, const char *part) +{ + PH_FN_CALL; + char* title = data; + + if (title && *title) + return strdup((const char *)data); + + return NULL; +} + +static void group_popup_hide_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *icon; + Evas_Object *btn; + ct_group_data *cgroup_d = data; + btn = evas_object_data_get(obj, "expand_btn"); + if (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(cgroup_d->popup); + cgroup_d->popup = NULL; +} + +static void group_destroy_child_ug(void *data) +{ + ct_group_data *cgroup_d = data; + cgroup_d->child_ug = NULL; +} + +API void phone_group_message_result_cb(void *data, int *list, int cnt) +{ + service_h service; + ui_gadget_h ug; + struct ug_cbs cbs = {0}; + struct ug_priv_data *priv_data; + ct_group_data *cgroup_d = data; + char buf[PH_TEXT_MAX_LEN] = {'\0'}; + char temp[PH_TEXT_MAX_LEN+1] = {'\0'}; + int ret,i; + contacts_record_h number_record = NULL; + char *number; + + p_retm_if(NULL == cgroup_d, "parameter(cgroup_d) is NULL"); + p_retm_if(0 == cnt || NULL == list, "parameter(list) is NULL"); + + priv_data = calloc(1, sizeof(struct ug_priv_data)); + p_retm_if(NULL == priv_data, "calloc is failed"); + + priv_data->destroy_cb = group_destroy_child_ug; + priv_data->cb_param = cgroup_d; + + service_create(&service); + + for(i = 0; i < cnt; i++){ + ret = contacts_db_get_record(_contacts_number._uri,list[i],&number_record); + if(CONTACTS_ERROR_NONE != ret) { + ERR("contacts_db_get_record() Failed(%d)", ret); + continue; + } + + contacts_record_get_str_p(number_record,_contacts_number.number,&number); + if (number && *number) { + if (*buf) + snprintf(temp, sizeof(temp), "%s", buf); + if (*temp) + snprintf(buf, sizeof(buf), "%s,%s", temp, number); + else + snprintf(buf, sizeof(buf), "%s", number); + } + contacts_record_destroy(number_record, true); + } + if(*buf){ + PH_DBG("number %s", buf); + service_add_extra_data(service, "TO", 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(cgroup_d->ug, MSG_COMPOSER_UG, UG_MODE_FULLVIEW, service, &cbs); + service_destroy(service); + + if (ug == NULL) { + free(priv_data); + ERR("%s ug_create is failed", MSG_COMPOSER_UG); + } + evas_object_smart_callback_del(cgroup_d->navi, "transition,finished", ctui_list_edit_navi_pop); + cgroup_d->child_ug = ug; +} + + +API void phone_group_email_result_cb(void *data, int *list, int cnt) +{ + service_h service; + Ecore_X_Window win_id; + ct_group_data *cgroup_d = data; + int ret,i; + char *email; + contacts_record_h email_record = NULL; + char buf[PH_TEXT_MAX_LEN+1] = {'\0'}; + char temp[PH_TEXT_MAX_LEN+1] = {'\0'}; + + p_retm_if(NULL == cgroup_d, "parameter(cgroup_d) is NULL"); + p_retm_if(0 == cnt || NULL == list, "parameter(list) is NULL"); + + win_id = elm_win_xwindow_get(cgroup_d->win); + service_create(&service); + service_set_app_id(service, EMAIL_COMPOSER_PKG); + service_set_window(service, win_id); + + for(i = 0; i < cnt; i++){ + ret = contacts_db_get_record(_contacts_email._uri,list[i],&email_record); + if (CONTACTS_ERROR_NONE != ret) { + ERR("contacts_db_get_record() Failed(%d)", ret); + continue; + } + contacts_record_get_str_p(email_record,_contacts_email.email,&email); + if (email && *email) { + if (*buf) + snprintf(temp, sizeof(temp), "%s", buf); + + if (*temp) + snprintf(buf, sizeof(buf), "%s;%s", temp, email); + else + snprintf(buf, sizeof(buf), "%s", email); + } + contacts_record_destroy(email_record, true); + } + if(*buf){ + PH_DBG("email %s", buf); + service_add_extra_data(service, SERVICE_DATA_TO, buf); + } + + service_send_launch_request(service, NULL, NULL); + service_destroy(service); +} + +static void group_notify_update(ct_group_data *cgroup_d) +{ + if (GROUP_MODE_NORMAL == cgroup_d->group_mode) + phone_hide_notify(cgroup_d->layout); + else { + if (0 < cgroup_d->count) { + char buf[PH_TEXT_MAX_LEN+1]; + snprintf(buf, sizeof(buf), "%s (%d)", S_(PH_SYS_POP_SELECTED), cgroup_d->count); + phone_show_notify(cgroup_d->layout, buf); + } + else + phone_show_notify(cgroup_d->layout, T_(CT_GET_TEXT_BASE_OP, CTTEXT_SELECT_GROUP)); + } +} + +static void group_edit_result_cb(int grp_id,void *data, bool changed) +{ + ct_group_data *cgroup_d = data; + group_notify_update(data); + + if (changed) { + cgroup_d->group_mode = GROUP_MODE_NORMAL; + phone_hide_notify(cgroup_d->layout); + phone_group_set_navi(cgroup_d->layout); + } +} + +static void group_edit_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_group_data *cgroup_d; + ct_group_list *info = data; + + cgroup_d = evas_object_data_get(elm_object_item_widget_get(info->item), "cgroup_d"); + p_retm_if(NULL == cgroup_d, "evas_object_data_get() return NULL"); + + phone_hide_notify(cgroup_d->layout); + ctui_create_group_input_view(cgroup_d->win, cgroup_d->navi, data, group_edit_result_cb, cgroup_d); +} + +static void group_navi_item_update(ct_group_data *cgroup_d) +{ + if (0 < cgroup_d->count) + elm_object_disabled_set(cgroup_d->delete_button, EINA_FALSE); + else + elm_object_disabled_set(cgroup_d->delete_button, EINA_TRUE); +} + +static void group_check_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_group_list *info = data; + ct_group_data *cgroup_d; + p_retm_if(NULL == data, "data is NULL"); + + cgroup_d = evas_object_data_get(elm_object_item_widget_get(info->item), "cgroup_d"); + p_retm_if(NULL == cgroup_d, "evas_object_data_get() return NULL"); + + if (EINA_TRUE == info->selected && false == info->is_read_only) + cgroup_d->count++; + else + cgroup_d->count--; + group_navi_item_update(cgroup_d); + group_notify_update(cgroup_d); +} + +static Evas_Object* group_gl_content_get(void *data, Evas_Object *obj, const char *part) +{ + Evas_Object *icon; + Evas_Object *button; + Evas_Object *check; + ct_group_data *cgroup_d; + ct_group_list *info = data; + + cgroup_d = evas_object_data_get(obj, "cgroup_d"); + p_retvm_if(NULL == cgroup_d, NULL, "evas_object_data_get() return NULL"); + + if (0 == strcmp(part, "swallow.icon")) { + if (CT_UG_REQUEST_SELECT_GROUP == cgroup_d->ug_request || + CT_UG_REQUEST_SELECT_GROUP_ADD_TO_HOME == cgroup_d->ug_request) + return NULL; + if (GROUP_MODE_NORMAL == cgroup_d->group_mode) + return NULL; + else if (info->id_grp) { + button = elm_button_add(obj); + p_retvm_if(NULL == button, NULL, "elm_button_add() return NULL"); + evas_object_propagate_events_set(button, EINA_FALSE); + elm_object_style_set(button, "rename"); + evas_object_smart_callback_add(button, "clicked", group_edit_btn_cb, info); + return button; + } + } + else if (0 == strncmp(part, "swallow.content", 15)) { + int index = -1; + sscanf(part, "swallow.content%d", &index); + p_retvm_if(index<1 || 6<index, NULL, "index(%d) is out of range", index); + + if (info->img && *info->img) { + icon = elm_icon_add(obj); + p_retvm_if(NULL == icon, NULL, "elm_icon_add() return NULL"); + elm_icon_file_set(icon, info->img, NULL); + evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_NONE, 1, 1); + evas_object_size_hint_align_set(icon, 0.5, EVAS_HINT_FILL); + return icon; + } + else if (info->img_list[index-1] && *info->img_list[index-1]) { + icon = elm_icon_add(obj); + p_retvm_if(NULL == icon, NULL, "elm_icon_add() return NULL"); + elm_icon_file_set(icon, info->img_list[index-1], NULL); + evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_NONE, 1, 1); + evas_object_size_hint_align_set(icon, 0.5, EVAS_HINT_FILL); + return icon; + } + } + else if(0 == strcmp(part, "swallow.edit.icon") && GROUP_MODE_EDIT == cgroup_d->group_mode){ + if (CT_UG_REQUEST_SELECT_GROUP == cgroup_d->ug_request) + return NULL; + if(info->is_read_only == true){ + check = elm_check_add(obj); + p_retvm_if(NULL == check, NULL, "elm_check_add() return NULL"); + evas_object_show(check); + elm_object_disabled_set(check,EINA_TRUE); + return check; + } + + check = elm_check_add(obj); + p_retvm_if(NULL == check, NULL, "elm_check_add() return NULL"); + evas_object_show(check); + evas_object_propagate_events_set(check, EINA_FALSE); + elm_check_state_pointer_set(check, &info->selected); + elm_check_state_set(check, info->selected); + evas_object_smart_callback_add(check, "changed", group_check_changed_cb, info); + return check; + } + return NULL; +} + +static void __group_return_id(ui_gadget_h ug, int group_id) +{ + PH_FN_CALL; + service_h service = NULL; + char buf[16] = {0, }; + + service_create(&service); + + if (group_id) { + snprintf(buf, sizeof(buf), "%d", group_id); + service_add_extra_data(service, CT_UG_BUNDLE_RESULT_GROUP_ID, buf); + } + + PH_DBG("group_id=%d", group_id); + ug_send_result(ug, service); + + service_destroy(service); +} + + +static void group_gl_sel(void *data, Evas_Object *obj, void *event_info) +{ + PH_FN_CALL; + Elm_Object_Item *item = event_info; + ct_group_data *cgroup_d = data; + ct_group_list *info = elm_object_item_data_get(item); + ph_view_info *view_info; + p_retm_if(NULL == info, "elm_object_item_data_get() return NULL"); + + elm_gengrid_item_selected_set(item, EINA_FALSE); + + if (CT_UG_REQUEST_SELECT_GROUP == cgroup_d->ug_request) { + __group_return_id(cgroup_d->ug, info->id_grp); + ug_destroy_me(cgroup_d->ug); + cgroup_d->ug = NULL; + } + else if (GROUP_MODE_NORMAL == cgroup_d->group_mode) { + view_info = calloc(1, sizeof(ph_view_info)); + phone_set_view_info(view_info, cgroup_d->win, cgroup_d->navi, cgroup_d->ug, cgroup_d->ug_request, + cgroup_d->ug_cnt_max, cgroup_d->ug_data); + + if (0 < info->id_grp) + ctui_list_create_contact_view_with_info(view_info, CT_GET_LIST_PERSON_OF_GROUP_ID, info); + else // not assigned + ctui_list_create_contact_view_with_info(view_info, CT_GET_LIST_PERSON_NOT_ASSIGNED_OF_ADDRBOOK_ID, info); + free(view_info); + } + else { + + if(info->is_read_only == true)return; //skip default group + + info->selected = !info->selected; + elm_gengrid_item_update(info->item); + + if (EINA_TRUE == info->selected) + cgroup_d->count++; + else + cgroup_d->count--; + + group_navi_item_update(cgroup_d); + group_notify_update(cgroup_d); + } +} + +static void group_create_itcs() +{ + group_itcs[GROUP_ITC_GROUP_TITLE].func.text_get = group_gl_index_label_get; + + group_itcs[GROUP_ITC_1IMAGE].func.text_get = group_gl_label_get; + group_itcs[GROUP_ITC_1IMAGE].func.content_get = group_gl_content_get; + group_itcs[GROUP_ITC_1IMAGE].func.del = group_gl_del; + + group_itcs[GROUP_ITC_2IMAGE].func.text_get = group_gl_label_get; + group_itcs[GROUP_ITC_2IMAGE].func.content_get = group_gl_content_get; + group_itcs[GROUP_ITC_2IMAGE].func.del = group_gl_del; + + group_itcs[GROUP_ITC_3IMAGE].func.text_get = group_gl_label_get; + group_itcs[GROUP_ITC_3IMAGE].func.content_get = group_gl_content_get; + group_itcs[GROUP_ITC_3IMAGE].func.del = group_gl_del; + + group_itcs[GROUP_ITC_6IMAGE].func.text_get = group_gl_label_get; + group_itcs[GROUP_ITC_6IMAGE].func.content_get = group_gl_content_get; + group_itcs[GROUP_ITC_6IMAGE].func.del = group_gl_del; +} + +static Elm_Gengrid_Item_Class* group_get_gengrid_item_class(const char *img, int count) +{ + PH_FN_CALL; + if ((img && *img) || count < 2) + return &group_itcs[GROUP_ITC_1IMAGE]; + else if (2 == count) + return &group_itcs[GROUP_ITC_2IMAGE]; + else if (3 == count) + return &group_itcs[GROUP_ITC_3IMAGE]; + else + return &group_itcs[GROUP_ITC_6IMAGE]; +} + +static contacts_filter_h group_create_filter_int(contacts_filter_h filter, const char *view_uri, int property_id, contacts_match_int_flag_e flag, int match_value) +{ + contacts_error_e err = CONTACTS_ERROR_NONE; + + if (NULL == filter) { + err = contacts_filter_create(view_uri, &filter); + p_retvm_if(CONTACTS_ERROR_NONE != err, NULL, "contacts_filter_create() Failed(%d)", err); + } + else { + err = contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND); + p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_filter_add_operator() Failed(%d)", err); + } + + err = contacts_filter_add_int(filter, property_id, flag, match_value); + p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_filter_add_int() Failed(%d)", err); + + return filter; +} + +static void __group_get_images(ct_group_list *info, contacts_list_h person_list) +{ + int cnt=0; + contacts_error_e err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + if(person_list == NULL) { + ERR("person list is null"); + return; + } + + err = contacts_list_get_current_record_p(person_list, &record); + p_retm_if(CONTACTS_ERROR_NONE != err, "phone_cts_get_list() Failed(%d)", err); + while(record) + { + char *path = NULL; + contacts_record_get_str_p(record,_contacts_person_grouprel.image_thumbnail_path, &path); + info->img_list[cnt++] = SAFE_STRDUP(path); + err = contacts_list_next(person_list); + if (CONTACTS_ERROR_NONE != err) + break; + contacts_list_get_current_record_p(person_list, &record); + if (5 < cnt) break; + } + +} + + +static void __group_append_gengrid_of_ab(ct_group_data *cgroup_d, int ab_id, int ab_mode) +{ + PH_FN_CALL; + contacts_error_e err = CONTACTS_ERROR_NONE; + unsigned int count = 0; + ct_group_list *info; + contacts_record_h record = NULL; + contacts_list_h group_list = NULL; + contacts_list_h person_list = NULL; + contacts_filter_h filter = NULL; + contacts_query_h query = NULL; + + unsigned int person_grouprel_projection[] = { + _contacts_person_grouprel.person_id, + _contacts_person_grouprel.status, + _contacts_person_grouprel.display_name, + _contacts_person_grouprel.display_name_index, + _contacts_person_grouprel.addressbook_ids, + _contacts_person_grouprel.image_thumbnail_path, + _contacts_person_grouprel.link_count, + }; + + err = phone_cts_get_list(_contacts_group._uri, _contacts_group.address_book_id, ab_id, &group_list); + p_warn_if(CONTACTS_ERROR_NONE != err, "phone_cts_get_list() Failed(%d)", err); + + err = contacts_list_get_current_record_p(group_list, &record); + p_warn_if(CONTACTS_ERROR_NONE != err, "contacts_list_get_current_record_p() Failed(%d)", err); + while(record){ + int grp_id; + char* img = NULL; + char* gname = NULL; + char* group_system_id = NULL; + bool is_read_only = false; + + err = contacts_record_get_int(record,_contacts_group.id, &grp_id); + p_retm_if(CONTACTS_ERROR_NONE != err, "contacts_record_get_int() Failed(%d)", err); + info = calloc(1, sizeof(ct_group_list)); + if (NULL == info) { + ERR("calloc() return NULL"); + break; + } + info->id_ab = ab_id; + info->mode = ab_mode; + info->id_grp = grp_id; + err = contacts_record_get_str_p(record,_contacts_group.image_path,&img); + + p_retm_if(CONTACTS_ERROR_NONE != err, "contacts_record_get_str_p() Failed(%d)", err); + info->img = SAFE_STRDUP(img); + + contacts_record_get_str_p(record, _contacts_group.system_id, &group_system_id); + if (NULL != group_system_id) { + if (strcmp(group_system_id,"friends")==0) + info->name = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_FRIENDS)); + else if (strcmp(group_system_id,"family")==0) + info->name = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_FAMILY)); + else if (strcmp(group_system_id,"coworkers")==0) + info->name = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_CO_WORKERS)); + else + info->name = strdup(T_(CT_GET_TEXT_ERR, CTTEXT_NONAME)); + } + else { + err = contacts_record_get_str_p(record,_contacts_group.name,&gname); + p_retm_if(CONTACTS_ERROR_NONE != err, "contacts_record_get_str_p() Failed(%d)", err); + info->name = SAFE_STRDUP(gname); + } + + err = phone_cts_get_list(_contacts_person_grouprel._uri, _contacts_person_grouprel.group_id, grp_id, &person_list); + p_retm_if(CONTACTS_ERROR_NONE != err, "phone_cts_get_list() Failed(%d)", err); + + err = contacts_record_get_bool(record,_contacts_group.is_read_only, &is_read_only); + p_retm_if(CONTACTS_ERROR_NONE != err, "contacts_record_get_bool() Failed(%d)", err); + info->is_read_only = is_read_only; + + err = contacts_list_get_count(person_list,&count); + p_retm_if(CONTACTS_ERROR_NONE != err, "contacts_list_get_count() Failed(%d)", err); + info->count = count; + __group_get_images(info, person_list); + + info->item = elm_gengrid_item_append(cgroup_d->gengrid, group_get_gengrid_item_class(info->img, info->count), info, group_gl_sel, cgroup_d); + + err = contacts_list_next(group_list); + if (CONTACTS_ERROR_NONE != err) { + ERR("contacts_list_next() Failed(%d)", err); + break; + } + err = contacts_list_get_current_record_p(group_list, &record); + if (CONTACTS_ERROR_NONE != err) { + ERR("contacts_list_get_current_record_p() Failed(%d)", err); + break; + } + } + err = contacts_list_destroy(group_list, true); + p_retm_if(CONTACTS_ERROR_NONE != err, "contacts_list_get_current_record_p() Failed(%d)", err); + + err = contacts_query_create(_contacts_person_grouprel._uri, &query); + p_retm_if(CONTACTS_ERROR_NONE != err, "contacts_query_create() Failed(%d)", err); + + filter = group_create_filter_int(filter, _contacts_person_grouprel._uri, _contacts_person_grouprel.address_book_id, CONTACTS_MATCH_EQUAL, ab_id); + filter = group_create_filter_int(filter, _contacts_person_grouprel._uri, _contacts_person_grouprel.group_id, CONTACTS_MATCH_NONE, 0); + + do { + if (CONTACTS_ERROR_NONE != (err = contacts_query_set_filter(query, filter))) break; + if (CONTACTS_ERROR_NONE != (err = contacts_query_set_distinct(query, true))) break; + if (CONTACTS_ERROR_NONE != (err = contacts_query_set_projection(query, person_grouprel_projection, sizeof(person_grouprel_projection)/sizeof(int)))) break; + if (CONTACTS_ERROR_NONE != (err = contacts_db_get_records_with_query(query, 0, 0, &person_list))) break; + + err = contacts_list_get_count(person_list, &count); + p_retm_if(CONTACTS_ERROR_NONE != err, "contacts_list_get_count() Failed(%d)", err); + + if (0 < count && cgroup_d->group_mode == GROUP_MODE_NORMAL ) { + info = calloc(1, sizeof(ct_group_list)); + p_retm_if(NULL == info, "calloc() return NULL"); + info->id_ab = ab_id; + info->count = count; + info->mode = ab_mode; + if (0 == ab_id) + info->name = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_NOT_ASSIGNED)); + else + info->name = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_ALL_CONTACTS)); + __group_get_images(info, person_list); + info->item = elm_gengrid_item_append(cgroup_d->gengrid, group_get_gengrid_item_class(info->img, info->count), info, group_gl_sel, cgroup_d); + } + } while (0); + + contacts_query_destroy(query); + contacts_filter_destroy(filter); +} + +static void __group_fill_layout(ct_group_data *cgroup_d) +{ + int ret; + contacts_record_h record = NULL; + contacts_list_h addressbook_list = NULL; + + ret = contacts_db_get_all_records(_contacts_address_book._uri, 0,0, &addressbook_list); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_db_get_all_records() Failed(%d)", ret); + ret = contacts_list_get_current_record_p(addressbook_list, &record); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_get_current_record_p() Failed(%d)", ret); + while(record){ + int ab_id; + int ab_mode; + char *name; + + ret = contacts_record_get_int(record,_contacts_address_book.id,&ab_id); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_record_get_int() Failed(%d)", ret); + if (0 == ab_id) + name = (char *)T_(CT_GET_TEXT_BASIC, CTTEXT_PHONE); + else { + ret = contacts_record_get_str_p(record,_contacts_address_book.name,&name); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_record_get_str() Failed(%d)", ret); + } + ret = contacts_record_get_int(record,_contacts_address_book.mode,&ab_mode); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_record_get_int() Failed(%d)", ret); + + if (GROUP_MODE_NORMAL == cgroup_d->group_mode || CONTACTS_ADDRESS_BOOK_MODE_READONLY != ab_mode) { + elm_gengrid_item_append(cgroup_d->gengrid, &group_itcs[GROUP_ITC_GROUP_TITLE], name, NULL, NULL); + __group_append_gengrid_of_ab(cgroup_d, ab_id, ab_mode); + } + ret = contacts_list_next(addressbook_list); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_next() Failed(%d)", ret); + ret = contacts_list_get_current_record_p(addressbook_list, &record); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_get_current_record_p() Failed(%d)", ret); + } + ret = contacts_list_destroy(addressbook_list, true); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_destroy() Failed(%d)", ret); +} + +static void group_edit_mode_end(ct_group_data *cgroup_d, bool redraw) +{ + p_retm_if(NULL == cgroup_d, "parameter(cgroup_d) is NULL"); + cgroup_d->count = 0; + phone_hide_notify(cgroup_d->layout); + cgroup_d->group_mode = GROUP_MODE_NORMAL; + if (redraw) + phone_group_set_navi(cgroup_d->layout); + elm_gengrid_clear(cgroup_d->gengrid); + __group_fill_layout(cgroup_d); +} + +static Eina_Bool group_wait_changed(void *user_data) +{ + ct_group_data *cgroup_d = user_data; + ecore_timer_del(cgroup_d->waiting_timer); + cgroup_d->waiting_timer = NULL; + if(cgroup_d->need_update) { + PH_DBG("need to update"); + cgroup_d->need_update = false; + group_changed(cgroup_d); + } + return ECORE_CALLBACK_CANCEL; +} + + +static Eina_Bool group_changed(void *user_data) +{ + ct_group_data *cgroup_d = user_data; + PH_DBG("group_changed"); + if(cgroup_d->update_timer) { + ecore_timer_del(cgroup_d->update_timer); + cgroup_d->update_timer = NULL; + } + + if(cgroup_d->waiting_timer) { + PH_DBG("waiting 3 seconds for group change"); + cgroup_d->need_update = true; + return ECORE_CALLBACK_RENEW;; + } + else { + cgroup_d->waiting_timer = ecore_timer_add(3.0, group_wait_changed, cgroup_d); + } + + elm_gengrid_clear(cgroup_d->gengrid); + __group_fill_layout(cgroup_d); + + return ECORE_CALLBACK_CANCEL; +} + +static void group_data_lazy_update(const char* view_uri,void *data) +{ + PH_FN_CALL; + ct_group_data *cgroup_d = data; + + if (cgroup_d->update_timer) { + ecore_timer_del(cgroup_d->update_timer); + cgroup_d->update_timer = NULL; + } + + PH_DBG("cgroup_d->is_background = %d", cgroup_d->is_background); + + if (cgroup_d->is_background) + cgroup_d->update_timer = ecore_timer_add(3.0, group_changed, cgroup_d); + else + group_changed(cgroup_d); + + if(cgroup_d->group_mode == GROUP_MODE_EDIT) + group_edit_mode_end(cgroup_d, true); +} + +static void group_delete_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + int ret; + bool completed = true; + Elm_Object_Item *item; + const Elm_Gengrid_Item_Class *itc_temp; + ct_group_data *cgroup_d = data; + + group_popup_hide_cb(cgroup_d, NULL, NULL); + + item = elm_gengrid_first_item_get(cgroup_d->gengrid); + + while (item) { + itc_temp = elm_gengrid_item_item_class_get(item); + if (0 == strcmp(itc_temp->item_style, group_itcs[GROUP_ITC_GROUP_TITLE].item_style)) { + item = elm_gengrid_item_next_get(item); + continue; + } + + ct_group_list *info = elm_object_item_data_get(item); + if (info && info->selected) { + ret = contacts_db_delete_record(_contacts_group._uri,info->id_grp); + if (CONTACTS_ERROR_NONE != ret) { + ERR("Error : contacts_db_delete_record() Failed(%d)", ret); + completed = false; + break; + } + } + item = elm_gengrid_item_next_get(item); + } + if (completed) + phone_show_tickernoti(S_(PH_SYS_POP_DELETED)); + else + phone_show_tickernoti(S_(PH_SYS_POP_FAILED)); + + group_edit_mode_end(cgroup_d, true); +} + + +static void group_cacnel_btn_cb(void *data, Evas_Object *obj, void *event_info) +{ + Elm_Object_Item *item; + ct_group_data *cgroup_d = data; + ct_group_list *info; + const Elm_Gengrid_Item_Class *itc_temp; + + item = elm_gengrid_first_item_get(cgroup_d->gengrid); + while (item) { + itc_temp = elm_gengrid_item_item_class_get(item); + if (0 == strcmp(itc_temp->item_style, group_itcs[GROUP_ITC_GROUP_TITLE].item_style)) { + item = elm_gengrid_item_next_get(item); + continue; + } + + info = elm_object_item_data_get(item); + if (NULL == info) continue; + info->selected = EINA_FALSE; + item = elm_gengrid_item_next_get(item); + } + group_edit_mode_end(cgroup_d, true); +} + +static void group_edit_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_group_data *cgroup_d = data; + if (cgroup_d->popup){ + evas_object_del(cgroup_d->popup); + cgroup_d->popup = NULL; + } + + cgroup_d->group_mode = GROUP_MODE_EDIT; + phone_group_set_navi(cgroup_d->layout); + elm_gengrid_clear(cgroup_d->gengrid); + __group_fill_layout(cgroup_d); + phone_show_notify(cgroup_d->layout, T_(CT_GET_TEXT_BASE_OP, CTTEXT_SELECT_GROUP)); + +} + +static void group_account_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_group_data *cgroup_d = data; + if (cgroup_d->popup){ + evas_object_del(cgroup_d->popup); + cgroup_d->popup = NULL; + } + + cgroup_d->child_ug = ctui_account_ug(cgroup_d->ug, NULL, NULL, + ctui_destroy_child_ug, &cgroup_d->child_ug); +} + +static void group_more_cb(void *data, Evas_Object *obj, void *event_info) +{ + int rotate; + int x,y,w,h; + ct_group_data *cgroup_d = data; + + if (cgroup_d->popup){ + evas_object_del(cgroup_d->popup); + cgroup_d->popup = NULL; + } + + cgroup_d->popup = elm_ctxpopup_add(cgroup_d->navi); + p_retm_if(NULL == cgroup_d->popup, "elm_ctxpopup_add() return NULL"); + + rotate = (int)evas_object_data_get(cgroup_d->navi, "phone_rotate"); + if (0 == rotate || 180 == rotate) + elm_ctxpopup_direction_priority_set(cgroup_d->popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, + ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT); + + evas_object_smart_callback_add(cgroup_d->popup, "dismissed", group_popup_hide_cb, cgroup_d); + + elm_ctxpopup_item_append(cgroup_d->popup, S_(PH_SYS_SK_EDIT), NULL, + group_edit_cb, cgroup_d); + + evas_object_geometry_get(cgroup_d->ctrl_button, &x, &y, &w, &h); + evas_object_move(cgroup_d->popup, w/2, y+h/2); + evas_object_show(cgroup_d->popup); +} + +static void group_add_cb(void *data, Evas_Object *obj, void *event_info) +{ + ct_group_data *cgroup_d = data; + evas_object_data_set(cgroup_d->navi, "navi_it_pop_to", cgroup_d->navi_item); + ctui_create_group_input_view(cgroup_d->win, cgroup_d->navi,NULL, NULL, NULL); +} + +#ifdef _CT_GROUP_DEFAULT_GROUP_UPDATE_DB +static void group_update_default_group_name(keynode_t *key, void *data) +{ + PH_FN_CALL; + int ret; + int text_index= -1; + contacts_record_h record = NULL; + contacts_record_h group_record = NULL; + contacts_list_h group_list = NULL; + + group_list = NULL; + ret = contacts_db_get_all_records( _contacts_group._uri,0,0,&group_list); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_db_get_all_records() Failed(%d)", ret); + ret = contacts_list_get_current_record_p(group_list, &record); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_get_current_record_p() Failed(%d)", ret); + while(record){ + int grp_id; + char* group_sysid; + char* group_name; + + ret = contacts_record_get_int(record,_contacts_group.id,&grp_id); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_record_get_int() Failed(%d)", ret); + ret = contacts_record_get_str_p(record,_contacts_group.system_id,&group_sysid); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_record_get_str_p() Failed(%d)", ret); + ret = contacts_record_get_str_p(record,_contacts_group.name,&group_name); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_record_get_str_p() Failed(%d)", ret); + if(group_sysid == NULL){ + PH_DBG("sysid null ,group_name__ = %s ", group_name); + + ret = contacts_list_next(group_list); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_next() Failed(%d)", ret); + + ret = contacts_list_get_current_record_p(group_list, &record); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_get_current_record_p() Failed(%d)", ret); + continue; + } + PH_DBG("group_sysid = %s",group_sysid); + if(strcmp(group_sysid,"friends")==0) + text_index = CTTEXT_FRIENDS; + else if(strcmp(group_sysid,"family")==0) + text_index = CTTEXT_FRIENDS+1; + else if(strcmp(group_sysid,"coworkers")==0) + text_index = CTTEXT_FRIENDS+2; + else { + ret = contacts_list_next(group_list); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_next() Failed(%d)", ret); + + ret = contacts_list_get_current_record_p(group_list, &record); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_get_current_record_p() Failed(%d)", ret); + continue; + } + + if(text_index == -1){ + ret = contacts_list_next(group_list); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_next() Failed(%d)", ret); + + ret = contacts_list_get_current_record_p(group_list, &record); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_get_current_record_p() Failed(%d)", ret); + ERR("text_index is -1, failed"); + continue; + } + else + PH_DBG("text_index = %d",text_index); + + PH_DBG("group = %s , %s", group_name,T_(CT_GET_TEXT_BASIC, text_index)); + + if(strcmp(group_name,T_(CT_GET_TEXT_BASIC, text_index)) != 0){ + ret = contacts_db_get_record(_contacts_group._uri,grp_id,&group_record); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_db_get_record() Failed(%d)", ret); + + ret = contacts_record_set_str(group_record,_contacts_group.name,T_(CT_GET_TEXT_BASIC, text_index)); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_record_set_str() Failed(%d)", ret); + + ret = contacts_db_update_record(group_record); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_db_update_record() Failed(%d)", ret); + + ret = contacts_record_destroy(group_record, true); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_record_destroy() Failed(%d)", ret); + } + ret = contacts_list_next(group_list); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_next() Failed(%d)", ret); + + ret = contacts_list_get_current_record_p(group_list, &record); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_get_current_record_p() Failed(%d)", ret); + } + ret = contacts_list_destroy(group_list, true); + p_retm_if(CONTACTS_ERROR_NONE != ret, "contacts_list_destroy() Failed(%d)", ret); + +} +#endif + +static void __group_pop_as_topmost(void *data, Evas_Object *obj, void *event_info) +{ + ct_group_data *cgroup_d = data; + if(cgroup_d->navi_item == elm_naviframe_top_item_get(obj)) { + group_notify_update(cgroup_d); + } +} + +static void group_view_delete_cb(void *data, Evas *e, Evas_Object *obj, + void *event_info) +{ + int ret; + ct_group_data *cgroup_d = data; + p_retm_if(NULL == cgroup_d, "parameter(cgroup_d) is NULL"); + + + ret = contacts_db_remove_changed_cb(_contacts_contact._uri,group_data_lazy_update,cgroup_d); + p_warn_if(CONTACTS_ERROR_NONE, "contacts_db_remove_changed_cb() Failed(%d)", ret); + ret = contacts_db_remove_changed_cb(_contacts_group._uri,group_data_lazy_update,cgroup_d); + p_warn_if(CONTACTS_ERROR_NONE, "contacts_db_remove_changed_cb() Failed(%d)", ret); + ret = contacts_db_remove_changed_cb(_contacts_person._uri, group_data_lazy_update, cgroup_d); + p_warn_if(CONTACTS_ERROR_NONE, "contacts_db_remove_changed_cb() Failed(%d)", ret); + +#ifdef _CT_GROUP_DEFAULT_GROUP_UPDATE_DB + ret = vconf_ignore_key_changed(VCONFKEY_LANGSET, group_update_default_group_name); + p_warn_if(-1 == ret, "vconf_ignore_key_changed() Failed"); +#endif + + if (cgroup_d->th) { + elm_theme_extension_del(cgroup_d->th, GROUP_THEME_EDJ); + elm_theme_extension_del(cgroup_d->th, CONTACT_BUTTON_THEME_EDJ); + elm_theme_free(cgroup_d->th); + } + + if (cgroup_d->child_ug) + ug_destroy(cgroup_d->child_ug); + + if (cgroup_d->crop_ug) + ug_destroy(cgroup_d->crop_ug); + + if (cgroup_d->src_ug) + ug_destroy(cgroup_d->src_ug); + + if (cgroup_d->popup) + evas_object_del(cgroup_d->popup); + + if (cgroup_d->update_timer) + ecore_timer_del(cgroup_d->update_timer); + + if (cgroup_d->waiting_timer) + ecore_timer_del(cgroup_d->waiting_timer); + + evas_object_smart_callback_del(cgroup_d->navi, "transition,finished", __group_pop_as_topmost); + + free(cgroup_d); +} + +static int group_create_layout(ct_group_data *cgroup_d, Evas_Object *parent) +{ + PH_FN_CALL; + int ret; + const int CT_GROUP_ITEM_WIDTH = 360; + const int CT_GROUP_ITEM_HEIGHT = 340; + double scale; + Evas_Object *layout; + Evas_Object *base; + Evas_Object *gengrid; + cgroup_d->navi = parent; + + base = elm_layout_add(cgroup_d->navi); + p_retvm_if(NULL == base, -1, "elm_layout_add() return NULL"); + elm_layout_file_set(base, SELECTION_INFO_EDJ, "selectioninfo_layout"); + layout = phone_create_base_layout(base, false); + p_retvm_if(NULL == layout, -1, "phone_create_base_layout() return NULL"); + elm_object_part_content_set(base, "contents", layout); + cgroup_d->layout = base; + + gengrid = elm_gengrid_add(layout); + p_retvm_if(NULL == gengrid, -1, "elm_gengrid_add() return NULL"); + elm_object_theme_set(gengrid, cgroup_d->th); + evas_object_size_hint_weight_set(gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_gengrid_align_set(gengrid, 0.5, 0.0); + evas_object_data_set(gengrid, "cgroup_d", cgroup_d); + + scale = elm_config_scale_get(); + elm_gengrid_group_item_size_set(gengrid, (int)(720*scale), (int)(50*scale)); + elm_gengrid_item_size_set(gengrid, (int)(CT_GROUP_ITEM_WIDTH*scale), (int)(CT_GROUP_ITEM_HEIGHT*scale)); + elm_gengrid_horizontal_set(gengrid, EINA_FALSE); + + elm_gengrid_scroller_policy_set(gengrid, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO); + elm_object_part_content_set(layout, "elm.swallow.content", gengrid); + cgroup_d->gengrid = gengrid; + +#ifdef _CT_GROUP_DEFAULT_GROUP_UPDATE_DB + group_update_default_group_name(NULL, NULL); + ret = vconf_notify_key_changed(VCONFKEY_LANGSET, group_update_default_group_name, NULL); + p_warn_if(-1 == ret, "vconf_notify_key_changed() Failed"); +#endif + + group_create_itcs(); + __group_fill_layout(cgroup_d); + + evas_object_event_callback_add(cgroup_d->layout, EVAS_CALLBACK_DEL, group_view_delete_cb, cgroup_d); + + ret = contacts_db_add_changed_cb(_contacts_contact._uri, group_data_lazy_update, cgroup_d); + p_warn_if(CONTACTS_ERROR_NONE, "contacts_db_add_changed_cb() Failed(%d)", ret); + + ret = contacts_db_add_changed_cb(_contacts_group._uri, group_data_lazy_update, cgroup_d); + p_warn_if(CONTACTS_ERROR_NONE, "contacts_db_add_changed_cb() Failed(%d)", ret); + + ret = contacts_db_add_changed_cb(_contacts_person._uri, group_data_lazy_update, cgroup_d); + p_warn_if(CONTACTS_ERROR_NONE, "contacts_db_add_changed_cb() Failed(%d)", ret); + + return 0; + +} + +API void phone_group_set_navi(Evas_Object *layout) +{ + ct_group_data *cgroup_d; + Elm_Object_Item *navi_it; + Evas_Object *r_btn; + + cgroup_d = evas_object_data_get(layout, KEY_GROUP_DATA); + p_retm_if(NULL == cgroup_d, "cgroup_d is NULL"); + navi_it = elm_naviframe_bottom_item_get(cgroup_d->navi); + p_retm_if(NULL == navi_it, "navi item is NULL"); + + phone_navi_item_clear(cgroup_d->navi_item); + + if (cgroup_d->ug) { + r_btn = phone_create_toolbar_btn(cgroup_d->navi, S_(PH_SYS_SK_CANCEL), phone_ug_destroy_me_cb, cgroup_d->ug); + elm_object_item_part_content_set(cgroup_d->navi_item, "toolbar_button1", r_btn); + } + else { + if (GROUP_MODE_NORMAL == cgroup_d->group_mode) { + Evas_Object *group_button; + + cgroup_d->ctrl_button = ctui_create_more_btn(cgroup_d->navi, group_more_cb, cgroup_d); + elm_object_item_part_content_set(navi_it, "toolbar_more_btn", cgroup_d->ctrl_button); + + group_button = phone_create_toolbar_btn(cgroup_d->navi, S_(CT_SYS_BODY_CREATE), group_add_cb, cgroup_d); + elm_object_item_part_content_set(navi_it, "toolbar_button1", group_button); + + r_btn = elm_button_add(cgroup_d->navi); + elm_object_style_set(r_btn, "naviframe/back_btn/default"); + evas_object_smart_callback_add(r_btn, "clicked", phone_back_btn_clicked_cb, cgroup_d->win); + elm_object_item_part_content_set(navi_it, "prev_btn", r_btn); + } + else { + phone_navi_item_clear(navi_it); + cgroup_d->delete_button = phone_create_toolbar_btn(cgroup_d->navi, S_(PH_SYS_SK_DELETE), group_delete_btn_cb, cgroup_d); + elm_object_item_part_content_set(navi_it, "toolbar_button1", cgroup_d->delete_button); + elm_object_disabled_set(cgroup_d->delete_button, EINA_TRUE); + + r_btn = phone_create_toolbar_btn(cgroup_d->navi, S_(PH_SYS_SK_CANCEL), group_cacnel_btn_cb, cgroup_d); + elm_object_item_part_content_set(cgroup_d->navi_item, "toolbar_button2", r_btn); + } + } +} + +API Evas_Object* phone_create_group_view(ph_view_info *view_info) +{ + int ret; + Elm_Theme *th; + ct_group_data *cgroup_d= calloc(1, sizeof(ct_group_data)); + p_retvm_if(NULL == cgroup_d, NULL, "Fail to calloc ct_group_data"); + cgroup_d->ug = view_info->ug; + cgroup_d->ug_request = view_info->ug_request; + cgroup_d->ug_cnt_max = view_info->ug_cnt_max; + cgroup_d->ug_data = view_info->ug_data; + cgroup_d->win = view_info->win; + cgroup_d->navi_item = elm_naviframe_bottom_item_get(view_info->navi); + cgroup_d->is_background = true; + + th = elm_theme_new(); + elm_theme_ref_set(th, NULL); + elm_theme_extension_add(th, GROUP_THEME_EDJ); + elm_theme_extension_add(th, CONTACT_BUTTON_THEME_EDJ); + cgroup_d->th = th; + + ret = group_create_layout(cgroup_d, view_info->navi); + if (ret < 0) { + free(cgroup_d); + return NULL; + } + + evas_object_data_set(cgroup_d->layout, KEY_GROUP_DATA, cgroup_d); + evas_object_data_set(cgroup_d->navi, KEY_GROUP_DATA, cgroup_d); + + evas_object_smart_callback_add(view_info->navi, "transition,finished", __group_pop_as_topmost, cgroup_d); + + return cgroup_d->layout; +} + +API void phone_group_view_reset(Evas_Object *base) +{ + PH_FN_CALL; + ct_group_data *cgroup_d; + Elm_Object_Item *item; + + cgroup_d = evas_object_data_get(base, KEY_GROUP_DATA); + p_retm_if(NULL == cgroup_d, "cgroup_d is null"); + + if (cgroup_d->child_ug) { + ug_destroy(cgroup_d->child_ug); + cgroup_d->child_ug = NULL; + } + + item = elm_naviframe_bottom_item_get(cgroup_d->navi); + if (elm_naviframe_top_item_get(cgroup_d->navi) != item) + elm_naviframe_item_pop_to(item); + + if (GROUP_MODE_EDIT == cgroup_d->group_mode) + group_edit_mode_end(cgroup_d, false); +} + +API void phone_group_view_language_changed(Evas_Object *base) +{ + ct_group_data *cgroup_d; + cgroup_d = evas_object_data_get(base, KEY_GROUP_DATA); + p_retm_if(NULL == cgroup_d, "evas_object_data_get() return NULL"); + group_changed(cgroup_d); + + if(cgroup_d->group_mode == GROUP_MODE_EDIT) + group_notify_update(cgroup_d); +} + +API void phone_group_set_background(Evas_Object *obj, bool is_background) +{ + ct_group_data *cgroup_d; + cgroup_d = evas_object_data_get(obj, KEY_GROUP_DATA); + p_retm_if(NULL == cgroup_d, "group data is null"); + + cgroup_d->is_background = is_background; + if (cgroup_d->update_timer) { + ecore_timer_del(cgroup_d->update_timer); + cgroup_d->update_timer = NULL; + group_changed(cgroup_d); + } +} + +API Evas_Object* phone_create_group_view_ug(ui_gadget_h ug, Evas_Object *parent, int ug_request) +{ + int ret; + Elm_Theme *th; + ct_group_data *cgroup_d= calloc(1, sizeof(ct_group_data)); + p_retvm_if(NULL == cgroup_d, NULL, "Fail to calloc ct_group_data"); + cgroup_d->ug = ug; + cgroup_d->ug_request = ug_request; + cgroup_d->navi = elm_naviframe_add(parent); + p_retvm_if(NULL == cgroup_d->navi, FALSE, "elm_naviframe_add() return NULL"); + elm_object_part_content_set(parent, "elm.swallow.content", cgroup_d->navi); + evas_object_show(cgroup_d->navi); + + th = elm_theme_new(); + elm_theme_ref_set(th, NULL); + elm_theme_extension_add(th, GROUP_THEME_EDJ); + elm_theme_extension_add(th, CONTACT_BUTTON_THEME_EDJ); + cgroup_d->th = th; + + ret = group_create_layout(cgroup_d, cgroup_d->navi); + if (ret < 0) { + free(cgroup_d); + return NULL; + } + cgroup_d->navi_item = elm_naviframe_item_push(cgroup_d->navi, T_(CT_GET_TEXT_BASIC, CTTEXT_GROUP), NULL, NULL, cgroup_d->layout, NULL); + evas_object_data_set(cgroup_d->layout, KEY_GROUP_DATA, cgroup_d); + return cgroup_d->layout; +} + |