summaryrefslogtreecommitdiff
path: root/lib/list/ct-group-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/list/ct-group-view.c')
-rwxr-xr-xlib/list/ct-group-view.c1270
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;
+}
+